1、程序设计实验报告程序设计报告( 2012/2013学年 第一学期)题 目: 学生信息管理系统 专 业 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 计算机学院软件教学中心日 期 学生信息管理系统一、课题要求该系统要求对一个文件中所存储的学生数据进行各种常规操作,如:排序、查找、计算、显示等功能。通过此课题,熟练掌握文件、数组、结构体的各种数据描述和操作,以及一些算法思想的应用,实现一个简单的学生管理系统。功能要求:(1)学生信息包括:学号,姓名,性别,出生(年,月,日),三门课成绩和总分( 数学, 英语, C语言, 总分)。(2)数据格式:测试数据,以文件方式提供,studf
2、.txt,数据文件自己建立。(3)需要实现的功能1) 建立学生信息结构数组从文件中读入数据2) 按姓名递增冒泡排序3) 按总分递减选择排序4) 按学号递增冒泡排序5) 显示按总分排序后学生信息6) 按学号查学生信息和平均分数7) 按姓名查学生信息和平均分数8) 查各门课平均分数二、需求分析本系统应具有以下功能:1.数据输入功能:数据包括学生学号、性别、出生(年,月,日)、三门成绩和总分(数学,英语,c语言,总分)等。以及输入的学生姓名等操作。2、计算功能:在输入学生分数及学生信息时,自动查找和显示学生的成绩。3、查询功能:(1)按学号查学生信息和平均分数。(2) 也可以按姓名查学生信息和平均分
3、数来显示学生信息。4、排序功能:可按姓名递增选择排序法排序,按学号冒泡排序法排序以及按总分递减排序。5、数据显示功能:可浏览输入、查询或排序后的数据,显示学生的个人信息。三、概要设计方案设计 (1)、输入模块:录入需要管理的学生信息并将信息保存于文件中,以方便日后进行打印、读取、修改等操作。(2)、输出模块:将所有学生信息或想要查询的学生信息显示于屏幕,用于打印学生信息或查找某些学生信息。(3)、查询模块:可对已建立的学生信息进行查询,并且可根据需要选择按姓名,学号,总分查询。(4)、统计模块:对学生四门成绩平均成绩的统计。(5)、排序模块:对学生成绩由高到低的排序。(6)、退出系统:选择该项
4、,自动退出该系统。四、详细设计 数据结构:struct date int year; char month; char day;struct student char no10; char name9; char sex3; struct date birthday; int score4; int rescore4; (1)、输入模块 void readsi(struct student stud,int *n) FILE*fp; int i; if(fp=fopen(J:studf.txt,r)=NULL) printf(无法打开studf.txt文件!n); exit(1); for(i
5、=0;!feof(fp);i+) (*n)+; if(*nN) printf(最多处理30位学生信息!n); return; fscanf(fp,%s %s %s %d %d %d %d %d %d,studi.no,studi.name,studi.sex,&studi.birthday.year,&studi.birthday.month,&studi.birthday.day,&studi.score0,&studi.score1,&studi.score2); studi.score3=studi.score0+studi.score1+studi.score2; fclose(fp)
6、; (2)、输出模块(显示学生信息)void printsi(struct student *pstud,int n) int i,k=0; printf( 学号 姓名 性别 年 月 日 数学 英语 C语言 总分n); printf(n); printf(=n); for(i=0;in;i+) printf(%-8s %-8s %-2s %4d %2d %2d %4d %4d %4d %5dn,pstudi.no,pstudi.name,pstudi.sex,pstudi.birthday.year,pstudi.birthday.month,pstudi.birthday.day, pstu
7、di.score0,pstudi.score1,pstudi.score2,pstudi.score3); k+; (3)、查询模块 1按照学号查找学生成绩(顺序查找)的关键代码for(i=0;in;i+) if(strcmp(no,pstudi.no)=0) printf(已找到学号为%-8s的学生n学号:%-8sn姓名:%-8sn性别:%-2sn%4d年%2d月%2d日n数学:%4dn英语:%4dnc:%4dn总分%4dn平均分数为:%4dn,pstudi.no,pstudi.no,pstudi.name,pstudi.sex,pstudi.birthday.year,pstudi.bir
8、thday.month,pstudi.birthday.day,pstudi.score0,pstudi.score1,pstudi.score2,pstudi.score3,pstudi.score3/3); else j+; if(j=30) printf(未找到学号为%-8s的学生n,no);2按照姓名查找学生成绩折半查找函数int bsrch(struct student pname,int n,char *name)的代码:int lower=0,upper=n-1,mid; if(strcmp(name,pnamelower.name)=0) return lower; else
9、if(strcmp(name,pnameupper.name)=0) return upper; else while(lower0) lower=mid+1; else upper=mid-1; return -1;此处按照学生姓名查找成绩是运用了折半查找的方法,根据折半查找函数的返回值确定有没有找到该学生:i=bsrch(pname,n,name); if(i!=-1) printf(已找到该学生信息:%-8s %-8s %-2s %4d %2d %2d %4d %4d %4d %5dn, pnamei.no,pnamei.name,pnamei.sex, pnamei.birthday.
10、year,pnamei.birthday.month,pnamei.birthday.day,pnamei.score0,pnamei.score1,pnamei.score2,pnamei.score3); else printf(%d没有找到该学生资料!n,name); for(;) i=i-1; if(strcmp(name,pnamei.name)=0) printf(已找到该学生信息:%-8s %-8s %-2s %4d %2d %2d %4d %4d %4d %5dn, pnamei.no,pnamei.name,pnamei.sex, pnamei.birthday.year,p
11、namei.birthday.month, pnamei.birthday.day, pnamei.score0,pnamei.score1,pnamei.score2, pnamei.score3); else break; i=bsrch(pname,n,name); for(;) i=i+1; if(strcmp(name,pnamei.name)=0) printf(已找到该学生信息:%-8s %-8s %-2s %4d %2d %2d %4d %4d %4d %5dn, pnamei.no,pnamei.name,pnamei.sex, pnamei.birthday.year,pn
12、amei.birthday.month, pnamei.birthday.day, pnamei.score0,pnamei.score1,pnamei.score2, pnamei.score3); else break;3查询各门课程的平均分数关键代码:static sum1=0,sum2=0,sum3=0,score=0;int i;for(i=0;in;i+) sum1=sum1+pstudi.score0; sum2=sum2+pstudi.score1; sum3=sum3+pstudi.score2; printf(数学平均分数 :%4dn,sum1/n); printf(英语平
13、均分数 :%4dn,sum2/n); printf(c语言平均分数:%4dn,sum3/n);(4)、排序模块1根据姓名排序信息A 姓名递增选择法排序的关键代码:struct student temp; for(k=0;kn-1;k+) index=k; for(i=k+1;in;i+) if(strcmp(pnamei.name,pnameindex.name)0) index=i; if(index!=k) temp=pnamek; pnamek=pnameindex; pnameindex=temp; B 显示姓名排序后的学生信息的关键代码:printf(学号 姓名 性别 年 月 日 数
14、学 英语 C 总分n); printf(=n); for(i=0;in;i+) printf(%-8s%-8s%-2s%4d %2d %2d %4d %4d %4d %5dn, parrayi.no,parrayi.name,parrayi.sex, parrayi.birthday.year,parrayi.birthday.month,parrayi.birthday.day, parrayi.score0,parrayi.score1,parrayi.score2,parrayi.score3); 2根据总分排序信息按照总分选择法排序的代码和按姓名排序代码类似,for(i=0;in-1;
15、i+) for(j=0;jn-i-1;j+) if(ptscorej.score3ptscorej+1.score3) temp=ptscorej; ptscorej=ptscorej+1; ptscorej+1=temp; 然后显示按总分排序后的学生信息表:printf( 按总分排序后的学生信息表n); printf(n); printf(学号 姓名 性别 年 月 日 数学 英语 C 总分 n); printf(n); for(i=0;in;i+) printf(%-8s%-8s %-2s %4d %2d %2d %4d %4d %4d %4d n,studi.no,studi.name,s
16、tudi.sex,studi.birthday.year,studi.birthday.month,studi.birthday.day,studi.score0,studi.score1,studi.score2,studi.score3); if(i=n-1) printf(n); else printf(n); k+; 3根据学号排序信息首先利用冒泡法按照学号排序;for(i=0;in-1;i+) for(j=0;j0) strcpy(t,studj.no); strcpy(studj.no,studj+1.no); strcpy(studj+1.no,t); strcpy(x,stud
17、j.name); strcpy(studj.name,studj+1.name); strcpy(studj+1.name,x); strcpy(y,studj.sex); strcpy(studj.sex,studj+1.sex); strcpy(studj+1.sex,y); p=studj.birthday.year; studj.birthday.year=studj+1.birthday.year; studj+1.birthday.year=p; q=studj.birthday.month; studj.birthday.month=studj+1.birthday.month;
18、 studj+1.birthday.month=q; r=studj.birthday.day; studj.birthday.day=studj+1.birthday.day; studj+1.birthday.day=r; s=studj.score0; studj.score0=studj+1.score0; studj+1.score0=s; w=studj.score1; studj.score1=studj+1.score1; studj+1.score1=w; u=studj.score2; studj.score2=studj+1.score2; studj+1.score2=
19、u; v=studj.score3; studj.score3=studj+1.score3; studj+1.score3=v; 然后输出信息:for(i=0;in;i+) printf(%-8s %-8s %-2s %4d %2d %2d %4d %4d %4d %5dn,studi.no,studi.name,studi.sex,studi.birthday.year,studi.birthday.month,studi.birthday.day,studi.score0,studi.score1,studi.score2,studi.score3);4插入补考或休学学生信息后排序如果选
20、择了插入补考后成绩,则会先输入该学生的学号,if(strcmp(no,rescorei.no)=0) printf(已找到学号为%-8s的学生n学号:%-8sn姓名:%-8sn性别:%-2sn%4d年%2d月%2d日n语文:%4dn数学:%4dn英语:%4dn总分%4dn平均分数:%4dn,rescorei.no,rescorei.no,rescorei.name,rescorei.sex,rescorei.birthday.year,rescorei.birthday.month,rescorei.birthday.day,rescorei.score0,rescorei.score1,re
21、scorei.score2,rescorei.score3,rescorei.score3/3);然后选择要修改的某一门成绩:printf(1.插入语文补考成绩n); printf(2.插入数学补考成绩n); printf(3.插入英语补考成绩n); scanf(%d,&b); switch(b) case 1:printf(请输入语文补考成绩n); scanf(%d,&c); rescorei.score0=c; break; case 2:printf(请输入数学补考成绩n); scanf(%d,&c); rescorei.score1=c; break; case 3:printf(请输
22、入英语补考成绩n); scanf(%d,&c); rescorei.score2=c; break; default:printf(请在1-3之间选择!n); break; 如果选择了显示补考后的总分排序情况,则会先根据选择法排序信息,接着输出信息:for(i=0;in-1;i+) for(j=0;jn-i-1;j+) if(rescorej.score3rescorej+1.score3) temp=rescorej; rescorej=rescorej+1; rescorej+1=temp; (5)、统计模块统计每门课程的平均成绩for(i=0;in;i+) sum1=sum1+pstud
23、i.score0; sum2=sum2+pstudi.score1; sum3=sum3+pstudi.score2; printf(数学平均分数 :%4dn,sum1/n); printf(英语平均分数 :%4dn,sum2/n); printf(c语言平均分数:%4dn,sum3/n);五,测试开始程序 *欢迎使用学生信息管理系统* 1.显示所有学生信息* 2.根据姓名排序信息* 3.根据总分排序信息* 4.根据学号排序信息* 5.按照学号查找学生成绩* 6.按照姓名查找学生成绩* 7.查询各门课程平均分数* 8.插入补考或休学学生信息后排序* 0.退出信息管理系统*请选择功能: 1 学号
24、 姓名 性别 年 月 日 数学 英语 C语言 总分=110203 李红 女 1993 2 4 87 76 85 248110226 海明 男 1994 10 18 67 76 87 230110210 周强 男 1992 8 25 87 89 96 272110213 王杰 男 1994 2 9 56 45 65 166110208 张娟 女 1993 5 8 87 79 81 247110216 刘明 男 1994 9 18 67 68 81 216110205 马克 男 1992 8 12 58 89 90 237110204 吕婷 女 1994 7 4 79 76 85 240110214 张国 男 1994 10 18 81 76 87 244110222 李强 男 1
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1