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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

C语言实训报告之学籍管理系统.docx

1、C语言实训报告之学籍管理系统北京联合大学实训报告课程名称: C语言程序设计课 项目名称: 学籍管理系统 学 院: 自动化学院 专 业 信息处理与智能技术 姓 名: 杜旭亮 陶晓申 付娟 学 号:_指导教师: 李论 成 绩: 2011年6月 19 日 一、实训题目与要求1. 问题提出为了分析教学成果并进行相应的学籍处理,各学校每到期末都对综合成绩进行分类统计、上报成绩汇总结果等,这给每位教师和学籍管理人员带来很大的工作量。使用学籍管理系统可以减少工作者的工作负担。 2.功能要求循环显示如图(a)所示的主菜单。请输入选项编号(04) 请输入选项编号(04) 请输入选项编号(04)1-录入成绩 1-

2、按学号排序 1-生成并打印补考通知单2-统计成绩 2-按平均分排序 2生成并打印退学名单3-处理学籍 3统计各分数段人数 3生成并打印新名单4-创新功能 4-返回 4-返回0-退出系统 0-退出系统 0-退出系统 (a) (b) (c)在主菜单中选择1:录入成绩。假设某班的原始成绩单如下: 学号 姓名 高数 英语 编程 电路 法律03 zhanghe 89 92 88 79 9713 wangpei 72 86 94 83 7723 lifeng 91 84 90 79 83。其中,原始数据的排列时无序的。系统应能够保留原始成绩单。在主菜单选择2:进入图(b)子菜单并统计成绩。在此可以计算平均

3、成绩,统计各分数段人数,按学号排序,按平均分排序。在子菜单选择1时,将该班学生的成绩单按学号生序排列后存放在“按学号排序.txt.”文件中。在子菜单选择2时,将该班学生的成绩单按平均分降序排序后存放在“按平均分排序.txt”文件中。在子菜单选择3时,统计各分数段人数,并如表12.1所示的形式输出。在子菜单选择4时,返回主菜单,选择0时,退出系统。表12.1:各门课、各分数段人数统计90分以上8089分7079分6069分60分以下高数英语编程电路法律在主菜单选择3:进入如图(c)所示的子菜单,并处理学籍。为不及格的同学打印补考通知单时,应在通知单上写明补考的科目,时间,地点(键盘输入)。为了参

4、加多门科目补考的学生,应避免时间重复。为3门以上不及格的学生打印退学通知单,通知单上应打明学生的学号,姓名,退学原因(几门课不及格,成绩是多少)。删除已退学的学生,将该班中升入高年级的学生信息写入文件“升学名单.txt”中。在子菜单选择4,返回主菜单,选择0,退出系统。在主菜单选择4,此功能学生自由发挥,根据本组爱好增加与本题目相关的新功能。在主菜单选择0,显示结束信息,退出系统。3.任务分工组长:杜旭亮。负责小组程序的输入和创新部分,分配任务,使工作衔接有序。将各部分文件衔接,查找错误,排版论文。组员:陶晓申 负责小组程序的处理学籍的部分。主要负责绘制流程图,检查流程的连续,可操作性。组员:

5、付娟负责小组程序的成绩统计的部分。完成自己部分的编程,流程图,组织论文的创作,主要负责论文部分。二、设计实训题目功能.总体设计程序通过主模块调用其他函数来实现各种要求实现的功能。显示主菜单模块通过调用myprint函数显示主菜单,提示使用的用户改执行的操作,实现基本的人机对话。 创建“学生基本信息.txt”文件由调用scoreInput函数通过键盘输入学生的信息。 统计学生信息调用函数scoreStat,并通过子菜单的选择实现功能。 处理学籍功能调用函数studentStatus,通过子菜单的选择实现处理学籍的功能。 创新功能由调用函数mynew,自己编写的新功能由这部分实现。void mai

6、nprint(); /*主输出部分*/void scoreprint(); /*成绩录入*/void scoreStat(); /*统计成绩*/void studentStatus(); /*学籍处理*/void bukao(); /*生成并打印补考通知单*/void tuixue(); /*生成并打印退学通知单*/void xinmingdan(); /*生成并打印新名单*/void sortAnhao(); /*按学号排序*/void jisuanPingjun(); /*计算平均分并排序*/void tongjiFenshu(); /*统计分数段*/void fenxi(); /*分析学

7、生成绩,算出不及格门数*/void mynew(); /*创新功能*/void outstudent(); /*输出单个学生信息*/void outdanke(); /*输出单科成绩*/void teshutuixue(); /*非考试退学*/图2.1.1:主模块图(1)菜单的设计主函数的作用主要是调用myprint函数显示主界面,由于菜单比较简单所以采用printf函数将菜单项注意打印在屏幕上,边框则采用printf输出|-拼接起来实现人机对话的第一步.然后通过读取用户的输入,调用switch函数对用户的输入进行进一步的处理,并使用do-while函数实现用户的选择性的重复操作。我们为用户提

8、供了一个正常的出口,我们采用人机对话的形式,用户选择某一菜单以后,程序完成对于的功能,然后询问用户是否继续选择,用户即可退出也可以继续输入,而且主菜单0选项也可正常退出图2.1.2 总体设计流程图算法设计1 ,分析录入成绩模块算法:创建一个文件“学生基本信息.txt”,并把从键盘输入的数据(学号、姓名、成绩)存放在该文件中;每写入一组记录,文件记录数增1。建立录入成绩模块的流程图如下图所示。 采用先输入一组信息,应用scanf输入能有效阻止函数判断值的位置占用,采用while利用输入的信息都是非“#“,用“#”作为信息结束的判断语言。如果没有输入“#”,则继续,并且i+。 图2.1.3: 输入

9、流程图2.分析成绩统计的算法:成绩统计分为三大项和退出部分,按学号正向排序,按平均成绩逆向排序,打印各个分数段的人数。利用switch方法使分支明确化。2.1分析按学号排序模块的算法:双重循环排序。从学生基本信息.txt中读取信息,进行比较,假设第一个学生的学号是最小的,和之后的所有人进行比较,如果有比他学号还小的,将两个进行对调。图2.2.1:按学号排序流程图2.2,按平均成绩排序:先算每个人的平均成绩,存放,调用,双重循环排序;利用新定义的数组将成绩平均计算,依次排序,将学生成绩按平均成绩按降序排序 。2.3,统计各分数段人数并打印:定义二维数组,将各科成绩转化成5个空间的成绩数组,双重循

10、环,将各个成绩段的人数各次相加,得到最后结果;(如下图)3.学籍处理:此处分三部分和退出功能;打印补考学生名单;退学名单;升学名单;3.1,打印补考学生名单:由于不考需要考试场地,时间,而且互相不能重复,所以将考试科目,时间,地点都定义为二维字符串,方便输入和计算;补考学生要求是有一到三门科目不及格,所以要先判断,后计算是否补考;图2.3.1:生成并打印补考学生名单补考的时间,地点都需要用键盘输入,在这儿我们采用了将科目名称字符串化,使其在对应的补考时间,地点能统一,时间地点的输入采用逐次输入,依次对比形势,如果发现有时间相冲突的补考科目,采用重新输入后一个补考科目时间地点的形式。3.2,打印

11、退学名单:但不及格科目达到四门的时候,不参加补考,而是会被退学;由于升学名单和退学名单相互补充,所以我们在处理这方面时,采用先将文件读出,打印新名单时直接读出文件内容形式。3.3,升学名单:升学名单由非退学人员升入,故而此部分在退学名单中有所显示;打印新名单,将退学名单中的人删除,将后面的学生提前,覆盖原来学生的信息。图2.3.3生成新名单4.创新功能:此部分为自由发挥部分,我们组的创新功能具有较强的针对性:查询某学生信息;查询单科成绩;非考试不及格退学的学生;此部分依旧采用switch语言进入,选择具有多向性,显示更能清晰。图2.4.0:创新功能主流程图4.1,查询学生信息:此为学生查询部分

12、。输入自己的姓名就可以看到自己的情况;图2.4.1:查询单个学生成绩4.2,查询单科成绩:科目老师输入自己所教的科目,查考学生的情况;图2.4.2:查询单科成绩4.3,非不及格退学学生:因故不能继续上学的学生办理退学手续后班级清除其信息;图2.4.3:非考试原因退学学生结构体说明在程序中为了实现学生信息的链接统一,我们定义了结构体学生信息,通过结构体的调用实现信息的统一处理。struct student char num13; /*学生学号*/ char name18; /*学生姓名*/ float math; /*数学成绩*/ float english; /*英语成绩*/ float cp

13、rogram; /*c程序成绩*/ float circuit; /*电路设计成绩*/ float law; /*法律基础成绩*/ float pingjun; /*平均成绩*/ float score5; /*定义五科成绩数组*/;程序代码设计以补考函数为例讲解:void bukao() int i=0,j=0,count=0,n=0; char time510=,site515=,sbj510=高数,英语,c语言编程,电路设计,法律基础; 定义循环变量i,j并将其清零,定义参数常量count,n控制循环次数;定义二维字符串使输入的各科补考情况能进入循环。 struct student ex

14、3N=0; 定义结构体数组存放学生信息。 FILE *fp=NULL; 定义文件指针指向文件。 system(color 2f); 给运行窗口加色。 fp=fopen(d:学生基本信息.txt,r); 打开之前输入的学生信息。 if(fp=NULL) printf(n 打开文件失败!n); return; 如果没有指向,则显示文件无法打开。 printf(n 欢迎进入生成并打印补考通知单系统!n); while(feof(fp)=0) 打开文件将文件中的内容读出。 fscanf(fp,%3d%15s%16s%f%f%f%f%fn,&i,ex3i.num,ex3i.name,&ex3i.scor

15、e0,&ex3i.score1,&ex3i.score2,&ex3i.score3,&ex3i.score4); i+; n+; 以数组形式读取文件便于循环。 fclose(fp); 关闭文件。 for(i=0;i5;i+) 依次输入补考时间地点,循环比较,如果有冲突,重新输入。 printf(n请输入%s的补考时间、地点:,sbji); scanf(%s%s,&timej,&sitej); for(i=0;i4;i+) for(j=i+1;j5;j+) while(strcmp(timei,timej)=0&strcmp(sitei,sitej)=0) printf(nn%s科目与%s科目相

16、冲突,请重新输%s的考试时间、地点:,sbji,sbjj,sbjj); scanf(%s%s,&timej,&sitej); for(i=0;in;i+) 调用学生信息,统计学生不及格科目数。 for(j=0;j5;j+) if(ex3i.scorej0&count3) 符合补考条件,进入补考打印部分。 printf(nn); printf(n%15s学生%d门课不及格,补考科目、时间、地点:,ex3i.name,count); for(j=0;j5;j+) if(ex3i.scorej60) switch(j) 定义二维字符串将科目数组化,使之循环。找到对应科目,输出学生考试信息,补考信息。

17、 case 0:printf(n高数:%3.1f, 时间%s, 地点%s,ex3i.scorej,timej,sitej);break; case 1:printf(n英语:%3.1f, 时间%s, 地点%s,ex3i.scorej,timej,sitej);break; case 2:printf(nc语言编程:%3.1f,时间%s, 地点%s,ex3i.scorej,timej,sitej);break; case 3:printf(n电路设计:%3.1f, 时间%s, 地点%s,ex3i.scorej,timej,sitej);break; case 4:printf(n法律基础:%3.

18、1f, 时间%s, 地点%s,ex3i.scorej,timej,sitej);break; 程序结束。此外,有几个特别的语言需要说明:do mainprint(); printf( ); choose=getche( ); switch(choose) case1:scoreInput();break; /*成绩录入*/ case2:scoreStat();break; case3:studentStatus();break; case4:mynew();break; case0:break; default:printf(n %c是非法选项!n); break; if(choose=0)

19、break; printf(n 即将进入主菜单,要继续选择吗(Y/N)?n); do yes_no=getche( ); while(yes_no!=Y&yes_no!=y&yes_no!=N&yes_no!=n); while(yes_no=y|yes_no=Y); 使用该语句来实现在用户输入选择项后,程序判断后进入对应模块,并相应的调用模块使用的函数进行运算,并使用break在调用完函数后退出switch语句。然后询问用户是否继续操作,使用do-while语句来确认用户的输入的合法性,并使用使用getch语句来读取,然后使用外层的do-while判断是否退出循环;而myprint函数简单使

20、用了printf语句来显现将主菜单打印在屏幕上的功能。for(i=0;in-1;i+) for(j=i+1;j0) temp=ex2i; ex2i=ex2j; ex2j=temp; 进行排序时,我们需要先将最开始的学生当成学号最小的学生,用后面的学习生的学号和他的进行对比,如果后面某个学生的学号筱宇第一个学生的学号,将这个学生的所有性能系和第一个学生对调,那么这个学生的信息就放在了第一位,如果后面还有这样的情况,将他们的位置对调。循环完后面所有的学生后就确定了第一位的学生是学号最小的。然后进行第二个排序,也是和后面的所有学生进行对比,有符合情况的,交换位置。一次进行到倒数第二个,最后一个就不用

21、比较了,他就是最大的。而这部分的模式也是按平均分排序的主要模式。for(j=0;j5;j+) for(i=0;i100|listij0) e+; else t=(int)listij/10; switch(t) case 10:aj0+;break; case 9:aj0+;break; case 8:aj1+;break; case 7:aj2+;break; case 6:aj3+;break; default:aj4+;break; 这部分是各科目各分数段人数统计,我们采用单科学生循环模式,aj中j所代表的科目名称,我们只选取0100分的人员进行操作,在实际输入的过程中可能会有输入的错误

22、,我们将不在分数段的人不纳入统计范围,并且报错,除以10可以帮助我们选择相对应的分数段进行人数的相加。 for(i=0;i5;i+) printf(n请输入%s的补考时间、地点:,sbji); scanf(%s%s,&timej,&sitej); for(i=0;i4;i+) for(j=i+1;j5;j+) while(strcmp(timei,timej)=0&strcmp(sitei,sitej)=0) printf(nn%s科目与%s科目相冲突,请重新输%s的考试时间、地点:,sbji,sbjj,sbjj); scanf(%s%s,&timej,&sitej); 补考的考试时间和地点键

23、盘输入,想将所有的补考信息输入,然后进行比较,依次使每一科的信息都和其他的相对比,选出时间相互冲突的,再次输入,直至所有的时间都不相冲。printf(n请输入要查学的学生的姓名:); scanf(%s,&ch); for(i=0;in;i+) if(strcmp(ex4i.name,ch)=0) printf(n 您查询的是学号为%s的学生,他的成绩如下:,ex4i.num); printf(n 高数:%-7.1f,英语:%-7.1f,c语言编程:%-7.1f,电路设计:%-7.1f,法律基础:%-7.1fn,ex4i.score0,ex4i.score1,ex4i.score2,ex4i.s

24、core3,ex4i.score4); break; if(i=n)printf(n 查无此人.n);查询单个学生信息,输入学生的姓名,查找,如果有符合的学生,将他的信息输出且结束循环体,如果没有,即自动断出,那么查询所代表的i=n,这样,我们就判断出这个学生的信息不存在。完整程序请参见附录A 测试与调试测试数据类型测试数据预期结果实测结果合法数据在主菜单中输入1进入录入同学学籍菜单进入录入同学学籍菜单在创建同学学籍输入信息在”d盘学生基本信息.txt”文件存入同学信息d盘学生基本信息.txt文件有同学信息非法数据在主菜单中输入“a”输出“a为非法选项”输出“a为非法选项”在每次完成一项是弹出

25、“是否继续(Y/N)?”输入y没有反应没有反应图2.5.1 开始状态图2.5.2 输入1之后图2.5.3 输入a之后三个人总结杜旭亮的个人小结两周的实训结束了,对于这次C语言实训,我非常重视,这次实训我们编辑的程序不再是简单的模块,而是具有一定应用性的学籍管理系统。我们分到这个系统时认为这个系统程序调用函数少,可能是这次实训中最简单的,但是在实训开始后我们就发现,调用函数少,但是做的工作却是最多的。没有过多的说明,没有这方面的经验,我们在刚开始的时候做的非常辛苦,第一,二天基本没有什么收获。于是我们就进行严格的分工,将大片的信息处理成一个一个的模块。在此次编程中,我负责的是开始的输入部分和最后

26、的创新部分,这来那个部分都是比较简单的,但是如果用之前我的习惯,这段程序不仅繁杂而且可行性不高,我开始参考其他程序的输入部分,并找到了实用性较高的一个程序模板,并据此编写自己的程序。在编辑运行方面,我发现好多知识的欠缺,最后我负责将程序汇总调整的时候,有许多程序语言需要翻书才能看明白,在调试环节我发现好多错误,有粗心导致的丢符号,有逻辑小问题,这都导致运行结果不符合要求,常常一整篇程序,就因为一个小小的错误而得不到实现,在不断的找寻错误解决错误的过程中,锻炼了我的耐心和毅力,更让我不懈坚持着。在这里,我还要特别感谢我的指导老师,他总能在我对编程感到迷茫的时候鼓励我,让我不要着急,慢慢来,总会变

27、好的。每天他都在为学生们服务,非常辛苦,谢谢!两周的实训就要结束了,这两周里,我学到了很多东西,c语言的实训室是束了,但我的学习不会结束,这次试训让我认识到了我们的生活中的很多东西都应用了程序,我将继续我的学习,编写有用的程序。陶晓申的个人小结在这两个星期里,我们在老师的带领下进行了C语言程序实践.在这之前我们已经对这门课程学习了一个学期.但是很多东西都只是停留在了解和书面的知识上.虽然老师会给我们很多的实践机会,.但像这次我们可以合作完成一个完整的程序还是第一次.我作为其中的参与者.感触颇多. 在这次的实训中,我对C语言有了一个更深的了解和认识,也对这个学期学到的知识得到了巩固.每次运行程序

28、成功,拿下一个模块的时候,就很兴奋.让我对下面的编辑就更加充满了信心.通过合作,最终把最初学到的理论知识转化为基本技能.虽然只是很小的一个项目.但每天我们组都来的很早,大家一起学习.取长补短.我们很好的再实践中增长知识,提高我们的学习热情.尤其是在这次实训中,组长给了我很大的帮助.每次有问题他都会细心教我.让我弄明白了很多曾经不懂得东西. 在实训中,让我对C语言的热情进一步提高.而且让我深刻的认识到.很多时候,往往是细节决定成败,因为不管程序的语句是有多少,但只要是有一条语句或者语法不正确,就不能使程序得到所需要的结果付娟的个人总结为期两周的C语言的实训即将结束了,我们组制作的学籍管理系统也及时的完成。对于这次C语言实训,我对此非常重视,因为通过实训不仅仅是对所学知识的验证,也是对团队合作,处理好同学关系的锻炼,为毕业后更好的融入社会做准备。这两周的时间,我们

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

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