C语言课程设计报告模版、C语言程序设计教程:天文数的阶乘计算_第1页
C语言课程设计报告模版、C语言程序设计教程:天文数的阶乘计算_第2页
C语言课程设计报告模版、C语言程序设计教程:天文数的阶乘计算_第3页
C语言课程设计报告模版、C语言程序设计教程:天文数的阶乘计算_第4页
C语言课程设计报告模版、C语言程序设计教程:天文数的阶乘计算_第5页
已阅读5页,还剩16页未读, 继续免费阅读

下载本文档

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

文档简介

程序设计语言课程设计报告PAGEPAGE3湖南科技大学课程设计报告设计题目运动会分数统计程序的设计院系:专业班级:学号:学生姓名:指导教师:2010年12月30日目录TOC\o"1-3"\u1 叙述 21.1 功能要求 21.2 程序描述 21.3 主要模块描述 31.4 功能结构 41.5 流程图 101.6 采用的算法 162 课程设计总结 17功能要求基本要求:输入各个项目的前三名或前五名的成绩;能统计各学校的总分;可以按学校编号、学校总分输出、男女团体总分输出可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五的学校拓展功能:可以输入学校名称,运动项目的名称程序描述本程序通过建立结构体然后对学校数及名称、男女项目数及其所取名次、项目名及其对应学校编号录入,然后根据所要的输出方式进行排序输出。主要模块描述intmain(){ SchEnter();//学校录入 ProjectEnter();//项目录入 MarkEnter();//成绩录入 MenuSelect();//菜单选择 return0;}voidMenuSelect(){……switch(z){ case1:RuajData();break;//学校编号排序输出 case2:TotalSort(1);break;//学校总分排序输出 case3:BoySort();break;//学校男生总分排序输出 case4:GirlSort();break;//学校女生总分排序输出 case5:NoQuery();break;//查询某个学校成绩 case6:SchQuery();break;//查询某个项目成绩 case7:SaveData();break;//退出保存}}功能结构该程序应具有的功能有输入,计算,排序,查看成绩,保存退出。主函数主函数学校录入项目录入成绩录入菜单选择学校编号排序退出保存查询某个项目成绩查询某个学校成绩学校女生总分排序学校男生总分排序男总分学校总分排序1:输入(1)功能描述:实现学校数和学校名、男女项目数和项目名以及成绩取前五的项目编号的录入,以及成绩的初始化和计算。(2)设计说明:为了使入字母程序不产生错误使用了atoi函数,为了使屏幕简洁化使用了清屏函数system("cls")。(3)操作说明:输入学校数目、男女项目数都得在1-20之间,成绩取前五的编号不得大于男女项目数的总和,学校名称、项目名称、成绩取前五的编号不得重复。学校录入的效果图如下如果输入的学校数目不是1-20则会提示出错,假如输入的学校名重复则会提醒你与第几个重复并要求重新输入。其效果图如下:项目录入效果图如下:如果输入的男女项目数不是1-20则会提示出错,假如输入名次取前五的编号及项目名称重复则会提醒你与第几个重复并要求重新输入。其效果图如下:成绩录入效果图如下:如果输入数字不在1-w+m(这里w,m分别取3)之间则会提示你出错,要求你重新输入;效果图如下:2.菜单选择(1)功能说明:给出功能选项(2)设计说明:使用了switch()函数,进行选项选择,为了使入字母程序不产生错误使用了atoi函数。(3)操作说明:这里只有7个功能,所以我们只能选择1-7之间的选项。其效果图如下:假如输入的不是1-7;则会提示出错,效果图如下:学校编号排序输出功能说明:按编号排列顺序输出其效果图如下:学校总分排序功能说明:按总分排列顺序输出其效果图如下:学校男生总分排序功能说明:按学校男生总分排列顺序输出其效果图如下:学校女生总分排序功能说明:按学校女生总分排列顺序输出其效果图如下:查询某个学校的成绩功能说明:根据所选的编号输出学校成绩。设计说明:通过比较找到所选编号数据然后输出,为了使入字母程序不产生错误使用了atoi函数。操作说明:编号数要在1-n之间,否则会提示出错。其效果图如下:如果输入的编号不是1-n则会提示你输入错误:查询某个项目的成绩功能说明:根据所选的项目编号输出项目名,及其获得名次的学校。设计说明:通过比较找到所选编号数据然后输出,为了使入字母程序不产生错误使用了atoi函数。操作说明:编号数要在1-w+m之间,否则会提示出错。其效果图如下:如果输入的编号不是1-w+m则会提示你输入错误:退出保存功能说明:fout.open()函数生成一个txt文档然后按总分排序读入成绩。设计说明:通过fout.open()函数生成一个txt文档,然后按总分排序将数据读入这个txt文档,如果选择退出,会执行exit(0)。操作说明:输入y退出,其他返回主菜单。其效果图如下:流程图主模块:开始开始学校输入项目输入成绩录入主菜单i学校编号排序输出校录入学校总分排序分排序目录入学校男生总分排序排序绩录入学校女生总分排序查询某个学校成绩查询某个项目成绩保存退出Y/Ni=1i=2i=3i=4i=5i=6i=7YN学校输入;i=1;i=1;开始1<=n<=20YN输入name判断与前面的名称是否相同i++;i<n数据初始化结束NYNY输入n项目输入:i=1;i=1;开始输入m,w1<=m<=201<=w<=20YN输入name判断与前面的名称是否相同i++;i<w+mNYNY是否有成绩取前五的项目输入编号编号是否正确确前五的项目是否输入完结束YNYNYN成绩录入:开始开始i=1;j=1;判断是否为成绩取前五的项目Y输入学校编号X;j<=5;输入学校编号X;1<=x<=n;Pro[i].snum[j]=x;sch[x].score+=integral[j-1];if(i<=m)sch[x].male+=integral[j-1];elsesch[x].female+=integral[j-1];j++;Pro[i].snum[j]=x;sch[x].score+=Integral[j-1];if(i<=m)sch[x].male+=Integral[j-1];elsesch[x].female+=Integral[j-1];j++;j<=3;i++;j=1;i<=w+m;1<=x<=n;结束YYYYNNNNY因为排序大致相似所以只选取学校编号排序作为代表学校编号排序:开始开始i=1;j=i;sch[i].num>sch[j].numt=sch[i];sch[i]=sch[j];sch[j]=t;j++;j<=n;i++;i<=n;i=1;print(i);i++;i<=n;结束YYYNNN采用的算法因为我们要进行排序,所以我们会用到线性表。typedefstruct{ intnum;//学校的编号 stringname;//学校名称 intscore;//学校总分 intmale;//男子总分 intfemale;//女子总分 }sch[21];学校的编号排序StatusArrange(){for(i=1;i<n;i++) { for(j=i;j<=n;j++) if(sch[i].num<sch[j].num) { sch[i]<——>sch[j]; }}//Arrange学校总分排序StatusArrange(){for(i=1;i<n;i++) { for(j=i;j<=n;j++) if(sch[i].score<sch[j].score) { sch[i]<——>sch[j]; }}//Arrange学校男子总分排序StatusArrange(){for(i=1;i<n;i++) { for(j=i;j<=n;j++) if(sch[i].male<sch[j].male) { sch[i]<——>sch[j]; }}//Arrange学校女子总分排序StatusArrange(){for(i=1;i<n;i++) { for(j=i;j<=n;j++) if(sch[i].female<sch[j].female) { sch[i]<——>sch[j]; }}//Arrange这些算法的时间复杂度都是f(n)。课程设计总结在这个程序当中用到的函数有system("cls"):作用使屏幕整洁;atoi:把字符转化成数字,解决输入数字的地方输入字目程序出错;switch:实现功能选择,exit:退出函数;fout.open():实现文档保存。改进设想:可以增加运动员及其编号,和其每个运动员所拿到的积分数进行排名。所遇问题1:输入重复的学校、项目名称以及前五的编号时程序无法识别。解决方法:输入的编号先跟前面的比较看是否重复,如果重复就提示与哪个重复。所遇问题2:输入数字处输入字母会程序出错解决方法:使用atoi函数进行转换。备注:这里调试所用学校数:6分别为:1.中南大学2.湖南大学3湖南师范大学4.湘潭大学5.长沙理工大学6.湖南科技大学男女项目数:33项目分别为:1.男子跑步2.男子跳远3.男子跳高4.女子跑步5.女子跳远6.女子跳高成绩取前五的项目有:14天文数的阶乘计算_C语言程序设计教程天文数的阶乘计算在C语言里unsignedlongint型的的整数的仅可表示0~4294967295之间的数,而12!=479001600,13!=6227020800。可见,用unsignedlongint型的整数做阶乘运算时最多只能计算到12的阶乘。用函数doublesqrt(doublex)做开方算运算时,只能计算到16位有效数字。longdouble型的实数虽然可表示10-4931~10-4932的数,但其有效数字也只有18~19位。我编写了一个“天文数字计算”程序突破了这一限制,可以把数字的长度扩充到无穷多位。除了能做加、减、乘、除、求模等基本运算外还可以做阶乘、乘方、开平方等运算。例如:10000!=?、(2002^2000)%9999=9394、2002的平方根的小数点后第10000位是4。下面这个程序只是我用编写的“天文数字计算”里的一个计算。因为在程序代码中使用了中文,所以这个程序假如不在中文DOS下运行,可能会出现乱码,但不影响程序的计算结果。注:因为DOS能访问的内存有限,所以在DOS下可把计算结果扩充到30000多位。但假如用VC把它编绎成Windows程序,则可以计算到“真正的无穷多位”(与机子配置有关),一般计算到几十万位是没有问题的。/*此程序在TC2.0、TC3.0,BC,VC下都可编绎*/#defineM20000/*最大结果位数,DOS能访问的内存有限,最好不要超过30000位*/#defineN(M+5)main(){intNum;registerinti,j,k,flag;registerunsignedintn,m,pc;unsignedcharstr_n[5],result_0[N],result_1[N];voidfun_print_result(char*result,intflag);intfun_mul(char*a,char*b,char*c,intflag);printf("输入计算其阶乘的数:Num=");scanf("%d",&Num);if(Num>=100){printf("\n正在进行阶乘运算...\n");printf("已完成00000的阶乘,请等待...");}for(j=0;j<N;j++){result_1[j]=0;result_0[j]=0;}result_1[N-1]=1;for(i=0;i<5;i++){str_n[i]=0;}n=1;pc=0;flag=N-1;while(n<=Num){m=n;k=4;while(m>0){str_n[k]=m%10;m/=10;k--;}if(pc%2==0){if(fun_mul(str_n,result_1,result_0,flag)!=1){printf("\n\n结果溢出!当前所设置的最大结果为%d位已完成%d的阶乘",M,pc);exit(0);}}else{if(fun_mul(str_n,result_0,result_1,flag)!=1){printf("\n\n结果溢出!当前所设置的最大结果为%d位已完成%d的阶乘",M,pc);exit(0);}}flag=flag-(4-k);/*flag标记相乘后“可能的”第一个有效数字的标号*/if(pc%2==0)/*再处理一次使flag正好标记第一个有效数字的标号*/{if(result_0[flag]==0)flag++;}else{if(result_1[flag]==0)flag++;}n++;pc++;if((pc)%25==0&&Num>=100&&pc>=100){printf("\r已完成%5d",pc);}}if(Num>=100)printf("\n");if((pc-1)%2==0){fun_print_result(result_0,flag);}else{fun_print_result(result_1,flag);}}intfun_mul(char*a,char*b,char*c,intflag)/*相乘函数*/{registerinti,j;for(j=flag;j<N;j

温馨提示

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

评论

0/150

提交评论