大整数的四则运算 课程设计说明书.docx
- 文档编号:6614062
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:18
- 大小:319.66KB
大整数的四则运算 课程设计说明书.docx
《大整数的四则运算 课程设计说明书.docx》由会员分享,可在线阅读,更多相关《大整数的四则运算 课程设计说明书.docx(18页珍藏版)》请在冰豆网上搜索。
大整数的四则运算课程设计说明书
中北大学
课程设计说明书
学院、系:
软件学院
专业:
软件工程
学生姓名:
宋雨琪
学号:
1221011205
设计题目:
大整数的四则运算
起迄日期:
2013年10月11日~2013年11月16日
指导教师:
薛海丽
日期:
2013年11月16日
1设计目的
本课程设计是采用C语言,在VC平台下实现大整数的四则运算,该系统运行在MS-DOS命令行模式下。
本课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
提高学生适应实际,实践编程的能力。
1)进一步巩固和复习C程序设计的基础知识;
2)培养学生结构化程序、模块化程序设计的方法和能力;
3)了解软件的编制过程及各环节的具体内容;
4)提高学生程序调试技巧、软件设计能力和代码规范化等素质;
提高学生分析问题、解决问题以及实际运用能力。
2任务概述
完成大整数的四则运算任务,假定整数不超过五十位要求:
1)在屏幕上能够手动输入待求的两个大整数;
2)输入完成后通过选择可以完成大整数的加、减、乘、除运算;
3)将结果分别显示在屏幕上。
4)验收时程序能够演示,自己单独做。
3模块划分
1)定义c_to_d(charstr[N],chard[N])函数,实现把str的各位转变成对应整数,右对齐存入d,start为最高位下标
2)定义d_to_c(chard[N],charstr[N],intstart)函数,实现把d中数字d[start...N-1]转变为字符左对齐存入str
3)定义加法函数
4)定义减法函数
5)定义乘法函数
6)定义除法函数
7)定义输出格式函数
8)运用主函数计算
4主要函数说明及其N-S图
1)主函数说明
①定义变量
②输入要进行运算代码数字
③输入数字
④调用函数进行运算
2)其他函数说明
①min函数,比较两数大小
②c_to_d(charstr[N],chard[N])函数,实现把str的各位转变成对应整数,右对齐存入d,start为最高位下标
③d_to_c(chard[N],charstr[N],intstart)函数,实现把d中数字d[start...N-1]转变为字符左对齐存入str
④add(charstr_a[N],charstr_b[N],charstr_c[N]),加法函数
⑤sub(charstr_a[N],charstr_b[N],charstr_c[N]),减法函数
⑥compare(charstr1[N],charstr2[N]),实现str1,str2内存的是要进行比较的大整数
⑦mul(charstr_a[N],charstr_b[N],charstr_c[N]),乘法函数
⑧divd(charstr_a[N],charstr_b[N],charstr_c[N]),除法函数
主要函数的N-S图:
图1:
函数c_to_d(charstr[N],chard[N])N-S图
图2:
函数d_to_c(chard[N],charstr[N],intstart)N-S图
图3:
加法运算函数add()的N-S图
图4:
减法运算函数sub()的N-S图
图5:
比较函数compare()的N-S图
图6:
乘法运算函数的N-S图
图7:
除法运算函数的N-S图
图8:
运行四则运算的主函数的N-S图
5程序运行数据及其结果
1)测试加法
输入1
再输入1234567890和1234567890987
图一加法运算结果
2)测试减法
输入2
再输入123123123132和123123123
图二减法运算结果
3)测试乘法
输入3
再输入12363445234和23452435
图三乘法运算结果
4)测试除法
输入4
再输入1234567890和123456789
图四除法运算结果
5)退出
输入0
图五退出程序
6课程设计心得
这次我的课程设计是大整数的四则运算,由于平常使用的32位操作系统上,整形数的长度是32位,即四个字节,对于一般的应用,这个长度的整数已经足够。
但是在某些领域,中,经常需要用到长达128位(16字节)的整数,对于这种整数,内部型是无法进行计算的,所以我将大整数用字符串,数组的形式表示出来,用于它的四则运算。
通过此次课程设计,使我更加扎实的掌握了有关c语言设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
在课程设计过程中,不断发现错误,不断改正,不断领悟,不断获取。
在设计中遇到了很多问题,最后在老师的指导以及同学的帮助下,终于迎刃而解。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘。
附录:
#include
#include
#defineN256
intmin(intx,inty)
{
returnx x: y; } intc_to_d(charstr[N],chard[N]) {//把str的各位转变成对应整数,右对齐存入d,start为最高位下标 intlen,start;//strlen(str)=5N=10start=10-5=5 inti,j; for(i=0;i d[i]=0; len=strlen(str); start=N-len; for(i=0,j=start;i d[j]=str[i]-'0'; returnstart; } voidd_to_c(chard[N],charstr[N],intstart) { //把d中数字d[start...N-1]转变为字符左对齐存入str inti,j; intlen=N-start; for(i=0,j=start;i str[i]=d[j]+'0'; str[len]='\0'; } //加法addition voidadd(charstr_a[N],charstr_b[N],charstr_c[N]) { chara[N],b[N],c[N];//以右对齐的方式存储各位数 inti; intstart_a,start_b,start_c;//分别存储a,b,c中最高位的下标 intcarry;//进位 //把str_a,str_b的各位转变成对应整数,右对齐存入a,b start_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) { c[i]=a[i]+b[i]+carry; carry=c[i]/10; c[i]=c[i]%10; i--; } //如果有进位 if(carry>0) { start_c--; c[start_c]=carry; } //把c转化为字符串str_c d_to_c(c,str_c,start_c); } ////减法,subtration voidsub(charstr_a[N],charstr_b[N],charstr_c[N]) {//已假设a>b chara[N],b[N],c[N];//以右对齐的方式存储各位数 inti; intstart_a,start_b;//分别存储a,b,c中最高位的下标 intborrow;//借位 //把str_a,str_b的各位转变成对应整数,右对齐存入a,b start_a=c_to_d(str_a,a); start_b=c_to_d(str_b,b); //从低位到高位,对应位相减,注意借位 memset(c,0,sizeof(c));//将c中有效的个字节替换为并返回c; i=N-1; borrow=0; while(i>=start_a) { c[i]=a[i]-b[i]-borrow; if(c[i]<0)//借位 { borrow=1; c[i]+=10; } else//注意不可缺省 borrow=0; i--; } //去掉结果前面的 while(i //把c转化为字符串str_c d_to_c(c,str_c,i);//i是c中最高位下标 } intcompare(charstr1[N],charstr2[N])//str1,str2内存的是要进行比较的大整数 {//如果前者大于后者,返回正数,若相等返回,否则返回负数 intlen1,len2; len1=strlen(str1); len2=strlen(str2); if(len1 return-1; elseif(len1>len2)return1; else returnstrcmp(str1,str2); } //乘法multiplication voidmul(charstr_a[N],charstr_b[N],charstr_c[N]) { intlen1,len2,i,j,k,carry; chara[N],b[N],c[N],d[N]; intstart_a,start_b,start_c,start_d; len1=strlen(str_a); len2=strlen(str_b); //把str_a,str_b的各位转变成对应整数,右对齐存入a,b start_a=c_to_d(str_a,a); start_b=c_to_d(str_b,b); memset(c,0,sizeof(c)); //用b[j](j=N-1,N-2....,)乘a,存入d,再把d累加到c中,注意错位问题,d的最低位下标不是N-1,而是j for(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开始 { d[k]=a[i]*b[j]; carry=d[k]/10; d[k]=d[k]%10; } //如果有进位 if(carry>0) { d[k]=carry; k--; } start_d=k+1; //把d累加到c中 carry=0; for(i=N-1;i>=start_d;i--) { c[i]=c[i]+d[i]+carry; carry=c[i]/10; c[i]=c[i]%10; } //如果有进位 if(carry>0) { c[i]=carry; i--; } } start_c=i+1; //把c转化为字符串str_c d_to_c(c,str_c,start_c); } ///除法。 division voiddivd(charstr_a[N],charstr_b[N],charstr_c[N]) {//已假设a>b charc[N];//以左对齐的方式存储各位数 charrmd[N];//存储余数 chartemp[N]; inti,k,len_rmd,len1,len2,cur; memset(c,0,sizeof(c)); //准备工作,先在被除数中取和除数同样多的位数 len1=strlen(str_a); len2=strlen(str_b); strcpy(rmd,str_a); rmd[len2]='\0'; cur=len2-1;//cur记下当前商对应的a中的下标 //如果不够除,再向右取位 if(compare(rmd,str_b)<0) { cur++; rmd[cur]=str_a[cur]; rmd[cur+1]='\0'; } //求商的过程是从高位到低位进行,商的每一位计算: 需要多次执行减法,减法次数即商的一位。 k=0; while(str_a[cur]! ='\0') { while(compare(rmd,str_b)>=0)//本循环确定str_a[cur]对应位置的商 { sub(rmd,str_b,temp); c[k]++; strcpy(rmd,temp); } //右移一位后继续上述过程 cur++; len_rmd=strlen(rmd); rmd[len_rmd]=str_a[cur];//照抄被除数的一位 rmd[len_rmd+1]='\0'; k++; } //将c[0...k-1]转换成字符存入str_c for(i=0;i str_c[i]=c[i]+'0'; str_c[i]='\0'; } voidwelcome() { printf("***********************大整数四则运算***********************\n"); printf("**************请选择要进行的四则运算对应选项: *************\n"); printf("**************1: 加法运算。 *************\n"); printf("**************2: 减法运算。 *************\n"); printf("**************3: 乘法运算。 *************\n"); printf("**************4: 除法运算。 *************\n"); printf("**************0: 退出。 *************\n"); printf("************************************************************\n"); } intmain() { intx,i; charstr_a[N],str_b[N],str_c[N]; for(i=1;;i++) { welcome(); scanf("%d",&x); if(x==0) { printf("程序结束! 感谢您的使用! \n"); return0; } else { while(x>4||x<0) { printf("输入错误,请重新输入\n"); scanf("%d",&x); } printf("请输入需要的两个数\n"); scanf("%s",str_a); scanf("%s",str_b); switch(x) { case1: add(str_a,str_b,str_c);break; case2: sub(str_a,str_b,str_c);break; case3: mul(str_a,str_b,str_c);break; case4: divd(str_a,str_b,str_c);break; } printf("=%s\n\n",&str_c); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大整数的四则运算 课程设计说明书 整数 四则运算 课程设计 说明书