有符号大整数计算器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
齐鲁工业大学
面向对象程序设计
课程设计报告
学号:************
姓名:***
班级:计科12-1班
课程设计题目:有符号大整数计算器
成绩:
一:设计目的与要求
对数值很大、精度很高的数进行高精度大整数计算是一类十分常见的问题。但由于C++语言中数据长度和范围受数据类型的限制,普通数学计算很难实现此类问题,为尝试解决这个问题,专门设计一个C++语言程序用于有符号大整数的计算。
二:设计内容分析
1.功能分析:
2.函数设计:
A.运算辅助函数
(1)检测用户输入运算符函数:Check_Oper()
函数原型:char Check_Oper(string &str,string &num_1,string &num_2);
功能:检测用户输入的运算符,并将char类型的运算符作为函数的返回值,若用户输
入有误则提示用户。
(2)反转字符串函数:Reverse_String()
函数原型:string Reverse_String(string &str);
功能:传入string类型对象的引用,将其中保存的字符串全部反转后作为函数的返回
值返回。
(3)字符串ASCII码减48位函数:SUB_ASC()
函数原型:string SUB_ASC(string &str);
功能:将string类型对象中字符串的所有元素的ASCII码减48。
(4)字符串ASCII码加48位函数:ADD_ASC()
功能:将string类型对象中字符串的所有元素的ASCII码加48。
(5)获取最大数函数:GET_MAX()
函数原型:string GET_MAX(string &num1,string &num2);
功能:将两个以string类型存放的大整数传入函数,返回值最大的整数的string对象。
B.数据运算
(1)加法运算:addition()
函数原型:string addition(string &num1,string &num2);
实现步骤:依次将两个字符串的每一位元素的ASCII码进行加法运算并存入结果中,
对满十的结果进行进位,然后对该位进行对十取余存入当前元素中。
(2)减法运算:subduction()
函数原型:string subduction(string &num1,string &num2);
实现步骤:依次将两个字符串的每一位元素的ASCII码进行减法运算并存入结果中,
对负值的结果进行借位,然后对该位进行加十运算存入当前元素中。
(3)乘法运算:multiplication()
函数原型:string multiplication(string &num1,string &num2);
实现步骤:依次将一字符串中的所有元素的ASCII码乘以另一个字符串中的所有元素并
相加后存入结果中,对每一个大于10的ASCII码元素进行进位操作。
(4)除法运算:division()
函数原型:string division(string &num1,string &num2);
实现步骤:将未经反转的字符串传入,循环利用比较和减法,若余数大于除数,则进行
减法调用。
(5)阶乘运算:factorial()
函数原型:string factorial(string &num);
实现步骤:依次对1至N之间的所有整数进行乘法运算。
三:实现步骤
#include
#include
#include
#include
#include
#include
using namespace std;
class Operation
{
public:
char Check_Oper(string &str,string &num_1,string &num_2); //检测运算符
string addition(string &num1,string &num2); //加法运算
string subduction(string &num1,string &num2); //减法运算
string multiplication(string &num1,string &num2); //乘法运算
string division(string &num1,string &num2); //除法运算
string factorial(string &num); //阶乘运算
private:
string SUB_ASC(string &str); //字符串ASCII码减48位string ADD_ASC(string &str); //字符串ASCII码加48位string GET_MAX(string &num1,string &num2); //获取两个数中的最大值};
string Operation::addition(string &num1,string &num2)
{
unsigned short a=0,b=0;
string result;
string num_1(num1);
string num_2(num2);
string::size_type i=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) goto skip;
result.insert(result.begin(),'0');
return result;
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]);
else if(i!=num_1.size()) result.insert(result.end(),num_1[i]);
else if(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());
else break;
}