大整数的四则运算课程设计说明书.docx
《大整数的四则运算课程设计说明书.docx》由会员分享,可在线阅读,更多相关《大整数的四则运算课程设计说明书.docx(19页珍藏版)》请在冰豆网上搜索。
![大整数的四则运算课程设计说明书.docx](https://file1.bdocx.com/fileroot1/2022-10/10/026e7030-1386-4ca4-ad9d-a219d97e313a/026e7030-1386-4ca4-ad9d-a219d97e313a1.gif)
大整数的四则运算课程设计说明书
中北大学
课程设计说明书
学院、系:
软件学院
专业:
软件工程
学生姓名:
宋雨琪
学号:
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图
while(imemset(c,0,sizeof(c),)将c中有效的个字节替换为0并返回c
i=N-1;borrow=0
while(i>=start_a)
c[i]=a[i]-b[i]-borrow
如果有借位
TF
borrow=1;c[i]+=10
borrow=1;i--
i++
图4:
减法运算函数sub()的N-S图
图5:
比较函数compare()的N-S图
for(j=N-1;j>=start_b;j--)
memset(c,0,sizeof(c),)
carry=0;
for(i=N-1,k=j;i>=start_a;i--,k--)
d[k]=a[i]*b[j];
carry=d[k]/10;
d[k]=d[k]%10;
if(carry>0)如果有进位
TF
d[k]=carry;
k--;
start_d=k+1;把d累加到c中
memset(c,0,sizeof(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)
TF
c[i]=carry;
i--;
start_c=i+1;
调用函数d_to_c(c,str_c,start_c)
图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)
{
returnxx:
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;id[i]=0;
len=strlen(str);
start=N-len;
for(i=0,j=start;id[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;istr[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(len1return-1;
elseif(len1>len2)return1;
else
returnstrcmp(str1,str2);
}