班级成绩管理系统 通信工程课程设计.docx
- 文档编号:24137436
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:28
- 大小:248.25KB
班级成绩管理系统 通信工程课程设计.docx
《班级成绩管理系统 通信工程课程设计.docx》由会员分享,可在线阅读,更多相关《班级成绩管理系统 通信工程课程设计.docx(28页珍藏版)》请在冰豆网上搜索。
班级成绩管理系统通信工程课程设计
课程设计报告
课程名称《C语言程序设计》
课题名称班级成绩管理系统
专业通信工程
班级
学号
姓名
指导教师
年月日
湖南工程学院
课程设计任务书
课程名称《C语言程序设计》
课题班级成绩管理系统
专业班级通信工程
学生姓名
学号
指导老师
审批
一、设计内容与设计要求
1.课程设计目的
全面熟悉、掌握C语言基本知识,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,养成提供文档资料的习惯和规范编程的思想,为后继课程(数据结构和数据库等课程)的实验以及课程设计打下较扎实的基础。
2.课题题目
班级成绩管理系统
3.设计要求
(1)掌握结构化程序设计的主体思想,以自顶向下逐步求精的方法编制程序解决一些实际的中型问题,为将来开发软件积累一些典型的案例处理经验。
具体要求如下:
设计课题题目:
每位同学根据自己学号除以5所得的余数加一选择相应题号的课题。
原则上不予换提,私自换题者不记成绩。
(2)根据自己对应的课题完成以下主要工作:
①完成系统需求分析:
包括系统设计目的与意义;系统功能需求;输入输出的要求。
②完成系统概要设计:
程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能;课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。
③完成系统详细设计:
包括采用C语言定义相关的数据类型;写出各模块的类C码算法;画出函数的调用关系图。
④调试分析、设计体会、测试数据:
准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果;程序调试中遇到的问题以及解决问题的方法;课程设计过程经验教训、心得体会。
⑤关键源程序(带注释)
⑶按规定格式完成课程设计报告,将其打印稿(A4纸)上交给老师存档。
⑷不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。
二、进度安排
目录
1.系统需求分析与简介1
1.1原始问题描述1
2.程序结构概要1
2.1程序的模块结构1
2.2各模块的功能2
3.具体细节设计与描述3
3.1采用C语言定义相关的数据类型3
3.2显示主界面的函数4
3.3成绩录入函数4
3.4成绩显示函数5
3.5成绩保存函数6
3.6成绩排序函数6
3.7成绩修改函数7
3.8成绩统计函数8
4.系统调试中存在的问题9
5.运行结果显示10
6.学习的心得体会14
7.附录15
7.1源代码15
7.2参考书目20
8附表21
1.系统需求分析与简介
1.1原始问题描述
对一个有N个学生的班级,每个学生有M门课程。
该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。
1.2功能需求
(1)本系统采用一个结构体数组,每个数据的结构应当包括:
学号、姓名、M门课程名称。
(2)本系统显示这样的菜单:
请选择系统功能项:
1.成绩录入
2.成绩显示
3.成绩保存
4.成绩排序
5.成绩修改(要求先输入密码)
6.成绩统计
(1)显示每门课程成绩最高的学生的基本信息
(2)显示每门课程的平均成绩
(3)显示超过某门课程平均成绩的学生人数
0.退出系统
(3)执行一个具体的功能之后,程序将重新显示菜单。
(4)将学生成绩保存到文件中。
2.程序结构概要
2.1程序的模块结构
整个系统除了主函数外,另外还有7个函数,实现七大功能:
成绩录入功能、成绩显示功能、成绩保存功能、成绩排序功能、成绩修改功能、成绩统计功能、退出系统功能。
用图可表示如如下:
2.2各模块的功能
(1)主函数main()
利用while
(1)输出函数主界面和swithch(t)实现选择函数以及各函数的调用,系统根据输入的数字选项来调用相应的函数。
用switch(t)开关语句,进入“功能选择”的界面,在这个界面里有显示系统的七大功能,执行完每一个函数功能后,返回菜单。
(2)成绩录入函数
voidluru(structstudentstu[],intn);实现对每个学生学号,姓名,四门课程的成绩,总成绩,平均成绩的录入。
(3)成绩显示函数
voidxianshi(structstudentstu[],intn);实现对每个学生的学生信息的输出。
(4)成绩保存函数
voidbaocun(structstudentstu[],intn);实现对输入的信息保存在stu.txt中,并且能从中读取学生的信息。
(5)成绩排序函数
voidpaixiu(structstudentstu[],intn);实现对学生总成绩的从大到小的排序。
(6)成绩修改函数
voidxiugai(structstudentstu[],intn);实现对几个学生信息修改,再次选择可将修改的程序重新保存。
(7)成绩统计函数
voidtongji(structstudentstu[],intn);实现以下三个分功能:
1.每门课程成绩最高的学生信息;
2.每门课程的平均成绩;
3.显示超过某门课程平均成绩的人数。
(8)退出系统函数
用if语句表示if(t=0)break;即选择0时就表示退出系统了。
3.具体细节设计与描述
3.1采用C语言定义相关的数据类型
对要输入的学生信息采用结构体数组的形式,这样既方便又明了,而且也使我自己对这种方式的表达更加熟悉。
structstudent//定义一个结构体类型
{
intnum;//学号
charname[16];//姓名
floatscore[4];//4科学生分数
floattotal;//总成绩
floataver;//平均成绩
}stu[10];//定义10个学生
本程序对要定义的学生信息中不同的信息采用了不同的数据类型,例如:
在对学生的学号和名称用字符型(intnum;charname[10];),在对学生的四门成绩,总成绩和平均成绩采用浮点型(floatscore[4];floattotal;floataver;)。
并且对后文程序中要定义的采用了相对应的类型(inti,j;)。
3.2显示主界面的函数
用while
(1)语句实现,如:
while
(1)
while
(1)//利用一个无限循环
{
printf("1.成绩录入\n");
printf("2.成绩显示\n");
printf("3.成绩保存\n");
printf("4.成绩排序\n");
printf("5.成绩修改\n");
printf("6.成绩统计\n");
printf("0.退出程序\n");
printf("请输入选项:
\n")
}
根据不同的需要进行不同的选项。
3.3成绩录入函数
voidluru(structstudentstu[],intn)
{inti;
charb,m;
for(i=0;i { printf("请输入第%d个学生的学号: \n",i+1); //利用一个i来提示信息的准确输入 scanf("%d",&stu[i].num); printf("请输入第%d个学生的名字: \n",i+1); scanf("%s",stu[i].name); printf("请输入第%d个学生的语文成绩: \n",i+1); scanf("%f",&stu[i].score[0]); printf("请输入第%d个学生的数学成绩: \n",i+1); scanf("%f",&stu[i].score[1]); printf("请输入第%d个学生的英语成绩: \n",i+1); scanf("%f",&stu[i].score[2]); printf("请输入第%d个学生的物理成绩: \n",i+1); scanf("%f",&stu[i].score[3]); printf("是否继续: 'Y'or'N'\n"); scanf("%c",&b); scanf("%c",&m); if(m=='N'||m=='n')//简单的判断 break; } } 3.4成绩显示函数 voidxianshi(structstudentstu[],intn) {inti; printf("\n学生信息: \n"); for(i=0;i<10;i++) { printf("\n学号%d,姓名%s,语文成绩%3.1f,数学成绩%3.1f,英语成绩%3.1f,物理成绩%3.1f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3]); } } 简单得循环来对已经输入信息的一个显示,来确认信息得正确性 3.5成绩保存函数 voidbaocun(structstudentstu[],intn) { intm1; FILE*fp;//建立一个文件指针 fp=fopen("stu.txt","r+");//打开文件 if(fp==NULL)fp=fopen("stu.txt","w+");//判断文件是否为空 rewind(fp);//让数据读写从头开始 fprintf(fp,"%d",n);//在文件中打印出来 for(m1=0;m1 { fprintf(fp,"%d%s%f%f%f%f\n",stu[m1].num,stu[m1].name,stu[m1].score[0],stu[m1].score[1],stu[m1].score[2],stu[m1].score[3]); } printf("保存成功! \n"); printf("\n"); fclose(fp);//关闭文件 } 3.6成绩排序函数 voidpaixiu(structstudentstu[],intn) {inti,j; for(i=0;i { stu[i].total=stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3];//计算每个人的平均成绩 } structstudentt; for(i=0;i { for(j=i+1;j if(stu[j].total>stu[i].total) { t=stu[j]; stu[j]=stu[i]; stu[i]=t; } } printf(": \n"); printf("按学生总成绩排名如下: \n学生信息: \n"); for(i=0;i { printf("\n学号%d,姓名%s,语文成绩%3.1f,数学成绩%3.1f,英语成绩%3.1f,物理成绩%3.1f,总成绩%3.1f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total); } } 3.7成绩修改函数 voidxiugai(structstudentstu[],intn) { inti,g,password,pass=123;//设置密码,可以更改 charm,b; printf("请输入密码: \n");//输入密码 scanf("%d",&password); if(password==pass)//利用if语句判断密码的正确性 {printf("请输入要修改信息学生的学号: \n"); scanf("%d",&g); for(i=0;i { if(stu[i].num==g) {printf("这是你要修改的学生的以前信息: \n学号%d,姓名%s,语文成绩%3.1f,数学成绩%3.1f,英语成绩%3.1f,物理成绩%3.1f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3]); printf("\n请输入最新语文成绩: \n");//一系列输出 scanf("%f",&stu[i].score[0]); printf("\n请输入最新数学成绩: \n"); scanf("%f",&stu[i].score[1]); printf("\n请输入最新英语成绩: \n"); scanf("%f",&stu[i].score[2]); printf("\n请输入最新物理成绩: \n"); scanf("%f",&stu[i].score[3]); printf("\n成绩已修改! 请再点击保存! \n\n\n"); break; } } } else printf("密码错误! \n\n\n请重新选择! \n\n");//密码错误提示 } 3.8成绩统计函数 voidtongji(structstudentstu[],intn) {inti,j,k; floatmax,sum,aver_cour[4]; printf("以下为有关科目信息\n\n"); printf("第1科目: 语文;第2科目: 数学;第3科目: 英语;第4科目: 物理\n\n"); for(j=0;j<4;j++)//统计每一科的最高成绩 { max=stu[0].score[j];//假定第一个人的成绩最高 k=0; for(i=0;i if(stu[i].score[j]>max)//如果又比第一个高的成绩就替换它 { max=stu[i].score[j]; k=i; } stu[k].total=stu[k].score[1]+stu[k].score[2]+stu[k].score[3]+stu[k].score[4]; stu[k].aver=stu[k].total/4; printf("\n第%d科最高的学生的信息如下: \n学号%d姓名%s语文%3.1f数学%3.1f英语%3.1f物理%3.1f总成绩%3.1f平均成绩%3.1f\n",j+1,stu[k].num,stu[k].name,stu[k].score[0],stu[k].score[1],stu[k].score[2],stu[k].score[3],stu[k].total,stu[k].aver); }//输出学生相关信息 for(j=0;j<4;j++)统计每一科的平均成绩 { sum=0; for(i=0;i { sum=sum+stu[i].score[j]; } aver_cour[j]=sum/10;//求平均成绩 printf("\n第%d科的平均成绩为%3.1f\n",j+1,aver_cour[j]); } for(j=0;j<4;j++)//统计超过平均分的学生 { k=0; for(i=0;i { if(stu[i].score[j]>aver_cour[j])k++;利用简单的计数 } printf("\n第%d科有%d个同学超过平均分\n",j+1,k); }//输出学生相关信息 } 4.系统调试中存在的问题 此系统其实结构已经相当清晰,要分清主次。 首先以一个主函数为主体,其他函数为分支。 在把主函数结构完完成后,在对分支函数进行编写,先对每一个小的函数进行调试,完成后在进行整体的调试。 在调试中不断发现问题并改正它们,使程序不断的完善。 经过无数次的修改程序使不仅可以运行,而且具有高度的协调性。 不可以是以完成目的就不做了,比如一个很简单的程序让你编写的很庞大。 很显然这样是不符合需求的,所以在编的时候要用心去体会其中的道理,才利于在以后的学习中更好的学习。 在程序调试中比较多注意的问题: 1.switch语句中,每一个case之后又应有一个break;,但最后一个应没有。 就是由于漏写了break语句,case只起标号的作用,而不起判断作用。 2.数组名代表该数组的起始地址。 3.在字符输入的编写中要注意空格间的相关问题,空格键也为一个字符,不然会出现系统错误。 4.在信息保存在文件中的时候,未使用恰当的输入输出语句,应将printf语句改为fprintf语句,将scanf语句改为fscanf语句,才解决了学生信息可在我保存的stu.txt中显示出来,而不是一些乱码。 5.要定义相同类型的参数,不然不可以进行数据的交换。 6.循环虽然很好利用,但不能混乱使用。 7.关键的使在进行一系列判断,一定要注意条件的正确性,比如密码的设定与进入时的判断。 5.运行结果显示 以下为在运行程序的时候出现的界面,对你的使用会有所帮助 1.在使用的过程中会不断提示你的主界面,根据不同的需要进行不同的选择 2.这是在进行第一个选项时出现的画面,成绩的输入并进行判断,下面我们以赵凡同学为例进行说明。 现在是赵凡同学的成绩录入界面,可以看到他的语文成绩是75分,学号为14。 3.在选择了不如输成绩时的结果,我们可以清楚的看到赵凡同学的各科成绩。 4.以上对学生成绩的显示,同样也为了检查信息的正确性 5.在检查无误后,在选择了保存成绩选项后,提示你保存成功,同时再进行其他操作。 6.显示总成绩的排名,我们课题看到赵凡同学的相关信息,他的总成绩为317分,次于凯小旋同学的后面。 7.进行成绩修改,提示你输入密码,当你输入错误时,显示密码错误,再进行选择。 8.当输入正确的密码后首先显示你要修改的学生之前的所有信息,并提示你进行新的各科的成绩的输入,同样我们修改赵凡同学的信息。 以语文成绩为例,修改为78分,而之前为75分。 9.提示你成绩修改成功,为确保信息的丢失再次进行一次成绩的保存。 我们可以看到赵凡同学的语文成绩有以前的75分,变为现在的78分,因此赵凡同学的成绩修改成功。 10.成绩统计每一科成绩最高者的相关信息,因为赵凡同学的成绩不是最高的,因此没显示他的信息。 11.统计中显示平均成绩和超过平均成绩的学生 12.在所有的相关操作完成后进行程序的推出 6.学习的心得体会 7.附录 7.1源代码 #include #include #include voidluru(structstudentstu[],intn); voidxianshi(structstudentstu[],intn); voidbaocun(structstudentstu[],intn); voidpaixiu(structstudentstu[],intn); voidxiugai(structstudentstu[],intn); voidtongji(structstudentstu[],intn); structstudent {intnum; charname[16]; floatscore[4]; floattotal; floataver; }stu[10]; voidmain() { intt,n=10,k=0,num=0,j; charch; FILE*fp; fp=fopen("stu.txt","r+"); if(fp==NULL)fp=fopen("stu.txt","w+"); ch=fgetc(fp); if(ch! =EOF) { rewind(fp); fscanf(fp,"%d",&num); for(j=0;j { fscanf(fp,"%d%s%f%f%f%f\n",&stu[j].num,stu[j].name,&stu[j].score[0],&stu[j].score[1],&stu[j].score[2],&stu[j].score[3]); } } printf("欢迎使用! ! ! \n\n"); while (1) { printf("1.成绩录入\n"); printf("2.成绩显示\n"); printf("3.成绩保存\n"); printf("4.成绩排序\n"); printf("5.成绩修改\n"); printf("6.成绩统计\n"); printf("0.退出程序\n"); printf("请输入选项: \n"); scanf("%d",&t); switch(t) {case1: luru(stu,n);break; case2: xianshi(stu,n);break; case3: baocun(stu,n);break; case4: paixiu(stu,n);break; case5: xiugai(stu,n);break; case6: tongji(stu,n);break; case0: break; default: printf("enterdataerror! \n"); } if(t==0)break; } } voidluru(structstudentstu[],intn) {inti; charb,m; for(i=0;i { printf("请输入第%d个学生的学号: \n",i+1); scanf("%d",&stu[i].num); printf("请输入第%d个学生的名字: \n",i+1); scanf("%s",stu[i].na
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 班级成绩管理系统 通信工程课程设计 班级 成绩管理系统 通信工程 课程设计