有符号大整数计算器.docx
- 文档编号:5118395
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:21
- 大小:137.85KB
有符号大整数计算器.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;m for(m=0;m if(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;i returnstr; } stringOperation: : ADD_ASC(string&str) { string: : size_typei; for(i=0;i returnstr; } 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<<"请输入运算式: "<<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 符号 整数 计算器