1、福建工程学院计算机与信息科学系实验报告20122013学年第1 学期 任课老师: 章静 课程名称 结构化程序综合设计班级计算机1001座号3100301114姓名张扬文实验题目学生成绩管理系统实验时间实验开始日期:2012/2/24报告提交日期:2012/3/10实验目的、要求1该实验的课内学时是4个课时。2程序完成后应该完成如下基本功能:1)用自定义结构体typedef struct设计该软件的数据结构;2)用数组或指针链表将所有学生的数据按照学号顺序链接起来;3)程序能够按照学号顺序输入学生的三门成绩,并计算平均成绩和总成绩。4)程序能够显示已经输入的指定学号的学生成绩以及平均成绩和总成绩
2、。5)程序能够按要求显示指定分数段的学生成绩以及平均成绩和总成绩。6)能够统计班级总人数、班级平均成绩.7)能够增加和删除指定学生的成绩.8)按照指定的要求以及顺序(升序或降序)显示学生成绩以及平均成绩和总成绩。实验步骤与内容 按如下顺序写:1、 主要设计思想;学生成绩管理系统包含多种功能,可以输入学生成绩,删除,插入,排序,查找等等。输入的信息又包含学生姓名,学号,各科成绩。所以首先要定义一个结构体:typedef struct node char id20; char name15; int scoreMAXCOURSE; int sum; double average; struct n
3、ode next;Student;根据结构体中的内容飙血程序。2、 主要数据结构及其解释在此次程序设计中用了链表来实现对数据的处理,并设计了菜单界面如图,根据switch语句来对用户的选择:3、 模块关系图;主函数输入学生信息打印成绩计算平均分和总分查找学生成绩插入学生成绩显示分数段的学生按总分平均分降序排列菜单4、 所有函数的简要说明;1) 插入函数Insert_Before();主要是要重新加入学生的信息,通过头插法.2) 计算平均分和总分Count_Score();将输入的数据计算出学生的平均分和总分。3) 删除学生信息Del_Student();删除某个学生的成绩。4) 按姓名查找Se
4、archname_Student();通过输入学生的姓名找到学生的成绩。5) 计算班级总人数people=Count_People();将总的输入学生人数打印出来.6) 显示某分数段学生信息Section_Score();首先选择你要某科目的成绩并输入成绩的范围,按条件输出学生成绩.7) 按总分,平均分降序排列Descend_English();将输入的全部学生成绩按总分排序. 5、 所有源代码;/学生成绩管理系统 C语言*/include stdio。hinclude stdlib.hinclude string。hdefine MAXID 10define MAXNAME 20#defin
5、e 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”); pr
6、intf(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
7、退出n”); return 0;/初始化/Student *Init() int i; Student *head; head=(Student )malloc(sizeof(Student); headnext=NULL; return head;/检查学号/char Check_ID(char *s) int i; if(strlen(s)=0|strlen(s)MAXID)return 0; for(i=0;istrlen(s);i+) if (si 0 & si = a si z) (si = A & si = Z)) return 1; return 0;/*检查分数/int Che
8、ck_Score(int s) if( s=0 & s=100 ) return 1; return 0;/*检查学号是否相同/char Is_SameID(char s) Student p= headnext; while(p!=NULL) if(strcmp(s,pid)=0) return 1; p=pnext; return 0;/* 输入学生信息 */void Input_Score(Student p) / 学号 / printf(”n请输入学号: ); do gets(p-id); if (!Check_ID(p-id) printf(输入不正确!请重新输入学号: ”); el
9、se if (Is_SameID(pid)) printf(存在已学号!请重新输入学号: ); while (!(Check_ID(pid) & !Is_SameID(pid); / 姓名 / printf(请输入姓名: ”); do gets(pname); if (!Check_Name(p-name) printf(”输入不正确!请重新输入姓名: ”); while (!Check_Name(pname); /输入成绩 int i; for(i=0; iscorei); if(!Check_Score(p-scorei) printf(”输入成绩不正确!n请重新输入s成绩:,ClassN
10、amei); while(!Check_Score(pscorei); paverage = 1; psum = -1; / 头插法插入节点 */void Insert_Before() Student *s =(Student) malloc(sizeof(Student)); Input_Score(s); snext = head-next; head-next = s;/*输出学生成绩信息*/void Output_Score(Student p) int i; printf(”n姓名:s, 学号:s n”,pname,p-id); for(i=0; iMAXCOURSE;i+) pr
11、intf(”s成绩:%d ”,ClassNamei,pscorei); printf(”总分:d 平均分:%。2f n,psum,p-average);/*删除节点q*/void Del_Node(Student *q) Student *p=head; while(p-next!=q) p=pnext; pnext=q-next; free(q);/插入学生成绩/void Insert_List() int x; printf(输入你要插入的学生数:); scanf(d,x); while(x!=0) getchar(); Student p =(Student) malloc(sizeof
12、(Student); printf(n请输入学号: ); do gets(pid); if (!Check_ID(p-id)) printf(输入不正确!请重新输入学号: ”); else if (Is_SameID(pid) printf(存在已学号!请重新输入学号: ”); while (!(Check_ID(pid) & !Is_SameID(pid)); /* 姓名 / printf(”请输入姓名: ); do gets(pname); if (!Check_Name(p-name) printf(”输入不正确!请重新输入姓名: ); while (!Check_Name(pname)
13、; /输入成绩 int i; for(i=0; iaverage = 1; psum = 1; p-next = head-next; headnext = p; x-; /按学号查找*/Student Search_ID(char id) Student p=headnext; while(p!=NULL) if(strcmp(p-id,id)=0)break; p=p-next; return p;/*按姓名查找节点*/Student Search_Name(char *name) Student p=headnext; while(p!=NULL) if(strcmp(p-name,na
14、me)=0)break; p=pnext; return p;/输出链表/void Output_List() Student p; p=head-next; while(p!=NULL) Output_Score(p); p=pnext; /删除指定学生信息/void Del_Student() Student p; fflush(stdin); char str15; char judge10; printf(请输入要删除的学生的 学号或姓名:”); do gets(str); if(!(Check_ID(str)|Check_Name(str)) printf(”输入错误!请重新输入:)
15、; while(!(Check_ID(str)|Check_Name(str)); /判断是否为学号还是姓名 if(str00&str0next; while(p != NULL) Quit(pnext); free(p); exit(0);/*计算个人平均分和总分/void Count_Score() Student p; int i; p=headnext; while(p!=NULL) for(i=0;iMAXCOURSE;i+) p-sum = psum + pscorei; paverage = p-sum 1.0 / MAXCOURSE; p=p-next; /计算班级总人数*/i
16、nt Count_People() Student p; int people=0; p=headnext; while(p!=NULL) people=people+1; p=pnext; return people;/计算班级平均分*/void Count_Mark() Student *p; int m; float avecla=0; p=headnext; while(p!=NULL) avecla=avecla+p-sum; p=pnext; m=Count_People(); printf(”班级平均分为:.2f,avecla/m);/根据某科成绩段显示成绩/void Secti
17、on_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 = pscore0 & p-score0= m) flag=1; printf(”n姓名:s, 学号:s n”,p-name,p-id); for(i=0; iMAXCOURSE;i+
18、) printf(s成绩:d ”,ClassNamei,pscorei); printf(”总分为:%d 平均分:。2fn”,p-sum,p-average); p = p-next; break; case B: while(p!=NULL) flag=1; if(n = pscore1 pscore1= m) printf(”n姓名:s, 学号:%s n,pname,p-id); for(i=0; iaverage); p = pnext; break; case C: while(p!=NULL) flag=1; if(n = p-score2 pscore2 scorei); prin
19、tf(”总分为:%d 平均分:.2fn”,psum,paverage); p = pnext; 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=pnext; if(p=Newhead) sortnext =
20、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 = pnext; Newhead = Descby_English(Newhead,p); p = q; if(p = head) printf(学生信息库为空!n); else p = Newheadnext; peopl
21、e=Count_People(); printf(”按总分和平均分排序如下:n); while(p!=NULL) if(j=people) printf(”第%d名 ,j); printf(姓名:s 学号:s ,p-name,pid); for(i=0; i=people-1;i+) printf(”s:d ,ClassNamei,pscorei); printf(”总分:%d 平均分:.2f ,psum,paverage); j+; printf(”n”); p=p-next; /按姓名查找学生成绩/void Searchname_Student() char name10; int i=0
22、; Student p=headnext; getchar(); printf(”请输入你要查找的学生姓名:”); do gets(name); if(!Check_Name(name)) printf(输入姓名不正确!重新输入:”); while(!Check_Name(name); while(p!=NULL) if(strcmp(pname,name)=0) Output_Score(p); i=1; p=pnext; if(i=0) printf(”找不到此姓名!); /*按学号查找学生成绩*/void SearchID_Student() char id10; int i=0; St
23、udent p=headnext; 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请输入命
24、令编号: ); 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: /打印出所有成绩 Outpu
25、t_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); 试验过程记录记录试验中遇到的困难及解决方法;实验结果记录以及与预期结果比较以及分析记录每次实验结果以及分析情况初始化输入学生成绩计算平均分 总分打印学生成绩删除学生成绩查找学生成