《C语言--学生成绩管理系统.doc》由会员分享,可在线阅读,更多相关《C语言--学生成绩管理系统.doc(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第一章 设计内容、任务及具体要求1.1内容和要求强化学习C语言中有关链表及外部文件的内容,独立设计学生成绩管理系统,并编程实现以下功能:1、整个系统均用C语言实现;2、利用指针、链表来实现学生成绩的数据结构设计;3、系统具有输入、显示、查询、删除、排序、插入,保存、读取基本功能;4、系统的各个功能模块都用函数的形式来实现;5、可以将学生成绩信息保存在文件中。6、可以将学生信息从文件中读取出来。1.2实现功能1、每一条记录包括一个学生的学号、姓名、3门成绩、平均成绩。2、输入功能:可以一次完成无数条记录的输入。3、显示功能:完成全部学生记录的显示。4、查找功能:完成按姓名查找学生记录,并显示。5
2、、排序功能:按学生平均成绩进行排序。6、插入功能:按平均成绩高低插入一条学生记录。7、保存功能:将学生记录保存在任何自定义的文件中,如保存在:c:score。8、读取功能:将保存在文件中的学生记录读取出来。9、有一个清晰美观界面来调用各个功能第二章 设计的总体思路2.1系统功能 系统将可以实现以下功能:1、每一条记录包括一个学生的学号、姓名、3门成绩、平均成绩。2、输入功能:可以一次完成无数条记录的输入。3、显示功能:完成全部学生记录的显示。4、查找功能:完成按姓名查找学生记录,并显示。5、排序功能:按学生平均成绩进行排序。6、插入功能:按平均成绩高低插入一条学生记录。7、保存功能:将学生记录
3、保存在任何自定义的文件中,如保存在:c:score。8、读取功能:将保存在文件中的学生记录读取出来。9、有一个清晰美观界面来调用各个功能2.2系统的总体框架MAIN()主函数CREAT函数LOAD函数SAVE函数INSERT函数DEL函数ADD函数SEARCH函数PRINT函数STATISTICS函数TAXIS函数MENU函数 图2-2 系统总体框架图2.3系统的总体流程图 开始编译运行有/错MAIN有无调用MENUK0EXITK=0 调用各个功能函数(K=?)连接执行错误 输入正确图2-3 系统总体流程图注:此图为概图、程序较多无法一一展示第三章 功能模块的具体设计3.1 定义结构体 本程序
4、需要定义多个结构体,用于存放学生的相关信息。struct student/定义结构体int number;char name10;float score;float yuwen;float yingyu;float shuxue;float sum;float ave;struct student *next;typedef struct student score;int n,k;3.2 main( )主函数 主函数功能比较简单,用while循环语句和switch多重选择语句来显示主界面和调用函数。在主函数的前面要写必须的头文件,预定义语句以及全局变量的结构体。3.3 add()函数 利用w
5、hile循环结构和else/if语句来实现增加信息的功能。先定义5个指针*p0,*p1,*p2,*p3,*max,开始运行,当学生学号小于0时返回add函数,重新开始,而当输入0时返回菜单函数。当输入学号符合要求时,函数向下运行,令p3=head,用else/if语句判断输入的学号是否重复,如果是则重新输入,如果不是,函数继续向下运行。接下来利用指针来储存依次输入的语文、英语、数学成绩。而用while 结构来保证输入的成绩在0100之间,如果不是则重新输入。3.4 del()删除函数在C语言中无法做到删除和移动数据,所以删除记录要先将所有记录从文件中读出,删除后再将记录写回文件中。每读出一条记
6、录,按其在文件中的顺序做好指针链接关系,然后查处要删除的学生信息,将其在链表中删除,最后再将变动的记录重新写回文件中。用指针,while循环和else/if结构来实现查找出要删除的学生。3.5 insert()插入函数 在插入函数中利用指针,和else/if语句来实现输入的数据按照插入相应的位置,流程图如下所示:图3-5 插入函数流程图3.6 load() 读取函数利用指针、链表打开已经储存的信息,主要的流程图如下所示:图3-6 load()函数流程图3.7 save()保存函数 函数比较简单,主要利用指针来把信息保存在文件中,流程图如下所示:图3-7 save()函数流程图3.8 taxis
7、()排序函数先用if判断是否存在信息,如果没有则返回,如果已经存在则继续运行函数。利用while循环语句和switch多重选择语句来实现是按照哪一种方式排名,在用for,if语句来实现排名。3.9 mesu() 菜单函数用do/while循环语句和switch多重选择语句调用各个功能函数,流程图如下所示:图3-9 mesu()函数流程图3.10 search() 查询函数首先输入学号,当没有记录是显示“没有任何学生”,返回函数重新开始。如过输入学号合格,则对已经存在的记录进行查找,最后打印信息。函数流程图如下所示:图3-10 search()函数流程图3.11 statistics() 统计数
8、据函数用while循环语句和switch多重选择语句输出记录中的个人总分和平均分、单科平均分、总分最高分、总分最低分,函数流程图如下所示:图3-11 statistics()函数流程图第四章 系统调试菜单界面运行如下:图4-1菜单界面输入函数界面运行如下:图4-2 输入函数界面查询信息模块运行如下:图4-3 查询信息界面删除模块运行界面如下:图4-4 删除模块界面插入模块运行界面如下: 图4-5 插入模块界面显示信息模块运行界面如下:图4-6 显示信息模块界面统计学生信息模块运行如下:图4-7 统计学生信息模块界面信息读取模块运行界面如下:图4-8 信息读取模块界面信息保存模块界面运行如下:图
9、4-9信息保存模块界面排序模块运行界面如下:图4-10排序模块界面第五章 总结与个人体会(1)该学生成绩管理系统基本可以运行,但是有不少地方仍是设计得不够科学,有些在任务书上的要求没有能十分好的把它运行出来。(2)、通过本次对C语言的深入学习,让我对C语言有了更多的了解并撑握更多的知识,成功地运用各类函数、循环变量、结构化的程序设计,以及结构体、指针的使用。(3)、但在学习中发现,编程确实不是很好做的,并非是你想要就能完成的,它需要的是认真、仔细地对待每一个程序块,特别是在对指针的使用时更加困难,那些指针指来指去,一不小心就会看错,编译不出来。(4)、由于学生的我只是大一,知识水平不够,没能够
10、完完全全地把程序做出来,而且程序中有许多不足之处不能够正确地将它改正,但总体上是可以运行的。(5)经过这次课程设计,我发现自己不少的不足之处,我将会在以后的学习中把它们改正过来,努力学到更多的知识。第六章 致谢 首先要感谢学校给了我这么一个学习的机会,还提供给我们机房使用,体现了学校对学生实际操作能力的重视;其次要感谢老师平时学习过程中对我的关照,在课程设计过程中对我们的教诲与教导,在那么炎热的天气里为我们作指导;同时也要感谢同学们在学习中各种支持与关注。第七章 参考文献1 谭浩强编著.C程序设计第三版.北京:清华大学出版社,20052 林瑞仲等编著.C语言实例解析精粹.北京:人民邮电出版社,
11、20053 王旭等编著.C语言实用界面技术.陕西:西北工业大学出版社,19964 邱仲潘等编著.Visual C+ 6 从入门到精通.北京:电子工业出版社,2005第八章 程序源代码#include #include#include #include #define NULL 0#define LEN sizeof(struct student)#include struct student/定义结构体int number;char name10;float score;float yuwen;float yingyu;float shuxue;float sum;float ave;stru
12、ct student *next;typedef struct student score;int n,k;score *creat(void)/创建链表 score*head; score *p1,*p2,*p3,*max; float sum=0,ave=0; int i,j; float fen; char t10; n=0; p1=p2=p3=(score *)malloc(LEN);head=p3; printf(请输入学生信息,输0退出!n);repeat1: printf(请输入学生学号:); scanf(%d,&p1-number); while(p1-numbernumber
13、); if(p1-number=0) goto end; else p3=head; if(n0) for(i=0;inumber!=p3-number) p3=p3-next; else printf(学号重复,请重输!n); goto repeat1; printf(请输入学生姓名:); scanf(%s,&p1-name); printf(请输入语文成绩(0100):); scanf(%f,&p1-yuwen); while(p1-yuwenyuwen100) getchar(); printf(输入错误,请重新输入语文成绩); scanf(%f,&p1-yuwen); printf(请
14、输入英语成绩(0100):); scanf(%f,&p1-yingyu); while(p1-yingyuyingyu100) getchar(); printf(输入错误,请重新输入英语成绩); scanf(%f,&p1-yingyu); printf(请输入数学成绩(0100):); scanf(%f,&p1-shuxue); while(p1-shuxueshuxue100) getchar(); printf(输入错误,请重新输入数学成绩); scanf(%f,&p1-shuxue); sum=p1-yuwen+p1-yingyu+p1-shuxue;ave=sum/3;head=NU
15、LL; while(p1-number!=0) n=n+1; if(n=1) head=p1; else p2-next=p1; p2=p1; p1=(score *)malloc(LEN); printf(请输入学生信息,输0退出!n);repeat2:printf(请输入学生学号:); scanf(%d,&p1-number); while(p1-numbernumber); if(p1-number=0) goto end; else p3=head; if(n0) for(i=0;inumber!=p3-number) p3=p3-next; else printf(学号重复,请重输!
16、n); goto repeat2; printf(请输入学生姓名:); scanf(%s,&p1-name); printf(请输入语文成绩(0100):); scanf(%f,&p1-yuwen); while(p1-yuwenyuwen100) getchar(); printf(输入错误,请重新输入语文成绩); scanf(%f,&p1-yuwen); printf(请输入英语成绩(0100):); scanf(%f,&p1-yingyu); while(p1-yingyuyingyu100) getchar(); printf(输入错误,请重新输入英语成绩); scanf(%f,&p1
17、-yingyu); printf(请输入数学成绩(0100):); scanf(%f,&p1-shuxue); while(p1-shuxueshuxue100) getchar(); printf(输入错误,请重新输入数学成绩); scanf(%f,&p1-shuxue); end: p1=head; p3=p1; for(i=1;in;i+) for(j=i+1;jnext; if(max-numberp1-number) k=max-number; max-number=p1-number; p1-number=k; strcpy(t,max-name); strcpy(max-name
18、,p1-name); strcpy(p1-name,t); fen=max-yuwen; max-yuwen=p1-yuwen; p1-yuwen=fen; fen=max-yingyu; max-yingyu=p1-yingyu; p1-yingyu=fen; fen=max-shuxue; max-shuxue=p1-shuxue; p1-shuxue=fen; max=head;p1=head; p2-next=NULL; printf(共存在%d个学生信息!n,n); return(head);void print(struct student *head)/输出函数 struct s
19、tudent *p1; float sum,ave; printf(nNow,These %d records are:n,n); p1=head; if(head!=NULL) printf(-n); printf(|学号t|姓名t|语文t|英语t|数学t|总分t|平均分t|n); printf(-n); do sum=p1-yuwen+p1-yingyu+p1-shuxue;ave=sum/3; printf(|%dt|%st|%.1ft|%.1ft|%.1ft|%.1ft|%.1ft|n,p1-number,p1-name,p1-yuwen,p1-yingyu,p1-shuxue,sum
20、,ave); p1=p1-next; while(p1!=NULL); score *del(score *head)/删除函数 score *p1,*p2;int number; printf(输入要删除的学生的学号(输入0则退出):); scanf(%d,&number); getchar(); while(number!=0) if(head=NULL) printf(n没有任何学生信息!n); return(head); p1=head; while(number!=p1-number&p1-next!=NULL) p2=p1;p1=p1-next; if(number=p1-numb
21、er) if(p1=head) head=p1-next; else p2-next=p1-next; printf(删除:%dn,number);n=n-1; else printf(%d不存在此学生!n,number); printf(输入要删除的学生的学号:); scanf(%d,&number); getchar(); #ifdef DEBUG printf(已经退出了!n);#endifprintf(现在的学生数为:%d个!n,n); return(head); struct student *insert(struct student *head, struct student *
22、stud)/插入函数struct student *p0,*p1,*p2;p1=head;p0=stud;if(head=NULL)/头指针为空head=p0; p0-next=NULL;elsewhile(p0-numberp1-number) & (p1-next!=NULL)p2=p1; p1=p1-next; if(p0-numbernumber) if(head=p1) head=p0;else p2-next=p0;p0-next=p1; elsep1-next=p0; p0-next=NULL; n=n+1; return(head); score *load(score *he
23、ad)/读取文件信息 score *p1,*p2;float sum,ave; int m=0; char filepn10; FILE *fp; printf(请输入文件路径及文件名:); scanf(%s,filepn); if(fp=fopen(filepn,r+)=NULL) printf(不能打开文件!n); return 0; fscanf(fp,-n); fscanf(fp,|学号t|姓名t|语文t|英语t|数学t|总分t|平均分t|n); fscanf(fp,-n); printf(-n); printf(|学号t|姓名t|语文t|英语t|数学t|总分t|平均分t|n); pr
24、intf(-n); m=m+1; if(m=1) p1=(score *)malloc(LEN); sum=p1-yuwen+p1-yingyu+p1-shuxue;ave=sum/3; fscanf(fp,%d%s%f%f%f%f%f,&p1-number,p1-name,&p1-yuwen,&p1-yingyu,&p1-shuxue,sum,ave); printf(|%dt|%st|%.1ft|%.1ft|%.1ft|%.1ft|%.1ft|n,p1-number,p1-name,p1-yuwen,p1-yingyu,p1-shuxue,sum,ave); head=NULL; do n
25、=n+1; if(n=1) head=p1; else p2-next=p1; p2=p1; p1=(score *)malloc(LEN); fscanf(fp,%d%s%f%f%f%f%fn,&p1-number,p1-name,&p1-yuwen,&p1-yingyu,&p1-shuxue,sum,ave); printf(|%dt|%st|%.1ft|%.1ft|%.1ft|%.1ft|%.1ft|n,p1-number,p1-name,p1-yuwen,p1-yingyu,p1-shuxue,sum,ave); while(!feof(fp); p2-next=p1; p1-next
26、=NULL; n=n+1; printf(-n); fclose(fp); return (head);score *add(score *head,score *stu)/增加信息 score *p0,*p1,*p2,*p3,*max; int i,j; float fen; char t10; p3=stu=(score *)malloc(LEN); printf(n输入要增加的学生的资料!); repeat4: printf(请输入学生学号(学号应大于0):); scanf(%d,&stu-number); while(stu-numbernumber); if(stu-number=0
27、) goto end2; else p3=head; if(n0) for(i=0;inumber!=p3-number) p3=p3-next; else printf(学号重复,请重输!n); goto repeat4; printf(输入学生姓名:); scanf(%s,stu-name); printf(请输入语文成绩(0100):); scanf(%f,&stu-yuwen); while(stu-yuwenyuwen100) getchar(); printf(输入错误,请重新输入语文成绩); scanf(%f,&stu-yuwen); printf(请输入英语成绩(0100):)
28、; scanf(%f,&stu-yingyu); while(stu-yingyuyingyu100) getchar(); printf(输入错误,请重新输入英语成绩); scanf(%f,&stu-yingyu); printf(请输入数学成绩(0100):); scanf(%f,&stu-shuxue); while(stu-shuxueshuxue100) getchar(); printf(输入错误,请重新输入数学成绩); scanf(%f,&stu-shuxue); p1=head;p0=stu;if(head=NULL) head=p0;p0-next=NULL; else if
29、(p1-next=NULL) p1-next=p0; p0-next=NULL; else while(p1-next!=NULL) p2=p1;p1=p1-next; p1-next=p0; p0-next=NULL; n=n+1;p1=head;p0=stu; for(i=1;in;i+) for(j=i+1;jnext; if(max-numberp1-number) k=max-number; max-number=p1-number; p1-number=k; strcpy(t,max-name); strcpy(max-name,p1-name); strcpy(p1-name,t
30、); fen=max-yuwen; max-yuwen=p1-yuwen; p1-yuwen=fen;fen=max-yingyu; max-yingyu=p1-yingyu; p1-yingyu=fen; fen=max-shuxue; max-shuxue=p1-shuxue; p1-shuxue=fen; max=head;p1=head; end2: printf(现在的学生数为:%d个!n,n); return(head);save(score *p1) /保存函数 FILE *fp; float sum,ave; char filepn20; printf(请输入文件路径及文件名:
31、); scanf(%s,filepn); if(fp=fopen(filepn,w+)=NULL) printf(不能打开文件!n); return 0; fprintf(fp,-n); fprintf(fp,|学号t|姓名t|语文t|英语t|数学t|总分t|平均分t|n); fprintf(fp,-n); while(p1!=NULL) sum=p1-yuwen+p1-yingyu+p1-shuxue;ave=sum/3; fprintf(fp,%dt%st%.1ft%.1ft%.1ftn,p1-number,p1-name,p1-yuwen,p1-yingyu,p1-shuxue,sum,
32、ave); p1=p1-next; fclose(fp); printf(文件已经保存!n); return 0;score *search(score *head)/查询函数float sum,ave;int number; score *p1,*p2; printf(输入要查询的学生的学号: ); scanf(%d,&number);while(number!=0) if(head=NULL) printf(n没有任何学生资料!n);return(head); printf(-n); printf(|学号t|姓名t|语文t|英语t|数学t|总分t|平均分t|n); printf(-n);
33、p1=head; while(number!=p1-number&p1-next!=NULL) p2=p1;p1=p1-next; sum=p1-yuwen+p1-yingyu+p1-shuxue;ave=sum/3; if(number=p1-number) printf(|%dt|%st|%.1ft|%.1ft|%.1ft|%.1ft|%.1ft|n,p1-number,p1-name,p1-yuwen,p1-yingyu,p1-shuxue,sum,ave); printf(-n); else printf(%d不存在此学生!n,number); printf(输入要查询的学生的学号: ); scanf(%d,&number);printf(已经退出了!n);return(head);