数据结构大作业实验报告

上传人:仙*** 文档编号:32160104 上传时间:2021-10-13 格式:DOC 页数:26 大小:854KB
收藏 版权申诉 举报 下载
数据结构大作业实验报告_第1页
第1页 / 共26页
数据结构大作业实验报告_第2页
第2页 / 共26页
数据结构大作业实验报告_第3页
第3页 / 共26页
资源描述:

《数据结构大作业实验报告》由会员分享,可在线阅读,更多相关《数据结构大作业实验报告(26页珍藏版)》请在装配图网上搜索。

1、数据结构大作业实验报告数据结构实验报告-学生成绩分析系统学校 南京大学院系 工程管理学院专业 管理科学与工程类年级 2010级课题 学生成绩分析系统指导老师 朱美琳小组成员信息姓名学号叶皓恺101279055殷承来101279056于婴朴101279058周道航101279062摘要一 需求分析3二 概要设计4一 算法设计4二 存储结构设计5三 详细设计5四 调试分析18一 调试结果18二 时间复杂度分析24三 程序中存在问题以及可能改进的地方24五 总结25一 需求分析本成绩分析管理系统可以实现以下主要功能:1.信息的输入:建立学生档案文件 (包括姓名,学号,班级,课程编号,成绩)2.信息的

2、维护: 添加:增加新学生 修改:学生信息的改变 删除:学生减少 3.信息的处理 按要求检索学生信息 按要求统计信息 本成绩分析管理系统同时可以实现以下系统界面:1. 管理员进入 请输入密码:2. 一级菜单 1.信息维护 输入“1”进入信息维护二级菜单2.信息检索 输入“2”进入信息检索二级菜单3.信息统计 输入“3”进入信息统计二级菜单4.退出 输入“4”退出系统3. 二级菜单 信息维护 1.建立学生成绩文件 2.添加学生纪录 3.删除学生纪录 4.修改学生纪录 5.返回上级菜单 信息检索 1. 按姓名查找 2. 按班级查找 3. 返回上级菜单信息统计 1.成绩统计 2.返回上级菜单 二 概要

3、设计一 算法设计1. 用口令(密码)形式验证管理员身份(可输入三次密码),合法者进入,否则程序结束。算法实现可以使用break和continue语句,使用一个变量计数; 2. 有关功能说明(1)建立学生成绩表 void establish(void); /建立学生成绩表函数建立新的学生纪录(包括姓名,学号,班级,课程编号,成绩) (暂定为2个班级,2门课程,学生个数每班10人左右)算法实现可以使用fp头文件指针,将指定的记录写入相应的文本文件中;(2) 添加学生纪录 void add(void); /添加学生纪录函数在已存在的学生成绩文件中添加新纪录 算法实现同样利用文件操作将新添加的记录追加

4、到文件的尾部即可;(3) 删除学生纪录 void deleteinfo(void); /删除学生记录函数在学生成绩文件中删除2个课程没有成绩的学生纪录 删除前,逐条显示符合删除条件的学生姓名,成绩,确认后再删除 算法实现先在文件中将记录读出,再寻找删除项,最后将其重新写入文本文件中;(4)修改学生信息 void modify(void); /修改学生记录函数输入学生学号,在学生成绩文件中找出该学生纪录 在屏幕上逐条显示该学生的各条纪录 每显示一条,询问是否修改,如果“1,输入修改后的数据,文件原记录删除,保存新的记录 算法实现与删除学生记录相似就是将原文件内容读出,后根据条件修改内容,最后再重

5、新写入文件中;判断是否修改时,利用if循环就可以了;(5) 按姓名和班级查找 输入姓名,显示该学生所有信息 void searchname(void); /按姓名查找学生记录函数输入班级,显示所有学生信息 void searchclass(void); /按班级查找学生记录函数算法实现先将文本内容读出,利用条件查找相应的记录,再将相应的记录输出(6) 信息统计 void tongji(void); /统计学生成绩信息函数同时按照班级和课程统计每门课程,每个课程每个班级的平均成绩,最高分,最低分 在屏幕上先依次显示各门课程,对应的各个班级的统计数据。 算法实现利用文件操作将学生成绩表中内容读出,

6、然后利用循环语句将对应的统计项找到,输出结果(7)退出信息管理系统,返回操作系统利用switch case语句二 存储结构设计因为每个学生纪录包括姓名,学号,班级,课程编号,成绩,所以要使用结构变量,同时考虑到处理数据的数量,我们采用结构数组来完成程序的实现,具体定义如下;struct studentchar name20; /学生的姓名long n; /学生的学号char classnum10; /学生的班级char coursenum210; /学生的所有课程编号int grade2; /学生的各科的成绩 STUmaxsize; /最大数据容量常数maxsize三 详细设计C语言源代码如下

7、:/*-头文件定义-*/#include #include #include #include /*-*/#define maxsize 20 /定义最大数据容量常数maxsize/*-数据类型定义-*/ struct studentchar name20; /学生的姓名long n; /学生的学号char classnum10; /学生的班级char coursenum210; /学生的所有课程编号int grade2; /学生的各科的成绩 STUmaxsize;/*-*/*-函数列表-*/void establish(void); /建立学生成绩表函数void add(void); /添加

8、学生纪录函数void deleteinfo(void); /删除学生记录函数void modify(void); /修改学生记录函数void searchname(void); /按姓名查找学生记录函数void searchclass(void); /按班级查找学生记录函数void tongji(void); /统计学生成绩信息函数/*-*/*=-主函数-*/int main(void)int count,i,j;char password15=1B620,password115; /其中password为管理员密码;printf(-欢迎来到南京大学学生成绩分析系统-n);/*-管理员密码验证

9、-*/for(count=0;count3;count+) /用密码形式验证管理员身份(可输入三次密码),合法者进入,否则程序结束printf(-请输入密码:-n);gets(password1);if(strcmp(password1,password)=0)break;elsecontinue;/*-*/if(count=3) return 0; /身份验证次数超过3次,程序结束;else if(count3) /*-一级菜单-*/ loop: /loop是回到一级菜单的语句标号printf(-1 信息维护-n);printf(-2 信息检索-n);printf(-3 信息统计-n);pr

10、intf(-4 退出-n);/*-*/scanf(%d,&i);switch(i)case 1:/*-信息维护的二级菜单-*/ lo: /lo是回到信息维护二级菜单的语句标号printf(-1 建立学生成绩文件-n);printf(-2 添加学生记录-n);printf(-3 删除学生记录-n);printf(-4 修改学生记录-n); printf(-5 返回上级菜单-n);/*-*/scanf(%d,&j); switch(j)case 1:establish();goto lo; /调用建立学生成绩表函数;并且调用完之后返回信息维护二级菜单 case 2:add();goto lo; /

11、调用添加学生纪录函数;并且调用完之后返回信息维护二级菜单case 3:deleteinfo();goto lo; /调用删除学生记录函数;并且调用完之后返回信息维护二级菜单case 4:modify();goto lo; /调用修改学生记录函数;并且调用完之后返回信息维护二级菜单case 5:goto loop; /回到一级菜单;break;case 2:/*-信息检索的二级菜单-*/ op: /op是回到信息维护二级菜单的语句标号 printf(-1 按姓名查找-n);printf(-2 按班级查找-n);printf(-3 放回上级菜单-n);/*-*/scanf(%d,&j); swit

12、ch(j)case 1:searchname();goto op; /调用按姓名查找学生记录函数;并且调用完之后返回信息检索二级菜单 case 2:searchclass();goto op; /调用按班级查找学生记录函数;并且调用完之后返回信息检索二级菜单case 3:goto loop; /回到一级菜单break;case 3:/*-信息统计的二级菜单-*/ to: /to是返回到信息统计的二级菜单的语句标号 printf(-1 成绩统计-n); printf(-2 放回上级菜单-n); /*-*/ scanf(%d,&j); switch(j) case 1:tongji();goto

13、to; /调用信息统计函数;并且调用完之后返回信息统计二级菜单 case 2:goto loop; /回到一级菜单 break; case 4: break; return 0;/*-*/*-建立学生成绩文件函数的具体实现-*/void establish(void) FILE *fp; /定义头文件指针fp;int t,i; printf(please input a number:); /要输入的学生记录个数为t scanf(%d,&t);/*-输入t条学生记录-*/for(i=0;it;i+)scanf(%s%ld%s%s%s%d%d,STUi.name,&STUi.n,STUi.cla

14、ssnum,STUi.coursenum0,STUi.coursenum1,&STUi.grade0,&STUi.grade1);/*-*/*-打开成绩分析管理文本文件并添加学生记录-*/if( ( fp=fopen(成绩分析管理.txt,wb) )=NULL)printf(打开文件错误n); return; /文件打开错误直接返回;for(i=0;iname,&stu-n,stu-classnum,stu-coursenum0,stu-coursenum1,&stu-grade0,&stu-grade1);/*-将该结构变量加到成绩分析管理文本文件的末尾-*/if( fp=fopen(成绩分

15、析管理.txt,ab) )=NULL) /*打开文件*/printf(打开文件错误n); return;if(fwrite(stu,sizeof(struct student),1,fp)!=1)/*写文件*/ printf(写文件错误n); return;fclose(fp); /*-关闭文件-*/ /*-*/return ;/*-*/*-删除记录函数的具体实现-*/void deleteinfo(void) FILE *fp; /定义头文件指针fp int cnt=0,i=0,flag=0; /flag用作标识符,cnt和i用作计数if(fp=fopen(成绩分析管理.txt,rb)=NU

16、LL) /*打开文件*/printf(打开成绩分析管理.txt文件失败n);return;while(imaxsize)if(fread(&STUi,sizeof(struct student),1,fp)=1) /*读文件*/cnt+; /统计文件中记录条数else if(i=0)printf(读文件失败n);break;i+;fclose(fp);/*关闭文件*/*-读取文件中的记录-*/if(fp=fopen(成绩分析管理.txt,rb)=NULL) /*打开文件*/printf(删除时打开文件失败n);return;for(i=0;icnt;i+)if(fread(&STUi,size

17、of(struct student),1,fp)!=1) /*先读文件*/printf(读文件错误n);return; fclose(fp); /*关闭文件*/*-*/for(i=0;icnt;i+) if(STUi.grade0=0)&(STUi.grade1=0)/输出各科成绩为0 的学生记录,并对学生的姓名做上标记;printf(%s,%ld,%s,%s,%s,%d,%dn,STUi.name,STUi.n,STUi.classnum,STUi.coursenum0,STUi.coursenum1,STUi.grade0,STUi.grade1);strcpy(STUi.name,#),

18、flag=1;if(!flag) printf(nThere are no records to delete!n );/如果文件中没有满足条件的记录输出该信息/*-将删除后的学生记录写入文件中-*/if(fp=fopen(成绩分析管理.txt,wb)=NULL) /*打开文件*/printf(删除时打开文件失败n);return;for(i=0;icnt;i+) /*写向成绩分析管理文件写内容*/if( strcmp(STUi.name,#)!=0 ) if(fwrite(&STUi,sizeof(struct student),1,fp)!=1) /*写文件*/printf(删除时写文件错

19、误n); return;fclose(fp);/*关闭文件*/*-*/return ;/*-*/*-修改学生记录函数具体实现-*/void modify(void) FILE *fp; /定义头文件指针fplong n1; char name120;char classnum110; char coursenum1210; int grade12,ch,cnt=0,i=0,flag=1; /定义变量 /*-打开成绩分析管理文本文件并读出文件中的学生记录-*/ if(fp=fopen(成绩分析管理.txt,rb)=NULL) /*打开文件*/printf(打开成绩分析管理.txt文件失败n);r

20、eturn;while(imaxsize)if(fread(&STUi,sizeof(struct student),1,fp)=1) /*读文件*/cnt+;else if(i=0)printf(读文件失败n);break;i+;fclose(fp);/*关闭文件*/*-*/printf(nplease input the students number: );scanf(%ld,&n1); /输入要修改的学生记录的学号for(i=0;icnt;i+)if(STUi.n=n1) /找到匹配的学生记录 /*-修改姓名的操作实现-*/printf(n%s,STUi.name); /输出原学生记录

21、的姓名 printf(nplease input 1 or 0!n); /判断是否改名,1代表改名,0代表不改scanf(%d,&ch);if(ch)printf(Please input the new name:); scanf(%s,name1); /输入新姓名; strcpy(STUi.name,name1),flag=0;/flag用作是否改动的判断标志/*-*/*-修改学号的操作实现-*/printf(n%ldnplease input 1 or 0!,STUi.n);/输出原学生记录的学号并判断是否改学号,1代表改学号,0代表不改scanf(%d,&ch);if(ch)print

22、f(please input the new xuehao:); scanf(%ld,&n1); /输入新学号 STUi.n=n1,flag=0; /flag用作是否改动的判断标志 /*-*/ /*-修改班级的操作实现-*/ printf(n%snplease input 1 or 0!,STUi.classnum);/输出原学生记录的班级并判断是否改班级,1代表改班级,0代表不改scanf(%d,&ch);if(ch)printf(please input the new the classnum:); scanf(%s,classnum1); /输入新班级 strcpy(STUi.clas

23、snum,classnum1),flag=0;/flag用作是否改动的判断标志/*-*/ /*-修改课程名的操作实现-*/printf(n%snplease input 1 or 0!,STUi.coursenum0);/输出原学生记录的课程名并判断是否改课程名,1代表改课程名,0代表不改scanf(%d,&ch);if(ch)printf(please input the new coursenum:); scanf(%s,coursenum10); /输入新课程名 strcpy(STUi.coursenum0,coursenum10),flag=0;/flag用作是否改动的判断标志 pri

24、ntf(n%snplease input 1 or 0!,STUi.coursenum1);/输出原学生记录的课程名并判断是否改课程名,1代表改课程名,0代表不改scanf(%d,&ch);if(ch)printf(please input the new coursenum:); scanf(%s,coursenum11); /输入新课程名 strcpy(STUi.coursenum1,coursenum11),flag=0;/flag用作是否改动的判断标志 /*-*/ /*-修改成绩的操作实现-*/ printf(n%dnplease input 1 or 0!,STUi.grade0);

25、 /输出原学生记录的成绩并判断是否改成绩,1代表改成绩,0代表不改scanf(%d,&ch); if(ch)printf(please input the new grade1: ); scanf(%d,grade1); /输入新成绩 STUi.grade0=grade10,flag=0;printf(n%dnplease input 1 or 0!,STUi.grade1); /输出原学生记录的成绩并判断是否改成绩,1代表改成绩,0代表不改scanf(%d,&ch);if(ch)printf(please input the new grade2: ); scanf(%d,grade1+1)

26、; /输入新成绩 STUi.grade1=grade11,flag=0; /flag用作是否改动的判断标志/*-*/if(flag)printf(Can not find the data!); /如果没有对应的学生记录的学号与已知的学号相匹配/*-将修改好的学生记录重新写入学生成绩分析管理文本文件中-*/ if(fp=fopen(成绩分析管理.txt,wb)=NULL) /*打开文件*/printf(修改时打开文件失败n);return;for(i=0;icnt;i+) /*向成绩分析管理文件中写内容*/ if(fwrite(&STUi,sizeof(struct student),1,fp

27、)!=1) /*写文件*/printf(删除时写文件错误n); return;fclose(fp);/*关闭文件*/*-*/return ;/*-*/*-按姓名查找学生记录函数的具体实现-*/ void searchname(void) FILE *fp;/定义头文件指针fp char s120; int cnt=0,i=0,flag=1; /定义变量/*-打开成绩分析管理文本文件并读出文件中的学生记录-*/ if(fp=fopen(成绩分析管理.txt,rb)=NULL) /*打开文件*/printf(添加时打开成绩分析管理.txt文件失败n);return;while(imaxsize)i

28、f(fread(&STUi,sizeof(struct student),1,fp)=1) /*读文件*/cnt+;else if(i=0)printf(读文件失败n);break;i+;fclose(fp);/*关闭文件*/*-*/ printf(n-please input the students name:-n); scanf(%s,s1); /输入要查找的学生姓名 for(i=0;icnt;i+) if(strcmp(STUi.name,s1)=0) /找到匹配结果,输出匹配记录的内容并用flag做标记 flag=0,printf(%s,%ld,%s,%s,%s,%d,%dn,STU

29、i.name,STUi.n,STUi.classnum,STUi.coursenum0,STUi.coursenum1,STUi.grade0,STUi.grade1); if(flag) printf(There are no information to modify!n); /如果未找到匹配记录return ; /*-*/*-按班级查找函数的具体实现-*/void searchclass(void)FILE *fp; /定义头文件指针fp char classnum210,flag=1; int cnt=0,i=0; /定义变量/*-打开成绩分析管理文本文件并读出文件中的学生记录-*/

30、if(fp=fopen(成绩分析管理.txt,rb)=NULL) /*打开文件*/printf(添加时打开成绩分析管理.txt文件失败n);return;while(imaxsize)if(fread(&STUi,sizeof(struct student),1,fp)=1) /*读文件*/cnt+;else if(i=0)printf(读文件失败n);break;i+;fclose(fp);/*关闭文件*/*-*/ printf(nplease input a classname:); scanf(%s,classnum2); /输入要查找的班级名称 for(i=0;icnt;i+)if(s

31、trcmp(STUi.classnum,classnum2)=0) /找到匹配结果,输出匹配记录的内容并用flag做标记printf(%s,%ld,%s,%s,%s,%d,%dn,STUi.name,STUi.n,STUi.classnum,STUi.coursenum0,STUi.coursenum1,STUi.grade0,STUi.grade1),flag=0; if(flag) printf(nCan not find the infomation!n); /如果未找到匹配记录 return ;/*-*/*-信息统计函数的具体实现-*/void tongji(void)FILE *fp

32、; /定义头文件指针fpint min1=101,min2=101,min3=101,min4=101,max1=0,max2=0,max3=0,max4=0,sum1=0,sum2=0,sum3=0,sum4=0,n1=0,n2=0,n3=0,n4=0,cnt=0,i=0;float a,b,c,d;char classnumber210, coursenumber210; /定义变量/*-打开成绩分析管理文本文件并读出文件中的学生记录-*/if(fp=fopen(成绩分析管理.txt,rb)=NULL) /*打开文件*/printf(打开成绩分析管理.txt文件失败n);return;wh

33、ile(imaxsize)if(fread(&STUi,sizeof(struct student),1,fp)=1) /*读文件*/cnt+;else if(i=0)printf(读文件失败n);break;i+;fclose(fp);/*关闭文件*/*-*/scanf(%s%s%s%s,classnumber0,classnumber1,coursenumber0,coursenumber1); /输入要统计的班级和课程名称,各两个for(i=0;icnt;i+)if(strcmp(STUi.classnum,classnumber0)=0)&(strcmp(STUi.coursenum0

34、,coursenumber0)=0)sum1+=STUi.grade0; /求某门课班级的成绩总和if(STUi.grade0max1)max1=STUi.grade0; /找求某门课班级的成绩最高值n1+; /计数 if(strcmp(STUi.classnum,classnumber0)=0)&(strcmp(STUi.coursenum1,coursenumber1)=0)sum2+=STUi.grade1;/求某门课班级的成绩总和if(STUi.grade1max2)max2=STUi.grade1;/找求某门课班级的成绩最高值n2+;/计数 if(strcmp(STUi.classn

35、um,classnumber1)=0)&(strcmp(STUi.coursenum0,coursenumber0)=0)sum3+=STUi.grade0;/求某门课班级的成绩总和if(STUi.grade0max3)max3=STUi.grade0;/找求某门课班级的成绩最高值n3+;/计数 if(strcmp(STUi.classnum,classnumber1)=0)&(strcmp(STUi.coursenum1,coursenumber1)=0)sum4+=STUi.grade1;/求某门课班级的成绩总和if(STUi.grade0max4)max4=STUi.grade1;/找求

36、某门课班级的成绩最高值n4+;/计数a=(float)sum1/n1;/求某门课班级的平均成绩b=(float)sum2/n2;/求某门课班级的平均成绩c=(float)sum3/n3;/求某门课班级的平均成绩d=(float)sum4/n4;/求某门课班级的平均成绩/*-输出统计结果-*/printf(n%20s %20s %10.2f %10d %10d,classnumber0,coursenumber0,a,min1,max1);printf(n%20s %20s %10.2f %10d %10d,classnumber0,coursenumber1,b,min2,max2);prin

37、tf(n%20s %20s %10.2f %10d %10d,classnumber1,coursenumber0,c,min3,max3);printf(n%20s %20s %10.2f %10d %10dn,classnumber1,coursenumber1,d,min4,max4);/*-*/四 调试分析一 调试结果1 身份验证界面如果密码通过得到的界面如下:如果密码输入三次未通过,得到以下界面:2 如果密码通过则进入一级菜单 选1就得到以下界面选2就得到以下界面;选3就得到以下界面;选4就得到以下界面;3 现在假设我们进入了信息维护的二级菜单 下面进行具体函数调用选1调用函数voi

38、d establish(void),并且在屏幕中输入“4 yinchenglai 101279056 601 wuli shuxue 99 100 zhoudaohang 101279062 602 wuli shuxue 98 98 yehaokai 101279055 601 wuli shuxue 98 93 yuyingpu 101279058 602 wuli shuxue 0 0”可得到以下界面:在此基础上可以选3调用函数void deleteinfo(void),可以显示第四条记录得到以下界面:在此基础上调用函数void modify(void)对表中记录进行修改;可以得到以下界面:在此基础上调用函数void add(void)得到以下界面:4 在文件中存在记录的前提下我们来调用信息检索中的函数: 选1 调用函数void searchname(void);得到以下界面:在此基础上选2调用函数void searchclass(void)得到以下界面:5 在4最后一步的基础上选3返回上级菜单后选择3信息统计后选1调用函数void tongji(void)并输入”601 602 wuli huaxue” 得到以下界面:至此本系统的主要函数已经全部调用完成!二 时间复杂度分析本程序运行所耗费的时间主要在于循环语句,for和w

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

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

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


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