C语言综合程序设计说明书.docx
- 文档编号:17624830
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:17
- 大小:133.08KB
C语言综合程序设计说明书.docx
《C语言综合程序设计说明书.docx》由会员分享,可在线阅读,更多相关《C语言综合程序设计说明书.docx(17页珍藏版)》请在冰点文库上搜索。
C语言综合程序设计说明书
C语言综合程序设计说明书
一、设计目的
用C语言设计一个具有输入成绩、打印成绩表功能的综合程序,以巩固和加深对C语言的学习。
二、设计要求
已知有5名学生学号、学科如下:
学号
姓名
数学
英语
计算机
哲学
总分
名次
10101
10102
10103
10104
10105
设计一个菜单程序,完成功能如下:
1、输入1时完成输入姓名及各科成绩;
2、输入2时完成打印输出总表;
3、输入3时完成打印学号,成绩表,总分和名次;
4、输入4时,完成退出功能。
注:
每执行完一个功能,屏幕必须清屏。
三、设计思路
将设计要求中的1、2、3分别定义为具有相应功能的子函数,再在主函数中进行调用。
1、根据设计要求,设计需要用到结构体数组。
因此,首先需要定义一个结构体数组,并将其中的学号赋值为从10101~10105。
2、定义一个具有输入成绩功能的子函数,用循环语句和scanf语句相结合,完成每个学生的信息输入。
3、另外定义一个子函数对结构体中的总分进行比较,排出学生名次。
4、定义一个输出总表函数,用printf语句和循环语句结合使用,使该函数可以输出结构体中的各项数据。
根据设计要求,可将定义的输出总表的函数中的输出姓名项删除,即可得到打印学号、成绩表、总分和名次的函数。
四、程序设计环境
Windows操作系统Win-tc
五、程序功能模块图
六、程序功能流程图
假假
真真
输入子函数--完成信息的录入输出子函数—完成打印表
排名子函数--完成名次的排列退出子函数--完成退出功能
七、程序代码
#include
#include
#include
#include
structstudent
{intnum;
charname[20];
floatscore[5];
floatsum;
intmingci;
}st[6]={{0},{10101},{10102},{10103},{10104},{10105}};
intshuru()
{inti;
system("cls");
printf("成绩录入\n\n\n\n");
printf("\t\t本程序只能输入5个学生的信息\n\t\t为使系统正常工作请按提示操作\n\n\t\t注意:
每输入成一项信息后按Enter键确认!
\n\n\n\n");
printf("\n\n");
sqrt(0);/*打开wintc浮点数支持*/
for(i=1;i<=5;i++)/*这个循环是输入数据*/
{
printf("请输入学号为%d学生的姓名:
",st[i].num);
scanf("%s",st[i].name);
printf("请输入该生的数学成绩:
");
scanf("%f",&st[i].score[1]);
printf("请输入该生的英语成绩:
");
scanf("%f",&st[i].score[2]);
printf("请输入该生的计算机成绩:
");
scanf("%f",&st[i].score[3]);
printf("请输入该生的哲学成绩:
");
scanf("%f",&st[i].score[4]);
st[i].sum=st[i].score[1]+st[i].score[2]+st[i].score[3]+st[i].score[4];
}
printf("\n您已经完成了5位学生信息的录入\n\n\t\t请按任意键返回主菜单\t");
getch();
}
intmingci()
{inti,j;
for(i=1;i<=5;i++)
{st[i].mingci=1;
for(j=1;j<=5;j++)
if(st[i].sum } } intshuchu() {inti; printf("打印输出总表"); printf("\n\n\n"); printf("\t\b\b\b________________________________________________________________________\n"); printf("\t学号\t姓名\t\t数学\t英语\t计算机\t哲学\t总分\t名次\n"); printf("\t\b\b\b________________________________________________________________________\n"); for(i=1;i<6;i++)/*这个循环是输出数据*/ {printf("\t%d\t%8s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d\n",st[i].num,st[i].name,st[i].score[1],st[i].score[2],st[i].score[3],st[i].score[4],st[i].sum,st[i].mingci); printf("\t\b\b\b________________________________________________________________________\n");} printf("\n\n\n\n"); printf("您还想完成哪项操作,请选择功能键1,2,3,4后按Enter\n"); printf("\n"); printf("\t1.录入成绩2.打印输出总表3.打印学号、成绩表、总分和名次4.退出\n"); } intshuchu1() {inti; printf("打印学号、成绩表、总分和名次"); printf("\n\n\n"); printf("\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b_______________________________________________________________\n"); printf("\t\t学号\t数学\t英语\t计算机\t哲学\t总分\t名次\n"); printf("\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b_______________________________________________________________\n"); for(i=1;i<6;i++)/*这个循环是输出数据*/ {printf("\t\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d\n",st[i].num,st[i].score[1],st[i].score[2],st[i].score[3],st[i].score[4],st[i].sum,st[i].mingci); printf("\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b_______________________________________________________________\n");} printf("\n\n\n\n"); printf("您还想完成哪项操作,请选择功能键1,2,3,4后按Enter\n"); printf("\n"); printf("\t1.录入成绩2.打印输出总表3.打印学号、成绩表、总分和名次4.退出\n"); } inttuichu() {charm; while (1) {system("cls"); printf("\n\n\n\n\n"); printf("\t\t\t您确认要退出吗? (y/n)\n"); printf("\n\n"); printf("\t\t\ty确认退出\n"); printf("\t\t\tn返回主菜单\n\n\n\n"); printf("\t\t请选择功能键y或n后按Enter\t"); scanf("%c",&m); if(m=='y')exit(0); elseif(m=='n')main(); } } main() {inti,j; charn; system("graftabl936"); system("cls"); printf("08-09学年第2学期c语言综合程序设计*****应用电子技术08-1班: 肖红福丁传飞*****\n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("\n\n\n\n"); printf("\t\t\t1.录入成绩\n\t\t\t2.打印输出总表\n\t\t\t3.打印学号、成绩表、总分和名次\n\t\t\t4.退出\n\n\n\n\n"); printf("\t\t请选择功能键1,2,3,4后按Enter\t"); while (1) { scanf("%c",&n); switch(n) { case'1': system("cls"); shuru(); mingci(); main(); break; case'2': system("cls"); shuchu(); break; case'3': system("cls"); shuchu1(); break; case'4': tuichu(); default: printf("对不起! 您输入的数字不是功能键,请从新选择\n"); } } } 八、程序运行结果 注: 本程序因调用函数system("graftabl936"),因此直接用Win-tc的英文环境即可运行。 1、进入程序界面,如图8.1所示: 进入程序选择界面 2、输入1后按Enter进入成绩录入界面如图8.2所示: 进入成绩录入界面 3、按提示完成成绩的录入,如图8.3所示: 图8.3成绩的录入界面 4、完成成绩的录入后输入2后按Enter打印出总表: 打印总表界面 5、完成成绩的录入后选择3后按Enter,打印出学号、成绩表、总分和名次,如图8.5所示: 打印出学号、成绩表、总分和名次表界面 6、输入4后,按Eneter进入退出界面如图8.6所示: 九、设计总结 1、定义结构体数组structstudent 本次设计的程序需要定义结构体,起出我们是把各科成绩分开逐个定义: floatshuxue; floatyingyu; floatjisuanji; floatzhexue; 但后面发现这样定义过于繁杂,而且不易给其赋值和打印。 然后我们将结构体中学生的成绩定义为一个数组floatscore[5];,为与各个学生的学号对应,增强程序的可读性,我们定义的成绩数组score可以存储六科成绩,其中score[0]不用,从score[1]开始,分别存储学生的数学、英语、计算机和哲学成绩。 2、定义输入子函数intinput() 在定义输入函数时我们遇到了这样的一个问题: 我们用循环语句和输入函数scanf对结构体数组赋值,但是在运行时,输入数据程序就突然跳出了。 后来在网上查到,这是由于只不过,TC有关于float(浮点数)的BUG而已。 解决这个问题有一个方法,就是先在程序中用浮点数进行一次赋值或运算即可,因此我们在定义的输入子函数input时先调用函数sqrt(0);求0的平方根,但舍弃结果//这句的作用,可以让TC打开浮点数支持。 3、定义排名函数intmingci() 原先我们想用教材上(P102)所举出的“冒泡”排序法,对学生的总分进行排序,然后按从高到底的顺序排列出来,即可打印出名次,编辑的代码如下: intmingci() {inti,j,num1; floatcj1,cj2,cj3,cj4,sum1; charname1; for(i=1;i<6;i++) {for(j=i+1;j<6;j++) {if(st[i].sum {num1=st[i].num; st[i].num=st[j].num; st[j].num=num1; strcpy(name1,st[i].name); strcpy(st[i].name,st[j].name); strcpy(st[j].name,name1); cj1=st[i].score[1]; st[i].score[1]=st[j].score[1]; st[j].score[1]=cj1; cj2=st[i].score[2]; st[i].score[2]=st[j].score[2]; st[j].score[2]=cj2; cj3=st[i].score[3]; st[i].score[3]=st[j].score[3]; st[j].score[3]=cj3; cj4=st[i].score[4]; st[i].score[4]=st[j].score[4]; st[j].score[4]=cj4; sum1=st[i].sum; st[i].sum=st[j].sum; st[j].sum=sum1; } } } } 但这样的排序不仅代码过多,而且输出的结果是按总分从高到底的排列,它把学生的学号顺序打乱了。 后来通过与其他同学的交流发现还有好的方法,即: 用循环语句把学生的总分进行比较,然后得出学生的名次,代码如下: intmingci() {inti,j; for(i=1;i<=5;i++) {st[i].mingci=1; for(j=1;j<=5;j++) if(st[i].sum } } 显然,这中方法比“冒泡”排序更为简便,而且他输出的结果是按学生的学号从小到大排列出来的,这样更方便成绩的查看,更接近于我们平常所用的成绩表。 4、定义输出子函数intshuchu() 起初,我们在写输出代码时,直接用输出函数printf()将学生表的各项信息以空格键分开,但这与表的标签项(学号、姓名、数学、英语、计算机、哲学)的位置对应不好调整,需以“调整位置—>运行程序—>关闭程序—>调整位置”的调整模式来调整对应位置,比较麻烦,而且程序代码不太美观,不易查看。 后来,我们在书上查到有制表符\t、\b,用制表符来对表的标签和学生信息的对应位置做调整比较方便,只需用相同制表服将printf()函数中的信息隔开,输出的表的标签与学生的信息就回相对应了。 5、设计主函数main() 本设计需要程序具有菜单功能,因此在主函数中我们选择了switch()循环语句。 为防止跳出循环而出错,我们又在switch()外加上了一个while (1)的死循环。 这样,程序就不会因为跳出循环而结束。 另外,在switch()上,加一个if语句,当用户输入的信息有误时给用户提示,提高程序的容错率。 6、程序运行环境 为使程序能在不用超级工具(中文DOS运行环境)的条件下运行出中文,我们在主函数中加入了函数system("graftabl936"),该函数可以实现在英文运行环境下使程序能显示中文。 但需要注意的是该函数要加在主函数中,第一句含中文的语句前面,不然会使程序出错而无法运行。 十、设计心得体会 本学期C语言的期末考试采取设计程序这种开放性的考试方式,不仅使我们对所学的知识加深了理解,而且教会了我们要将所学的知识加以应用。 另外,使我们在设计程序的过程中学到了很多,课堂上无法到的知识。 由于这是我们遇到的第一次这样的考试,所以在设计程序的过程中我们还是遇到了很多问题,这使我们在这次综合程序设计中锻炼了与同学共同协作完成一项工作的能力和自学的方法。 而由于我们的能力有限,所以设计的程序或许不够完善,但我们会在今后的学习中加倍努力,争取学习更多知识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 综合 程序设计 说明书