大整数的四则运算课程设计_第1页
大整数的四则运算课程设计_第2页
大整数的四则运算课程设计_第3页
大整数的四则运算课程设计_第4页
大整数的四则运算课程设计_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、 中 北 大 学课程设计说明书学 院、系:软件学院专 业:软件工程学 生 姓 名:宋雨琪学 号:1221011205设 计 题 目:大整数的四则运算 起 迄 日 期: 2013年10月11日2013年11月16日指 导 教 师:薛海丽日期: 2013年11月16日1 设计目的 本课程设计是采用C语言,在VC平台下实现大整数的四则运算,该系统运行在MS-DOS命令行模式下。本课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。 1)进一步巩固和复习C程序设计的基础知识; 2)培养学生结构

2、化程序、模块化程序设计的方法和能力; 3)了解软件的编制过程及各环节的具体内容; 4)提高学生程序调试技巧、软件设计能力和代码规范化等素质;提高学生分析问题、解决问题以及实际运用能力。2 任务概述 完成大整数的四则运算任务,假定整数不超过五十位要求: 1) 在屏幕上能够手动输入待求的两个大整数; 2) 输入完成后通过选择可以完成大整数的加、减、乘、除运算; 3)将结果分别显示在屏幕上。 4) 验收时程序能够演示,自己单独做。3 模块划分 1) 定义c_to_d(char strN, char dN)函数,实现把str的各位转变成对应整数,右对齐存入d, start为最高位下标 2)定义d_to

3、_c(char dN, char strN, int start)函数,实现把d中数字dstart.N-1转变为字符左对齐存入str 3)定义加法函数 4)定义减法函数 5)定义乘法函数 6)定义除法函数7)定义输出格式函数 8)运用主函数计算4 主要函数说明及其N-S图 1)主函数说明 定义变量 输入要进行运算代码数字 输入数字 调用函数进行运算 2)其他函数说明 min函数,比较两数大小 c_to_d(char strN, char dN)函数,实现把str的各位转变成对应整数,右对齐存入d, start为最高位下标 d_to_c(char dN, char strN, int start

4、)函数,实现把d中数字dstart.N-1转变为字符左对齐存入str add(char str_aN, char str_bN, char str_cN),加法函数 sub(char str_aN, char str_bN, char str_cN),减法函数 compare(char str1N, char str2N) ,实现str1,str2内存的是要进行比较的大整数 mul(char str_aN, char str_bN, char str_cN),乘法函数 divd(char str_aN, char str_bN, char str_cN),除法函数主要函数的N-S图:for(i

5、=0,j=start;i<len;i+,j+)dj=stri-0)定义变量x,y,strN,dN,I,j,lenint len,start,i,jfor(i=0;i<N;i+)di=0 len=strlen(str)start=N-lenreturn start图1:函数c_to_d(char strN,char dN) N-S图定义变量x,y,strN,dN,startI,j,lenint len,start,i,j for(i=0,j=start;i<len;i+,j+)dj=stri+0) len=strlen(str)strlen=0图2:函数d_to_c(char

6、dN,char strN,int start) N-S图如果有进位T Fci=ai+bi+carry;carry=ci/10;ci=ci%10;i-;while(i>=start_c)定义变量 str_aN, str_bN, str_cN aN, bN,cN,i, start_a,start_b,start_c,carry,aN, bN,cNi=N-1;carry=0;调用函数c_to_d()start_c=min(start_a,start_b);start_c-;cstart_c=carry;调用函数d_to_c()图3:加法运算函数add()的N-S图调用函数d_to_c()调用函

7、数c_to_d()定义变量 str_aN, str_bN, str_cN aN, bN,cN,i, start_a,start_b,start_c,borrow while(i<N && ci=0 )memset(c,0,sizeof(c),)将c中有效的个字节替换为0并返回ci=N-1;borrow=0while(i>=start_a)ci=ai-bi-borrow如果有借位T Fborrow=1;ci+=10borrow=1;i-i+图4:减法运算函数sub()的N-S图len1=strlen(str1)if(len1>len2)T F定义变量 str1N

8、, str2N,len1,len2len2=strlen(str2)if(len1<len2)T Freturn -1;return 1return strcmp(str1,str2);图5:比较函数compare()的N-S图调用函数c_to_d()for(j=N-1;j>=start_b;j-)len1=strlen(str_a); len2=strlen(str_b)定义变量str_aN, str_bN, str_cN,len1, len2,i,j,k,carry,aN, bN, cN, dN,start_a, start_b, start_c, start_dfor(j=N

9、-1;j>=start_b;j-)memset(c,0,sizeof(c),)carry=0;for(i=N-1,k=j;i>=start_a;i-,k-)dk=ai*bj;carry=dk/10;dk=dk%10;if(carry>0) 如果有进位T Fdk=carry;k-;start_d=k+1; 把d累加到c中memset(c,0,sizeof(c),)carry=0for(i=N-1;i>=start_d;i-)ci=ci+di+carry;carry=ci/10;ci=ci%10;if(carry>0)T Fci=carry; i-;start_c=i

10、+1;调用函数d_to_c(c,str_c,start_c)图6:乘法运算函数的N-S图 定义变量str_aN, str_bN,str_cN ,cN,rmdN;tempN; i,k,len_rmd, len1,len2,cur;len1=strlen(str_a); len2=strlen(str_b)strcpy(rmd, str_a)rmdlen2='0'cur=len2-1 cur记下当前商对应的a中的下标if(compare(rmd, str_b)<0)T F cur+; rmdcur=str_acur; rmdcur+1='0'K=0while(

11、str_acur!='0')while(compare(rmd,str_b)>=0)sub(rmd, str_b, temp);ck+;strcpy(rmd, temp);cur+len_rmd=strlen(rmd)rmdlen_rmd=str_acurrmdlen_rmd+1='0'for(i=0;i<k;i+)str_ci=ci+'0'memset(c,0,sizeof(c)k+str_ci='0'图7:除法运算函数的N-S图for(i=1; ;i+)调用输出格式函数welcome()输入一个数x判断x是否等于0

12、T F定义变量x,i, str_aN,str_bN,str_cN;输出(“程序结束,欢迎 您的使用!”)并结束程序while(x>4|x<0)输出("输入错误,请重新输入) 再次输入一个数字 输出(”请输入需要的两个数”)输入一个数再输入一个数switch()case 1:运行加法运算case 2:运行减法运算case 3:运行乘法运算case 4:运行除法运算输出结果图8:运行四则运算的主函数的N-S图5 程序运行数据及其结果1) 测试加法输入1再输入1234567890和1234567890987图一 加法运算结果2) 测试减法输入2再输入123123123132和1

13、23123123 图二 减法运算结果3) 测试乘法输入3再输入12363445234和23452435图三 乘法运算结果4) 测试除法输入4再输入1234567890和123456789图四 除法运算结果5) 退出输入0图五 退出程序6 课程设计心得 这次我的课程设计是大整数的四则运算,由于平常使用的32位操作系统上,整形数的长度是32位,即四个字节,对于一般的应用,这个长度的整数已经足够。但是在某些领域,中,经常需要用到长达128位(16字节)的整数,对于这种整数,内部型是无法进行计算的,所以我将大整数用字符串,数组的形式表示出来,用于它的四则运算。 通过此次课程设计,使我更加扎实的掌握了有

14、关c语言设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。 在课程设计过程中,不断发现错误,不断改正,不断领悟,不断获取。在设计中遇到了很多问题,最后在老师的指导以及同学的帮助下,终于迎刃而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘。 附录:#include<stdio.h>

15、#include<string.h>#define N 256int min(int x, int y)return x<y?x:y;int c_to_d(char strN, char dN)/把str的各位转变成对应整数,右对齐存入d, start为最高位下标int len,start; /strlen(str)=5 N=10 start =10-5=5 int i,j;for(i=0;i<N;i+)di=0;len=strlen(str);start=N-len;for(i=0,j=start;i<len;i+,j+)dj=stri-'0'r

16、eturn start;void d_to_c(char dN, char strN, int start)/把d中数字dstart.N-1转变为字符左对齐存入strint i,j;int len=N-start;for(i=0,j=start; i<len; i+,j+)stri=dj+'0'strlen='0'/加法additionvoid add(char str_aN, char str_bN, char str_cN)char aN, bN,cN; /以右对齐的方式存储各位数int i;int start_a,start_b,start_c;/分

17、别存储a,b,c中最高位的下标int carry;/进位/把str_a,str_b的各位转变成对应整数,右对齐存入a,bstart_a=c_to_d(str_a, a);start_b=c_to_d(str_b, b);/从低位到高位,对应位相加i=N-1;carry=0;start_c=min(start_a,start_b);while(i>=start_c)ci=ai+bi+carry;carry=ci/10;ci=ci%10;i-;/如果有进位if(carry>0)start_c-;cstart_c=carry;/把c转化为字符串str_cd_to_c(c, str_c,

18、start_c);/减法,subtrationvoid sub(char str_aN, char str_bN, char str_cN)/已假设a>bchar aN, bN,cN; /以右对齐的方式存储各位数int i;int start_a,start_b;/分别存储a,b,c中最高位的下标int borrow;/借位/把str_a,str_b的各位转变成对应整数,右对齐存入a,bstart_a=c_to_d(str_a, a);start_b=c_to_d(str_b, b);/从低位到高位,对应位相减,注意借位memset(c,0,sizeof(c);/将c中有效的个字节替换为

19、并返回c;i=N-1;borrow=0;while(i>=start_a)ci=ai-bi-borrow;if(ci<0) /借位borrow=1;ci+=10;else /注意不可缺省borrow=0;i-; /去掉结果前面的while(i<N && ci=0 )i+;/把c转化为字符串str_cd_to_c(c, str_c, i);/i是c中最高位下标 int compare(char str1N, char str2N) /str1,str2内存的是要进行比较的大整数 /如果前者大于后者,返回正数,若相等返回,否则返回负数int len1,len2;l

20、en1=strlen(str1);len2=strlen(str2);if(len1<len2)return -1;else if(len1>len2)return 1;elsereturn strcmp(str1,str2);/乘法multiplicationvoid mul(char str_aN, char str_bN, char str_cN)int len1, len2,i,j,k,carry;char aN, bN, cN, dN;int start_a, start_b, start_c, start_d;len1=strlen(str_a);len2=strlen

21、(str_b);/把str_a,str_b的各位转变成对应整数,右对齐存入a,bstart_a=c_to_d(str_a, a);start_b=c_to_d(str_b, b);memset(c, 0, sizeof(c);/用bj(j=N-1,N-2.,) 乘a,存入d,再把d累加到c中,注意错位问题,d的最低位下标不是N-1,而是jfor(j=N-1;j>=start_b;j-)memset(d, 0, sizeof(d);carry=0;for(i=N-1,k=j;i>=start_a;i-,k-) /注意d的最低位下标从j开始,而不是从N-1开始dk=ai*bj;carr

22、y=dk/10;dk=dk%10;/如果有进位if(carry>0)dk=carry;k-;start_d=k+1;/把d累加到c中carry=0;for(i=N-1;i>=start_d;i-)ci=ci+di+carry;carry=ci/10;ci=ci%10;/如果有进位if(carry>0)ci=carry;i-;start_c=i+1;/把c转化为字符串str_cd_to_c(c, str_c, start_c);/除法。divisionvoid divd(char str_aN, char str_bN, char str_cN)/已假设a>bchar c

23、N; /以左对齐的方式存储各位数char rmdN;/存储余数char tempN;int i,k,len_rmd, len1,len2,cur;memset(c,0,sizeof(c);/准备工作,先在被除数中取和除数同样多的位数len1=strlen(str_a);len2=strlen(str_b);strcpy(rmd, str_a);rmdlen2='0'cur=len2-1; /cur记下当前商对应的a中的下标/如果不够除,再向右取位if(compare(rmd, str_b)<0)cur+;rmdcur=str_acur;rmdcur+1='0

24、9;/求商的过程是从高位到低位进行,商的每一位计算:需要多次执行减法,减法次数即商的一位。k=0;while(str_acur!='0')while(compare(rmd,str_b)>=0) /本循环确定str_acur对应位置的商sub(rmd, str_b, temp);ck+;strcpy(rmd, temp);/右移一位后继续上述过程cur+;len_rmd=strlen(rmd);rmdlen_rmd=str_acur;/照抄被除数的一位rmdlen_rmd+1='0'k+;/将c0.k-1转换成字符存入str_cfor(i=0;i<k;i+)str_ci=ci+'0'str_ci='0'vo

温馨提示

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

评论

0/150

提交评论