学生成绩管理系统C语言.docx
《学生成绩管理系统C语言.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统C语言.docx(29页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统C语言
课程设计名称:
高级语言程序设计
专业班级:
学生姓名:
学号:
指导教师:
课程设计时间:
专业课程设计任务书
学生姓名
专业班级
学号
题目
学生成绩管理系统
课题性质
课题来源
指导教师
同组姓名
主要内容
学习掌握并熟练运用C语言进行程序设计;
学习使用数组、指针、结构体和文件等数据结构;
根据具体题目进行简单的需求分析,给出设计方案。
任务要求
综合运用和融化所学理论知识,提高分析和解决实际问题的能力,使用C语言设计一个简单的学生成绩管理系统;
完成需求分析报告,报告中对关键部分给出图表说明。
要求格式规范,工作量饱满。
参考文献
《C语言程序设计》(第三版)谭浩强清华大学出版社
《数据结构(C语言版)》严蔚敏清华大学出版社
审查意见
指导教师签字:
教研室主任签字:
年月日
说明:
本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
1需求分析
1.1本程序实现一个小型的学生成绩管理系统。
利用C语言编制程序,实现学生成绩信息的输入、调入、查询、删除、追加、显示、统计、保存、排序、退出等功能。
2.1本题我选择了最简单的顺序存储结构,而且九个功能再加上一个菜单功
能,则共要七个部分。
因为有以往的经验,可以预知本次的量是很大的,而且还限制了很多的元素,因此源程序应该不会变化太大,实现起来还是比较简单的。
2概要设计
2.1函数creat功能:
创建链表,此函数带回一个指向链表头的指针。
在该函数中完成学生成绩信息的输入。
2.2函数load功能:
从文件读入学生记录。
在该函数中完成从磁盘文件中录入学生成绩信息的功能。
2.3函数add功能:
追加学生资料,并且将所有学生资料按学号排序。
在该函数中完成对学生成绩信息的插入,并把插入后的所有学生成绩信息按学号排序。
2.4函数search功能:
查询学生成绩。
在该函数中完成对已有学生成绩信息的查询。
2.5函数del功能:
删除学生资料。
在该函数中实现对已有学生成绩信息的删除。
2.6函数print功能:
显示学生成绩。
以表格形式显示已有的学生成绩信息。
2.7函数statistics功能:
统计学生成绩。
以个人总分和平均分、单科平均分、单科最高分、单科最低分、单科分数段人数五种方式对学生成绩信息进行统计。
2.8函数save功能:
保存学生的资料。
在该函数中实现把现有学生成绩信息保存到磁盘文件中。
2.9函数taxis功能:
排序。
以按学生学号排序、按平均分排序、按语文成绩排序、按英语成绩排序、按数学成绩排序这五种排序方式对学生成绩信息进行排序。
2.10函数menu功能:
菜单选择界面。
为用户提供一个友好的使用界面。
2.11主函数main功能:
通过调用以上所述的各个函数,实现学生成绩管理系统功能。
3运行环境
3.1硬件环境:
普通PC机。
3.2软件环境
1)操作系统:
WindowsXP
2)编程环境:
VisualC++6.0
4开发工具和编程语言
4.1开发工具:
MicrosoftVisualC++6.0
4.2编程语言:
VisualC
5详细设计
5.1创建链表,实现学生成绩信息的输入功能。
score*creat(void)
{score*head;
score*p1,*p2,*p3,*max;
inti,j;
floatfen;
chart[10];
n=0;
p1=p2=p3=(score*)malloc(LEN);head=p3;/*开辟一个新单元*/
printf("请输入学生资料,输0退出!
\n");
repeat1:
printf("请输入学生学号(学号应大于0):
");
scanf("%d",&p1->number);/*输入学号,学号应大于0*/
while(p1->number<0)
{getchar();
printf("输入错误,请重新输入学生学号:
");
scanf("%d",&p1->number);}
/*输入学号为字符或小于0时,程序报错,提示重新输入学号*/
if(p1->number==0)gotoend;/*当输入的学号为0时,转到末尾,结束创建链表*/
else{p3=head;
if(n>0)
{for(i=0;i{if(p1->number!
=p3->number)p3=p3->next;
else{printf("学号重复,请重输!
\n");
gotorepeat1;}/*当输入的学号已经存在,程序报错,返回前面重新输入*/
}
}
}
printf("请输入学生姓名:
");
scanf("%s",&p1->name);/*输入学生姓名*/
printf("请输入语文成绩(0~100):
");/*输入语文成绩,成绩应在0-100*/
scanf("%f",&p1->yuwen);
while(p1->yuwen<0||p1->yuwen>100)
{printf("输入错误,请重新输入语文成绩:
");
scanf("%f",&p1->yuwen);}/*输入错误,重新输入语文成绩直到正确为止*/
printf("请输入英语成绩(0~100):
");/*输入英语成绩*/
scanf("%f",&p1->yingyu);
while(p1->yingyu<0||p1->yingyu>100)
{printf("输入错误,请重新输入英语成绩");
scanf("%f",&p1->yingyu);}/*输入错误,重新输入*/
printf("请输入数学成绩(0~100):
");/*输入数学成绩*/
scanf("%f",&p1->shuxue);
while(p1->shuxue<0||p1->shuxue>100)
{printf("输入错误,请重新输入数学成绩");
scanf("%f",&p1->shuxue);}/*输入错误,重新输入*/
p1->ave=(p1->shuxue+p1->yingyu+p1->yuwen)/3;
head=NULL;
while(p1->number!
=0)
{n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(score*)malloc(LEN);
printf("请输入学生资料,输0退出!
\n");
repeat2:
printf("请输入学生学号(学号应大于0):
");
scanf("%d",&p1->number);/*输入学号,学号应大于0*/
while(p1->number<0)
{printf("输入错误,请重新输入学生学号:
");
scanf("%d",&p1->number);}
/*输入学号为字符或小于0时,程序报错,提示重新输入学号*/
if(p1->number==0)gotoend;/*当输入的学号为0时,转到末尾,结束创建链表*/
else{p3=head;
if(n>0)
{for(i=0;i{if(p1->number!
=p3->number)p3=p3->next;
else{printf("学号重复,请重输!
\n");
gotorepeat2;}/*当输入的学号已经存在,程序报错,返回前面重新输入*/
}
}
}
printf("请输入学生姓名:
");
scanf("%s",&p1->name);/*输入学生姓名*/
printf("请输入语文成绩(0~100):
");
scanf("%f",&p1->yuwen);/*输入语文成绩,成绩应在0-100*/
while(p1->yuwen<0||p1->yuwen>100)
{printf("输入错误,请重新输入语文成绩");
scanf("%f",&p1->yuwen);}/*输入错误,重新输入到正确为*/
printf("请输入英语成绩(0~100):
");
scanf("%f",&p1->yingyu);/*输入英语成绩,成绩应在0-100*/
while(p1->yingyu<0||p1->yingyu>100)
{printf("输入错误,请重新输入英语成绩");
scanf("%f",&p1->yingyu);}/*输入错误,重新输入*/
printf("请输入数学成绩(0~100):
");
scanf("%f",&p1->shuxue);/*输入数学成绩,成绩应在0-100*/
while(p1->shuxue<0||p1->shuxue>100)
{printf("输入错误,请重新输入数学成绩");
scanf("%f",&p1->shuxue);}/*输入错误,重新输入*/
p1->ave=(p1->shuxue+p1->yingyu+p1->yuwen)/3;
}
end:
p1=head;p3=p1;
for(i=1;i{for(j=i+1;j<=n;j++)
{max=p1;
p1=p1->next;
if(max->number>p1->number)
{k=max->number;
max->number=p1->number;
p1->number=k;/*交换前后结点中的学号值,使得学号大者移到后面的结点中*/
strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);/*交换前后结点中的姓名,使之与学号相匹配*/
fen=max->yuwen;
max->yuwen=p1->yuwen;
p1->yuwen=fen;/*交换前后结点中的语文成绩*/
fen=max->yingyu;
max->yingyu=p1->yingyu;
p1->yingyu=fen;/*交换前后结点中的英语成绩*/
fen=max->shuxue;
max->shuxue=p1->shuxue;
p1->shuxue=fen;/*交换前后结点中的数学成绩*/
fen=max->ave;
max->ave=p1->ave;
p1->ave=fen;/*交换前后结点中的平均成绩*/
}
}
max=head;p1=head;/*重新使max,p指向链表头*/
}
p2->next=NULL;/*链表结尾*/
printf("输入的学生数为:
%d个!
\n",n);
return(head);
}
5.2从文件读取学生成绩信息。
score*load(score*head)
{score*p1,*p2;
intm=0;
charfilepn[10];
FILE*fp;
printf("请输入文件路径及文件名:
");
scanf("%s",filepn);/*输入文件路径及名称*/
if((fp=fopen(filepn,"r"))==NULL)
{printf("不能打开文件!
\n");
return0;
}
fscanf(fp,"考试成绩管理系统\n");
fscanf(fp,"欢迎使用\n");
fscanf(fp,"------------------------------------------------\n");
fscanf(fp,"|学号\t|姓名\t|语文\t|英语\t|数学\t|平均分\t|\n");
fscanf(fp,"------------------------------------------------\n");
printf("考试成绩管理系统\n");
printf("欢迎使用\n");
printf("------------------------------------------------\n");
printf("|学号\t|姓名\t|语文\t|英语\t|数学\t|平均分\t|\n");
printf("------------------------------------------------\n");
n=0;
p1=p2=(score*)malloc(LEN);/*开辟一个新单元*/
fscanf(fp,"%d%s%f%f%f%f",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue,&p1->ave);
head=NULL;
while(!
feof(fp))
{n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(score*)malloc(LEN);/*开辟一个新单元*/
fscanf(fp,"%d%s%f%f%f%f",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue,&p1->ave);
}
p2->next=NULL;
printf("------------------------------------------------\n");/*表格下线*/
fclose(fp);/*结束读入,关闭文件*/
print(head);
return(head);
}
5.3查询学生成绩信息。
score*search(score*head)
{intnumber;
score*p1,*p2;
printf("输入要查询的学生的学号:
");
scanf("%d",&number);
while(number!
=0)
{if(head==NULL)
{printf("\n没有任何学生资料!
\n");return(head);}
printf("-----------------------------------------\n");
printf("|学号\t|姓名\t|语文\t|英语\t|数学\t|\n");
printf("-----------------------------------------\n");
p1=head;
while(number!
=p1->number&&p1->next!
=NULL)
{p2=p1;p1=p1->next;}
if(number==p1->number)
{printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue);
printf("-----------------------------------------\n");}
elseprintf("%d不存在此学生!
\n",number);
printf("输入要查询的学生的学号:
");
scanf("%d",&number);
}
printf("已经退出了!
\n");
return(head);}
5.4删除学生成绩信息。
score*del(score*head)/*函数del功能:
删除学生资料*/
{score*p1,*p2;
intnumber;
printf("输入要删除的学生的学号(输入0时退出):
");
scanf("%d",&number);
while(number!
=0)/*输入学号为0时退出*/
{if(head==NULL)
{printf("\n没有任何学生资料!
\n");
return(head);
}
p1=head;
while(number!
=p1->number&&p1->next!
=NULL)
{p2=p1;p1=p1->next;}/*p1后移一个结点*/
if(number==p1->number)/*找到了*/
{if(p1==head)
head=p1->next;/*若p1指向的是首结点,把地二个结点地址赋予head*/
else
p2->next=p1->next;/*否则将下一个结点地址赋给前一结点地址*/
printf("删除:
%d\n",number);n=n-1;
}
elseprintf("%d不存在此学生!
\n",number);/*找不到该结点*/
printf("输入要删除的学生的学号:
");
scanf("%d",&number);
}
printf("已经退出了!
\n");
printf("现在的学生数为:
%d个!
\n",n);
return(head);
}
5.5追加某学生成绩信息。
score*add(score*head,score*stu)
{score*p0,*p1,*p2,*p3,*max;
inti,j;
floatfen;
chart[10];
p3=stu=(score*)malloc(LEN);/*开辟一个新单元*/
printf("\n输入要增加的学生的资料!
");
repeat4:
printf("请输入学生学号(学号应大于0):
");
scanf("%d",&stu->number);/*输入学号,学号应大于0*/
while(stu->number<0)
{printf("输入错误,请重新输入学生学号:
");
scanf("%d",&stu->number);}/*输入错误,重新输入学号*/
if(stu->number==0)gotoend2;/*当输入的学号为0时,转到末尾,结束追加*/
else{p3=head;
if(n>0)
{for(i=0;i{if(stu->number!
=p3->number)p3=p3->next;
else{printf("学号重复,请重输!
\n");
gotorepeat4;}/*当输入的学号已经存在,程序报错,返回前面重新输入*/
}
}
}
printf("输入学生姓名:
");
scanf("%s",stu->name);/*输入学生姓名*/
printf("请输入语文成绩(0~100):
");
scanf("%f",&stu->yuwen);/*输入语文成绩,成绩应在0-100*/
while(stu->yuwen<0||stu->yuwen>100)
{printf("输入错误,请重新输入语文成绩");
scanf("%f",&stu->yuwen);}/*输入错误,重新输入*/
printf("请输入英语成绩(0~100):
");
scanf("%f",&stu->yingyu);/*输入英语成绩,成绩应在0-100*/
while(stu->yingyu<0||stu->yingyu>100)
{printf("输入错误,请重新输入英语成绩");
scanf("%f",&stu->yingyu);}/*输入错误,重新输入*/
printf("请输入数学成绩(0~100):
");
scanf("%f",&stu->shuxue);/*输入数学成绩,成绩应在0-100*/
while(stu->shuxue<0||stu->shuxue>100)
{printf("输入错误,请重新输入数学成绩");
scanf("%f",&stu->shuxue);}/*输入错误,重新输入*/
stu->ave=(stu->shuxue+stu->yingyu+stu->yuwen)/3;
p1=head;
p0=stu;
if(head==NULL){head=p0;p0->next=NULL;}/*当原来链表为空时,从首结点开始存放资料*/
else{if(p1->next==NULL)/*找到原来链表的末尾*/
{p1->next=p0;p0->next=NULL;}/*将它与新开单元相连接*/
else{while(p1->next!
=NULL)/*还没找到末尾,继续找*/
{p2=p1;p1=p1->next;}
p1->next=p0;
p0->next=NULL;
}
}
n=n+1;
p1=head;p0=stu;
for(i=1;i{for(j=i+1;j<=n;j++)
{max=p1;
p1=p1->next;
if(max->number>p1->number)
{k=max->number;
max->number=p1->number;
p1->number=k;/*交换前后结点中的学号值,使得学号大者移到后面的结点中*/
strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);/*交换前后结点中的姓名,使之与学号相匹配*/
fen=max->yuwen;
max->yuwen=p1->yuwen;
p1->yuwen=fen;/*交换前后结点中的语文成绩*/
fen=max->yingyu;
max->yingyu=p1->yingyu;
p1->yingyu=fen;/*交换前后结点中的英语成绩*/
fen=max->shuxue;
max->shuxue=p1->shuxue;
p1->shuxue=fen;/*交换前后结点中的数学成绩*/
fen=max->ave;
max->ave=p1->ave;
p1->ave=fen;/*交换前后结点中的平均成绩*/
}
}
max=head;p1=head;/*重新使max,p指向链表头*/
}
end2:
printf("现在的学生数为:
%d个!
\n",n);
return(head);
}
5.6以多种方式统计学生成绩。
score*statistics(score*head)
{floatsum1=0,sum2=0,sum3=0,ave1=0,ave2=0,ave3=0,maxyw,maxyy,maxsx,max1,max2,max3;
score*p;
intx,y=0,i=0;
p=head;
printf("1个人总分和平均分\t2单科平均分\t3单科最高分\t4单科最低分\t5单科分数段人数\n");
scanf("%d",&x);
switch(x)/*用switch语句实现功能选择*/
{case1:
if(head==NULL)
{printf("\n没有任何学生资料!
\n");return