学生成绩管理系统 C语言.doc

上传人:最*** 文档编号:1557134 上传时间:2019-10-27 格式:DOC 页数:22 大小:178.50KB
返回 下载 相关 举报
学生成绩管理系统 C语言.doc_第1页
第1页 / 共22页
学生成绩管理系统 C语言.doc_第2页
第2页 / 共22页
学生成绩管理系统 C语言.doc_第3页
第3页 / 共22页
点击查看更多>>
资源描述
_福建工程学院计算机与信息科学系实验报告 2012 2013 学年第 1 学期 任课老师: 章静 课程名称 结构化程序综合设计班级计算机1001座号3100301114姓名张扬文实验题目学生成绩管理系统实验时间实验开始日期:2012/2/24 报告提交日期:2012/3/10 实验目的、要求1该实验的课内学时是4个课时。2程序完成后应该完成如下基本功能:1)用自定义结构体typedef struct设计该软件的数据结构;2)用数组或指针链表将所有学生的数据按照学号顺序链接起来;3)程序能够按照学号顺序输入学生的三门成绩,并计算平均成绩和总成绩。4)程序能够显示已经输入的指定学号的学生成绩以及平均成绩和总成绩。5)程序能够按要求显示指定分数段的学生成绩以及平均成绩和总成绩。6)能够统计班级总人数、班级平均成绩。7)能够增加和删除指定学生的成绩。8)按照指定的要求以及顺序(升序或降序)显示学生成绩以及平均成绩和总成绩。 实验步骤与内容 按如下顺序写:1、 主要设计思想;学生成绩管理系统包含多种功能,可以输入学生成绩,删除,插入,排序,查找等等。输入的信息又包含学生姓名,学号,各科成绩。所以首先要定义一个结构体:typedef struct node char id20; char name15; int scoreMAXCOURSE; int sum; double average; struct node *next;Student;根据结构体中的内容飙血程序。2、 主要数据结构及其解释在此次程序设计中用了链表来实现对数据的处理,并设计了菜单界面如图,根据switch语句来对用户的选择: 3、 模块关系图; 主函数输入学生信息打印成绩计算平均分和总分查找学生成绩插入学生成绩显示分数段的学生按总分平均分降序排列菜单4、 所有函数的简要说明;1) 插入函数Insert_Before();主要是要重新加入学生的信息,通过头插法。2) 计算平均分和总分Count_Score();将输入的数据计算出学生的平均分和总分。3) 删除学生信息Del_Student();删除某个学生的成绩。4) 按姓名查找Searchname_Student();通过输入学生的姓名找到学生的成绩。5) 计算班级总人数people=Count_People();将总的输入学生人数打印出来。6) 显示某分数段学生信息Section_Score();首先选择你要某科目的成绩并输入成绩的范围,按条件输出学生成绩。7) 按总分,平均分降序排列Descend_English();将输入的全部学生成绩按总分排序。 5、 所有源代码; /*学生成绩管理系统 C语言*/#include #include #include #define MAXID 10#define MAXNAME 20#define MAXCOURSE 3/* 学生数据结构 */typedef struct node char id20; char name15; int scoreMAXCOURSE; int sum; double average; struct node *next;Student;/* 头指针 */Student *head = NULL;/*课程名称*/char ClassNameMAXCOURSE20=数学,英语,计算机;/* 菜单 */int Menu() system(cls); fflush(stdin); printf( 计算机1001 张扬文 3100301114 n); printf(n); printf(*学生成绩管理系统*n); printf(n); printf( 1-初始化n); printf( 2-输入学生信息n); printf( 3-计算所有学生的总分和平均分n); printf( 4-打印全部学生信息n); printf( 5-查找学号或姓名删除学生信息n); printf( 6-按姓名查找学生信息n); printf( 7-按学号查找学生信息n); printf( 8-查找某一科成绩段学生信息n); printf( 9-插入学生信息到链表中n); printf( 10-按总分或平均分降序排列学生成绩n); printf( 0-退出n); return 0;/*初始化*/Student *Init() int i; Student *head; head=(Student *)malloc(sizeof(Student); head-next=NULL; return head;/*检查学号*/char Check_ID(char *s) int i; if(strlen(s)=0|strlen(s)MAXID)return 0; for(i=0;i 0 & si MAXNAME) return 0; for(i=0; i= a & si = A & si =0 & snext; while(p!=NULL) if(strcmp(s,p-id)=0) return 1; p=p-next; return 0;/* 输入学生信息 */void Input_Score(Student *p) /* 学号 */ printf(n请输入学号: ); do gets(p-id); if (!Check_ID(p-id) printf(输入不正确!请重新输入学号: ); else if (Is_SameID(p-id) printf(存在已学号!请重新输入学号: ); while (!(Check_ID(p-id) & !Is_SameID(p-id); /* 姓名 */ printf(请输入姓名: ); do gets(p-name); if (!Check_Name(p-name) printf(输入不正确!请重新输入姓名: ); while (!Check_Name(p-name); /输入成绩 int i; for(i=0; iscorei); if(!Check_Score(p-scorei) printf(输入成绩不正确!n请重新输入%s成绩:,ClassNamei); while(!Check_Score(p-scorei); p-average = -1; p-sum = -1; /* 头插法插入节点 */void Insert_Before() Student *s =(Student*) malloc(sizeof(Student); Input_Score(s); s-next = head-next; head-next = s;/*输出学生成绩信息*/void Output_Score(Student *p) int i; printf(n姓名:%s, 学号:%s n,p-name,p-id); for(i=0; iscorei); printf(总分:%d 平均分:%.2f n,p-sum,p-average);/*删除节点q*/void Del_Node(Student *q) Student *p=head; while(p-next!=q) p=p-next; p-next=q-next; free(q);/*插入学生成绩*/void Insert_List() int x; printf(输入你要插入的学生数:); scanf(%d,&x); while(x!=0) getchar(); Student *p =(Student*) malloc(sizeof(Student); printf(n请输入学号: ); do gets(p-id); if (!Check_ID(p-id) printf(输入不正确!请重新输入学号: ); else if (Is_SameID(p-id) printf(存在已学号!请重新输入学号: ); while (!(Check_ID(p-id) & !Is_SameID(p-id); /* 姓名 */ printf(请输入姓名: ); do gets(p-name); if (!Check_Name(p-name) printf(输入不正确!请重新输入姓名: ); while (!Check_Name(p-name); /输入成绩 int i; for(i=0; iscorei); do if(!Check_Score(p-scorei) printf(输入成绩不正确!请重新输入%s成绩:,ClassNamei); while(!Check_Score(p-scorei); p-average = -1; p-sum = -1; p-next = head-next; head-next = p; x-; /*按学号查找*/Student *Search_ID(char *id) Student *p=head-next; while(p!=NULL) if(strcmp(p-id,id)=0)break; p=p-next; return p;/*按姓名查找节点*/Student *Search_Name(char *name) Student *p=head-next; while(p!=NULL) if(strcmp(p-name,name)=0)break; p=p-next; return p;/*输出链表*/void Output_List() Student *p; p=head-next; while(p!=NULL) Output_Score(p); p=p-next; /*删除指定学生信息*/void Del_Student() Student *p; fflush(stdin); char str15; char judge10; printf(请输入要删除的学生的 学号或姓名:); do gets(str); if(!(Check_ID(str)|Check_Name(str) printf(输入错误!请重新输入:); while(!(Check_ID(str)|Check_Name(str); /判断是否为学号还是姓名 if(str00&str0next; while(p != NULL) Quit(p-next); free(p); exit(0);/*计算个人平均分和总分*/void Count_Score() Student *p; int i; p=head-next; while(p!=NULL) for(i=0;isum = p-sum + p-scorei; p-average = p-sum * 1.0 / MAXCOURSE; p=p-next; /*计算班级总人数*/int Count_People() Student *p; int people=0; p=head-next; while(p!=NULL) people=people+1; p=p-next; return people;/*计算班级平均分*/void Count_Mark() Student *p; int m; float avecla=0; p=head-next; while(p!=NULL) avecla=avecla+p-sum; p=p-next; m=Count_People(); printf(班级平均分为:%.2f,avecla/m);/*根据某科成绩段显示成绩*/void Section_Score() char x; int m,n,i,flag=0; Student *p; p=head-next; printf(请输入指定分数段的科目(A:数学 B:英语 C:计算机):n); scanf(%c,&x); printf(请输入你要显示的分数段(从n到m):); scanf(%d,&n); scanf(%d,&m); switch(x) case A: while(p!=NULL) if(n score0 & p-score0name,p-id); for(i=0; iscorei); printf(总分为:%d 平均分:%.2fn,p-sum,p-average); p = p-next; break; case B: while(p!=NULL) flag=1; if(n score1 & p-score1name,p-id); for(i=0; iscorei); printf(总分为:%d 平均分:%.2fn,p-sum,p-average); p = p-next; break; case C: while(p!=NULL) flag=1; if(n score2 & p-score2 name,p-id); for(i=0; iscorei); printf(总分为:%d 平均分:%.2fn,p-sum,p-average); p = p-next; break; default: printf(输入无效!n); fflush(stdin); if(flag=0) printf(在%d到%d的分数段学生为零!);/*比较成绩大小*/Student *Descby_English(Student *Newhead,Student *sort) Student *p,*q; p=Newhead; while(p!=NULL) if(sort-sum p-sum) break; q=p; p=p-next; if(p=Newhead) sort-next = p; return sort; else q-next = sort; sort-next = p; return Newhead; /*按总分或平均分降序排列*/void Descend_English() Student *p,*q,*Newhead; int i,j=1,people; Newhead = NULL; p = head; while(p != NULL) q = p-next; Newhead = Descby_English(Newhead,p); p = q; if(p = head) printf(学生信息库为空!n); else p = Newhead-next; people=Count_People(); printf(按总分和平均分排序如下:n); while(p!=NULL) if(jname,p-id); for(i=0; iscorei); printf(总分:%d 平均分:%.2f ,p-sum,p-average); j+; printf(n); p=p-next; /*按姓名查找学生成绩*/void *Searchname_Student() char name10; int i=0; Student *p=head-next; getchar(); printf(请输入你要查找的学生姓名:); do gets(name); if(!Check_Name(name) printf(输入姓名不正确!重新输入:); while(!Check_Name(name); while(p!=NULL) if(strcmp(p-name,name)=0) Output_Score(p); i=1; p=p-next; if(i=0) printf(找不到此姓名!); /*按学号查找学生成绩*/void *SearchID_Student() char id10; int i=0; Student *p=head-next; getchar(); printf(请输入你要查找的学生学号:); do gets(id); if(!Check_ID(id) printf(输入学号不正确!重新输入:); while(!Check_ID(id); while(p!=NULL) if(strcmp(p-id,id)=0) Output_Score(p); i=1; p=p-next; if(i=0) printf(找不到此学号!); /*主函数*/void main() int x,n,people; Student *q; Menu(); while(1) printf(n请输入命令编号: ); scanf(%d, &x); switch(x) case 1: /初始化 head = Init(); printf(初始化成功!n); break; case 2: /输入成绩 printf(输入序号:); scanf(%d,&n); getchar(); while(n!=-1) Insert_Before(); printf(输入序号:); scanf(%d,&n); getchar(); break; case 3: /计算平均分和总分 Count_Score(); printf(计算平均分和总分成功!); break; case 4: /打印出所有成绩 Output_List(); break; case 5: Del_Student(); break; case 6: /按姓名查找学生成绩 Searchname_Student(); break; case 7: /按学号查找学生成绩 SearchID_Student(); break; case 8: /计算班级人数 people=Count_People(); printf(班级总人数为:%d n,people); break; case 9: /*插入学生成绩*/ Insert_List(); break; case 10: /*显示某科分数段的学生*/ getchar(); Section_Score(); break; case 11: /*按总分或平均分降序排列*/ Descend_English(); break; case 0: /*结束*/ Quit(); break; default:printf(输入错误!nn); 试验过程记录记录试验中遇到的困难及解决方法;实验结果记录以及与预期结果比较以及分析记录每次实验结果以及分析情况初始化输入学生成绩计算平均分 总分打印学生成绩删除学生成绩查找学生成绩插入学生成绩显示某分数段学生成绩总结以及心得体会实验总体还是比较顺利,但也遇到了一些困难,通过与同学交流和查找资料已经解决了。 在做实验之前,一定要把课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时久听不懂,这会使实验难度加大,浪费做实验的宝贵时间。做实验一定要亲力亲为,务必要将每个细节,每个步骤弄清楚,弄明白,还要复习,思考。这样,你的印象才深刻,才记得牢固,否则,过后就忘了还不如不做。 每次的实验都让我受益非浅,这次课程设计更使我有了更大的收获。明白了字符串的很多操作算法的编写和理解,并且查阅了大量的资料,对字符串的相关知识有了很大的了解。期间遇到了很多的问题,其实我觉得编写程序,调试,遇到问题耐心的查错,总会有解决办法的,比较困难的错误其实是能够运行之后结果不稳定,有时候对,有时候错,这样的问题往往是程序设计的算法的问题,虽然这次程序没有太复杂的算法,但是一些小的地方没有考虑到,往往会给运行结果造成很多难以解释的错误。我觉得我的程序在经过很多种情况的测试后,基本上能满足我自己的要求了,可能还有很多不完善的地方,但是确实收获了很多东西,随着以后的学习运用,估计会有更深入的认识。指导老师评阅意见指导老师: 年 月 日填写内容时,可把表格扩大。实验的源程序代码(要有注释)附在表后。THANKS !致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求欢迎您的下载,资料仅供参考-可编辑修改-
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!