c语言程序设计报告超大数据的运算_第1页
c语言程序设计报告超大数据的运算_第2页
c语言程序设计报告超大数据的运算_第3页
c语言程序设计报告超大数据的运算_第4页
c语言程序设计报告超大数据的运算_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计报告——超大数据运算tax第第页C语言课程设计报告题目:#1超大数据的运算学院:班级:学生:tax学号:提交日期:

目录需求分析31.题目要求32.限制条件及具体目标3总体设计31.完成过程32.问题与解决方法33.程序设计思想4详细设计51.函数列表52.函数关系调用图5程序运行结果测试与分析5结论与心得9附源代码9需求分析1.题目要求对超大型数据(考虑负数和小数)进行存储、运算和输出打印。运算具体要求如下:进行四则运算;整数型超大数据的阶乘;超大型数据某范围内孪生质数的判断输出;超大型数据文件的存储和读取。2.限制条件及具体目标将数据要求为超大型且考虑负数与小数,即各种数据类型都要考虑,并处理超出各种数据类型所能表示范围的数据;运算要求包括四则运算、阶乘、孪生质数的判断;程序要求支持文件的存储和读取。二、总体设计1.完成过程本程序的目标是完成超大数据(以下简称大数)的运算,考虑负数和小数意味着数据类型要带符号并且包括浮点数据,所谓超大,即超出数据类型所能保存的范围,会发生溢出的情况,其次是大数的正常显示也无法通过一般数据类型实现,主要思想是利用字符串对大数进行保存,然后分析各种要求的四则运算,阶乘运算,孪生质数判断的过程,接下来模拟运算过程编写算法即可。在各个算法的编写过程中插入文件的创建打开与写入,从而实现文件的存储和读取。至此本程序的功能基本编写完成。2.问题与解决方法运算过程分析与模拟算法的编写本身比较复杂。因为考虑负数的要求,就必须有判断符号的过程,体现在加减法的运算中,就要求程序要能根据符号的正负来选择运算方式,从而得出正确的结果,体现在乘除法的运算中,则判断是否异号进而决定计算结果的符号,并且在余数的计算中还有更复杂的进位分析,再加上考虑小数的要求,问题的复杂度就又提高一层,在乘除运算中,可以通过将浮点大数转换为整数,记录两数小数位数,计算得到的基础上再加上相应小数点即可。在加减法中小数点位置不会改变,将小数点对齐后再进行运算即可。阶乘运算在分析清算法后较容易实现,即实现循环的乘法。孪生质数则通过接受要求范围后循环进行素数判断(利用根号)至循环结束即可。程序设计思想三、详细设计1.函数列表voidjianfa(inta[],intb[],intf)voidjiafa(inta[],intb[],intf)voidchengfa(inta[],intb[])voidchufa(char*beichu,char*chu,char*shang,char*yu)voidsi_ze()voidjie_cheng()voidluansheng_zhishu()intmain()函数的调用关系图程序运行结果测试与分析经大量具代表性的数据测试,本程序已能实现预期功能,符合课程题目要求,能实现超大数据的四则运算、阶乘运算以及范围内孪生质数的判断输出,并将数据存储到指定文件中,程序演示效果如下:表格SEQ表格\*ARABIC1四则运算演示表格SEQ表格\*ARABIC2阶乘计算演示表格SEQ表格\*ARABIC3孪生质数演示表格SEQ表格\*ARABIC4数据文件存储演示五、结论与心得我主要负责阶乘运算的实现,并和小组成员一起实现其他运算功能1、刚开始考虑进位问题过于简单,导致测试数据时多次出错;2、分析运算方式并将其编写为算法的过程中花费了很大的功夫理解和编写,发现自己的编程思维还有待提升;3、开始写程序时源程序没有严格按单元模块结构编写,可读性较差。4、由于初次进行大规模的程序设计,层次结构划分不太合理,应在以后的设计中强化此思维,逐渐与高效简练的程序设计接轨。附源代码如下#include<stdio.h>#include<string.h>#include<conio.h>#include<math.h>#include<stdlib.h>#defineMAX101#defineN1000#defineM250000/*函数功能:利用字符串实现超长数加减法运算*/voidjianfa(inta[],intb[],intf);intlena,lenb,da=1,db=1;/*把lena,lenb设为全局变量,lena纪录第一个超长型数组的位数,lenb纪录第二个超长型数组的位数*/charb1[MAX],b2[MAX];/*纪录需要计算的两个超长型数据*/voidinput(inta1[],inta2[])/*函数input为输入函数,用来纪录两个待计算的超型数据,以数组首地址为参数.以实现返回两个超长型数据*/{ FILE*fp1; if((fp1=fopen("xxx.txt","a+"))==NULL) {printf("\ncannotcreat!"); exit(0); }inti,fa=1,fb=1;printf("请输入第一个数:\n");scanf("%s",b1); fputs(b1,fp1); fputs(",",fp1); printf("请输入第二个数:\n");/*输入两个超长型数据*/scanf("%s",b2); fputs(b2,fp1); lena=strlen(b1);/*lena纪录b1的位数*/lenb=strlen(b2);/*lenb纪录b2的位数*/if(b1[0]=='-'){lena--;da=-1;fa=0;}/*判断数组的符号*/if(b2[0]=='-'){lenb--;db=-1;fb=0;}for(i=0;i<lena;i++,fa++){a1[i]=b1[lena-fa]-'0';}/*把字符形数据b1转为整数形数据,同样用数组纪录*/for(i=0;i<lenb;i++,fb++)a2[i]=b2[lenb-fb]-'0';/*同上*/}voidjiafa(inta[],intb[],intf)/*超长型数据加法运算*/{ FILE*fp1;inti,c[MAX+1]={0},s; if((fp1=fopen("xxx.txt","a+"))==NULL) {printf("\ncannotcreat!"); exit(0); }if(da*db>0||f){if(lena>lenb)s=lena;elses=lenb;/*用s纪录结果的最大位数*/for(i=0;i<s;i++){c[i]=a[i]+b[i]+c[i];c[i+1]=(int)c[i]/10;/*c[i+1]代表进位*/c[i]=(int)c[i]%10;/*超长数加法运算过程*/}if(c[s])s++;/*判断最后结果的位数*/fputs("\n两者之和:\n",fp1); if(da<0&&f||da<0){printf("-");fputc('-',fp1);}for(i=s-1;i>=0;i--) {printf("%d",c[i]);fprintf(fp1,"%d",c[i]);}/*输出结果*/}elsejianfa(a,b,1);}voidjianfa(inta[],intb[],intf)/*超长数减法运算*/{ FILE*fp1;inti,u=0,c[MAX+1]={0},s; if((fp1=fopen("xxx.txt","a+"))==NULL) {printf("\ncannotcreat!"); exit(0); } fputs("\n两者之差:\n",fp1);if(da*db>0||f){if(lena>lenb)s=lena;else/*用s纪录结果的最大位数*/{s=lenb;for(i=s;a[i]<=b[i]&&i>=0;i--)if(a[i]<b[i])u=1;/*u纪录结果符号*/}if(!u)/*超长数减法运算过程*/for(i=0;i<s;i++){if(a[i]<b[i]){a[i+1]--;a[i]+=10;}c[i]=a[i]-b[i];}else/*当a<b时的处理*/for(i=0;i<s;i++){if(b[i]<a[i]){b[i+1]--;b[i]+=10;}c[i]=b[i]-a[i];}while(!c[s-1]&&s>1)s--;/*判断最后结果的位数*/if(f&&(da>0&&u||da<0&&!u)||da>0&&(db>0&&u||u&&!f)){printf("-");fputc('-',fp1);} if(da<0&&db<0&&!u){printf("-");fputc('-',fp1);}/*如果u为真是输出负号*/for(i=s-1;i>=0;i--){printf("%d",c[i]);fprintf(fp1,"%d",c[i]);}}elsejiafa(a,b,1);}/*超长型数据乘除法运算*/voidchengfa(inta[],intb[])/*超长数乘法运算*/{ FILE*fp1;inti,j,c[2*MAX]={0},s;s=lena+lenb-1;/*用s纪录结果的最大位数*/ if((fp1=fopen("xxx.txt","a+"))==NULL) {printf("\ncannotcreat!"); exit(0); } fputs("\n两者之积:\n",fp1);for(i=0;i<lena;i++)/*超长数乘法运算过程*/for(j=0;j<lenb;j++){c[i+j]=a[i]*b[j]+c[i+j];c[i+j+1]=c[i+j]/10+c[i+j+1];c[i+j]=c[i+j]%10;}while(!c[s])s--;/*判断最后结果的位数*/if(da*db<0){printf("-");fputc('-',fp1);}for(i=s;i>=0;i--){printf("%d",c[i]);fprintf(fp1,"%d",c[i]);}/*输出结果*/}//比较两个用字符串存储的超长数的大小,若a>b,返回1;a==b,返回0;a<b,返回-1intCompare(constchar*a,constchar*b){intlenA=strlen(a);intlenB=strlen(b);if(a[0]=='-')lenA--;if(b[0]=='-')lenB--;if(lenA!=lenB)returnlenA>lenB?1:-1;elsereturnstrcmp(a,b);}//超长正数的减法,且被减数大于减数voidcha(char*beijian,char*jian,char*chas){intcB[MAX]={0};//用来存储被减数的整型数组intcJ[MAX]={0};//用来存储减数的整型数组intcC[MAX]={0};//用来存储两数之差的整型数组intlenM=strlen(beijian),lenS=strlen(jian);//被减数和减数字符串的长度inti;//逆序复制减数和被减数到整型数组(因为减法运算是从低位开始),保证cB大于cJfor(i=0;i<lenM;i++)cB[i]=beijian[lenM-1-i]-'0';for(i=0;i<lenS;i++)cJ[i]=jian[lenS-1-i]-'0';for(i=0;i<lenM;i++)//减法运算过程{if(cB[i]>=cJ[i])//被减数大于减数,直接相减cC[i]=cB[i]-cJ[i];else//否则要向前借位{cC[i]=cB[i]+10-cJ[i];--cB[i+1];}}while(cC[i-1]==0)i--;intj=0;intk;for(k=i-1;k>=0;k--,j++)//逆序存储两数之差到字符串chaschas[j]=cC[k]+'0';chas[j]='\0';}voidchufa(char*beichu,char*chu,char*shang,char*yu)//超长型数据的整除,求余运算{ intlenv=strlen(beichu),lens=strlen(chu); if(beichu[0]=='-') { da=-1;//判断数组的符号 for(inti=0;i<lenv;i++) { beichu[i]=beichu[i+1]; } lenv--; } if(chu[0]=='-') { db=-1; for(inti=0;i<lens;i++) { chu[i]=chu[i+1]; } lens--; }if(Compare(beichu,chu)==0)//被除数等于除数{strcpy(shang,"1");strcpy(yu,"0");return;}if(strcmp(chu,"0")==0||Compare(beichu,chu)<0)//被除数小于除数{strcpy(shang,"0");strcpy(yu,beichu);return;}charbuf[2]="0";//临时数组依次存储被除数的每一位数inti,s,k;strcpy(yu,"");//先使余数的值为空for(i=0,k=0;beichu[i]!='\0';i++){s=0;buf[0]=beichu[i];strcat(yu,buf);//接上被除数的一位数,改变当前余数while(Compare(yu,chu)>=0)//连减试商{s++;cha(yu,chu,yu);}shang[k++]=s+'0';//记录每一位得到的商值if(strcmp(yu,"0")==0)strcpy(yu,"");//使余数的值为空,去掉多余的0}shang[k]='\0';//去掉多余的0intj;for(i=0;shang[i]=='0';i++);for(j=i;j<=k;j++)shang[j-i]=shang[j];}voidput_chufa(){ FILE*fp1; if((fp1=fopen("xxx.txt","a+"))==NULL) {printf("\ncannotcreat!"); exit(0); } charc[MAX]={0},d[MAX]={0};chufa(b1,b2,c,d);puts("两者之商:");fputs("\n两者之商:\n",fp1);if(da*db<0&&strcmp(c,"0")){printf("-");fputc('-',fp1);}puts(c); fputs(c,fp1);puts("余数:"); fputs("\n余数:\n",fp1);puts(d); fputs(d,fp1); fputc('\n',fp1);}voidsi_ze(){inta[MAX]={0},b[MAX]={0}; 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(); }/*超大数阶乘运算*/voidjie_cheng(){ FILE*fp1; charc='\n';intn; inti,j;inta[M];//存数运算结果intp,h;//p存储当前结果的位数,h为进位a[1]=1; printf("输入所要求的整数:");scanf("%d",&n); if((fp1=fopen("xxx.txt","a+"))==NULL) {printf("\ncannotcreat!"); exit(0); } fputs("\n阶乘:\n",fp1);p=1;for(i=2;i<=n;i++)//循环与2,3,4n相乘{for(j=1,h=0;j<=p;j++)//让a[]的每位与i相乘{a[j]=a[j]*i+h;h=a[j]/10;a[j]=a[j]%10;}while(h>0)//如果h不为0{a[j]=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",a[i]); fprintf(fp1,"%d",a[i]);}printf("%d\n",a[i]); fprintf(fp1,"%d",a[i]); fputc(c,fp1); fclose(fp1);}/*超大数据范围内孪生质数的输出*/intprime(longintn){longintr,i;r=(int)sqrt(n);for(i=2;i<=r;i++){if(n%i==0)//此处n%i==0,说明不是素数,立刻跳出循环return0;}return1;}voidluansheng_zhishu(){FILE*fp1;longintm,n,i,t=0; if((fp1=fopen("xxx.txt","a+"))==NULL) {printf("\ncannotcreat!"); exit(0); }printf("请输入范围m,n\n");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("%d\n",t);fprintf(fp1,"%d",t);fputc('\n',fp1);if(t==0){printf("无孪生素数!");//这个输出格式应该在循环外判定fputs("无孪生素数!",fp1);}//getch();}/*主函数*/intmain(){ intn; printf("选择想要进行的运算:1、四则运算,2、阶乘,3、孪生质数:"); scanf("%d",&n); switch(n) { case1:si_ze(); break; case2:jie_cheng(); break; case3:luansheng_zhishu(); break; default:exit(0); } return0;}目录TOC\o"1-2"\h\z\u第一章总论 1第二章项目提出的背景和必要性 4第一节项目建设背景 4第二节项目建设的必要性 4第三节项目建设的先进性 8第三章市场分析与建设规模 10第一节市场分析 10第二节建设规模 11第四章工艺技术方案及设备选型 12第一节工艺技术方案 12第二节主要设备方案 14第五章原料、辅助材料及燃料的供应 17第一节主要原材料、辅助材料及公用工程供应来源 17第二节主要公用工程用量及供应 18第六章厂址选择和建设条件 19第一节厂址选择 19第二节建设条件 19第七章总图运输、土建及公用工程 22第一节总平面布置及运输 P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论