数据结构 计算器求大数_第1页
数据结构 计算器求大数_第2页
数据结构 计算器求大数_第3页
数据结构 计算器求大数_第4页
数据结构 计算器求大数_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 C+程序设计课程设计说明书 计算器求大数院 部: 计算机与信息科学学院 学生姓名: 专 业: 软件工程 班 级: 1401 完成时间: 2015年6月 目 录1. 设计概要31.1 设计背景31.2 数据结构设计32. 需求分析42.1 基本需求42.2 实现功能43. 算法设计53.1 概要说明53.2 模块间调用关系53.3 详细说明(Abstract Data Type描述)53.4 流程图及主要函数模块说明63.4.1. 判断运算符优先权6(1) 算符优先关系表6(2) 算法代码63.4.2. 主操作函数7(1) 算法概要流程图7(2) 操作过程8(3) 算法代码83.4.3 二元运

2、算函数9(1) 算法代码104. 测试结果114.1 简单表达式求值114.2 复杂表达式求值115. 总结125.1 改进思想125.2 经验和体会12参考文献14附 录15源程序151. 设计概要1.1设计背景利用数组存储,根据需要改变大小。转化乘除法的思想,将乘法转化为加法,将除法转化为减法,减少程序计算的难度。1.2数据结构设计1.乘法用逐位相乘由各位到高位一次进行,然后初步确定计算结果的长度 s1i = c1len1 - i -1 - '0' 将字符串转化为整型,并反着存放。2.除法转化为减法的思想来计算,大大降低计算设计的难度,利用数来存储。并可以根据计算位数要求设

3、计数组大小以满足需求。3.通过主函数来实现函数的调用。2.1 需求分析 在调查与科研实验中经常需要计算位数相对较大的加减乘除法,但是计算机本身提供的数据类型无法保存几百位甚至上千位的。所以针对超过手机与计算器计算位数的四则运算,设计出能实现长整数运算的程序。2.1 实现功能大数加法:输入两个位数较大的数,实现加法计算。大数减法:输入两个位数较大的数,实现减法计算,但不能计算结果为负数的数。大数乘法:输入两个位数较大的数,实现乘法计算。大数除法:输入两个位数较大的数,实现除法计算,计算结果只保留整数。进制转换:指定输入什么进制的数,可将其转变成任意进制数4. 测试结果图4-1主菜单图4-2 大数

4、加法图4-3 大数除法图4-4 进制转换5. 实验总结51改进思想1减法不能用小数减去大数,即不能有负数结果。2除法不能保留小数点后的数字,精确度还有待提高。3程序的界面也还有待改进,可以进一步将界面进行美化5.2 经验和体会大数的四则运算虽然不难,但是要打破常规,将乘法与除法换一种思想来计算,构思方面有很大的挑战。在这次试验中我们认识到了对于特别长的数的计算,只能化整为零,先求局部的结果,然后将各部分的结果综合起来,得到最终的结果。比如加法就是从最低位开始计算,判断进位后再向高位计算。但是乘除法虽然进行了转换,但是数字如果太大的话,进行加减法的次数也是很庞大的。本程序是分工完成的,所以我们也

5、充分认识到了团队协作的重要性,通过一起的讨论与分工,我们能得出解决问题的最好办法,各抒己见,在争论中互相成长。此外,这次的课程设计进一步加强了我们进行编程,调试,处理问题的能力,加深了我们对算法及数据结构的认识,对于程序的一些基本结构也更加地熟悉,课本知识也能够更加熟练地运用。同时我们也意识到,开发程序的早期计划要做的充分,以免出现程序完成后发现不足而带来的修改麻烦。虽然这只是一个小小的程序,但对我们之后的影响确实很大的。参考文献谭浩强. C+程序设计(第四版). 清华大学出版社,2010年6月谭浩强. C语言程序设计(第四版). 清华大学出版社,2010年6月崔进平 等. 数据结构(C语言版

6、). 北京:中国铁道出版社,2008年11月Stephen Prata. C Primer Plus中文版(第五版).人民邮电出版社,2005年2月附 录源程序#include<iostream>using namespace std;#include<malloc.h>#include<stdio.h>#include<string.h>#include<windows.h>#include<malloc.h>#define NUM 1000typedef struct STACKNOTE char data; STAC

7、KNOTE* next; LinkStack,*STACK;int Init_stack();int Empty_Stack();int Stack_conversion();int Pop_Stack();int Push_Stack_Elem();void menu();void numzero(int s);void strzero(char s);void add(char a1,char a2);void jian(char b1,char b2);void cheng(char c1,char c2);void chu(char d1,char d2);void menu() sy

8、stem("cls"); int count=0; printf("nnt*计算器*n"); printf("t1.大数加法n"); printf("t2.大数减法n"); printf("t3.大数乘法n"); printf("t4.大数除法n"); printf("t5.进制转换n"); printf("t*nn"); int num;void jian(char b1,char b2) int v1NUM; int v2NUM;

9、int v3NUM,L,i,z; numzero(v1); numzero(v2); numzero(v3); L=strlen(b1); for (i=0; i<L; i+) v1i=b1L-1-i-'0' L=strlen(b2); for (i=0; i<L; i+) v2i=b2L-1-i-'0' for (i=0; i<NUM; i+) v3i=v1i-v2i; /* for(i=0;i<9;i+) cout<<v3i<<" " cout<<endl; */ int jw=

10、0; for (i=0; i<NUM; i+) if(v3i<0) v3i=10-abs(v3i); v3i+1-=1; z=0; for (i=NUM-1; i>=0; i-) if(v3i=-1&&z=0) printf("-"); v3i=abs(v3i); break; if(v3i!=0 && v3i!=-1) z=1; z=0; printf("n计算结果为:"); for (i=NUM-1; i>=0; i-) if (z=0) if (v3i!=0) printf("%d&

11、quot;,v3i); z=1; else printf("%d",v3i); if (z=0) printf("0"); printf("n"); printf("请按任意键返回n"); getchar(); getchar(); getchar(); menu();void cheng(char c1,char c2) int s1NUM,s2NUM, ssNUM;/s1,s2:两个乘数;s:乘积的结果 int i, j, k, c; int len1, len2, len; len1 = strlen(c1)

12、; len2 = strlen(c2); len = len1 + len2;/初步确定乘积的长度 for(i = len1 - 1; i >= 0; i-) s1i = c1len1 - i -1 - '0'/将字符串转化为整型,并反着存放 for(i = len2 - 1; i >= 0; i-) s2i = c2len2 - i - 1 - '0' numzero(ss); for(i = 0; i <= len1 -1; i+) for(j = 0; j <= len2 -1; j+) ssi + j = ssi + j + s1

13、i * s2j;/逐位相乘 for(i = 0, c = 0; i <= len - 1; i+) /处理进位 k = ssi + c; ssi = k % 10; c = k / 10; for(i = len - 1; i >= 0; i-) if(ssi != 0) break;/处理多余的零 len = i + 1; char lineNUM;/注意只有指针才可以返回去,不能定义成数组 if(len = 0) line0 = 0 + '0' line1 = '0'/字符串的结束标志 else for(i = 0; i <= len -

14、1; i+) linei = sslen - i - 1 + '0' linelen = '0'/字符串的结束标志 printf("n计算结果为:"); cout<<line<<endl; printf("n"); getchar(); getchar(); menu();int Stack_conversion() system("cls"); char str21; int count=0; int Numbers; int i; printf("请输入您要输入什么

15、进制的数n"); cin>>Numbers; printf("请输入您要转化的数n"); cin>>str; STACK Conversion_Stack; Init_stack(Conversion_Stack); if(!Empty_Stack(Conversion_Stack) return 0; for(i=0; i<=strlen(str)-1; i+) char Temp_Conversion_number=stri; Push_Stack_Elem(Conversion_Stack,Temp_Conversion_num

16、ber); count+; long long Res_Number=0; char TempNum; int k; for(i=0,k=1; i<count; i+) Pop_Stack(Conversion_Stack,TempNum); if(TempNum>='0'&&TempNum<='9') Res_Number+=(k*(TempNum-'0'); if(TempNum>='a'&&TempNum<='z') Res_Number+=(k*(TempNum-'a'+10); if(TempNum>='A'&&TempNum<='Z') Res_Number+=(k*(TempNum-'A'+10); k*=Numbers; char *tempstr="0123456789ABCDEF" int j; printf("n请问您要把%s转化成什么进制的数n",str); cin>>j; char s20; int counts=0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论