C语言学生成绩管理系统.docx
- 文档编号:11782035
- 上传时间:2023-04-01
- 格式:DOCX
- 页数:47
- 大小:309.98KB
C语言学生成绩管理系统.docx
《C语言学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《C语言学生成绩管理系统.docx(47页珍藏版)》请在冰豆网上搜索。
C语言学生成绩管理系统
第一章设计内容、任务及具体要求
1.1内容和要求
强化学习C语言中有关链表及外部文件的内容,独立设计学生成绩管理系统,并编程实现以下功能:
1、整个系统均用C语言实现;
2、利用指针、链表来实现学生成绩的数据结构设计;
3、系统具有输入、显示、查询、删除、排序、插入,保存、读取基本功能;
4、系统的各个功能模块都用函数的形式来实现;
5、可以将学生成绩信息保存在文件中。
6、可以将学生信息从文件中读取出来。
1.2实现功能
1、每一条记录包括一个学生的学号、姓名、3门成绩、平均成绩。
2、输入功能:
可以一次完成无数条记录的输入。
3、显示功能:
完成全部学生记录的显示。
4、查找功能:
完成按姓名查找学生记录,并显示。
5、排序功能:
按学生平均成绩进行排序。
6、插入功能:
按平均成绩高低插入一条学生记录。
7、保存功能:
将学生记录保存在任何自定义的文件中,如保存在:
c:
\score。
8、读取功能:
将保存在文件中的学生记录读取出来。
9、有一个清晰美观界面来调用各个功能
第二章设计的总体思路
2.1系统功能
系统将可以实现以下功能:
1、每一条记录包括一个学生的学号、姓名、3门成绩、平均成绩。
2、输入功能:
可以一次完成无数条记录的输入。
3、显示功能:
完成全部学生记录的显示。
4、查找功能:
完成按姓名查找学生记录,并显示。
5、排序功能:
按学生平均成绩进行排序。
6、插入功能:
按平均成绩高低插入一条学生记录。
7、保存功能:
将学生记录保存在任何自定义的文件中,如保存在:
c:
\score。
8、读取功能:
将保存在文件中的学生记录读取出来。
9、有一个清晰美观界面来调用各个功能
2.2系统的总体框架
图2-2系统总体框架图
2.3系统的总体流程图
图2-3系统总体流程图
注:
此图为概图、程序较多无法一一展示
第三章功能模块的具体设计
3.1定义结构体
本程序需要定义多个结构体,用于存放学生的相关信息。
structstudent//定义结构体
{
intnumber;
charname[10];
floatscore;
floatyuwen;
floatyingyu;
floatshuxue;
floatsum;
floatave;
structstudent*next;
};
typedefstructstudentscore;
intn,k;
3.2main()主函数
主函数功能比较简单,用while循环语句和switch多重选择语句来显示主界面和调用函数。
在主函数的前面要写必须的头文件,预定义语句以及全局变量的结构体。
3.3add()函数
利用while循环结构和else/if语句来实现增加信息的功能。
先定义5个指针*p0,*p1,*p2,*p3,*max,开始运行,当学生学号小于0时返回add函数,重新开始,而当输入0时返回菜单函数。
当输入学号符合要求时,函数向下运行,令p3=head,用else/if语句判断输入的学号是否重复,如果是则重新输入,如果不是,函数继续向下运行。
接下来利用指针来储存依次输入的语文、英语、数学成绩。
而用while结构来保证输入的成绩在0~100之间,如果不是则重新输入。
3.4del()删除函数
在C语言中无法做到删除和移动数据,所以删除记录要先将所有记录从文件中读出,删除后再将记录写回文件中。
每读出一条记录,按其在文件中的顺序做好指针链接关系,然后查处要删除的学生信息,将其在链表中删除,最后再将变动的记录重新写回文件中。
用指针,while循环和else/if结构来实现查找出要删除的学生。
3.5insert()插入函数
在插入函数中利用指针,和else/if语句来实现输入的数据按照插入相
应的位置,流程图如下所示:
图3-5插入函数流程图
3.6load()读取函数
利用指针、链表打开已经储存的信息,主要的流程图如下所示:
图3-6load()函数流程图
3.7save()保存函数
函数比较简单,主要利用指针来把信息保存在文件中,流程图如下所示:
图3-7save()函数流程图
3.8taxis()排序函数
先用if判断是否存在信息,如果没有则返回,如果已经存在则继续运行函数。
利用while循环语句和switch多重选择语句来实现是按照哪一种方式排名,
在用for,if语句来实现排名。
3.9mesu()菜单函数
用do/while循环语句和switch多重选择语句调用各个功能函数,流程图如下所示:
图3-9mesu()函数流程图
3.10search()查询函数
首先输入学号,当没有记录是显示“没有任何学生”,返回函数重新开始。
如过输入学号合格,则对已经存在的记录进行查找,最后打印信息。
函数流程图如下所示:
图3-10search()函数流程图
3.11statistics()统计数据函数
用while循环语句和switch多重选择语句输出记录中的个人总分和平均分、单科平均分、总分最高分、总分最低分,函数流程图如下所示:
图3-11statistics()函数流程图
第四章系统调试
菜单界面运行如下:
图4-1菜单界面
输入函数界面运行如下:
图4-2输入函数界面
查询信息模块运行如下:
图4-3查询信息界面
删除模块运行界面如下:
图4-4删除模块界面
插入模块运行界面如下:
图4-5插入模块界面
显示信息模块运行界面如下:
图4-6显示信息模块界面
统计学生信息模块运行如下:
图4-7统计学生信息模块界面
信息读取模块运行界面如下:
图4-8信息读取模块界面
信息保存模块界面运行如下:
图4-9信息保存模块界面
排序模块运行界面如下:
图4-10排序模块界面
第五章总结与个人体会
(1)该学生成绩管理系统基本可以运行,但是有不少地方仍是设计得不够科学,有些在任务书上的要求没有能十分好的把它运行出来。
(2)、通过本次对C语言的深入学习,让我对C语言有了更多的了解并撑握更多的知识,成功地运用各类函数、循环变量、结构化的程序设计,以及结构体、指针的使用。
(3)、但在学习中发现,编程确实不是很好做的,并非是你想要就能完成的,它需要的是认真、仔细地对待每一个程序块,特别是在对指针的使用时更加困难,那些指针指来指去,一不小心就会看错,编译不出来。
(4)、由于学生的我只是大一,知识水平不够,没能够完完全全地把程序做出来,而且程序中有许多不足之处不能够正确地将它改正,但总体上是可以运行的。
(5)经过这次课程设计,我发现自己不少的不足之处,我将会在以后的学习中把它们改正过来,努力学到更多的知识。
第六章致谢
首先要感谢学校给了我这么一个学习的机会,还提供给我们机房使用,体现了学校对学生实际操作能力的重视;其次要感谢老师平时学习过程中对我的关照,在课程设计过程中对我们的教诲与教导,在那么炎热的天气里为我们作指导;同时也要感谢同学们在学习中各种支持与关注。
第七章参考文献
[1]谭浩强编著.C程序设计第三版.北京:
清华大学出版社,2005
[2]林瑞仲等编著.C语言实例解析精粹.北京:
人民邮电出版社,2005
[3]王旭等编著.C语言实用界面技术.陕西:
西北工业大学出版社,1996
[4]邱仲潘等编著.VisualC++6从入门到精通.北京:
电子工业出版社,2005
第八章程序源代码
#include
#include
#include
#include
#defineNULL0
#defineLENsizeof(structstudent)
#include
structstudent//定义结构体
{intnumber;
charname[10];
floatscore;
floatyuwen;
floatyingyu;
floatshuxue;
floatsum;
floatave;
structstudent*next;
};
typedefstructstudentscore;
intn,k;
score*creat(void)//创建链表
{
score*head;
score*p1,*p2,*p3,*max;
floatsum=0,ave=0;
inti,j;
floatfen;
chart[10];
n=0;
p1=p2=p3=(score*)malloc(LEN);head=p3;
printf("请输入学生信息,输0退出!
\n");
repeat1:
printf("请输入学生学号:
");
scanf("%d",&p1->number);
while(p1->number<0)
{getchar();
printf("输入错误,请重新输入学生学号:
");
scanf("%d",&p1->number);}
if(p1->number==0)
gotoend;
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): "); scanf("%f",&p1->yuwen); while(p1->yuwen<0||p1->yuwen>100) {getchar(); printf("输入错误,请重新输入语文成绩"); scanf("%f",&p1->yuwen);} printf("请输入英语成绩(0~100): "); scanf("%f",&p1->yingyu); while(p1->yingyu<0||p1->yingyu>100) {getchar(); printf("输入错误,请重新输入英语成绩"); scanf("%f",&p1->yingyu);} printf("请输入数学成绩(0~100): "); scanf("%f",&p1->shuxue); while(p1->shuxue<0||p1->shuxue>100) {getchar(); printf("输入错误,请重新输入数学成绩"); scanf("%f",&p1->shuxue);} sum=p1->yuwen+p1->yingyu+p1->shuxue; ave=sum/3; head=NULL; while(p1->number! =0) { n=n+1; if(n==1) head=p1; else p2->next=p1; p2=p1; p1=(score*)malloc(LEN); printf("请输入学生信息,输0退出! \n"); repeat2: printf("请输入学生学号: "); scanf("%d",&p1->number); while(p1->number<0) {getchar(); printf("输入错误,请重新输入学生学号: "); scanf("%d",&p1->number);} if(p1->number==0) gotoend; 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); while(p1->yuwen<0||p1->yuwen>100) {getchar(); printf("输入错误,请重新输入语文成绩"); scanf("%f",&p1->yuwen);} printf("请输入英语成绩(0~100): "); scanf("%f",&p1->yingyu); while(p1->yingyu<0||p1->yingyu>100) {getchar(); printf("输入错误,请重新输入英语成绩"); scanf("%f",&p1->yingyu);} printf("请输入数学成绩(0~100): "); scanf("%f",&p1->shuxue); while(p1->shuxue<0||p1->shuxue>100) {getchar(); printf("输入错误,请重新输入数学成绩"); scanf("%f",&p1->shuxue); } } 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; } } max=head;p1=head; } p2->next=NULL; printf("共存在%d个学生信息! \n",n); return(head); } voidprint(structstudent*head)//输出函数 {structstudent*p1; floatsum,ave; printf("\nNow,These%drecordsare: \n",n);p1=head; if(head! =NULL) printf("------------------------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|英语\t|数学\t|总分\t|平均分\t|\n"); printf("-------------------------------------------------------\n"); do {sum=p1->yuwen+p1->yingyu+p1->shuxue; ave=sum/3; printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue,sum,ave); p1=p1->next; }while(p1! =NULL); } score*del(score*head)//删除函数 { score*p1,*p2; intnumber; printf("输入要删除的学生的学号(输入0则退出): "); scanf("%d",&number); getchar(); while(number! =0) { if(head==NULL) { printf("\n没有任何学生信息! \n"); return(head); } p1=head; while(number! =p1->number&&p1->next! =NULL) { p2=p1;p1=p1->next; } if(number==p1->number) { if(p1==head) head=p1->next; else p2->next=p1->next; printf("删除: %d\n",number);n=n-1; } else printf("%d不存在此学生! \n",number); printf("输入要删除的学生的学号: "); scanf("%d",&number); getchar(); } #ifdefDEBUG printf("已经退出了! \n"); #endif printf("现在的学生数为: %d个! \n",n); return(head); } structstudent*insert(structstudent*head,structstudent*stud)//插入函数 {structstudent*p0,*p1,*p2; p1=head; p0=stud; if(head==NULL)//头指针为空 {head=p0;p0->next=NULL;} else {while((p0->number>p1->number)&&(p1->next! =NULL)) {p2=p1; p1=p1->next;} if(p0->number<=p1->number) {if(head==p1)head=p0; elsep2->next=p0; p0->next=p1;} else {p1->next=p0;p0->next=NULL;}} n=n+1; return(head); } score*load(score*head)//读取文件信息 {score*p1,*p2; floatsum,ave; intm=0; charfilepn[10]; FILE*fp; printf("请输入文件路径及文件名: "); scanf("%s",filepn); if((fp=fopen(filepn,"r+"))==NULL) { printf("不能打开文件! \n"); return0; } fscanf(fp,"----------------------------------------------------------\n"); fscanf(fp,"|学号\t|姓名\t|语文\t|英语\t|数学\t|总分\t|平均分\t|\n"); fscanf(fp,"----------------------------------------------------------\n"); printf("------------------------------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|英语\t|数学\t|总分\t|平均分\t|\n"); printf("------------------------------------------------------------\n"); m=m+1; if(m==1) { p1=(score*)malloc(LEN); sum=p1->yuwen+p1->yingyu+p1->shuxue; ave=sum/3; fscanf(fp,"%d%s%f%f%f%f%f",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue,sum,ave); printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue,sum,ave); head=NULL; do { 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%f\n",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue,sum,ave); printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue,sum,ave); }while(! feof(fp)); p2->next=p1; p1->next=NULL; n=n+1; }printf("---------------------------------------------------------\n"); fclose(fp); return(head); } 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); while(stu->number<0) {getchar(); printf("输入错误,请重新输入学生学号: "); scanf("%d",&stu->number);} if(stu->number==0) gotoend2; else {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 学生 成绩管理系统