学生管理系统(链表版)_第1页
学生管理系统(链表版)_第2页
学生管理系统(链表版)_第3页
学生管理系统(链表版)_第4页
学生管理系统(链表版)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

福建工程学院计算机与信息科学系实验报告 2010 2011 学年第 一 学期 任课老师: 实验题目设计一个简单实用班级成绩管理系统实验时间实验开始日期: 报告提交日期: 实验目的、要求1该实验的课内学时是4个课时。2程序完成后应该完成如下基本功能:1)用自定义结构体typedef struct设计该软件的数据结构;2)用数组或指针链表将所有学生的数据按照学号顺序链接起来。3)程序能够按照学号顺序输入学生的三门成绩,并计算平均成绩和总成绩。4)程序能够显示已经输入的指定学号的学生成绩以及平均成绩和总成绩。5)程序能够按要求显示指定分数段的学生成绩以及平均成绩和总成绩。6)能够统计班级总人数、班级平均成绩。7)能够增加和删除指定学生的成绩。8)按照指定的要求以及顺序(升序或降序)显示学生成绩以及平均成绩和总成绩。3在完成上述基本功能的前提下,有能力的同学可以完成如下加强功能:1)能够输入的数据长期存储在文件中,再次运行程序时从文件中读取数据,无须重复输入。5)在程序的提示语言清晰明确,界面美观并且适用。实验设计内容(1)实验设计的数据结构typedef structchar name60;char ID7;float Chinese,Math,English ,sum,average;student;(2)层次图主函数main()创建文件增加和删除学生的成绩|按学号录入学生平均成绩,总成绩计算查询查询指定学号学生的成绩平均成绩总成绩指定分数段的学生成绩以及平均成绩和总成绩按指定条件对学生成绩进行排序统计班级总人数、班级平均成绩结束程序(3)各个函数分析1.主函数main() Int n; FILE fp; 判断是否存在data.txt这个文件,不存在就创建该文件; 输入n选择要进行的操作,根据n的值调用相应的函数;2. 录入学生成绩struct student *init (int n) 定义变量; 打开文件; While() 输入学生成绩放入变量p;把p里面的内容打印到文件上; 关掉文件;3.插入学生成绩void insert (struct student *head) 定义变量; 打开文件;While() 输入学生成绩放入变量pi; 插入到指定学号后面;关闭文件;4.查看学生成绩void list(struct student *head) 定义变量; 打开文件; While() 显示学生成绩5.查看指定学号或成绩段学生成绩void search (struct student *head)定义变量;打开文件;1. 按学号查找 输入要查找的学号;2. 按分数段查找录入成绩段;While()显示学生成绩6. 统计班级总人数及班级平均成绩void tongji (struct student *head)定义变量;打开文件While()累计班级人数,计算班级总成绩,各科总成绩计算班级平均成绩,显示结果;7.删除指定学生的成绩struct student *del (struct student *head,int n)定义变量;打开文件;删除指定学生的成绩;保存并关闭文件;7.排序void sumas(struct student *head) 定义变量;比较升序排序;void sumdes(struct student *head) 定义变量;比较降序排序;(4) 测试数据的设计及预期结果1.录入的学生信息:姓名 学号 英语 数学 语文 张三 1 100 100 100倩倩 2 80 80 80小丽 11 90 90 90李四 12 60 60 60阿香 30 50 50 502.预期结果:(1)删除李四张三 1 100 100 100倩倩 2 80 80 80小丽 11 90 90 90阿香 30 50 50 50(2)添加李四张三 1 100 100 100倩倩 2 80 80 80小丽 11 90 90 90李四 12 60 60 60阿香 30 50 50 50(3)统计总人数和成绩总人数为:5班级英语平均成绩:76班级数学平均成绩:76班级语文平均成绩:76(4)查找指定学生成绩查找总分200300的学生姓名 学号 英语 数学 语文 总分张三 1 100 100 100 300倩倩 2 80 80 80 240小丽 11 90 90 90 270(5)按总分降序排序张三 1 100 100 100 300小丽 11 90 90 90 270倩倩 2 80 80 80 240李四 12 60 60 60 180阿香 30 50 50 50 150(4)程序界面.主界面 .学生成绩录入界面 .成绩查询界面 .排序界面 .退出程序的界面 (5)流程图1. 录入学生成绩输入要创建的学生人数 n是开始输入学生信息 i=n?是结束否2.显示学生成绩是开始 显示学生数据p-next=Null?是结束否3.插入学生信息输入要插入学生信息的位置 n开始输入学生信息 结束i=n ?是否4.删除数据输入要删除学生的学号 np-num=n ?是否删除数据开始结束5.查看指定学号或成绩段学生成绩输入要查找学生的学号 n (或分数段)p-num=n或 (p-sum=a&p-sum=b)是否显示学生成绩开始结束调试过程记录本次课题除了排序的函数在调试的时候有问题外,其他的都没有问题.下面主要写调试排序时的错误.实验结果记录以及与预期结果比较以及分析排序结果截图:分析:排序结果搜正确,而且能按照不同项目排序.所以该算法基本上没问题.总结以及心得体会指导老师评阅意见指导老师: 年 月 日 代码:#include #include #include #include#define Null 0struct student int num; char name20; float chinese,math,english,ave,sum; struct student *next;void print () 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( | 0 = 退出学生管理系统 |n); printf( |-|n);struct student *init (int n) int i; struct student *head,*p,*s; for (i=1;inum); printf(姓名n); scanf(%s,&p-name); printf(语文n); scanf(%f,&p-chinese); printf(数学n); scanf(%f,&p-math); printf(英语n); scanf(%f,&p-english); p-sum=p-chinese+p-math+p-english; p-ave=p-sum/3; head=p; if (n=1) p-next=Null; else printf(请输入第%d个学生信息:n,i); s=(struct student *)malloc (sizeof(struct student); printf(学号n); scanf(%d,&s-num); printf(姓名n); scanf(%s,&s-name); printf(语文n); scanf(%f,&s-chinese); printf(数学n); scanf(%f,&s-math); printf(英语n); scanf(%f,&s-english); s-sum=s-chinese+s-math+s-english; s-ave=s-sum/3; p-next=s; p=s; s-next=Null; return head;void insert (struct student *head) struct student *p,*pi; int xuehao; printf (请问要在哪个学生后面插入数据(输入学号):); scanf(%d,&xuehao); pi=(struct student *)malloc (sizeof(struct student); p=head; printf(学号n); scanf(%d,&pi-num); printf(姓名n); scanf(%s,&pi-name); printf(语文n); scanf(%f,&pi-chinese); printf(数学n); scanf(%f,&pi-math); printf(英语n); scanf(%f,&pi-english); pi-sum=pi-chinese+pi-math+pi-english; pi-ave=pi-sum/3; if (head=Null) head=pi; pi-next=Null; else while (p-num!=xuehao)&(p-next!=Null) p=p-next; if (p-next!=Null) pi-next=p-next; p-next=pi; else p-next=pi; pi-next=Null; void search (struct student *head) int no; struct student *p; p=head; int n=0; printf(1 按学号查找n);printf(2 按分数段查找n);scanf(%d,&n);switch(n)case 1: printf(请输入要查找同学的学号:); scanf(%d,&no); while(p!=Null) if(p-num=no) printf(-学生成绩表-n); printf(=n); printf(%-5s%-8s%-8s%-8s%-8s%-8s%-8sn,学号,姓名,语文,数学,英语,总分,平均分); printf(=n); printf(%-5d%-8s%-8.1f%-8.1f%-8.1f%-8.1f%-8.1fn,p-num,p-name,p-chinese,p-math,p-english,p-sum,p-ave); printf(=n); break; p=p-next; break; case 2: float a,b; int choose; char c; for(;) printf(t|-|n); printf(t| 分数段查询 |n); printf(t|-|n); printf(t| 1 = 按总分成绩查询 |n); printf(t| 2 = 按语文成绩查询 |n); printf(t| 3 = 按数学成绩查询 |n); printf(t| 4 = 按英语成绩查询 |n); printf(t| 0 = 返回上一级菜单 |n); printf(t|-|n); printf(请输入你要执行的操作:); scanf(%d,&choose); while(getchar()!=n); switch(choose) case 1: p=head; printf(请输入所要查找的分数段:n); printf(请输入第一个分数:n); scanf(%f,&a); printf(请输入第二个分数:n); scanf(%f,&b); printf(%-5s%-8s%-8s%-8s%-8s%-8s%-8sn,学号,姓名,语文,数学,英语,总分,平均分); while(p!=Null) if (p-sum=a&p-sumnum,p-name,p-chinese,p-math,p-english,p-sum,p-ave); p=p-next; break; case 2: p=head; printf(请输入所要查找的分数段:n); printf(请输入第一个分数:n); scanf(%f,&a); printf(请输入第二个分数:n); scanf(%f,&b); printf(%-5s%-8s%-8s%-8s%-8s%-8s%-8sn,学号,姓名,语文,数学,英语,总分,平均分); while(p!=Null) if (p-chinese=a&p-chinesenum,p-name,p-chinese,p-math,p-english,p-sum,p-ave); p=p-next; break; case 3: p=head; printf(请输入所要查找的分数段:n); printf(请输入第一个分数:n); scanf(%f,&a); printf(请输入第二个分数:n); scanf(%f,&b); printf(%-5s%-8s%-8s%-8s%-8s%-8s%-8sn,学号,姓名,语文,数学,英语,总分,平均分); while(p!=Null) if (p-math=a&p-mathnum,p-name,p-chinese,p-math,p-english,p-sum,p-ave); p=p-next; break; case 4: p=head; printf(请输入所要查找的分数段:n); printf(请输入第一个分数:n); scanf(%f,&a); printf(请输入第二个分数:n); scanf(%f,&b); printf(%-5s%-8s%-8s%-8s%-8s%-8s%-8sn,学号,姓名,语文,数学,英语,总分,平均分); while(p!=Null) if (p-english=a&p-englishnum,p-name,p-chinese,p-math,p-english,p-sum,p-ave); p=p-next; break; case 0: return ; default: printf(nn您的输入有误!请重新输入:nn);break; struct student *del (struct student *head,int n) struct student *p,*q; p=head; if (head=Null) printf(没有学生的资料要删除!n); return head; while (p-num!=n&p-next!=Null) q=p; p=p-next; if (p-num=n) if (p=head) head=p-next; else q-next=p-next; free (p); else printf(找不到相应的学生资料!n); return head;void list(struct student *head) int i=0; struct student *p; p=head; printf(-学生成绩表-n); printf(=n); printf(%-5s%-8s%-8s%-8s%-8s%-8s%-8sn,学号,姓名,语文,数学,英语,总分,平均分); printf(=n); while (p!=Null) printf(%-5d%-8s%-8.1f%-8.1f%-8.1f%-8.1f%-8.1fn,p-num,p-name,p-chinese,p-math,p-english,p-sum,p-ave); p=p-next; printf(=n); printf(nn);void tongji (struct student *head) int i=0; struct student *p; float chinese1=0,math1=0,english1=0; p=head; while(p!=Null) i=i+1; chinese1=chinese1+p-chinese; math1=math1+p-math; english1=english1+p-english; p=p-next; printf(班级总人数为:%dn,i); printf(班级语文平均分为:%4.1fn,chinese1/i); printf(班级数学平均分为:%4.1fn,math1/i); printf(班级英语平均分为:%4.1fn,english1/i); printf(n);student *sort(student *head,int choose) student *p1,*p2=head,*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-nump2-num) pm=p2;break; case 2:if (pm-sumsum) pm=p2;break; case 3:if (pm-chinesechinese) pm=p2;break; case 4:if (pm-mathmath) pm=p2;break; case 5:if (pm-englishenglish) 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); list(head); return head;student *sort_all(student *head)int choose;for(;) printf(t|-|n); printf(t| 学生成绩统计排序 |n); printf(t|-|n); printf(t| 1 = 按学生学号排序 |n); printf(t| 2 = 按学生总分排序 |n); printf(t| 3 = 按学生语文成绩排序 |n); printf(t| 4 = 按学生数学成绩排序 |n); printf(t| 5 = 按学生英语成绩排序 |n); printf(t| 0 = 返回上一级菜单 |n); printf(t|-|n); printf(请输入你要执行的操作:); scanf(%d,&choose); while(getchar()!=n); switch(choose) case 1:head=sort(head,choose);break; case 2:head=sort(head,choose);break; case 3:head=sort(head,choose);break; case 4:head=sort(head,choose);break; case 5:head=sort(head,choose);break; case 0:return head; default: printf(nn您的输入有误!请重新输入:nn);break; void save(struct student *head) int i,j; FILE *fp; student *p; p=head; char c; /head 头指针 if(fp=fopen(c:stu_list,wb)=NULL) printf(Cannot open file strike any key exit!); getch(); exit(0); while(p) fwrite(p,sizeof(student),1,fp); p=p-next; fclose(fp);struct student* read() int i=0,j; FILE *fp; struct student *p; /工作指针 student *las

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论