ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:529.31KB ,
资源ID:4052856      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4052856.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言实验大作业 学生成绩管理.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C语言实验大作业 学生成绩管理.docx

1、C语言实验大作业 学生成绩管理 学 院班 级学 号姓 名/*在后面的文档编写中,请你不要修改各个标题的内容,从而确保报告内容和风格一致。完成全部内容后,你只需要在上面的目录上右键“更新域”,选择“只更新页码”就可以更新正确的目录页码。注意:目录的左边距为6.5厘米。*/1 摘要1.1 设计题目学成绩管理程序1.2 设计内容为了便于对学生星系进行管理,这里设计了学生信息管理程序。该程序主要通过对链表的相关操作运用菜单的形式实现对学生基本信息的管理。首先用户要输入三个学生的基本信息,程序即据此建立了一个有三个学生的链表,每个结点包括学号、姓名、3门课的成绩(英语、数学、计算机,其中成绩精确到小数点

2、后两位)。菜单为: 1显示。(即显示所建立的链表及当前链表内容) 2排序。(即将用户所输入的学生信息按学号大小对原有链表内容进行排序,并将经排序所产生的新链表展示给用户) 3插入。(用户根据需要可增加原链表中学生的数量,输入一个学生的基本信息,即将其插入原链表中,且新链表按学号有序排列并展现给用户) 4查找。(输入一个学号,输出各种成绩) 5删除。(输入一个学号,从链表中删除该学生,并展示新链表) 6统计。(若按1,则输入该学生的学号统计该学生的总分及平均分;若按2,则输入课程(1.英语 2.数学 3.计算机)求该门课程的总分及平均分) 7存盘。(将建立起来的链表以文件的形式存储) 8读入。(

3、将原来已将存盘的文件读入内存,进行管理)1.3 开发工具Visual C+ 6.0和Win32。1.4 应用平台Windows XP/Vista 32位2 详细设计2.1 程序结构程序的流程:该程序首先定义了一个记录学生基本信息的结构体,和全局变量链表的头指针“*head”,自定义了13个函数,然后是主函数通过调用以上自定义函数来实现程序的功能。这样做的好处是,在调用自定义函数时不必再对其申明。主函数第一行首先在程序运行界面中央输出“欢迎进入学生管理”,接着是输出“按回车键进入”(在界面中央),以提醒用户进一步操作程序。按回车键后程序执行创建链表函数(create(),这时出现界面需要用户输入

4、三个学生的基本信息,按回车键后创建成功,同时进入while循环体。该循环提以“system(cls)”开始,作用是在每次循环结束进入下一次循环时对上一次循环的运行结果进行清除,以保证本次循环的结果能清晰展示。该循环第二行执行函数“printfmenu()”,输出当前链表内容。接着进入菜单选择界面,此时需输入数字(08)进行菜单选择。若输入8,该循环结束;否则继续。然后执行菜单选择函数,用户通过菜单上执行不同的操作调用不同的函数。执行完菜单函数后,按回车键本次循环结束,并进入下一次循环。循环结束后,又一次执行清屏程序,最后输出“谢谢使用,愿你开心度过每一天”字样,至此整个程序结束。自定义函数:一

5、、显示菜单函数:void printfmenu()。用输出管理菜单:1.显示2.排序3.插入4.查找5.删除6.统计7.存盘8.读入9.结束二、链表输出函数:void printfform()。用来将已经创建链表或当前所建链表进行输出显示。三、链表创建函数:void create()。该函数用来创建一个动态链表,期间需要用户输入学生基本信息。四、排序函数:void arrange()。该函数用来对所创建的链表或当前存在的链表中的结构体按学号递增排序。排序结束调用“链表输出函数”,将新产生的链表进行输出。五、插入函数:void insert()调用该函数时,由用户输入一个学生的信息,将产生一个新

6、的结构体,并将其按学号插入当前链表中。调用链表输出函数,将新链表输出。六、查找函数:void find()。输入一个学号,将链表中该学生的信息输出。若链表中无该学号,则输出“未找到”。七、删除函数:void delet()。输入一个学号,将链表中该学号学生信息删除,并调用链表输出函数将删除后的链表输出。若输入学号不存在,输出“未找到”。八、按学生统计函数:void studentcount()。输入一个学号,计算该学号学生的总分和平均分并输出。若学号不存在,输出“未找到”。九、按科目统计函数:void subjectcount()。输入一个科目序号(.英语.数学.计算机),计算该科目的总分和平

7、均并输出。十、统计函数:void count()。当输入,调用“按学生统计函数”;当输入,调用“按科目统计函数”。分别进行统计操作。十一、存盘函数:void save()。将链表中的内容以文件的形式存放在磁盘中。十二、读入函数:void read()。将已经存盘的文件读入内存,进行管理。十三、选择菜单函数:void menu(char t)。主函数输入实参变量t,该函数通过选择判断调用以上函数来实现该程序的管理功能。参数传递:该程序包括主函数总共有14个函数,只有选择菜单函数是有参函数,其他均是无参函数。选择菜单函数运用switch选择结构,形参的传递用来选择执行调用相应的菜单功能函数。如从主

8、函数输入1,主函数调用该函数,并把1传递给该函数,该函数则调用“排序函数”执行菜单中的排序操作。2.2 主要功能程序功能:1、该程序主要用来对数量较少的学生基本信息进行管理(初始学生数为三)。 2、显示输入的学生基本信息。 3、对学生按学号进行排序、,并将信息以链表的形式进行保存。 4、可通过插入操作增加所要处理的学生信息数量。 5、显示所要查找的学生的基本信息。 6、删除不必要的信息。 7、统计学生成绩的相关数据,总分和平均分。 8、将经过处理的信息存盘管理。 9、以文件的形式将以存盘信息读入内存进行管理。原理和方法:1、该程序的要通过对链表进行操作来实现管理。 2、用循环结构和指针对已存在

9、链表输出显示,调用输出函数“printf”。 3、排序时先把链表中的学好数据存放在一位数组中,再用选择排序法对数组中的元素排序,最后用while循环结构把数组中的元素与结构体逐一配对,从而实现对链表的排序。 4、先用while找到插入位置,然后是链表的插入操作。 5、while循环执行查找操作。 6、while循环找到删除对象,链表的删除操作。 7、while循环找到操作对象,在执行相应操作。 8、文件的存储。 9、文件的读取。2.3 函数实现函数主要运用了while、do。while、for循环结构,还有选择排序法。函数大多为无参类型,自函数之间有少量调用。如排序、插入、删除、统计等函数都是

10、较为简单的函数,只需根据医学知识稍加修改即可。数据结构方面,主要事项是函数调用,主函数调用菜单函数,菜单函数又调用其它类型函数,其他自定义函数之间也有调用。2.4 开发日志关于该程序的设计,首先根据题目的要求考虑实现该函数所需的函数。考虑把自定义函数放在整个程序的前面,这样在主函数调用时就不必再对其进行申明。比如必须的一些基本函数链表输出函数、链表创建函数、链表排序函数、查询函数、链表删除函数、统计函数等,先把这些基本函数建立起来之后,程序的整体结构。考虑到程序的整体结构通过函数调用来实现较为方便,由此增加设计了一些函数,如链表输出函数、显示菜单函数、存盘函数、读入函数等。函数的的创建过程实在

11、是一个繁琐的工作,编译时常要去翻看课本去查找已经遗忘的C语言的相关语法知识,特别是一些细节上的设计,更不敢轻易放过。如转义字符“t”的使用回事程序界面更加美观整洁好看,期间也对结构体链表的知识作了较好的复习掌握。在做到排序函数时突然忘了选择排序法的算法,于是通过查资料对其进行了重新的掌握,其中插入函数的算法较为复杂,通过分析发现,须先查找然后再插入,查找的算法编号之后,后面的统计、删除函数也就迎刃而解了。调试的过程是最令人纠结的,觉得完好的程序却总是调不出来,经过复杂的心理脑力斗争最终发现却总是一些不该有的失误,而不是算法上问题。调试的过程是用时最长的,同时也磨练了我的耐性,让我对频频出现的错

12、误更加理智、更加淡定、更加耐心。而且在调试的过程中也积累了一些常见的错误经验,对部分调试的错误能大体上感知其错误的原因及位置。影响最深的是对排序函数的调试,指针数组的地址代码写错导致程序运行时不能读入,还有创建链表函数出现的问题,输入函数多打了几个“%lf”导致链表创建时出现乱码。程序的整体结构设计参考了“C语言课程设计”一书,再次申明。总之,程序的运行过程看是简单,作用也非常单一,但对于像我这样的智商不是很高的初学者而言,编程、调试过程是相当的艰辛与繁琐,其间个中滋味,汗水、辛酸只能把它埋在心底。3 程序调试及运行3.1 程序运行结果程序开始运行界面程序运行过程界面如下:程序结束界面:3.2

13、 程序使用说明该程序较为简单,根据程序运行时的提示即可完成操作。在第一次进行显示操作时,需按两次0才能显示所建链表。在完成一次菜单操作后,应按回车键返回主菜单。3.3 程序开发总结大作业的编写,是一个对所学知识综合应用的过程,也是对所学知识掌握情况的检验过程,更是对所学知识系统复习的过程。其间涉及除程序设计外多方面技能应用,能够很好训练一个人的整体思维能力,体现其综合素质。同时在完成作业的过程中,也让我体验了当一个程序员的神奇感受。当然我编的程序很简单,用途也很有限,其实就当前的程序来看根本没什么实际用途。但是设计工作的过程还是让我体会到了其艰辛其难度,编完之后油然而生的小小成就感是相当美妙的

14、。在编程设计过程中遇到过很多问题和困难,也让我深刻认识到自己知识的欠缺,感受到自己离一个真正的程序设计人员的差距还是相当之远,自己还有很多只是要学习和掌握。更重要的是过程激发了我对计算机编程的兴趣,虽然这门课程即将结束,当我想我对其的学习与热爱绝不会停止。限于本人智商和时间的原因,该程序存在一定的缺陷和一些需要完善提高的地方,现在此处指出如下:1、在链表的创建上,包含的信息量较少,仅有三个学生,其实据此方法可适当增加学生数量,以增强程序的实用性。2、再删除操作上,仅有对单个学生的删除功能,缺乏相应的全部删除功能,限于时间的原因未能增加。3、在对学生信息处理上,功能较少,缺乏最高分最低分的统计以

15、及对于程序的排序。4、在统计功能的程序设计上,在选择完成一种统计操作后,程序即回到主菜单而不能回到统计界面继续进行统计操作,此不足之处未能改善。 当然通过对大作业的撰写,打字水平也有了较大的提高。总之,完成大作业,无论是思想上、能力上还是知识上都有了较大的飞跃,各方面都受益匪浅。4 附件(源程序)#include #include #include struct student long num; char name80; double score3; struct student *next;struct student *head; /定义全局变量head,各个函数中均可用#define

16、LEN sizeof(struct student)struct student *stu;void printfmenu() /将菜单列出函数 printf(tttt0.显示n); printf(tttt1.排序n); printf(tttt2.插入n); printf(tttt3.查找n); printf(tttt4.删除n); printf(tttt5.统计n); printf(tttt6.存盘n); printf(tttt7.读入n); printf(tttt8.结束n);void printfform() /用于每次将链表列出 struct student *p; printf(t学

17、号t姓名t数学成绩t英语成绩t计算机成绩n); p=head; if(head!=NULL) do printf(t%ldt%s t%.2f t%.2f t%.2fn,p-num,p-name,p-score0,p-score1,p-score2); p=p-next; while(p!=NULL); else return;void create() /创建三人构成的初始表 int i=0,j,k; struct student *p1,*p2; char name1380; long num13; double score133; head=p1=p2=(struct student *)

18、malloc(LEN); printf(请输入3个所要处理的学生信息,包括学号、姓名,英语、数学、计算机的成绩n); /赋予三个学生的信息 for(k=0;k3;k+) scanf(%ld%s,&num1k,name1k); for(j=0;j3;j+) scanf(%lf,&score1kj); while(inext=p1; p1-num=num1i; strcpy(p1-name,name1i); for(j=0;jscorej=score1ij; p2=p1; if(i=2) p1-next=NULL; /链表结束 else p1=(struct student *)malloc(LE

19、N); /开辟一个新的单元 i+; void arrange() /排序函数 void printfform(); struct student *p1,*p2,*p3; long s3; p2=p1=head;int i,j,t,k; for(i=0;inum; p1=p1-next; for(i=0;i3;i+) k=i; for(j=i+1;jsj)k=j; if(k!=i) t=sk; sk=si; si=t; for(i=0;inum!=si&p2!=NULL) p2=p2-next; pi=p2; p2=head; head=p0;p0-next=p1;p1-next=p2;p2-

20、next=NULL; printfform(); void insert() /插入函数 struct student *p0,*p1,*p2; char t; printf(温馨提示:需要进行排序后才可进行插入,输入9返回主菜单,按回车键继续n); t=getchar(); if(t=9) return; printf(请输入要插入的学号,姓名,数学成绩,英语成绩,计算机成绩n); stu=(struct student *)malloc(LEN); scanf(%ld%s%lf%lf%lf,&stu-num,stu-name,&stu-score0,&stu-score1,&stu-sco

21、re2); p0=stu; /p0指向要插入的节点 p1=head; /p1指向首节点 while(p0-nump1-num)&(p1-next!=NULL) /找插入位置 p2=p1; p1=p1-next; if(p0-numnum) if(head=p1) /插入到第一个节点前 head=p0; else p2-next=p0; p0-next=p1; else /插入到最后一个节点后 p1-next=p0; p0-next=NULL; printfform(); /显示链表void find() /查找函数 struct student *p1; long num1; p1=head;

22、 printf(请输入要查找的学号); scanf(%ld,&num1); while(p1!=NULL) if(p1-num=num1) printf(t学号t姓名t数学成绩t英语成绩t计算机成绩n); printf(t%ldt%s t%.2f t%.2f t%.2fn,p1-num,p1-name,p1-score0,p1-score1,p1-score2); break; p1=p1-next; if(p1=NULL) printf(未找到);void delet() /删除指定学号的函数 long num; struct student *p1,*p2; p1=head; printf

23、(请输入要删的学生的学号); scanf(%d,&num); while(num!=p1-num&p1-next!=NULL) /p1指向的不是所要的节点,并且后面还有节点 p2=p1; p1=p1-next; if(num=p1-num) /找到了 if(p1=head) /对首节点特殊处理 head=p1-next; else p2-next=p1-next; printfform(); else printf(学号为%ld的同学未找到n,num);void studentcount() /按学生统计函数 double aver,zong; struct student *p1; long

24、 num; printf(请输入学号); scanf(%ld,&num); p1=head; while(p1!=NULL) if(p1-num=num) zong=p1-score0+p1-score1+p1-score2; aver=zong/3; printf(学号为%ld的总分=%.2f,平均分=%.2f,p1-num,zong,aver); break; p1=p1-next; if(p1=NULL) printf(未找到);void subjectcount() /按科目统计函数 double aver,zong=0; struct student *p1; int i,n=0;

25、printf(t请选择科目(13); printf(t1.数学); printf(t2.英语); printf(t3.计算机); scanf(%d,&i); p1=head; while(p1!=NULL) zong=zong+p1-scorei-1; n+; p1=p1-next; aver=zong/n; printf(该科目的总分=%.2f,平均分=%.2f,zong,aver);void count() /统计函数 int t; printf(tt1.求学生总分平均分ntt2.求科目总分平均分n); printf(请输入); scanf(%d,&t); switch(t) case 1

26、:studentcount();break; case 2:subjectcount();break; void save() /存盘函数 FILE *fp; struct student *p1; p1=head; if(fp=fopen(score.dat,wb)=NULL) /不能打开时 printf(Cannot open file); exit(1); while(p1!=NULL) fwrite(p1,LEN,1,fp); p1=p1-next; fclose(fp); printf(已存到c:/score.dat);void read() /读入函数 FILE *fp; stru

27、ct student *p1,*p2; char filename80; p1=p2=(struct student *)malloc(LEN); printf(请输入要进行管理的文件名字:); scanf(%s,filename); if(fp=fopen(score.dat,rb)=NULL) /不能打开时 printf(Cannot open file); return; fread(p1,LEN,1,fp); /将文件的信息读给结构体 head=NULL; while(!feof(fp) /创建内容为文件内容的链表 if(head=NULL) head=p1; else p2-next=p1; p2=p1; p1=(struct student *)malloc(LEN); fread(p1,LEN,1,fp); p2-next=NULL; printf(现在您可对%s进行操作了,filename);void menu(char t) /选择菜单函数 switch(t) case 0:printfform();break; case 1:arrange();break; case 2:insert();break; case 3:find();break; case 4:delet();break; case 5:cou

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1