有符号大整数计算器.docx

上传人:b****5 文档编号:5118395 上传时间:2022-12-13 格式:DOCX 页数:21 大小:137.85KB
下载 相关 举报
有符号大整数计算器.docx_第1页
第1页 / 共21页
有符号大整数计算器.docx_第2页
第2页 / 共21页
有符号大整数计算器.docx_第3页
第3页 / 共21页
有符号大整数计算器.docx_第4页
第4页 / 共21页
有符号大整数计算器.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

有符号大整数计算器.docx

《有符号大整数计算器.docx》由会员分享,可在线阅读,更多相关《有符号大整数计算器.docx(21页珍藏版)》请在冰豆网上搜索。

有符号大整数计算器.docx

有符号大整数计算器

齐鲁工业大学

面向对象程序设计

课程设计报告

 

学号:

************

姓名:

***

班级:

计科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<<"请输入运算式:

"<<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1