中 北 大 学
课程设计说明书
学 院、系:
软件学院
专 业:
软件工程
学 生 姓 名:
宋雨琪
学 号:
1221011205
设 计 题 目:
大整数的四则运算
起 迄 日 期:
2013年10月11日~2013年11月16日
指 导 教 师:
薛海丽
日期: 2013年11月16日
1 设计目的
本课程设计是采用C语言,在VC平台下实现大整数的四则运算,该系统运行在MS-DOS命令行模式下。本课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。
1)进一步巩固和复习C程序设计的基础知识;
2)培养学生结构化程序、模块化程序设计的方法和能力;
3)了解软件的编制过程及各环节的具体内容;
4)提高学生程序调试技巧、软件设计能力和代码
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
化等素质;
提高学生分析问题、解决问题以及实际运用能力。
2 任务概述
完成大整数的四则运算任务,假定整数不超过五十位要求:
1) 在屏幕上能够手动输入待求的两个大整数;
2) 输入完成后通过选择可以完成大整数的加、减、乘、除运算;
3)将结果分别显示在屏幕上。
4) 验收时程序能够演示,自己单独做。
3 模块划分
1) 定义c_to_d(char str[N], char d[N])
函
关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函
数,实现把str的各位转变成对应整数,右对齐存入d, start为最高位下标
2)定义d_to_c(char d[N], char str[N], int start)函数,实现把d中数字d[start...N-1]转变为字符左对齐存入str
3)定义加法函数
4)定义减法函数
5)定义乘法函数
6)定义除法函数
7)定义输出格式函数
8)运用主函数计算
4 主要函数说明及其N-S图
1)主函数说明
①定义变量
②输入要进行运算代码数字
③输入数字
④调用函数进行运算
2)其他函数说明
①min函数,比较两数大小
②c_to_d(char str[N], char d[N])函数,实现把str的各位转变成对应整数,右对齐存入d, start为最高位下标
③d_to_c(char d[N], char str[N], int start)函数,实现把d中数字d[start...N-1]转变为字符左对齐存入str
④add(char str_a[N], char str_b[N], char str_c[N]),加法函数
⑤sub(char str_a[N], char str_b[N], char str_c[N]),减法函数
⑥compare(char str1[N], char str2[N]) ,实现str1,str2内存的是要进行比较的大整数
⑦mul(char str_a[N], char str_b[N], char str_c[N]),乘法函数
⑧divd(char str_a[N], char str_b[N], char str_c[N]),除法函数
主要函数的N-S图:
return start
图1:函数c_to_d(char str[N],char d[N]) N-S图
str[len]=’\0’
图2:函数d_to_c(char d[N],char str[N],int start) N-S图
调用函数d_to_c()
图3:加法运算函数add()的N-S图
调用函数d_to_c()
调用函数c_to_d()
定义变量 str_a[N], str_b[N], str_c[N] a[N], b[N],c[N],i, start_a,start_b,start_c,borrow
i++
图4:减法运算函数sub()的N-S图
len1=strlen(str1)
return 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_a[N], str_b[N], str_c[N],len1, len2,i,j,k,carry,a[N], b[N], c[N], d[N],start_a, start_b, start_c, start_d
调用函数d_to_c(c,str_c,start_c)
图6:乘法运算函数的N-S图
定义变量str_a[N], str_b[N],str_c[N] ,c[N],rmd[N];temp[N]; i,k,len_rmd, len1,len2,cur;
str_c[i]='\0'
图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字节)的整数,对于这种整数,内部型是无法进行计算的,所以我将大整数用字符串,数组的形式
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示出来,用于它的四则运算。
通过此次课程设计,使我更加扎实的掌握了有关c语言设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
在课程设计过程中,不断发现错误,不断改正,不断领悟,不断获取。在设计中遇到了很多问题,最后在老师的指导以及同学的帮助下,终于迎刃而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘。
附录:
#include
#include
#define N 256
int min(int x, int y)
{
return x=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
void sub(char str_a[N], char str_b[N], char str_c[N])
{//已假设a>b
char a[N], b[N],c[N]; //以右对齐的方式存储各位数
int i;
int start_a,start_b;//分别存储a,b,c中最高位的下标
int borrow;//借位
//把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(ilen2)return 1;
else
return strcmp(str1,str2);
}
//乘法multiplication
void mul(char str_a[N], char str_b[N], char str_c[N])
{
int len1, len2,i,j,k,carry;
char a[N], b[N], c[N], d[N];
int start_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
void divd(char str_a[N], char str_b[N], char str_c[N])
{//已假设a>b
char c[N]; //以左对齐的方式存储各位数
char rmd[N];//存储余数
char temp[N];
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);
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;i4||x<0)
{
printf("输入错误,请重新输入\n");
scanf("%d",&x);
}
printf("请输入需要的两个数\n");
scanf("%s",str_a);
scanf("%s",str_b);
switch(x)
{
case 1:add(str_a,str_b,str_c); break;
case 2:sub(str_a,str_b,str_c); break;
case 3:mul(str_a,str_b,str_c); break;
case 4:divd(str_a,str_b,str_c); break;
}
printf("=%s\n\n",&str_c);
}
}
}