学生成绩管理系统(c语言结构体以及文件操作)实验报告

上传人:r****d 文档编号:126579713 上传时间:2022-07-28 格式:DOC 页数:12 大小:70.50KB
收藏 版权申诉 举报 下载
学生成绩管理系统(c语言结构体以及文件操作)实验报告_第1页
第1页 / 共12页
学生成绩管理系统(c语言结构体以及文件操作)实验报告_第2页
第2页 / 共12页
学生成绩管理系统(c语言结构体以及文件操作)实验报告_第3页
第3页 / 共12页
资源描述:

《学生成绩管理系统(c语言结构体以及文件操作)实验报告》由会员分享,可在线阅读,更多相关《学生成绩管理系统(c语言结构体以及文件操作)实验报告(12页珍藏版)》请在装配图网上搜索。

1、 C程序设计 实验报告编号: 姓名院系学号任课教师于萧指导教师实验地点实验时间实验名称文件操作同 组 人无预习报告(对实验主要内容的认识)得分实验目的: 练习使用C语言的标准I/O函数系列处理文件 熟悉二维数组的操作函数、模块化程序设计以及增量测试方法熟悉结构体类型、结构体数组、写钩体数组函数参数、体会结构体类型代替普通的数组类型实现数据库管理的优越性熟悉文件的基本操作以及增量的测试方法 实验内容(问题,思路,程序,结果)得分一、 设计思路: 仔细阅读系统要求,首先将此系统化分为如下模块(即如下函数) 1、 输入初始的学生信息:其中包括学生的学号、姓名、数学、物理、英语成绩等相关信息;使用fo

2、r循环,以及结构体成员调用一次录入每个学生的成绩等学生信息2、 计算平均和总分模块:利用两层for循环,计数变量i累加一次循环一个学生、计数变量j进行与科目次数相同的累加循环每个科目的成绩进行累加。 3、 按照学生成绩以及姓名字典排序模块:比较学生成绩的高低以及姓名字典的大小,使用选择法进行排序4、 查询模块:遍历结构体数组,如果姓名相同则循环输出学生的信息。5、 写文件模块:使用fopen函数打开文件以后进行循环写入。一直到最后一个学生。6、 读文件操作模块:打开文件以后,进行循环输出,一直循环的文件的最末尾。利用feof()。7、 退出函数,使用exit函数进行操作。将整个程序模块化编写之

3、后,在主函数中使用while循环调用,使用switc函数进行选择相应的函数功能。为了防止用户不按照正常的操作流程操作,不进行学生成绩的输入就进行后续操作导致的系统报错或者弹出错误,在调用函数之前使用while循环增加一段容错代码,如果用户第一次选择的不是输入功能则提示用户选择错误并返回循环重新要求用户选择功能,直到用户输出成绩为止,跳出容错的处理循环进行正常的功能选择循环。最后进行相应的用户使用界面的设计和优化。二、 菜单设计*欢迎进入学生成绩管理系统*programmed by Menglingxin 131110412* *菜单* * 1、录入每个学生的学号,姓名,和各科考试成绩! * *

4、 2、计算每个学生的总分和平均分! * * 3、按每个学生的总分和平均分从高到低排出名次表!* * 4、按姓名的字典顺序排出成绩! * * 5、按姓名查询学生学生排名和考试成绩! * * 6、输出每个学生的学号,姓名,各科成绩! * * 7、将每个学生的信息写入文件! * * 8、从文件读取信息并显示! * * 9、退出程序! *三、 退出界面 * * 谢谢您的使用 *四、 错误提示界面* * 请先录入学生信息和成绩 *五、 函数代码1、 主函数/*编 程:孟令鑫 131110412 时 间:2013年12月24日 内 容;结构体实现学生成绩管理系统*/#include #include #d

5、efine COURSE 3#define STUD_N 30#include lab1.h#include lab2.h#include lab3.h#include lab4.h#include lab5.h#include lab6.h#include lab7.hint main() int choice,n,pos,j; STUDENT stuSTUD_N; char x10,ch;/定义一个十个字节的字符数组用来存放要查找的姓名 printf( *欢迎进入学生成绩管理系统*n); printf( *programmed by Menglingxin 131110412*n); pr

6、intf( *菜单*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、退出

7、程序! *n); printf( *n); while(1)/用来处理用户的错误输入 printf(请输入您要进行的操作:t); scanf(%d,&choice); if (choice=1) n = InputScore(stu,3);/调用录入函数 printf(分数录入完毕!n); break;/如果用户正确的先录入了学生成绩则跳出该错误处理循环 else if (choice=9) printf( *n); printf( * 谢谢您的使用 *n); printf( *n); exit(0); else/如果没有先录入成绩用户直接进行其他操作则提示用户请先录入学生成绩并反复循环。 p

8、rintf( *n); printf( * 请先录入学生信息和成绩 *n); printf( *n); while(1)/用while循环实现功能循环操作 printf(请输入您要进行的操作:t); scanf(%d,&choice); switch(choice) case 1: n = InputScore(stu,3);/调用录入函数 printf(分数录入完毕!n); break; case 2: AverforStudent(stu,n,COURSE);/调用平均数函数 printf(平均分计算完毕!n); break; case 3: AverforStudent(stu,n,CO

9、URSE);/调用平均数函数 sortbystudentsumS(stu,n);/调用排序 printf(按学生平均分进行降序排序:n); Print(stu,n,COURSE); break; case 4: AverforStudent(stu,n,COURSE); SortbyName(stu,n); printf(按姓名字典输出:n); Print(stu,n,COURSE); break; case 5: AverforStudent(stu,n,COURSE); do printf(请输入您要查找的姓名:n); scanf(%s,x); pos = LinrSearch(stu,x

10、,n); if(pos != -1)/循环输出学生的成绩和学号等 printf(%ld%8s,stupos.studentID,stupos.studentName); for(j=0;jCOURSE;j+) printf(%4d,stupos.scorej); printf(%4d,stupos.sumS); printf(%n,stupos.averS); else printf(没有找到这个学生的信息!n); printf(您还想继续进行查找吗?(y/n)); scanf( %c,&ch); while(ch=y); break; case 6:/成绩输出 AverforStudent(

11、stu,n,COURSE); printf(成绩输出:n); Print(stu,n,COURSE); break; case 7:/写文件 AverforStudent(stu,n,COURSE); WritetoFile(stu,n,COURSE); printf(已经成功写入文件!n); break; case 8:/读文件 ReadfromFile(stu,COURSE); PrintScore(stu,n,COURSE); break; case 9: printf( *n); printf( * 谢谢您的使用 *n); printf( *n); exit(0); break; de

12、fault :/容错处理 printf(输入错误!); break; return 0;2、 各个模块#include #include #define COURSE 3#define STUD_N 30typedef struct student/定义学生的信息结构体 long studentID; char studentName10; int score3; float averS; int sumS;STUDENT;/函数功能:利用循环输入学生的学号姓名以及成绩等信息。int InputScore(STUDENT stu,int m) int i,j,n; printf(请输入参加考试

13、的人数:); scanf(%d,&n); for(i=0;in;i+) printf(请输入第%d个学生的信息:学号,姓名,成绩(数学、英语,物理)n,i+1); scanf(%ld,&stui.studentID); scanf(%s,stui.studentName); for(j=0;jm;j+) scanf(%d,&stui.scorej); return i;/返回学生人数#include #include #define COURSE 3#define STUD_N 30typedef struct student/定义学生信息的结构体 long studentID; char s

14、tudentName10; int score3; float averS; int sumS;STUDENT;/函数功能:计算学生的平均分、总分void AverforStudent(STUDENT stu,int n,int m) int i,j; for(i=0;in;i+) stui.sumS=0; for(j=0;jm;j+) stui.sumS=stui.sumS+stui.scorej; stui.averS=stui.sumS/m; /函数功能:循环输出学生的成绩信息void Print(STUDENT stu,int n,int m) int i,j; for(i=0;in;

15、i+) printf(%10ld%8st,stui.studentID,stui.studentName); for(j=0;jm;j+) printf(%dt,stui.scorej); printf(%dt,stui.sumS); printf(%t,stui.averS); printf(t%dn,i+1); #include #include #include #define COURSE 3#define STUD_N 30typedef struct student/定义学生的信息结构体 long studentID; char studentName10; int score3;

16、 float averS; int sumS;STUDENT;/声明打印的函数void Print(STUDENT stu,int n,int m);/函数功能:按照学生的总分进行排序void sortbystudentsumS(STUDENT stu,int n) int i,j,k,t,d; long a; char b10; int c; float e; for(i=0;in-1;i+) k=i; for(j=i+1;jstuk.sumS) k=j; if(k!=i) /交换学号。 a = stuk.studentID; stuk.studentID=stui.studentID; s

17、tui.studentID=a; /交换姓名 strcpy(b,stuk.studentName); strcpy(stuk.studentName,stui.studentName); strcpy(stui.studentName,b); /交换成绩 for(t=0;tCOURSE;t+) d=stui.scoret; stui.scoret=stuk.scoret; stuk.scoret=d; /交换总分。 c = stuk.sumS; stuk.sumS=stui.sumS; stui.sumS=c; /交换平均分。 e = stuk.averS; stuk.averS=stui.a

18、verS; stui.averS=e; #include #include #include #define COURSE 3#define STUD_N 30typedef struct student long studentID; char studentName10; int score3; float averS; int sumS;STUDENT;/函数功能:按照学生的姓名字进行排序void SortbyName(STUDENT stu,int n) int i,j,t,c,d; long a; char b10; float e; for(i=0;in-1;i+) for(j=i

19、+1;jn;j+) if(strcmp(stuj.studentName,stui.studentName)0) a = stui.studentID; /交换学号。 stui.studentID=stuj.studentID; stuj.studentID=a; /交换姓名 strcpy(b,stui.studentName); strcpy(stui.studentName,stuj.studentName); strcpy(stuj.studentName,b); /交换成绩 for(t=0;tCOURSE;t+) d=stui.scoret; stui.scoret=stuj.scor

20、et; stuj.scoret=d; c = stui.sumS; /交换总分。 stui.sumS=stuj.sumS; stuj.sumS=c; e = stui.averS; /交换平均分。 stui.averS=stuj.averS; stuj.averS=e; #include #include #include #define COURSE 3#define STUD_N 30typedef struct student long studentID; char studentName10; int score3; float averS; int sumS;STUDENT;/函数

21、功能,遍历查找学生的名字int LinrSearch(STUDENT stu,char p,int n) int i; for(i=0;in;i+) if(strcmp(p,stui.studentName)=0) return i; return -1;#include #include #define COURSE 3#define STUD_N 30typedef struct student long studentID; char studentName10; int score3; float averS; int sumS;STUDENT;/函数功能将学生信息循环写入文件void

22、 WritetoFile(STUDENT stu,int n,int m) FILE *fp; int i,j; if(fp=fopen(score.xls,w)=NULL) printf(打开文件失败); exit(0); for(i=0;in;i+) fprintf(fp,%10ldt%8st,stui.studentID,stui.studentName); for(j=0;jm;j+) fprintf(fp,%dt,stui.scorej); fprintf(fp,%dt,stui.sumS); fprintf(fp,%n,stui.averS); fclose(fp);#includ

23、e #include #define COURSE 3#define STUD_N 30typedef struct student long studentID; char studentName10; int score3; float averS; int sumS;STUDENT;/函数功能将学生信息循环读出void ReadfromFile(STUDENT stu,int m) FILE *fp; int i,j; if(fp=fopen(score.xls,r)=NULL) printf(打开文件失败); exit(0); for(i=0;!feof(fp);i+)/循环到文件末尾

24、 fscanf(fp,%10ldt,&stui.studentID); fscanf(fp,%8st,stui.studentName); for(j=0;jm;j+) fprintf(fp,%dt,stui.scorej); fprintf(fp,%dt,stui.sumS); fprintf(fp,%n,stui.averS); fclose(fp); printf(学生人数是:%d.n,i-1);/函数功能打印学生信息void PrintScore(STUDENT stu,int n,int m) int i,j; for(i=0;in;i+) printf(%10ld%8st,stui

25、.studentID,stui.studentName); for(j=0;jm;j+) printf(%dt,stui.scorej); printf(%dt,stui.sumS); printf(%n,stui.averS); 六、 出现问题1、 用户不按照正常顺序操作,会出现程序报错;2、 文件写入绝对路径寻找比较麻烦3、 其他相关问题在学生成绩管理系统V1.0已经提出并解决七、 问题解决1、 为了防止用户不按照正常的操作流程操作,不进行学生成绩的输入就进行后续操作导致的系统报错或者弹出错误,在调用函数之前使用while循环增加一段容错代码,如果用户第一次选择的不是输入功能则提示用户选择

26、错误并返回循环重新要求用户选择功能,直到用户输出成绩为止,跳出容错的处理循环进行正常的功能选择循环。2、 进行写文件操作的时候使用的是“”,将文件写入D盘。这可能会导致系统在不同机器上的移植问题,将它改为“score.xls”引用相对路径。将它放在程序的文件夹里面。解决程序的移植问题得分一、实验结论 1、函数的模块化思想有利于程序的debug。2、学会了文件的基本操作;3、多打备注有利于检查。4、掌握了结构体数组的使用方法二、问题解决和收获1、在程序的开始或者相关函数调用的时候增加一段错误处理代码。可以增加整个工程的容错性,提高程序的使用性能。2、将程序中的绝对路径引用改为相对路径引用可以提高整个程序的移植性能。3、各个case语句只是一个入口标号。不影响执行终点,一般应该在各个case语句最后加一个break语句,可以使流程跳出switch结构,否则会从下一个入口处一直向下执行。教师评价总分实际得分

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