C语言学生成绩管理系统实验报告.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 学生 成绩管理系统 实验 报告
- 资源描述:
-
C语言学生成绩管理系统实验报告 30 2020年4月19日 文档仅供参考,不当之处,请联系改正。 HUNAN UNIVERSITY 程序设计训练 报 告 题 目 学生成绩管理系统 学生姓名 学生学号 专业班级 指导老师 湖南大学程序设计训练报告 目 录 一 程序功能简介…………………………………………………………………………….........3 二 本人完成的主要工作…………………………………………………………………….....3 三 设计方案 …………………………………………………………………………….........3 1) 设计分析…………………………………………………………………………….........3 2) 模块的功能及程序分析…………………………………………………………......4 3) 核心算法流程图……………………………………………………………………......7 4) 核心源程序模块………………………………………………………………………..8 5) 操作方法简介…………………………………………………………………………...8 6) 实验结果…………………………………………………………………………….........9 8) 设计体会…………………………………………………………………………….........11 四 附录 ……………………………………………………………………………..............12 一、 程序功能简介; 本程序作为一个学生成绩管理系统,用户能够首先使用管理员模式初始化该系统。初始化完成之后,用户能够选择使用成绩记录人模式进入系统,对学生成绩进行记录。系统自动储存所记录的学生成绩,然后用户可根据不同需要来选择不同的功能来使用程序,其中包括成绩查询与增减,成绩排序,成绩分析等功能。 二、 本人完成的主要工作; 程序设计分析,绘制程序流程图,写出大致结构算法以及各个核心算法模块,写出核心源程序,对源程序进行算法优化,对源代码进行多次试验验证其正确性,完成源代码的测试以及代码书写规范检测。 三、 设计方案; 1) 设计分析; 首先拿到这个题目,我就开始思考如何将这个看似简单的系统做的较为完善,而不是简简单单的学生成绩管理系统,学生管理系统自然是这个题目的核心,从中发散思维,我想到了几个比较细小的地方。例如:如何很好的将程序中的功能步骤化,系统化以及便利化。基于C语言程序的特点,我还联想到了对信息的保存问题。这些问题都随着代码的一步一步完善而解决。管理员系统与查询系统的选择很好的解决了这些问题。 2) 模块的功能及程序说明; 整个系统除了主函数外,另外还有10个函数,实现八大功能:输入功能、显示功能、查找功能、排序功能、插入功能、保存功能、读取功能。各个函数的详细设计说明分别如下: 1、 主函数 main() 利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。 2、 初始化函数 STUDENT *init() 这是一个无参函数,里面只有一个语句,它的作用是使链表初始化,使head的值为NULL。比如:没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码! 3、 菜单选择函数 int menu_select(); 这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择,中间还显示系统当前的时间。等执行完每一个函数功能后,按任一键回到主界面也要经过这个函数来实现! 4、 输入记录函数 STUDENT *create() 这是一个无参函数,用来执行第学生成绩记录的输入,当学生为0时停止输入,函数结束后,带回一个指向链表头的指针head。 算法:先声明一个首节点head,并将head->next设为NULL。每输入一个数据就声明一个新节点p,把p->next设为NULL,而且链接到之前列表的尾端。 5、 显示记录函数 void print(STUDENT *head) 这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。 算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为止。 6、 查找记录函数 void search(STUDENT *head) 这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号对某个学生进行查找,并显示所查找到的记录。 算法:采用线性查找法往下一个节点查找。输入所要查找的学生的学号s,设一个指针变量p,先指向第一个结点,当strcmp(p->name,s) && p != NULL时,使p后移一个结点,如果p!=NULL,输出p所指的结点。 7、 删除记录函数 STUDENT *delete(STUDENT *head) 这是一个有参函数,形参为“链表头的指针”,先输入要删除的学生记录的学号,找到后显示该学生信息,等确认后便可按“Y”进行删除。 算法:从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的那个学号。如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止。 8、排序函数 STUDENT *sort(STUDENT *head) 这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高低进行排序,还能够显示名次。 8、 插入函数 STUDENT *insert(STUDENT *head,STUDENT *new) 这是一个有参函数,形参有两个,一个是“链表头的指针”,一个是“待插入指针”,按照原来成绩平均分的高低进行插入,插入后会重新进行排序,并返回。 算法:先将学生的成绩按平均分由高分到低分进行排序,再插入一个新生的结点,要求按平均分的高低顺序插入。先用指针变量p0指向待插入的结点,p1指向第一个结点。如果p0->average<p1->average,则待插入的结点不应插在p1所指的结点之前。此时将p1后移,并使p2指向刚才p1所指的结点。重复以上的步骤,直到p0->average>=p1->average为止。这时将p0指向的结点插到p1所指结点之前。可是如果p1所指的已是表尾结点,则p1就不应后移了。如果p0->average比所有结点的average都小,则应将p0所指的结点插到链表末尾。如果插入的位置既不在第一个结点之前,又不在表尾结点之后,则将p0的值赋给p2->,使p2->next指向待插入的结点,然后将p1的值赋给p0->next,使得p0->next指向p1指向的变量。如果插入位置为第一个结点之前,则将p0赋给head,将p1赋给p0->next。如果要插到表尾之后,应将p0赋给p1->next,NULL赋给p0->next。最后再调用排序的函数,将学生成绩重新排序. 10、保存数据到文件函数 void save(STUDENT *head) 这是一个不返回值的有参函数,形参为“链表头的指针”,能够把学生记录保存在电脑上由自己任意命名的二进制文件。 3) 核心算法流程图; 4) 核心源程序模块; 核心源程序为驱动整个程序运行的最重要的模块,经过核 心源程序将2)中的主要模块进行组织与构成,依次执行 上述的十个模块中的程序,使程序能够正常运行。 总体功能要求: (1)链表的建立,每个节点包括:学号、姓名、性别、语 文、数学、英语、总分。 (2)节点的插入,按学号的顺序插入。 (3)删除链表中的节点,按学号或者姓名。 (4)链表的输出。按学号排序、按总分排序 功能模块 图、流程图(要求有总体的功能模块图、各部分流程图): 核心源程序位于main函数中,先对系统进行初始化,之后 进入模式选择界面,选择模式并进行相应的操作,返回值 模式选择界面,直到录入完成,进行查询计算,查询结束 能够选择删改,最后退出程序。 5) 操作方法简介; 作为一个学生成绩管理系统,用户能够首先使用管理员模式初始化该系统,并产生一个开始的学生成绩系统,初始化时可输入学生姓名、学生学号、学生各科成绩等信息。初始化完成之后,用户可选择使用管理员模式进入系统修改学生信息,也能够选择使用用户模式进入系统,对学生成绩进行各项查询,其中有成绩最高分查询,还能够按照不同的要求进行排序,有按照学号,按照分数高低等;同时能够生成学生成绩表,更加直观的对比查询学生各项成绩,最后还能够删除或者添加学生成绩及各项信息,避免开始的录入错误。 6) 实验结果; 1.初次进入系统,进行学生成绩系统的初始化: 能够根据学生人数的多少输入若干学生的各项信息和成绩信 息,当要结束时,能够输入0结束学生信息的录入。 2. 能够选择按照学生的总分进行排序,并清楚的显示其排序结 果。 3.接下来能够进行学生成绩统计排序。 4. 在学生成绩管理系统中,能够根据初始化的数据,对学生计算学生均分以及求出单科最高分的同学。 7) 设计体会; 此次C语言程序设计实践,本人实在是获益不浅!C语言是上个学期开的课程,因此这个学期并没怎么看过,当要开始设计的时候,还真不知从哪下手!结果,第一次的上机,我只坐了一个下午,什么也没干!回去以后,我想,这样不行,这样下去还得了!我就重新学了一遍我们上个学期的教材,发觉自已有许多都遗忘了!特别是有文件的操作,几乎是一遍空白!几乎花了我百分之九十的时间,而且还是在一些在其它同学的帮助下和在上网查看了大量的资料之后才做出来!最后,想说两句,这次设计,让我重新掌握了C语言,而且还得到了用C语言解决实际问题的宝贵经验! 经过对该课题的程序设计,我认识到了C语言作为一种程序机械语言的灵活性。C语言不但仅是C++以及其它程序语言的基础,也能够做出许多复杂的程序。在试验当中,经过对许多不甚了解的语言规则的上网查阅,丰富了我自己对C语言的知识与认识。也了解了许多C语言程序设计的基本思路,开阔了自己的视野,也巩固了上学期对于C语言的学习。 四、 附录: (1) 主要变量: 1) int num; /*学号*/; 2) char name[20]; /*姓名*/; 3) char sex[2]; / *性别*/; 4) int score[3]; /*成绩*/; 5) int sum; /*总成绩*/; 6) int n; /*声明一个全局变量*/; 7) struct student *next /*声明一个结构体指针*/; (2) 自定义函数: 1)Student *cin(void); /*学生信息成绩录入函数*/ 2)Student *sort_1(Student *head,int); /*声明按学号排序函数*/ 3)void sort_2(Student *head); /*声明按总分排序函数*/ 4)void print(Student *head); /*声明显示函数*/ 5)Student *sort_all(Student *head); /*声明排序函数*/ 6)void find(Student *head); /*声明查询函数*/ (3) 源程序代码: #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #define LEN sizeof(Student) typedef struct student { int num; /*学号*/ char name[20]; /*姓名*/ char sex[2]; /*性别*/ int score[3]; /*成绩*/ int sum; /*总成绩*/ struct student *next; }Student; int n; /*声明一个全局变量*/ Student *cin(void); Student *sort_1(Student *head,int); /*声明按学号排序函数*/ void sort_2(Student *head); /*声明按总分排序函数*/ void print(Student *head); /*声明显示函数*/ Student *sort_all(Student *head); /*声明排序函数*/ void find(Student *head); /*声明查询函数*/ Student *add_new(Student *head); Student *cin() { int flag; 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"); return head; } Student *sort_all(Student *head) /*定义排序函数*/ { int choose; 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) { case 1: case 2: case 3: case 4: case 5: case 6:head=sort_1(head,choose);break; case 7:print(head);sort_2(head);break; case 8:print(head);break; case 0:return head; default: printf("\n\n您的输入有误!请重新输入:\n\n");break; } } } Student *sort_1(Student *head,int choose) /*定义按学号排序函数*/ { Student *p1,*p2=head->next,*pm,*px; Student mid; if (!p2) return head; for(p1=p2;p1->next!=NULL;p1=p1->next) { pm=p1; for(p2=p1->next;p2!=NULL;p2=p2->next) switch(choose) { case 1:if (pm->num>p2->num) pm=p2;break; case 2:if (pm->sum<p2->sum) pm=p2;break; case 3:if (pm->score[0]<p2->score[0]) pm=p2;break; case 4:if (pm->score[1]<p2->score[1]) pm=p2;break; case 5:if (pm->score[2]<p2->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); return head; } void sort_2(Student *head) /*定义按总分排序函数*/ { Student *p=head->next; int max_1,max_2,max_3,min_1,min_2,min_3; int max_sum,min_sum; int sum_1=0,sum_2=0,sum_3=0; float aver_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_1<p->score[0]) max_1=p->score[0]; else if (min_1>p->score[0]) min_1=p->score[0]; if (max_2<p->score[1]) max_2=p->score[1]; else if (min_2>p->score[1]) min_2=p->score[1]; if (max_3<p->score[2]) max_3=p->score[2]; else if (min_3>p->score[2]) min_3=p->score[2]; if (max_sum<p->sum) max_sum=p->sum; else if (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); } void find(Student *head) /*定义查询函数*/ { Student *p; int choose,fnum; char tem[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); } else if (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); } } } else if (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); } else if (!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); } } } else if (choose==0) {printf("\n你选择了不查询!\n");break;} else {printf("\n你以其它方式选择了不查询!\n");break;} } } Student *add_new(Student *head) /*定义插入函数*/ { Student *p; int flag; 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); return head; } void print(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]); } struct student *del(struct student *head,long num) /*定义删除学生信息函数*/ {struct student *p1,*p2; if(head==NULL) {printf("\nlist null! \n");return head;} p1=head; while(num!=p1->num && p1->next!=NULL) {p2=p1;p1=p1->next;} if(num==p1->num) {if(p1==head)head=p1->next; else p2->next=p1->next; printf("delete:%ld\n",num); n=n-1; } else printf("%ld not deen found! \n",num); return(head); } int main()/*主函数即用户的操作界面*/ { Student *head; int choose,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) { case 1: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;} else if (i==0) { printf("\n你选择了放弃建立新的数据系统!\n"); break; } else { printf("\n你做出别的选择,当作放弃建立!\n"); break; } case 2:head=sort_all(head);break; /*调用排序函数*/ case 3:find(head);break; /*调用查询函数*/展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




C语言学生成绩管理系统实验报告.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/4456249.html