大整数的四则运算 课程设计说明书.docx
《大整数的四则运算 课程设计说明书.docx》由会员分享,可在线阅读,更多相关《大整数的四则运算 课程设计说明书.docx(18页珍藏版)》请在冰豆网上搜索。
![大整数的四则运算 课程设计说明书.docx](https://file1.bdocx.com/fileroot1/2023-1/8/b2cfd871-e0b8-4f9a-8a17-578d54833513/b2cfd871-e0b8-4f9a-8a17-578d548335131.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图
图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)
{
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);
}
//乘法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;istr_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);
}
}
}