




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中南大学C语言程序设计实践报告题目学生成绩管理系统学生姓名木雕小象指导教师×××学院信息科学与工程学院专业班级电气0900班完成时间2010年7月8日系统描述………功能模块结构……数据结构设计……主要模块的算法说明………………运行结果……………课程设计总结………附录(源代码)……一、系统描述学生成绩管理系统对日常学生的基本成绩信息进行管理,能实现对学生多种信息的存储,可以对多种数据进行各种各样的操作。管理系统首先能实现数据的输入。学生的各种信息(比如:班级,学号,姓名,性别,年龄,选修课程编号,名称,考试成绩,平时成绩,综合成绩)能正确的输入,从而可以进行处理。待所有学生信息输入以后,如果发现输入有误或者需要修改一些学生的信息,可以利用修改函数进行修改,并且可以修改任意需要修改的信息。同时当学生管理系统需要进行学生的添加时(比如:新生转学时),利用添加函数能及时的补充所需要的信息。当所需的学生信息正确而完整的输入后,该信息系统可以进行信息的查询(本系统可按学生姓名和学号查询),当输入正确的查询信息后,该管理系统可以显示出该生的所有信息。当输入信息不正确时,系统会提示错误,并允许重新输入。此系统同时可以进行信息的删除,当有学生退学或休学时,利用删除函数可以删除特定的学生信息,从而减少冗余的信息。该系统可以显示输入的所有信息。利用该系统可以同时计算每个同学的平均成绩,并对所有的学生按平均成绩高低进行排序,同时输出排序后的成绩表。此系统同时还可以列出不及格学生的学号,姓名,课程和成绩,便于进行统一的管理。二、功能模块结构该系统的模块设计清晰,各模块的算法简单,高效,整个系统由主函数调用各个模块而组成。可以把函数分为数据录入模块,数据修改模块,数据添加模块,数据查询模块(可分文姓名和学号查询),数据删除模块,数据统计模块(成绩显示模块,成绩计算及排序模块,成绩分类模块),文件保存模块共七大模块,其中主函数中包含界面模块主要模块的结构图如下:主控函数主控函数数据录入数据修改数据统计退出系统数据删除数据查询数据添加姓名查询学号查询全部显示平均分不及格模块功能描述主控模版:主控模版是整个系统的模块交汇点,使用者使用系统时先进入主控模版,通过主控模版可以调用任意的模块,达到预期的功能。数据录入模块:该模块可以实现学生多种数据的录入,录入的信息储存在数组中,其他模块能够调用。数据模块修改:该模块可以实现数据的修改。当输入修改的学生信息时,模块会自动找寻,未找到则显示不存在,若找到则进入下级列表,操作者可以根据界面标号进行任意的修改数据添加模块:该模块将学生的信息完整的存入一个结构体数组中,其他模块可以调用。数据模块查询:该模块可以对信息进行检索,挑选出符合要求的信息,并显示列表,如果没有搜索的信息,则显示未找到。(1)按姓名查询(2)按学号查询数据删除模块:该模块可以删除任意指定学生的信息,模块首先会提醒操作者输入特定的学号,数据输入后进行搜寻,若无此学生的信息,则显示不能找到,若找到此生信息,则显示删除成功。数据统计模块(1)成绩显示模块:输入选择号后,该模块可以显示已经输入系统的学生信息。(2)成绩计算及排序模块:该模块可以利用平均成绩函数计算每位学生的平均成绩,并按学生平均成绩的高低进行排序,然后将学生姓名列表显示。(3)成绩分类模块:该模块可以查找系统中不及格学生的信息,然后将该生的学号,姓名,不及格科目及分数显示出来。8、退出系统模块三、数据结构设计学生成绩管理系统在使用中用到了众多的数据,数据多,数据类型复杂,给数据的管理和使用带来了很大的麻烦。所以我使用了数组来存放数据。定义了结构体来存放学生的各种类型的数据,使存放更合理,便于管理。为避免学生基本信息结构体stu太长,嵌套定义了一个选修课程结构体coursestructcourse{课程编号整型intnum;课程名字符串charname[10];考试成绩浮点型floatscore;平时成绩浮点型floatusual;综合成绩浮点型floatintegral;};structstu{专业班级整型intclass;学生编号整型intnum;学生姓名字符串charname[10];性别字符串charsex[2];年龄整型intage;嵌套定义课程信息structcoursecourse[2];平均成绩浮点型floatavescore;}程序后面的模块都会要用到以上结构体的信息,控制好循环结构,能随时调用结构体中的信息。四:数据模块结构说明本系统的功能都是由主函数调用各个模块来实现,每个模块都是一个特定的自定义函数,能分别实现不同的功能。采用的思想也就是“化整为零”,将一个问题分解为一个个的小问题,各自来攻破。下面将分写介绍每个模块的实现过程及功能。在最开始,定义了一个全局变量m,m是结构体数组stu的有效长度,能够对后面的插入,删除等范围进行控制。voidmenu()改函数为主控函数,起到功能菜单的作用,每个功能从这个界面选择,实现功能后返回改界面,进而选择其他功能。voidinput();此函数实现最开始数据的输入功能。在屏幕的提示下,操作者能输入相应学生的信息,采用的是双重循环:外层循环for(i=0;i<m-1;i++)来控制学生的个数,输入基本信息;内循环for(j=0,sum=0;j<COURSENUM;j++)控制课程门数,此处COURSENUM是一个宏定义,指的是课程门数,能相应的输入学生的选修课程信息。stu[i].course[j].integral=stu[i].course[j].usual*0.3+stu[i].course[j].score*0.7,此式为综合成绩的计算表达式,当integral<60时,为“Y”(由条件语句if来判断实现)。平均分也在此模块求:总分sum为各科的综合成绩之和,除以课程数,就是平均分。voidmodify();此函数实现修改功能。在屏幕提示下,操作者可选择修改基本信息或课程信息,接着输入相关的信息。修改成功会提示,否则显示“无学生信息”。voidinsert()此函数实现插入功能。在屏幕提示下,操作者输入要增加的学生信息,此时,信息被放在数组元素stu[m]中(即最后一个,m为全局变量)。插完一个人之后,m自增,屏幕会显示“插入成功”,还会询问操作者“继续添加吗?”此处定义了一个字符型变量ch,当ch为Y或y时,继续输入,当ch为其他字符时,停止添加。5.voidsearch()此函数实现查询功能。定义了一个字符串数组来存放输入的学生姓名。操作者在屏幕提示下输入要查询的名字或学号,本模块采用了字符串比较函数,当输入的字符串(名字或学号)与程序中的相同时,输出该生的所有信息(包括基本信息,选修信息),由for循环控制。此处采用了查询标志p:当查询正确时,p被赋值为1,显示信息;当没有查询信息时,p被赋值为0,在if语句控制下,显示“无学生信息”。由for语句控制循环。6.voiddelete()此函数实现删除功能。定义了字符串变量name[15],删除标志p。运用了字符串比较函数,当输入的字符串name与数据中的名字相同时,删除分两种情况:被删除的学生不是最后一个。由for语句控制循环,运用了字符串比较函数,当输入的姓名存在时,从此学生开始,将后面的数组元素依次赋值给前面的数组元素(即覆盖掉),实现了删除的功能。同时,全局变量m会自减,p被赋值为1,显示“删除成功”。被删除的学生是最后一个时,直接m自减,在后面的输出函数output()的for(i=0;i<m-1;i++)语句中,m已经减1了,于是不输出最后一名同学的信息,没有实现物理内存上的删除,但实现了删除的功能。此时,p被赋值为1,显示“删除成功”。当输入的字符串name找不到相匹配的名字时,p被赋值为0,显示“没有学生档案”。7.voidtongji()(1)voidoutput()此函数实现输出功能。由printf函数将一系列的表格框架、表头及相关的信息输出,for(i=0;i<m-1;i++)语句控制基本信息循环。当前面插入了学生信息时,m自增,此时,输出函数会将加入的学生信息显示出来;当删除了某生的信息时,m自减,此时,输出函数不会显示被删学生信息。两个for语句控制课程信息的循环,输出对应学生的课程信息。(2)voidaverage()在前面输入函数input()中已经计算过平均分,此处实现输出平均分的功能,并按平均分的高低实现从高到低的排序输出。运用选择法排序,定义了中间结构体变量temp,for(i=0;i<m-1;i++)控制外层循环(排序的趟数),for(j=i+1;j<=m-1;j++)控制内层循环(某趟中排序的次数)。当stu[i].avescore<stu[j].avescore时,运用中间变量,将二者的信息交换,以实现高分在前,低分“沉”到最后。在外层循环中,输出学生姓名,实现从高到低的排序。(3)voidunpassed()此函数实现输出不及格学生信息的功能。由if语句判断,当stu[i].course[j].integral<60(综合分小于60)时,在for语句控制下,输出相关信息(包括学生姓名,课程名称,综合分数),便于对学生进行安排。8.voidanykey();此函数实现缓冲的功能,为操作者提供时间进行其他操作。当某个模块运行完之后,屏幕显示“按任意键继续”,按键之后,回到操作界面可以进行其他操作。主函数main()说明主模块:首先输入一个数字进入主菜单。包括输入信息,修改信息,插入信息,查询信息,删除信息,信息统计(全部输出,平均成绩信息及排序,不及格名单),退出。在屏幕提示下,选择一个数字,实现相应的功能,实现之后,按任意键又回到主菜单,来实现下一个功能。直到按退出键“7”退出界面。此处由一个switch语句及它的多个case语句来完成,每个case语句中调用各个不同的数据模块,调用结束后,由break函数跳出,返回主菜单,继续执行下一个任务。主菜单:一个选择表格输出来,末行会提示输入相应的数字。以进入相应的模块录入模块:调用input()函数,输入信息。修改模块:调用modify()函数,修改信息。插入模块:调用insert()函数,插入信息。查找模块:调用search()函数,查找信息。删除模块:调用delete()函数,删除信息。统计模块:全部输出output()函数,输出全部学生信息;平均分模块调用average()函数,输出平均分信息及按平均分排序;输出不及格名单unpassed()函数,输出综合分<60的名单。退出系统。五、运行结果1、主界面×××2、选择数据输入3、修改数据界面,可分别修改学生基本信息和课程信息4、插入数据,可添加新的信息5、数据查询界面(1)下面是按姓名查询结果6、数据删除7、数据统计(1)显示全部数据(2)计算平均成绩并排序
(3)输出不及格名单六、课程设计总结两个星期的计算机实践终于圆满的完成了。能够完整的将自己编的程序运行一遍,这是一件多么美妙的事情!从对C语言浅显的认识到更深刻的体会,这是一个从量变到质变的过程。每一个人都会有很大的进步。说远比动手容易!这是我最深的体验。刚拿到题目,觉得没什么大不了,不就是定义几个函数,在主函数中运用一个switch语句,然后再调用嘛。随便的想了一想,也没太在意。之后的上机过程真的是给我泼了冷水,把我浇醒。一系列的变量定义,函数定义,输入输出,将我理想中的简单程序变得越来越复杂……不是把数据类型弄错,就是漏了什么东西,或者又打错了什么,反正十次中有九次不能运行,还有一次运行结果不对。编程序很需要耐心,各个细节都很重要,一个小错误将会导致整个系统的错误。最更要命的是,我偷了一下懒,只给每位学生安排了一门课程,所以在这个地方,思路就错了。综合分变成了自己输入,而不是按百分比计算,每个人的平均分也没有。还好问的及时,老师指出了错误,不至于错误继续延续下去,很值得庆幸。对课本上的知识不熟悉也导致了我编程进度缓慢。考试只是让我把知识进行简单的记忆,并没有真正转变成自己的,而这次的编译程序过程做到了,经历之后,我还可以很熟练的写出语句,很快的检查出一些简单的错误。这次的实践,我很有收获!七、源程序代码#include<stdio.h>#include"stdlib.h"#defineCOURSENUM2/*宏定义课程数目*/voidmenu();voidinput();voiddelet();voidinsert();voidmodify();voidsearch();voidtongji();voidoutput();voidaverage();voidunpassed();voidanykey();staticintm=3;/*全局变量*/structcourse/*定义课程结构体*/{intnum;charname[10];floatcredit;floatscore;floatusual;floatintegral;};structstu/*定义学生结构体*/{intclass;intnum;charname[10];charsex[2];intage;structcoursecourse[2];floatavescore;}stu[50];voidinput()/*输入函数*/{inti,j,sum;for(i=0;i<m;i++){printf("请输入学生基本信息:\n");printf("班级:\n");scanf("%d",&stu[i].class);printf("学号:\n");scanf("%d",&stu[i].num);printf("姓名:\n");scanf("%s",stu[i].name);printf("性别:\n");scanf("%s",&stu[i].sex);printf("年龄:\n");scanf("%d",&stu[i].age);printf("请输入课程基本信息:\n");for(j=0,sum=0;j<COURSENUM;j++){printf("课程编号:\n");scanf("%d",&stu[i].course[j].num);printf("课程名称:\n");scanf("%s",stu[i].course[j].name);printf("学分:\n");scanf("%f",&stu[i].course[j].credit);printf("考试成绩:\n");scanf("%f",&stu[i].course[j].score);printf("平时成绩:\n");scanf("%f",&stu[i].course[j].usual);stu[i].course[j].integral=stu[i].course[j].usual*0.3+stu[i].course[j].score*0.7;/*计算综合分*/sum=sum+stu[i].course[j].integral;}stu[i].avescore=sum/COURSENUM;/*求平均成绩*/}anykey();}voidmodify()/*数据修改函数*/{inti,j,q,p=0,sum;charname[15];printf("---------------------------------------\n");printf("|1.修改基本信息:|\n");printf("|2.修改课程信息:|\n");printf("---------------------------------------\n");scanf("%d",&q);switch(q)/*选择项目*/{case1:printf("输入被修改者姓名:\n");scanf("%s",name);printf("请输入学生基本信息:\n");for(i=0;i<m;i++){if(strcmp(stu[i].name,name)==0){printf("班级:\n");scanf("%d",&stu[i].class);printf("学号:\n");scanf("%d",&stu[i].num);printf("姓名:\n");scanf("%s",stu[i].name);printf("性别:\n");scanf("%s",stu[i].sex);printf("年龄:\n");scanf("%d",&stu[i].age);printf("修改成功\n");p=1;}}if(p==0)printf("不存在");break;case2:printf("输入被修改者姓名:\n");scanf("%s",name);for(i=0;i<m;i++){if(strcmp(stu[i].name,name)==0){printf("请输入课程基本信息:\n");for(j=0,sum=0;j<COURSENUM;j++){printf("课程编号:\n");scanf("%d",&stu[i].course[j].num);printf("课程名称:\n");scanf("%s",stu[i].course[j].name);printf("学分:\n");scanf("%f",&stu[i].course[j].credit);printf("考试成绩:\n");scanf("%f",&stu[i].course[j].score);printf("平时成绩:\n");scanf("%f",&stu[i].course[j].usual);stu[i].course[j].integral=stu[i].course[j].usual*0.3+stu[i].course[j].score*0.7;sum=sum+stu[i].course[j].integral;printf("修改成功\n");}}p=1;}if(p==0)printf("不存在");break;default:printf("不存在该学生信息\n");}anykey();}voidinsert()/*插入函数*/{intj,sum;charch;do{printf("请输入学生基本信息:\n");printf("班级:");scanf("%d",&stu[m].class);printf("学号:");scanf("%d",&stu[m].num);printf("姓名:");scanf("%s",stu[m].name);printf("年龄:");scanf("%d",&stu[m].age);printf("性别:");scanf("%s",stu[m].sex);printf("请输入课程基本信息:\n");for(j=0,sum=0;j<COURSENUM;j++){printf("课程编号:");scanf("%d",&stu[m].course[j].num);printf("课程名称:");scanf("%s",stu[m].course[j].name);printf("学分:");scanf("%f",&stu[m].course[j].credit);printf("考试成绩:");scanf("%f",&stu[m].course[j].score);printf("平时成绩:");scanf("%f",&stu[m].course[j].usual);stu[m].course[j].integral=stu[m].course[j].usual*0.3+stu[m].course[j].score*0.7;sum=sum+stu[m].course[j].integral;}stu[m].avescore=sum/COURSENUM;m++;/*人数增加*/printf("插入成功\n");printf("是否继续插入信息?(y/n)\n");ch=getch();}while(ch=='Y'||ch=='y');anykey();}voidsearch()/*查询数据*/{inti,j,p=0,a,num;floatintegral;chars[15];printf("-----------------------------------------\n");printf("|1、按姓名查询|\n");printf("|2、按学号查询|\n");printf("-----------------------------------------\n");printf("请选择:\n");scanf("%d",&a);switch(a){case1:printf("请输入姓名\n");/*输入查询数据*/scanf("%s",s);for(i=0;i<m;i++){if(strcmp(stu[i].name,s)==0){printf("基本信息:\n");printf("------------------------------------------------------\n\|班级|学号|姓名|性别|年龄|\n");printf("|%6d|%6d|%6s|%6s|%6d|\n",stu[i].class,stu[i].num,stu[i].name,stu[i].sex,stu[i].age);/*输出表格*/printf("------------------------------------------------------\n");printf("课程基本信息:\n\------------------------------------------------------------\n");printf("|课程编号|课程名称|学分|考试成绩|平时成绩|综合成绩|\n");for(j=0;j<COURSENUM;j++){printf("|%10d|%10s|%6.2f|%10.2f|%10.2f|%10.2f|\n",stu[i].course[j].num,stu[i].course[j].name,stu[i].course[j].credit,stu[i].course[j].score,stu[i].course[j].usual,stu[i].course[j].integral);}printf("------------------------------------------------------------\n");p=1;anykey();}}if(p==0)printf("不存在该学生信息\n");break;case2:printf("请输入学号\n");scanf("%d",&num);for(i=0;i<m;i++){if(strcmp(stu[i].num,num)==0){printf("基本信息:\n");printf("-----------------------------------------\n\|班级|学号|姓名|性别|年龄|\n");printf("|%6d|%6d|%6s|%6s|%6d|\n",stu[i].class,stu[i].num,stu[i].name,stu[i].sex,stu[i].age);/*输出表格*/printf("-----------------------------------------\n");printf("课程信息:\n\-----------------------------------------------------------\n");printf("|课程编号|课程名称|学分|考试成绩|平时成绩|综合成绩|\n");printf("-----------------------------------------\n");for(j=0;j<COURSENUM;j++){printf("|%10d|%10s|%6.2f|%10.2f|%10.2f|%10.2f|\n",stu[i].course[j].num,stu[i].course[j].name,stu[i].course[j].credit,stu[i].course[j].score,stu[i].course[j].usual,stu[i].course[j].integral);printf("------------------------------------------------------------\n");}p=1;anykey();break;}}if(p==0)printf("不存在该学生信息\n");break;}}voiddelet()/*删除函数*/{inti,j,p=0;charname[15];printf("输入需要删除的学生姓名:\n");scanf("%s",&name);for(i=0;i<m-1;i++){if(strcmp(stu[i].name,name)==0){stu[i]=stu[i+1];m--;/*人数减少*/p=1;printf("删除成功\n");}elseif(strcmp(stu[m-1].name,name)==0){m--;p=1;printf("删除成功\n");}}if(p==0)printf("不存在该学生信息\n");anykey();}voidtongji()/*数据统计函数*/{intp;printf("-----------------------------------\n");printf("|1.全部输出:|\n");printf("|2.计算平均成绩|\n");printf("|3.不及格名单|\n");printf("-----------------------------------\n");scanf("%d",&p);switch(p){case1:output();break;case2:average();break;case3:unpassed();break;}}voidoutput()/*输出函数*/{inti,j;printf("学生基本信息:\n");/*输出表格和数据*/printf("--------------------------------------\n|班级|学号|姓名|性别|年龄|\n");printf("--------------------------------------\n");for(i=0;i<m;i++){printf("|%6d|%6d|%6s|%6s|%6d|\n",stu[i].class,stu[i].num,stu[i].name,stu[i].sex,stu[i].age);printf("--------------------------------------\n");}printf("课程信息:\n\--------------------------------------------------------------\n");printf("|课程编号|课程名称|学分|考试成绩|平时成绩|综合成绩|\n");printf("--------------------------------------------------------------\n");for(i=0;i<m;i++){for(j=0;j<COURSENUM;j++){printf("|%10d|%10s|%6.2f|%10.2f|%10.2f|%10.2f|\n",stu[i].course[j].num,stu[i].course[j].name,stu[i].course[j].credit,stu[i].course[j].score,stu[i].course[j].usual,stu[i].course[j].integral);printf("--------------------------------------------------------------\n");}}}voidaverage()/*平均分和排序函数*/{inti,j;structstutemp;printf("平均分信息:\n");printf("--------------------------\n");printf("|姓名|平均分|\n");printf("--------------------------\n");for(i=0;i<m;i++){printf("|%10s|",stu[i].name);printf("%10.3f|\n",stu[i].avescore);printf("--------------------------\n");}printf("从高到低排列:\n");printf("--------------------------\n");printf("|姓名|平均分|\n");printf("--------------------------\n");for(i=0;i<m;i++){for(j=i+1;j<=m-1;j++){if(stu[i].avescore<stu[j].avescore){temp=stu[i];stu[i]=stu[j];stu[j]=temp;}}printf("|%10s|",stu[i].name);printf("%10.3f|\n",stu[i].avescore);printf("--------------------------\n");}anykey();}voidunpassed()/*不及格名单*/{inti,j,k=0,sum;printf("不及格名单:\n");printf("--------------------------------\n");printf("|姓名|课程名称|综合成绩|\n");printf("--------------------------------\n");for(i=0;i<m;i++){for(j=0,sum=0;j<COURSENUM;j++){if(stu[i].course[j].integral<60){k=1;printf("|%6s|%10s|%10f|\n",stu[i].name,stu[i].course[j].name,stu[i].course[j].integral);stu[i].course[j].integral=stu[i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 粮食仓储机器人技术应用考核试卷
- 海洋油气资源开发项目合同管理考核试卷
- 建筑物拆除楼体隐患评估与拆除方案编制考核试卷
- 去泰山初二语文作文
- 课间初二语文作文
- 机电组件的智能驱动与控制策略考核试卷
- 白酒酿造过程中的智能监测与控制考试考核试卷
- 图书出租业务的智能书架设计考核试卷
- 小学数学二年级100以内加减法口算题
- 小学数学二年级下册口算练习300题
- GA/T 1359-2018信息安全技术信息资产安全管理产品安全技术要求
- 《商业银行个人理财业务发展研究国外文献综述》2500字
- 2023年赤峰龙韵城市建设有限公司招聘笔试题库及答案解析
- 专利申请培训课件
- DPtechIPS2000系列入侵防御系统培训胶片课件
- “四不伤害”安全生产专题培训课件
- (房屋建筑部分)工程建设标准强制性条文2023年版
- 幼儿园中班语言《小兔子开铺子》课件
- 公司面谈表模板
- 苏教版科学一年级下册第10课形形色色的动物课件25张
- 超声诊断学:局灶性肝病(肝脏占位性病变)
评论
0/150
提交评论