有符号大整数计算器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档