c语言课程设计.docx
《c语言课程设计.docx》由会员分享,可在线阅读,更多相关《c语言课程设计.docx(14页珍藏版)》请在冰点文库上搜索。
c语言课程设计
学生成绩管理系统
一.设计目的
熟练掌握C语言课程中所学的理论知识;C语言是在国内外广泛使用的一种计算机语言。
它既有高级语言的特点,又具有汇编语言的特点。
它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
因此,它的应用范围广泛。
学习使用C语言程序的目的是掌握程序设计的思路,学会用计算机语言编写程序正确处理算法和语法的关系算法是程序的核心、是灵魂,语法是外壳、是工具。
通过课程设计,我们要熟练的掌握C语言的算法、语言、函数的调用、循环的使用、数组的运用等。
二.设计要求
(一)。
信息描述
输入一个班学生的学号和每个学生考试三门功课(语文数学、英语、计算机基础)的成绩。
编程计算出每个学生的总分和平均分,并按学生成绩优劣排序,最后打印一张按高分到低分名次排序的成绩单。
1)排序用一个函数实现。
2)打印的成绩单表项包括:
学号、姓名、语文、数学、英语、总分、平均分。
3)按实验报告电子模板格式填写实验内容。
(二)。
功能描述
1.学生基本信息及成绩所选科目成绩的录入。
2.成绩的输出
3.基本信息的查询(学号)。
4.对每个学生成绩进行分析(即求总分、平均成绩);
5.对学生成绩插入,删除,分级别.
6.查找不及格的学生的学号,姓名.
7.对学生考试成绩进行排名(总体成绩进行排名,并显示各科成绩信息)
8.退出
三.总体设计
三.详细设计
1.main()主函数
程序采用模块化设计,主函数是程序的入口,各模块独立,可分块调试,均由主函数控制调用。
控制功能的实现通过循环执行一个开关语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值,调用相应的各功能函数,同时设置一个断点,即当返回值为一定条件时运行exit()函数结束程序,以免造成死循环。
2.shanchu()删除记录
输入要删除记录的姓名,调用find函数,如果没有该记录,显示没找到信息;否则,调用print函数,显示记录信息,接着显示是否确实要删除,请输入确认信息整数0或1,1表示是,0表示否。
如果输入了1,则系统删除信息。
要删除数组中的某一条元素,实际所做的操作是将其后继记录依次前移一条,所以删除第i条记录,用for语句,从i+l开始,依次将每个字段拷贝到前一条记录的相应字段,即覆盖了前一条记录,达到前移的目的,直到最后一条记录。
注意前移记录的时候是逐个字段赋值,不能一个记录整体赋值。
由于删除了一条记录,记录数减1,返回记录数,程序结束。
3.sort()排序
冒泡排序是一种比较简单且常用的排序方法。
具体的做法是假设待排序记录的排序码为k1,k2,…,kn,先比较k1和k2,如果kl>k2,则交换k1和k2所代表的记录,然后对k2(可能是刚交换来的)和k3进行同样的处理,重复此过程,直到处理完kn-1和kn。
这样从k1,k2到kn-1,kn的n-1次比较和交换的过程称为一次冒泡,这一步将最大的k值记录传到了最后,也是最终排序的位置。
重复这样的步骤,不过第二次只需从k1,k2到kn-2,kn-1,作n-2次比较,这样最多作n-1次冒泡。
为了减少不必要的循环,设置一个flag,表示本次冒泡是否出现过交换,如果没有交换,则说明本次比较已经达到排序要求,可以结束程序了。
本函数采用了冒泡排序方法,按照姓名排序,所以排序码为记录的姓名字段,对C语言来说,数组的下标是从0开始的,所以n条记录的比较是从s[0].xm,s[1].xm开始到t[n-2].xm,t[n-1].xm的,因为姓名是字符串,比较用字符串比较函数strcmp实现,移动记录借助于第三者临时结构体变量temp,移动要保持整条记录的移动,所以三个字段都要移动,对于字符串赋值便捷的方式是用strcpy复制函数,否则就要用循环语句逐字符移动。
Forj=0toN
Fori=0toM
temp=temp+stu[j].score[i]
stu[j].average=temp/N
求平均成绩并输出
排序(冒泡法)
输出学生平均成绩前三名
按任意键返回主菜单
4.charu()插入记录
输入要插入记录的信息,保存到临时变量temp中,然后再输入一个姓名,用字符串s表示,确定新记录插入在该记录之前,调用find()函数查找姓名为s的记录,得到该记录所在的序号,从最后一条记录开始,向后移动,即第n-1条移动到第n条,第n-2条移动到第n-1条,直到第i条移动到第i+l条,将新信息存入到第i条记录位置。
4.search()和find()查找记录
查找指定姓名的记录,采用顺序查找法。
首先输入要查找记录的姓名,然后顺序查找结点,如果没找到,则输出没找到信息,否则,显示找到的记录信息。
因为程序多次用到了查找和显示记录,例如删除记录中,所以编写了一个find()函数,专门进行查找。
从第一条记录开始,将记录中的姓名字段和待比较的姓名字符串s进行比较,一旦相等,程序结束,返回该记录的下标号i,也就是记录所在的序号;如果不相等,则继续下一条比较,所有记录比较完毕,循环结束,返回此时的下标变量i值。
search()函数通过调用find()得到了整数i,判断i的值如果大于n-1,已超过实际记录数,说明所有记录都进行过比较,没有找到,查找不成功:
否则,说明找到,调用输出函数print(),显示该第i条记录。
输入要查询学生号码
输出学生学号
输出学生姓名
fori=0toM
显示该学生的3门课程成绩
按任意键返回主菜单
四.调试分析
经过我一天的调试,我们终于把各自的模块整合起来了,在这过程中,我们遇到了很多问题,像数据不匹配,括号不配对,赋值重复等。
因为C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等原因。
但经过我的努力,终于完成了。
首先,我们用WHILE循环,使这个图书系统能无限使用,再次,我们用SWITCH对各个模块功能进行了组合,使学生成绩管理系统的功能更完善,界面更清晰、明了。
四.总结
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,当今计算机应用在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。
总的来说,本次课程设计,实在是受益匪浅。
本来这门课的知识学的就不够扎实,当刚开始要设计的时候,还真不知道从哪里下手,结果第一天的上机,我只是做了一个下午,什么也没干!
回去以后,我想,这样不行,这样下去还得了!
后来我们这组的组长把整个程序的各个模块都分配好任务,我主要负责查找那一个模块的。
第二天因为有了确实的任务,所以我就静下心来去编程,首先想到的是如何定义类型,想用数组的话很麻烦,我们也只学了这么多内容,后来组长说如果用结构体的话就比较方便,所以我们就决定自己在学一下结构体那方面的知识。
我选用了顺序查找法编写了查找函数,并且通过编写使该程序可以进行多次查找,界面友好,并且输出的画面美观。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,例如编写的程序在计算机上识别的是没有错误的,但是运行的结果确实不对的,总是两个字符串一起输出,怎么看我的源程序都没有错误,后来经过老师的指导才知道字符串输出是以回车键识别结束语句的,解决的办法是在输出语句中间加一个输入字符语句;后来在我们团队的合作下,一一攻破了困难,最后把一个完整的程序设计完成,感觉特别有成就感的。
虽然课程设计只有短短的几天,但是我发现我学到的知识比整整一个学期学到的都多。
理论和实践的相结合是学习最有效的方法。
在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。
回顾起此次课程设计,至今我仍感慨颇多,的确,从从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
五.参考资料
C程序设计(第三版)谭浩强著
六.程序代码
#include"stdio.h"/*I/O函数*/
#include"conio.h"/*屏幕操作函数*/
#include"string.h"/*字符串函数*/
#defineN3/*定义常数表示学生数*/
structstudent/*定义数据结构*/
{charxh[4];/*姓名*/
charxm[8];/*学号*/
intyw;/*语文*/
intsx;/*数学*/
intyy;/*英语*/
floataver;/*平均值*/
floatsum;/*总成绩*/
}stu[N];
main()
{inta;
structstudentstu[N];
voidinput(structstudents[],intL);/*输入学生信息*/
voidoutput(structstudents[],intL);/*输出学生信息*/
voidshanchu(structstudents[],intL);/*删除学生信息*/
voidaverage(structstudents[],intL);/*求每个学生的平均成绩*/
voidsort(structstudentstu[],intL);/*按总分排序*/
voidfenlei(structstudents[],intL);/*学生成绩级别*/
voidcharu(structstudents[],intL);/*插入学生成绩*/
voidfind(structstudents[],intL);/*查找不及格的学生*/
voidsearch(structstudents[],intL);/*查询学生成绩*/
while(a)/*调用主菜单函数,返回值为整数,作开关语句的条件*/
{
printf("1.input\n");/*输入所有学生信息*/
printf("2.output\n");/*输出所有学生信息*/
printf("3.shanchu\n");/*删除学生信息*/
printf("4.average\n");/*求每个学生的平均成绩*/
printf("5.sort\n");/*按总分排序*/
printf("6.fenlei\n");/*学生成绩级别*/
printf("7.charu\n");/*插入学生成绩*/
printf("8.find\n");/*查找不及格的学生*/
printf("9.search\n");/*查询学生成绩*/
printf("10,exit\n");/*结束程序*/
printf("pleaseselectmenuNO:
");/*提示输入选择功能的序号*/
scanf("%d",&a);/*输入选择功能的序号*/
switch(a)
{case1:
input(stu,N);break;
case2:
output(stu,N);break;
case3:
shanchu(stu,N);break;
case4:
average(stu,N);break;
case5:
sort(stu,N);break;
case6:
fenlei(stu,N);break;
case7:
charu(stu,N);break;
case8:
find(stu,N);break;
case9:
search(stu,N);break;
case10:
exit(0);/*如果返回值为10则程序结束*/
}
}
getch();
}
voidinput(structstudents[],intL)/*输入学生成绩的函数*/
{inti;
printf("pleaseinputscores:
\n");/*提示开始输入成绩*/
for(i=0;iscanf("%s%s%d%d%d",s[i].xh,s[i].xm,&s[i].yw,&s[i].sx,&s[i].yy);
}/*输入学生学号,姓名,语文,数学,英语*/
voidoutput(structstudents[],intL)/*输出学生成绩的成绩*/
{inti;
printf("pleaseoutputscores:
\n");/*提示开始输出成绩*/
printf("xhxmywsxyy\n");
for(i=0;iprintf("%8s%8s%8d%8d%8d",s[i].xh,s[i].xm,s[i].yw,s[i].sx,s[i].yy);
/*输出学生学号,姓名,语文,数学,英语*/
printf("\n");/*换行*/
}
voidshanchu(structstudents[],intL)/*删除学生成绩的函数*/
{inti,n;
scanf("%d",&n);/*输入要删除的学生*/
for(i=n;i{strcpy(s[i-1].xh,s[i].xh);
strcpy(s[i-1].xm,s[i].xm);
s[i-1].yw=s[i].yw;
s[i-1].sx=s[i].sx;
s[i-1].yy=s[i].yy;
}
}
voidaverage(structstudents[],intL)/*计算每个学生平均成绩的函数*/
{inti,sum;
floataver;
for(i=0;i{
sum=s[i].yw+s[i].sx+s[i].yy;/*累加各门课程成绩*/
aver=s[i].sum/3;/*求出平均值*/
s[i].sum=sum;
s[i].aver=aver;
}
printf("xhxmywsxyysumaver\n");
for(i=0;iprintf("%8s%8s%8d%8d%8d%8d%f",s[i].xh,s[i].xm,s[i].yw,s[i].sx,s[i].yy,s[i].sum,s[i].aver);
}
voidsort(structstudents[],intL)/*计算每个学生平均成绩的函数*/
{inti,j=0,k=0,sum,temp;
for(i=0;i{k=i;
sum=s[i].yw+s[i].sx+s[i].yy;
s[i].sum=sum;
for(j=i+1;jif(s[k].sum
if(k!
=i)
{temp=s[i].sum;
s[i].sum=s[k].sum;
s[k].sum=temp;}
}
printf("xhxmywsxyysumaver\n");
for(i=0;iprintf("%8s%8s%8d%8d%8d%8d%f",s[i].xh,s[i].xm,s[i].yw,s[i].sx,s[i].yy,s[i].sum,s[i].aver);
}
voidfenlei(structstudents[],intL)/*计算每个学生成绩级别的函数*/
{chargrade;inti;
for(i=0;i{s[i].aver=(s[i].yw+s[i].sx+s[i].yy)/3.0;
}
for(i=0;i{switch((int)s[i].aver/10)/*判定学生的级别*/
{case10:
case9:
grade='A';break;
case8:
grade='B';break;
case7:
grade='C';break;
case6:
grade='D';break;
case5:
case4:
case3:
case2:
case1:
case0:
grade='E';break;
}
printf("%c\n",grade);
}
}
voidcharu(structstudents[],intL)/*插入学生信息的函数*/
{inti,n;
scanf("%d",&n);
for(i=L;i>n;i--)
{strcpy(s[i].xh,s[i-1].xh);
strcpy(s[i].xm,s[i-1].xm);
s[i].yw=s[i-1].yw;s[i].sx=s[i-1].sx;s[i].yy=s[i].sx;
}
i=n;
scanf("%s%s%d%d%d%d",s[i].xh,s[i].xm,&s[i].yw,&s[i].sx,&s[i].yy);
/*输入要插入学生的学号,姓名,语文,数学,英语*/
}
voidfind(structstudents[],intL)/*查找不及格学生的函数*/
{inti,j,sum,flag=0;
printf("thestudentoftwoscores<60:
\n");
for(i=0;i{
sum=0;
if(s[i].yw||s[i].sx||s[i].yy<60)sum++;
if(sum>=2)
{flag=1;
printf("%8s%8s\n",s[i].xh,s[i].xm);/*输出这两名不及格学生的学号,姓名*/
}
}
if(flag==0)/*如果没有不及格学生*/
printf("notexist!
\n");
}
voidsearch(structstudents[],intL)/*按学号查询学生成绩*/
{inti,flag=1;
charm;
charxh[10];
while(flag)
{printf("pleaseinputthexhyousearch:
");
scanf("%s",xh);/*输入要查询学生的学号*/
for(i=0;iif(strcmp(stu,s[i].xh)==0)/*若找到该学生的学号*/
{printf("xhxmywsxyy\n");/*输出该学生的信息*/
printf("%8s%8s%8d%8d%8d%\n",s[i].xh,s[i].xm,s[i].yw,s[i].sx,s[i].yy);
break;
}
if(i==L)printf("nothisxh!
\n");/*若未找到该学生的学号*/
printf("continuorexit(Y/N)?
");
getchar();
scanf("%c",&m);
if(m=='n'||m=='N')
flag=0;
}
}