版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、福建工程学院计算机与信息科学系实验报告 2012 2013 学年第 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; s
3、truct node *next;Student;根据结构体中的内容飙血程序。2、 主要数据结构及其解释在此次程序设计中用了链表来实现对数据的处理,并设计了菜单界面如图,根据switch语句来对用户的选择: 3、 模块关系图; 主函数输入学生信息打印成绩计算平均分和总分查找学生成绩插入学生成绩显示分数段的学生按总分平均分降序排列菜单4、 所有函数的简要说明;1) 插入函数Insert_Before();主要是要重新加入学生的信息,通过头插法。2) 计算平均分和总分Count_Score();将输入的数据计算出学生的平均分和总分。3) 删除学生信息Del_Student();删除某个学生的成绩。
4、4) 按姓名查找Searchname_Student();通过输入学生的姓名找到学生的成绩。5) 计算班级总人数people=Count_People();将总的输入学生人数打印出来。6) 显示某分数段学生信息Section_Score();首先选择你要某科目的成绩并输入成绩的范围,按条件输出学生成绩。7) 按总分,平均分降序排列Descend_English();将输入的全部学生成绩按总分排序。 5、 所有源代码; /*学生成绩管理系统 C语言*/#include <stdio.h>#include <stdlib.h>#include <string.h>
5、;#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="数学","英语","计算机"/* 菜单 */in
6、t 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
7、"); 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;
8、 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<strlen(s);i+) if (si > '0' && si < '9') return 1; return 0;/*检查姓名*/char Check_Name(char
9、 *s) int i; if(strlen(s)=0|strlen(s)>MAXNAME) return 0; for(i=0; i<strlen(s); i+) if(si >= 'a' && si < 'z') | (si >= 'A' && si <= 'Z') return 1; return 0;/*检查分数*/int Check_Score(int s) if( s>=0 && s<=100 ) return 1; retu
10、rn 0;/*检查学号是否相同*/char Is_SameID(char *s) Student *p= head->next; 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("输入不正确!请重新输入学号: ");
11、 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
12、(i=0; i<MAXCOURSE; i+) do printf("请输入%s成绩:",ClassNamei); scanf("%d", &p->scorei); if(!Check_Score(p->scorei) printf("输入成绩不正确!n请重新输入%s成绩:",ClassNamei); while(!Check_Score(p->scorei); p->average = -1; p->sum = -1; /* 头插法插入节点 */void Insert_Before() St
13、udent *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; i<MAXCOURSE;i+) printf("%s成绩:%d ",ClassNamei,p->scorei); print
14、f("总分:%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(); Stud
15、ent *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(&quo
16、t;请输入姓名: "); do gets(p->name); if (!Check_Name(p->name) printf("输入不正确!请重新输入姓名: "); while (!Check_Name(p->name); /输入成绩 int i; for(i=0; i<MAXCOURSE; i+) fflush(stdin); printf("请输入%s成绩:",ClassNamei); scanf("%d", &p->scorei); do if(!Check_Score(p->
17、;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->
18、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
19、*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(str0>'0'&&str0<'9') p=Search_ID(str); if(p=NULL)
20、printf("此学号不存在!n"); else Output_Score(p); printf("是否要删除此学号!(确认按y,任意键取消):"); gets(judge); if(strcmp(judge,"y")=0) Del_Node(p); printf("删除成功!"); else p=Search_Name(str); if(p=NULL) printf("此姓名不存在!n"); else Output_Score(p); printf("是否要删除此姓名!(确认按y,任
21、意键取消):"); gets(judge); if(strcmp(judge,"y")=0) Del_Node(p); printf("删除成功!"); fflush(stdin); /* 退出 */void Quit() Student *p; p=head->next; while(p != NULL) Quit(p->next); free(p); exit(0);/*计算个人平均分和总分*/void Count_Score() Student *p; int i; p=head->next; while(p!=NULL
22、) for(i=0;i<MAXCOURSE;i+) p->sum = 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;
23、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"); scan
24、f("%c",&x); printf("请输入你要显示的分数段(从n到m):"); scanf("%d",&n); scanf("%d",&m); switch(x) case 'A': while(p!=NULL) if(n <= p->score0 && p->score0<= m) flag=1; printf("n姓名:%s, 学号:%s n",p->name,p->id); for(i=0; i
25、<MAXCOURSE;i+) printf("%s成绩:%d ",ClassNamei,p->scorei); printf("总分为:%d 平均分:%.2fn",p->sum,p->average); p = p->next; break; case 'B': while(p!=NULL) flag=1; if(n <= p->score1 && p->score1<= m) printf("n姓名:%s, 学号:%s n",p->name,
26、p->id); for(i=0; i<MAXCOURSE;i+) printf("%s成绩:%d ",ClassNamei,p->scorei); printf("总分为:%d 平均分:%.2fn",p->sum,p->average); p = p->next; break; case 'C': while(p!=NULL) flag=1; if(n <= p->score2 && p->score2 <= m) printf("n姓名:%s, 学号:
27、%s n",p->name,p->id); for(i=0; i<MAXCOURSE;i+) printf("%s成绩:%d ",ClassNamei,p->scorei); printf("总分为:%d 平均分:%.2fn",p->sum,p->average); p = p->next; break; default: printf("输入无效!n"); fflush(stdin); if(flag=0) printf("在%d到%d的分数段学生为零!");/
28、*比较成绩大小*/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_Eng
29、lish() 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(j
30、<=people) printf("第%d名 ",j); printf("姓名:%s 学号:%s ",p->name,p->id); for(i=0; i<=people-1;i+) printf("%s:%d ",ClassNamei,p->scorei); printf("总分:%d 平均分:%.2f ",p->sum,p->average); j+; printf("n"); p=p->next; /*按姓名查找学生成绩*/void *Sea
31、rchname_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) pri
32、ntf("找不到此姓名!"); /*按学号查找学生成绩*/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);
33、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("计算平均分和总分成功!"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年玻璃制品采购合同
- 2024年物业服务与社区文化活动策划委托合同3篇
- 《背影》课时教案模板
- 拟定财务的个人工作计划大全
- 2024山东基础软件服务市场前景及投资研究报告
- 产科工作计划
- 初中教师年终教学计划五篇
- 幼儿园实习自我总结十篇
- 内勤个人工作计划10篇
- 关于教师一级述职报告3篇
- 2025年国家图书馆招聘笔试参考题库含答案解析
- 机器人课程课程设计
- 南充市市级事业单位2024年公招人员拟聘人员历年管理单位遴选500模拟题附带答案详解
- 安全知识考试题库500题(含答案)
- 员工投诉表格样板
- 基础工程施工月进度计划表
- 危险性较大的分部分项工程专家论证表
- 2021-2022学年上海市闵行区五年级上学期期末语文试卷
- 人教版五年级上册数学组合图形的面积同步练习
- 2018级成考专升本汉语言文学专业12月份考试资料文献学复习资料
- 最新中考英语单词表2200个
评论
0/150
提交评论