学生成绩管理系统C语言.docx
- 文档编号:30346011
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:29
- 大小:61.28KB
学生成绩管理系统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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统 语言