1、c语言程序设计报告超大数据的运算C语言课程设计报告题目: #1 超大数据的运算 学 院: 班 级: 学 生: tax 学 号: 提交日期: 目录1、需求分析.3 1.题目要求.3 2.限制条件及具体目标.32、总体设计.3 1.完成过程.3 2.问题与解决方法.3 3.程序设计思想.43、详细设计.5 1.函数列表.5 2.函数关系调用图.54、程序运行结果测试与分析.55、结论与心得.9附源代码.91、需求分析1.题目要求 对超大型数据(考虑负数和小数)进行存储、运算和输出打印。运算具体要求如下:1) 进行四则运算;2) 整数型超大数据的阶乘;3) 超大型数据某范围内孪生质数的判断输出;4)
2、 超大型数据文件的存储和读取。2.限制条件及具体目标1) 将数据要求为超大型且考虑负数与小数,即各种数据类型都要考虑,并处理超出各种数据类型所能表示范围的数据;2) 运算要求包括四则运算、阶乘、孪生质数的判断;3) 程序要求支持文件的存储和读取。二、总体设计1.完成过程 本程序的目标是完成超大数据(以下简称大数)的运算,考虑负数和小数意味着数据类型要带符号并且包括浮点数据,所谓超大,即超出数据类型所能保存的范围,会发生溢出的情况,其次是大数的正常显示也无法通过一般数据类型实现,主要思想是利用字符串对大数进行保存,然后分析各种要求的四则运算,阶乘运算,孪生质数判断的过程,接下来模拟运算过程编写算
3、法即可。在各个算法的编写过程中插入文件的创建打开与写入,从而实现文件的存储和读取。至此本程序的功能基本编写完成。2.问题与解决方法 运算过程分析与模拟算法的编写本身比较复杂。因为考虑负数的要求,就必须有判断符号的过程,体现在加减法的运算中,就要求程序要能根据符号的正负来选择运算方式,从而得出正确的结果,体现在乘除法的运算中,则判断是否异号进而决定计算结果的符号,并且在余数的计算中还有更复杂的进位分析,再加上考虑小数的要求,问题的复杂度就又提高一层,在乘除运算中,可以通过将浮点大数转换为整数,记录两数小数位数,计算得到的基础上再加上相应小数点即可。在加减法中小数点位置不会改变,将小数点对齐后再进
4、行运算即可。阶乘运算在分析清算法后较容易实现,即实现循环的乘法。孪生质数则通过接受要求范围后循环进行素数判断(利用根号)至循环结束即可。3.程序设计思想三、详细设计1.函数列表void jianfa(int a,int b,int f)void jiafa(int a,int b,int f)void chengfa( int a, int b)void chufa(char *beichu, char *chu, char *shang, char *yu)void si_ze()void jie_cheng()void luansheng_zhishu()int main()2.函数的调用
5、关系图4、程序运行结果测试与分析 经大量具代表性的数据测试,本程序已能实现预期功能,符合课程题目要求,能实现超大数据的四则运算、阶乘运算以及范围内孪生质数的判断输出,并将数据存储到指定文件中,程序演示效果如下:表格 1 四则运算演示表格 2 阶乘计算演示表格 3 孪生质数演示表格 4 数据文件存储演示五、结论与心得 我主要负责阶乘运算的实现,并和小组成员一起实现其他运算功能 1、刚开始考虑进位问题过于简单,导致测试数据时多次出错;2、分析运算方式并将其编写为算法的过程中花费了很大的功夫理解和编写,发现自己的编程思维还有待提升;3、开始写程序时源程序没有严格按单元模块结构编写,可读性较差。4、由
6、于初次进行大规模的程序设计,层次结构划分不太合理,应在以后的设计中强化此思维,逐渐与高效简练的程序设计接轨。附源代码如下#include #include #include #include #include#define MAX 101#define N 1000#define M 250000/*函数功能:利用字符串实现超长数加减法运算 */void jianfa(int a,int b,int f); int lena,lenb,da=1,db=1; /* 把lena,lenb设为全局变量,lena纪录第一个超长型数组的位数,lenb纪录第二个超长型数组的位数*/char b1MAX,
7、b2MAX; /*纪录需要计算的两个超长型数据 */void input(int a1,int a2) /*函数input为输入函数,用来纪录两个待计算的超型数据,以数组首地址为参数.以实现返回两个超长型数据*/ FILE *fp1; if(fp1=fopen(xxx.txt,a+)=NULL) printf(n cannot creat!); exit(0); int i,fa=1,fb=1; printf(请输入第一个数:n); scanf ( %s, b1); fputs(b1,fp1); fputs( , ,fp1); printf(请输入第二个数:n); /*输入两个超长型数据*/
8、scanf(%s,b2); fputs(b2,fp1); lena = strlen( b1 ); /*lena纪录b1的位数*/ lenb = strlen( b2 ); /*lenb纪录b2的位数*/ if(b10=-) lena-; da=-1;fa=0; /*判断数组的符号*/ if(b20=-) lenb-; db=-1;fb=0; for (i=0; ilena; i+,fa+) a1i=b1lena-fa-0; /*把字符形数据b1转为整数形数据,同样用数组纪录*/ for (i=0; i0|f) if(lenalenb) s=lena; else s=lenb; /*用s纪录结
9、果的最大位数*/ for(i=0;is;i+) ci=ai+bi+ci; ci+1=(int)ci/10; /*ci+1代表进位*/ ci=(int)ci%10; /*超长数加法运算过程*/ if(cs) s+; /*判断最后结果的位数*/ fputs(n两者之和:n,fp1); if(da0&f|da=0;i-) printf(%d,ci); fprintf(fp1,%d,ci); /*输出结果*/ else jianfa(a,b,1); void jianfa(int a,int b,int f) /*超长数减法运算*/ FILE *fp1; int i,u=0,cMAX+1=0,s; i
10、f(fp1=fopen(xxx.txt,a+)=NULL) printf(n cannot creat!); exit(0); fputs(n两者之差:n,fp1); if(da*db0|f) if(lenalenb) s=lena; else /*用s纪录结果的最大位数*/ s=lenb; for(i=s;ai=0;i-) if(aibi) u=1; /*u纪录结果符号*/ if(!u) /*超长数减法运算过程*/ for(i=0;is;i+) if(aibi) ai+1-; ai+=10; ci=ai-bi; else /*当ab时的处理*/ for(i=0;is;i+) if(bi1)
11、s-; /*判断最后结果的位数*/ if(f&(da0&u|da0&(db0&u|u&!f) printf(-);fputc(-,fp1); if(da0&db=0;i-) printf(%d,ci);fprintf(fp1,%d,ci); else jiafa(a,b,1); /*超长型数据乘除法运算 */void chengfa( int a, int b) /*超长数乘法运算*/ FILE *fp1; int i, j, c2*MAX = 0,s; s = lena + lenb - 1; /*用s纪录结果的最大位数*/ if(fp1=fopen(xxx.txt,a+)=NULL) pr
12、intf(n cannot creat!); exit(0); fputs(n两者之积:n,fp1); for(i = 0; i lena; i+) /*超长数乘法运算过程*/ for(j = 0;j lenb; j+) ci+j = ai * bj + ci+j; ci+j+1 = ci+j / 10 + ci+j+1; ci+j = ci+j % 10; while(!cs) s-; /*判断最后结果的位数*/ if(da*db= 0; i-) printf(%d,ci);fprintf(fp1,%d,ci); /*输出结果*/ /比较两个用字符串存储的超长数的大小,若ab,返回1;a=b
13、,返回0;a lenB ? 1 : -1;else return strcmp(a,b);/超长正数的减法,且被减数大于减数void cha(char *beijian, char *jian, char *chas)int cBMAX = 0;/用来存储被减数的整型数组int cJMAX = 0;/用来存储减数的整型数组int cCMAX = 0;/用来存储两数之差的整型数组int lenM = strlen(beijian), lenS = strlen(jian);/被减数和减数字符串的长度int i;/逆序复制减数和被减数到整型数组(因为减法运算是从低位开始),保证cB大于cJ for
14、 (i=0; ilenM; i+) cBi = beijianlenM-1-i - 0; for (i=0; ilenS; i+) cJi = jianlenS-1-i - 0;for (i=0; i= cJi)/被减数大于减数,直接相减 cCi = cBi - cJi; else /否则要向前借位 cCi = cBi + 10 - cJi; -cBi+1; while (cCi-1 = 0) i-;int j = 0;int k;for (k=i-1; k=0; k-,j+)/逆序存储两数之差到字符串chas chasj = cCk + 0;chasj = 0;void chufa(char
15、 *beichu, char *chu, char *shang, char *yu) /超长型数据的整除,求余运算 int lenv=strlen(beichu),lens=strlen(chu); if(beichu0=-) da=-1; /判断数组的符号 for(int i=0;ilenv;i+) beichui=beichui+1; lenv-; if(chu0=-) db=-1; for(int i=0;ilens;i+) chui=chui+1; lens-; if (Compare(beichu, chu) = 0)/被除数等于除数 strcpy(shang, 1); strcp
16、y(yu, 0); return ;if (strcmp(chu, 0) = 0 | Compare(beichu, chu) = 0)/连减试商 s+; cha(yu, chu, yu); shangk+ = s + 0;/记录每一位得到的商值 if (strcmp(yu, 0) = 0) strcpy(yu, ); /使余数的值为空,去掉多余的0shangk = 0; /去掉多余的0int j;for (i=0; shangi=0; i+) ;for (j=i; j=k; j+) shangj-i = shangj;void put_chufa() FILE *fp1; if(fp1=fo
17、pen(xxx.txt,a+)=NULL) printf(n cannot creat!); exit(0); char cMAX = 0, dMAX = 0; chufa( b1, b2,c,d); puts(两者之商:); fputs(n两者之商:n,fp1); if(da*db0&strcmp(c,0) printf(-);fputc(-,fp1); puts(c); fputs(c,fp1); puts(余数:); fputs(n余数:n,fp1); puts(d); fputs(d,fp1); fputc(n,fp1);void si_ze() int aMAX=0,bMAX=0;
18、input(a,b); printf(n两者之和:n,b1,b2);jiafa(a,b,0); printf(n两者之差:n,b1,b2);jianfa(a,b,0); printf(n两者之积:n,b1,b2);chengfa(a,b); printf(n); getchar(); put_chufa(); /*超大数阶乘运算 */void jie_cheng() FILE *fp1; char c=n; int n; int i,j; int aM; /存数运算结果 int p,h; /p存储当前结果的位数,h为进位 a1=1; printf(输入所要求的整数:); scanf(%d,&n
19、); if(fp1=fopen(xxx.txt,a+)=NULL) printf(n cannot creat!); exit(0); fputs(n阶乘:n,fp1); p=1; for(i=2;i=n;i+) /循环与2,3,4.n相乘 for(j=1,h=0;j0) /如果h不为0 aj = h % 10 ; h = h / 10 ; j+; p = j - 1 ; /将当前的位数赋给p printf(%d!=,n); fprintf(fp1,%d,n); fputs(!=,fp1); for(i=p;i=2;i-) printf(%d,ai); fprintf(fp1,%d,ai);
20、printf(%dn,ai); fprintf(fp1,%d,ai); fputc(c,fp1); fclose(fp1);/*超大数据范围内孪生质数的输出 */ int prime(long int n) long int r,i; r=(int)sqrt(n); for(i=2;i=r;i+) if(n%i=0) /此处n%i=0,说明不是素数,立刻跳出循环 return 0; return 1; void luansheng_zhishu() FILE *fp1; long int m,n,i,t=0; if(fp1=fopen(xxx.txt,a+)=NULL) printf(n ca
21、nnot creat!); exit(0); printf(请输入范围m,nn); scanf(%d%d,&m,&n); fprintf(fp1,%d,m); fputc(,fp1); fprintf(fp1,%d,n); fputc(n,fp1); fputs(范围内孪生质数有:n,fp1); for(i=m;i=n-2;i+) /此处限制i=n-2,不然prime(i+2)超过范围;另外i每次自加1, /不能加2 if (prime(i)&prime(i+2) t+=1; printf(%d,%d)n,i,i+2); fputc(,fp1); fprintf(fp1,%d,i); fputc(,fp1); fprintf(fp1,%d,i+2); fputc(),fp1); fputc(n,fp1); printf(%dn,t); fprintf(fp1,%d,t); fputc(n,fp1); if(t=0) printf(无孪生素数!); /这个输出格式应该在循环外判定 fputs(无孪生素数!,fp1); /getch(); /*主函数*/int main() int n; printf(选择想要进行的运算:1、四则运算,2、阶乘,3、孪生
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1