c语言课程设计报告成绩管理系统.docx
《c语言课程设计报告成绩管理系统.docx》由会员分享,可在线阅读,更多相关《c语言课程设计报告成绩管理系统.docx(18页珍藏版)》请在冰豆网上搜索。
c语言课程设计报告成绩管理系统
学号:
C语言课程设计
设计说明书
学生成绩管理系统
起止日期:
2016年12月12日至2016年12月23日
学生姓名
班级
成绩
指导教师
电子信息工程系
年月日
目录:
1、课程设计题目要求………………..3
2、课程设计应完成的工作…………..3
3、总体设计要求…………...………....3
3.1总体功能要求………………….3
3.2主要模块功能包括…………….4
4、程序流程图…………………...........5
5、源代码及注释……………………..5
6、代码运行效果说明…………...........13
7、总结……...…..……………………..15
一、课程设计题目要求:
学生信息包括学号、姓名、3门考试成绩。
试设计一学生成绩管理系统,使之能提供以下功能:
1、学生成绩录入功能(成绩信息用文件保存,也可不用)
2、统计:
1)输入学生的学号统计该生的总分及平均分;
2)输入课程求该门课程的平均分。
3、排序:
按学号
4、查找:
输入一个学生学号,输出其姓名及平均成绩
5、修改、删除学生信息(任选一项)
调试环境:
VC++6.0
二、课程设计应完成的工作:
(1)编写算法
(2)算法测试,并有具体的测试结果和结果分析
(3)撰写课程设计报告。
内容包括:
a.封面扉页
b.设计任务书
c.目录
d.设计总体方案(包括流程图)
e.使用说明及运行实例(包括界面)
f.源程序代码注释
三、总体设计
总体功能要求:
(1)链表的建立,每个节点包括:
学号、姓名、性别、语文、数学、英语、总分。
(2)节点的插入,按学号的顺序插入。
(3)删除链表中的节点,按学号或者姓名。
链表的输出。
按学号排序、按总分排序 功能模块图、流程图(要求有总体的功能模块图、各部分流程图):
主要功能模块包括:
1、成绩录入功能
2、成绩输出功能
3、成绩查询功能
4、删除功能
5、排序功能
6、统计功能
四、程序流程图:
五、源代码及注释:
#include
#include
#include
#defineLENsizeof(Student)
#defineNULL0
typedefstructstudent
{
intnum;/*学号*/
charname[20];/*姓名*/
charsex[2];/*性别*/
intscore[3];/*成绩*/
intsum;/*总成绩*/
structstudent*next;
}Student;
intn;/*声明一个全局变量*/
Student*cin(void);
Student*sort_1(Student*head,int);/*声明按学号排序函数*/
voidsort_2(Student*head);/*声明按总分排序函数*/
voidprint(Student*head);/*声明显示函数*/
Student*sort_all(Student*head);/*声明排序函数*/
voidfind(Student*head);/*声明查询函数*/
Student*add_new(Student*head);
Student*cin()
{
intflag;
Student*head,*p1,*p2;
n=0;
head=(Student*)malloc(LEN);
p2=head;
printf("\n请输入第%d名学生的学号,学号为0表示结束输入:
",n+1);
scanf("%d",&flag);
while(getchar()!
='\n');
for(;flag;)/*输入每个学生的信息*/
{
n++;
p1=(Student*)malloc(LEN);
p1->num=flag;
printf("请输入第%d名学生的姓名:
",n);/*输入姓名*/
scanf("%s",p1->name);
printf("请输入第%d学生的性别:
",n);/*输入性别*/
scanf("%s",p1->sex);
printf("请输入第%d名学生的语文成绩:
",n);/*输入语文成绩*/
scanf("%d",&p1->score[0]);
printf("请输入第%d名学生的数学成绩:
",n);/*输入数学成绩*/
scanf("%d",&p1->score[1]);
printf("请输入第%d名学生的英语成绩:
",n);/*输入英语成绩*/
scanf("%d",&p1->score[2]);
p1->sum=p1->score[0]+p1->score[1]+p1->score[2];
p2->next=p1;
p2=p1;
printf("\n请输入第%d名学生的学号,没有此学生则输入0表示结束:
",n+1);
scanf("%d",&flag);
}
p2->next=NULL;
printf("\n\n");
returnhead;
}
Student*sort_all(Student*head)/*定义排序函数*/
{
intchoose;
for(;;)
{
printf("\n\t\t#####学生成绩统计排序####\n");
printf("\t\t#\t1.按学生学号排序\t#\n");
printf("\t\t#\t2.按学生总分排序\t#\n");
printf("\t\t#\t7.单科高分及均分\t#\n");
printf("\t\t#\t8.显示当前学生成绩\t#\n");
printf("\t\t#\t0.返回上一级菜单\t#\n");
printf("请输入你要执行的操作:
");
scanf("%d",&choose);
while(getchar()!
='\n');
switch(choose)
{
case1:
case2:
case3:
case4:
case5:
case6:
head=sort_1(head,choose);break;
case7:
print(head);sort_2(head);break;
case8:
print(head);break;
case0:
returnhead;
default:
printf("\n\n您的输入有误!
请重新输入:
\n\n");break;
}
}
}
Student*sort_1(Student*head,intchoose)/*定义按学号排序函数*/
{
Student*p1,*p2=head->next,*pm,*px;
Studentmid;
if(!
p2)returnhead;
for(p1=p2;p1->next!
=NULL;p1=p1->next)
{
pm=p1;
for(p2=p1->next;p2!
=NULL;p2=p2->next)
switch(choose)
{
case1:
if(pm->num>p2->num)pm=p2;break;
case2:
if(pm->sumsum)pm=p2;break;
case3:
if(pm->score[0]score[0])pm=p2;break;
case4:
if(pm->score[1]score[1])pm=p2;break;
case5:
if(pm->score[2]score[2])pm=p2;break;
}
if(pm!
=p1)
{
mid=*pm;
*pm=*p1;
*p1=mid;
px=pm->next;
pm->next=p1->next;
p1->next=px;
}
}
printf("\n排序后的成绩表为:
\n");
print(head);
returnhead;
}
voidsort_2(Student*head)/*定义按总分排序函数*/
{
Student*p=head->next;
intmax_1,max_2,max_3,min_1,min_2,min_3;
intmax_sum,min_sum;
intsum_1=0,sum_2=0,sum_3=0;
floataver_1,aver_2,aver_3,aver_sum;
if(!
p)return;
max_1=min_1=p->score[0];max_2=min_2=p->score[1];
max_3=min_3=p->score[2];
max_sum=min_sum=p->sum;
for(;p;p=p->next)
{
if(max_1score[0])max_1=p->score[0];
elseif(min_1>p->score[0])min_1=p->score[0];
if(max_2score[1])max_2=p->score[1];
elseif(min_2>p->score[1])min_2=p->score[1];
if(max_3score[2])max_3=p->score[2];
elseif(min_3>p->score[2])min_3=p->score[2];
if(max_sumsum)max_sum=p->sum;
elseif(min_sum>p->sum)min_sum=p->sum;
sum_1+=p->score[0];sum_2+=p->score[1];sum_3+=p->score[2];
}
aver_1=1.0*sum_1/n;aver_2=1.0*sum_2/n;aver_3=1.0*sum_3/n;
aver_sum=aver_1+aver_2+aver_3;
printf("总共%d名学生,具体数据为:
\n",n);
printf("总分最高分为%d,最低分位%d,平均分为%.2f\n",
max_sum,min_sum,aver_sum);
}
voidfind(Student*head)/*定义查询函数*/
{
Student*p;
intchoose,fnum;
chartem[20];
if(n==0){printf("\n当前系统没有任何学生数据!
\n");return;}
for(;;)
{
printf("\n请输入您要查询学生的方式:
\n\n");
printf("1、按学号查询;2、按姓名查询;0、我不查询了。
\n\n");
printf("请选择:
");
scanf("%d",&choose);
while(getchar()!
='\n');
if(choose==1)
{
printf("\n请输入你要查询的学生的学号,输入0退出学号查询:
");
scanf("%d",&fnum);
for(;fnum;)
{
for(p=head->next;p!
=NULL&&p->num!
=fnum;p=p->next);
if(!
p)
{
printf("\n\n找不到你要查询的学号,请重新输入,输入0表示结束:
");
scanf("%d",&fnum);
}
elseif(p->num==fnum)
{
printf("\n学号为%d学生的数据为:
\n",p->num);
printf("学号\t姓名\t性别\t语文成绩数学成绩英语成绩总分\n");/*输出所有的学生信息*/
printf("%d\t%s\t%s\t%d%d%d%d\n",p->num,
p->name,p->sex,p->score[0],p->score[1],p->score[2],p->sum);
printf("\n\n请输入你还要查询的学生的学号,输入0表示不按学号查询了:
");
scanf("%d",&fnum);
}
}
}
elseif(choose==2)
{
printf("\n请输入你要查询的学生的姓名,输入0退出姓名查询:
");
scanf("%s",tem);
for(;strcmp(tem,"0");)
{
for(p=head->next;p!
=NULL&&strcmp(p->name,tem);p=p->next);
if(!
p)
{
printf("\n\n找不到你要查询的姓名,请重新输入,输入0表示结束:
");
scanf("%s",tem);
}
elseif(!
strcmp(p->name,tem))
{
printf("\n姓名为%s学生的数据为:
\n",p->name);
printf("学号\t姓名\t性别\t语文成绩数学成绩英语成绩总分\n");
printf("%d\t%s\t%s\t%d%d%d%d\n",
p->num,p->name,p->sex,p->score[0],p->score[1],p->score[2],p->sum);
printf("\n\n请输入你还要查询的学生的姓名,输入0表示不按姓名查询了:
");
scanf("%s",tem);
}
}
}
elseif(choose==0){printf("\n你选择了不查询!
\n");break;}
else{printf("\n你以其他方式选择了不查询!
\n");break;}
}
}
Student*add_new(Student*head)/*定义插入函数*/
{
Student*p;
intflag;
printf("\n\n请输入你要新加入学生的学号,学号为0表示结束输入:
");
scanf("%d",&flag);
while(getchar()!
='\n');
for(;flag;)
{
p=(Student*)malloc(LEN);
p->num=flag;
printf("请输入新加入学生的姓名:
",n);/*输入姓名*/
scanf("%s",p->name);
printf("请输入新加入学生的性别:
");/*输入性别*/
scanf("%s",p->sex);
printf("请输入新加入学生的语文成绩:
",n);/*输入语文成绩*/
scanf("%d",&p->score[0]);
printf("请输入新加入学生的数学成绩:
",n);/*输入数学成绩*/
scanf("%d",&p->score[1]);
printf("请输入新加入学生的英语成绩:
",n);/*输入英语成绩*/
scanf("%d",&p->score[2]);
p->sum=p->score[0]+p->score[1]+p->score[2];
p->next=head->next;
head->next=p;
n++;
printf("\n请输入还要加入学生的学号,没有此学生则输入0表示结束:
");
scanf("%d",&flag);
}
head=sort_1(head,1);
printf("加入后的成绩表为:
\n");
print(head);
returnhead;
}
voidprint(Student*head)
{
Student*p=head->next;
if(!
p){printf("\n\n此系统目前没有任何学生数据!
\n\n\n");return;}
printf("此系统目前共计学生%d名:
\n",n);
printf("**************************学生成绩统计一览************************\
*****\n");
printf("学号\t姓名\t性别\t语文成绩数学成绩英语成绩总分\n");
for(;p;p=p->next)
printf("%d\t%s\t%s\t%d%d%d%d\n",
p->num,p->name,p->sex,p->score[0],p->score[1],p->score[2],p->sum=p->score[0]+p->score[1]+p->score[2]);
}
structstudent*del(structstudent*head,longnum)/*定义删除学生信息函数*/
{structstudent*p1,*p2;
if(head==NULL){printf("\nlistnull!
\n");returnhead;}
p1=head;
while(num!
=p1->num&&p1->next!
=NULL)
{p2=p1;p1=p1->next;}
if(num==p1->num)
{if(p1==head)head=p1->next;
elsep2->next=p1->next;
printf("delete:
%ld\n",num);
n=n-1;
}
elseprintf("%ldnotdeenfound!
\n",num);
return(head);
}
intmain()/*主函数即用户的操作界面*/
{
Student*head;
intchoose,i,num;/*声明局部变量*/
head=(Student*)malloc(LEN);
head->next=NULL;
for(;;)
{
printf("\n\t\t*****学生成绩管理系统****\n");/*学生成绩管理系统*/
printf("\t\t*\t1.学生数据键盘录入\t*\n");/*.学生数据键盘录入*/
printf("\t\t*\t2.学生数据统计排序\t*\n");/*学生数据统计排序*/
printf("\t\t*\t3.查询学生数据\t\t*\n");/*.查询学生数据*/
printf("\t\t*\t4.插入学生数据\t\t*\n");/*插入学生数据*/
printf("\t\t*\t5.显示当前成绩表\t*\n");/*显示当前成绩表*/
printf("\t\t*\t6.删除学生数据\t\t*\n");/*删除学生数据*/
printf("\t\t*\t0.退出成绩管理系统\t*\n");/*退出成绩管理系统*/
printf("\n请输入你要执行的操作:
");/*请输入你要执行的操作*/
scanf("%d",&choose);
while(getchar()!
='\n');
switch(choose)
{
case1:
printf("\n\t\t\t\t**************注意**************");
printf("\n\n此选项将会建立新的学生数据系统,原来的数据将\
不再存在,你确信要删除原来的数据并建立新的数据系统么?
\n\n");
printf("1、建立新的数据系统;0、放弃建立新的数据系统。
\n\n");
printf("请选择:
");
scanf("%d",&i);
if(i==1){head=cin();print(head);break;}
elseif(i==0)
{
printf("\n你选择了放弃建立新的数据系统!
\n");
break;
}
else{
printf("\n你做出别的选择,当作放弃建立!
\n");
break;
}
case2:
head=sort_all(head);break;/*调用排序函数*/
case3:
find(head);break;/*调用查询函数*/
case4:
head=add_new(head);/*调用插入函数*/
case5:
print(head);break;/*调用显示函数*/
case6:
printf("请输入要删除的学生学号:
");
scanf("%d",&num);
del(head,num);/*调用删除函数*/
case0:
system("pause");return0;/*退出系统*/
default:
printf("\n\n您的输入有误!
请重新输入:
\n\n");break;
}
}
}
六、代码运行效果说明
图1进入系统
图2通过键盘输入学生的信息
图3显示所有学生的信息
图4按学号排序
图5按学号查成绩
图6学生平均分
图7删除信息
七、总结
通过本次C程序课程设计,我觉得对自己提高很大:
克服了懒惰,这在我以后的学习和工作中的心理定位与调节有很大的帮助。
我感受到了编程是一项非常烦琐周密的活动,他不但需要一个人周密的思考问题的能力,处理问题的能力,还需要有足够的耐心和严谨治学的作风,来不得半点马虎。
通过本次课程设计,我初步学会了程序设计的基本方法,学会了怎样去借鉴别人的方法和经验,知道如何去查找资料和整合处理这些资料的能力,这为以后的大学毕业设计论文打下了一个初步的基础使我收益最大的是享受到了一种成功的喜悦,在这些天之中从开始的确定课程设计题目,然后是上网和上图书馆查找资料,编写C语言原程序,然后是进行编译,这个环节是一个非常痛苦和艰难的,常常会因为一小点的错误而在编译失败与再次修改的漫漫循环之路中,但失败的越多,对人的考验就越多,在编译运行成功之后的享受成功的喜悦也就越多,另外在调试程序的过程中不断的思考和运用已经学到的知识,这对于自己是有很大的提高的。
由于所学的知识不多,自己的编程经验不足,遇到了一些问题。
例如:
多个数据存储问题,返回上一菜单问题,未接受回车符而造成的后面程序无法运行等问题,经过查询资料,小组讨论以及向指导老师求助,我们顺利地解决了上述问题,从而积累了一些编程经验。
通过这几天地实践,发现该管理系统存在升级的空间,界面不是十分友好,这些方面有待完善。