有符号大整数计算器.docx
《有符号大整数计算器.docx》由会员分享,可在线阅读,更多相关《有符号大整数计算器.docx(21页珍藏版)》请在冰豆网上搜索。
有符号大整数计算器
齐鲁工业大学
面向对象程序设计
课程设计报告
学号:
************
姓名:
***
班级:
计科12-1班
课程设计题目:
有符号大整数计算器
成绩:
一:
设计目的与要求
对数值很大、精度很高的数进行高精度大整数计算是一类十分常见的问题。
但由于C++语言中数据长度和范围受数据类型的限制,普通数学计算很难实现此类问题,为尝试解决这个问题,专门设计一个C++语言程序用于有符号大整数的计算。
二:
设计内容分析
1.功能分析:
类
功能
分析
Operation
数据
运算
加法运算:
addition()
减法运算:
subduction()
乘法运算:
multiplication()
除法运算:
division()
阶乘运算:
factorial()
运算辅助函数
检测用户输入运算符:
Check_Oper()
反转字符串:
Reverse_String()
字符串ASCII码减48位:
SUB_ASC()
字符串ASCII码加48位:
ADD_ASC()
获取两个数中的最大值:
GET_MAX()
2.函数设计:
A.运算辅助函数
(1)检测用户输入运算符函数:
Check_Oper()
函数原型:
charCheck_Oper(string&str,string&num_1,string&num_2);
功能:
检测用户输入的运算符,并将char类型的运算符作为函数的返回值,若用户输
入有误则提示用户。
(2)反转字符串函数:
Reverse_String()
函数原型:
stringReverse_String(string&str);
功能:
传入string类型对象的引用,将其中保存的字符串全部反转后作为函数的返回
值返回。
(3)字符串ASCII码减48位函数:
SUB_ASC()
函数原型:
stringSUB_ASC(string&str);
功能:
将string类型对象中字符串的所有元素的ASCII码减48。
(4)字符串ASCII码加48位函数:
ADD_ASC()
函数原型:
stringADD_ASC(string&str);
功能:
将string类型对象中字符串的所有元素的ASCII码加48。
(5)获取最大数函数:
GET_MAX()
函数原型:
stringGET_MAX(string&num1,string&num2);
功能:
将两个以string类型存放的大整数传入函数,返回值最大的整数的string对象。
B.数据运算
(1)加法运算:
addition()
函数原型:
stringaddition(string&num1,string&num2);
实现步骤:
依次将两个字符串的每一位元素的ASCII码进行加法运算并存入结果中,
对满十的结果进行进位,然后对该位进行对十取余存入当前元素中。
(2)减法运算:
subduction()
函数原型:
stringsubduction(string&num1,string&num2);
实现步骤:
依次将两个字符串的每一位元素的ASCII码进行减法运算并存入结果中,
对负值的结果进行借位,然后对该位进行加十运算存入当前元素中。
(3)乘法运算:
multiplication()
函数原型:
stringmultiplication(string&num1,string&num2);
实现步骤:
依次将一字符串中的所有元素的ASCII码乘以另一个字符串中的所有元素并
相加后存入结果中,对每一个大于10的ASCII码元素进行进位操作。
(4)除法运算:
division()
函数原型:
stringdivision(string&num1,string&num2);
实现步骤:
将未经反转的字符串传入,循环利用比较和减法,若余数大于除数,则进行
减法调用。
(5)阶乘运算:
factorial()
函数原型:
stringfactorial(string&num);
实现步骤:
依次对1至N之间的所有整数进行乘法运算。
三:
实现步骤
#include
#include
#include
#include
#include
#include
usingnamespacestd;
classOperation
{
public:
charCheck_Oper(string&str,string&num_1,string&num_2);//检测运算符
stringaddition(string&num1,string&num2);//加法运算
stringsubduction(string&num1,string&num2);//减法运算
stringmultiplication(string&num1,string&num2);//乘法运算
stringdivision(string&num1,string&num2);//除法运算
stringfactorial(string&num);//阶乘运算
private:
stringReverse_String(string&str);//反转字符串
stringSUB_ASC(string&str);//字符串ASCII码减48位
stringADD_ASC(string&str);//字符串ASCII码加48位
stringGET_MAX(string&num1,string&num2);//获取两个数中的最大值
};
stringOperation:
:
addition(string&num1,string&num2)
{
unsignedshorta=0,b=0;
stringresult;
stringnum_1(num1);
stringnum_2(num2);
string:
:
size_typei=0,j=0;
Reverse_String(num_1);
Reverse_String(num_2);
SUB_ASC(num_1);
SUB_ASC(num_2);
for(i=0;i!
=num_1.size();i++)a+=num_1[i];
for(j=0;j!
=num_2.size();j++)b+=num_2[j];
if(a!
=0||b!
=0)gotoskip;
result.insert(result.begin(),'0');
returnresult;
skip:
i=j=0;
while(i!
=num_1.size()||j!
=num_2.size())
{
if(i!
=num_1.size()&&j!
=num_2.size())result.insert(result.end(),num_1[i]+num_2[j]);
elseif(i!
=num_1.size())result.insert(result.end(),num_1[i]);
elseif(j!
=num_2.size())result.insert(result.end(),num_2[j]);
i==num_1.size()?
i:
i++;
j==num_2.size()?
j:
j++;
}
for(i=0;i!
=result.size();i++)
if(result[i]>9)
{
result[i]%=10;
if(i+1==result.size())result.insert(result.end(),0);
result[i+1]+=1;
}
ADD_ASC(result);
Reverse_String(result);
while
(1)
{
if(*result.begin()=='0')result.erase(result.begin());
elsebreak;
}
returnresult;
}
stringOperation:
:
subduction(string&num1,string&num2)
{
shortk=0;
stringresult;
string:
:
size_typei=0,j=0;
stringnum_1(num1);
stringnum_2(num2);
if(GET_MAX(num_1,num_2)==num_2)
{
k=1;
num_2.swap(num_1);//交换对象数据
}
Reverse_String(num_1);
Reverse_String(num_2);
SUB_ASC(num_1);
SUB_ASC(num_2);
i=j=0;
while(i!
=num_1.size()||j!
=num_2.size())
{
if(i!
=num_1.size()&&j!
=num_2.size())result.insert(result.end(),num_1[i]-num_2[j]);
elseif(i!
=num_1.size())result.insert(result.end(),num_1[i]);
elseif(j!
=num_2.size())result.insert(result.end(),num_2[j]);
i==num_1.size()?
i:
i++;
j==num_2.size()?
j:
j++;
}
for(i=0;i!
=result.size();i++)
if(result[i]<0)
{
result[i]=10+result[i];
result[i+1]-=1;
}
ADD_ASC(result);
Reverse_String(result);
while
(1)
{
if(*result.begin()=='0')result.erase(result.begin());
elsebreak;
}
if(k)
{
if(result.empty())
result.insert(result.end(),'0');
else
result.insert(result.begin(),'-');
}
returnresult;
}
stringOperation:
:
multiplication(string&num1,string&num2)
{
stringresult,temp;
stringnum_1(num1);
stringnum_2(num2);
string:
:
size_typei=0,j=0,m=0;
shortk=1;
chartmp=NULL;
Reverse_String(num_1);
Reverse_String(num_2);
SUB_ASC(num_1);
SUB_ASC(num_2);
for(i=0;i!
=num_1.size();i++)result.insert(result.end(),num_2[0]*num_1[i]);
for(m=0;m!
=result.size();m++)
if(result[m]>9)
{
tmp=result[m];
result[m]%=10;
if(m+1==result.size())result.insert(result.end(),0);
result[m+1]+=tmp/10;
}
while(j!
=num_2.size()-1)
{
j++;
if(j==num_2.size())break;
for(i=0;i!
=num_1.size();i++)temp.insert(temp.end(),num_2[j]*num_1[i]);
temp.insert(temp.begin(),k,0);
for(m=0;mfor(m=0;mif(temp[m]>9)
{
tmp=temp[m];
temp[m]%=10;
if(m+1==temp.size())temp.insert(temp.end(),0);
temp[m+1]+=tmp/10;
}
result.assign(temp);
ADD_ASC(result);
SUB_ASC(result);
temp.erase(temp.begin(),temp.end());
k++;
}
Reverse_String(result);
ADD_ASC(result);
returnresult;
}
stringOperation:
:
division(string&num1,string&num2)
{
stringresult;
stringMAX;
stringremainder;
stringnum1_tmp;
stringnum_1(num1);
stringnum_2(num2);
stringstep(1,'1');
stringtemp1,temp2;
string:
:
iteratoriter=NULL;
string:
:
size_typei=0;
while(*num_2.begin()=='0')num_2.erase(num_2.begin());
if(num_2.empty())
{
result="除数不可以为零!
";
returnresult;
}
num_1.insert(num_1.end(),100,'0');
iter=num_1.begin()+num_2.size();
num1_tmp.assign(num_1.begin(),iter);
iter--;
again:
for(step[0]='1';1;step[0]++)
{
MAX.assign(GET_MAX(multiplication(num_2,step),num1_tmp));
if(step[0]=='9'&&num1_tmp==MAX)gotoskip;
if(MAX!
=num1_tmp)
{
step[0]--;
skip:
temp2.assign(subduction(num1_tmp,multiplication(num_2,step)));
while
(1)
if(temp2[0]=='0')temp2.erase(temp2.begin());
elsebreak;
result+=step;
iter++;
if(iter==num_1.end())
{
result.insert(result.begin(),num_2.size()-1,'0');
i=result.size()-100;
result.insert(i,1,'.');
while(*result.begin()=='0'&&*(result.begin()+1)!
='.')
result.erase(result.begin());
while(*(result.end()-1)=='0'&&*(result.end()-2)!
='.')result.erase(result.end()-1);
break;
}
num1_tmp.assign(temp2);
num1_tmp.insert(num1_tmp.end(),*iter);
gotoagain;
}
}
returnresult;
}
stringOperation:
:
factorial(string&num)
{
stringresult(num);
stringstep(1,'1');
string_num(num);
//if(num.size()<=1)
//if(num[0]=='1'||num[0]=='0')
//returnstep;
//cout<//result.assign(multiplication(factorial(subduction(num,step)),num));
for(_num.assign(subduction(_num,step));_num.size()==1?
(_num[0]=='1'||_num[0]=='0'?
0:
1):
1;_num.assign(subduction(_num,step)))
result.assign(multiplication(result,_num));
returnresult;
}
charOperation:
:
Check_Oper(string&str,string&num_1,string&num_2)
{
charch=NULL;
shortk=1;
string:
:
size_typei;
if(str[str.size()-1]=='!
')
if(str[0]>=48&&str[0]<=57)
return'!
';
else
returnNULL;
if(str[0]!
='-')i=0;
elseif(str[0]=='-')
{
num_1.insert(num_1.end(),'-');
i=1;
}
elseif(str[0]=='+')i=1;
elsereturnNULL;
for(;i{
if(str[i]>=48&&str[i]<=57)
{
if(k)num_1.insert(num_1.end(),str[i]);
else
num_2.insert(num_2.end(),str[i]);
}
else
{
if(ch!
=NULL)returnNULL;
switch(str[i])
{
case'+':
ch='+';
break;
case'-':
ch='-';
break;
case'*':
ch='*';
break;
case'/':
ch='/';
break;
default:
returnNULL;
}
k=0;
}
}
returnch;
}
stringOperation:
:
Reverse_String(string&str)
{
string:
:
size_typei,j=str.size()-1,length=str.size()/2;
chartmp=NULL;
for(i=0;i{
tmp=str[i];
str[i]=str[j];
str[j]=tmp;
}
returnstr;
}
stringOperation:
:
SUB_ASC(string&str)
{
string:
:
size_typei;
for(i=0;ireturnstr;
}
stringOperation:
:
ADD_ASC(string&str)
{
string:
:
size_typei;
for(i=0;ireturnstr;
}
stringOperation:
:
GET_MAX(string&num1,string&num2)
{
stringnum_1(num1);
stringnum_2(num2);
string:
:
size_typei;
while(num_1[0]=='0'||num_2[0]=='0')
{
if(num_1[0]=='0')num_1.erase(num_1.begin());
if(num_2[0]=='0')num_2.erase(num_2.begin());
}
if(num_1.size()>num_2.size())returnnum_1;
elseif(num_1.size()else
{
for(i=0;i!
=num_1.size();i++)
if(num_1[i]>num_2[i])returnnum_1;
elseif(num_1[i]}
returnnum_1;
}
intConsole()
{
system("cls");
SetConsoleTitle("有符号大整型数字计算器——By:
计科12-1班魏子楠");
cout<<"==============================================================================="<cout<<"\t\t\t有符号大整型数字计算器"<cout<<"本程序可进行:
\n1.加法运算\t2.减法运算\t3.乘法运算\t4.除法运算\t5.阶乘运算"<cout<<"==============================================================================="<return1;
}
intmain(intargc,char*argv[])
{
again:
charch;
Operationoper;
string*_str=newstring;
string*_num1=newstring;
string*_num2=newstring;
string*_result=newstring;
string&str=*_str;
string&num1=*_num1;
string&num2=*_num2;
string&result=*_result;
Console();
fflush(stdin);
cout<<"请输入运算式:
"<<