c程序学生成绩管理系统实验报告Word下载.docx
《c程序学生成绩管理系统实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《c程序学生成绩管理系统实验报告Word下载.docx(43页珍藏版)》请在冰豆网上搜索。
⑤至少采用文本菜单(如果能采用图形界面更好)。
此系统是可实现最基本功能的学生管理系统。
具体的管理信息应包括:
两个txt文件,其中stud.txt为学生基本信息文件,应该包括学号、姓名、性别、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩、平均分、实得学分;
stu-sort.txt为被删除的学生基本信息文件,应包括学号、姓名、性别、课程号、课程名称、学分、平时成绩、实验成绩、卷面成绩、平均分、实得学分。
1、学生基本情况查询:
输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。
2、成绩查询:
输入一个学号时,查询出此生的所有课程情况,
3、删除功能:
当在stud.txt中删除一个学生时,这个学生的信息将会被移动到stu-sort.txt中。
4、排序功能:
能实现选择按综合成绩或实得学分升序或降序排序并显示数据。
2总体设计
本次课程设计主要利用了结构体数组以及与文件有关的基本操作,通过采用模块化设计的思想,首先创建好各个模块的函数,然后被主函数调用以及函数间的嵌套调用。
主函数通过多次调用不同的函数实现创建文件、查询、删除学生信息模块和排序得基本功能,其总体框图如图2.1。
各个模块的程序编写比较容易,各个函数的接口是否处能理好,是本次课程设计能否成功的关键。
通过合理处理各函数得接口,使之能结合为一个完整的具有多功能的程序,从而顺利完成本次课程设计。
3模块设计
3.1主函数模块
在主函数中需要输出主菜单选择界面,简单菜单的制作可利用printf实现。
获取用户的输入选择,存放在b中,判断用户所要执行的任务,调用对应的函数执行。
其流程图见图3.1。
调用
output_
函数
find函数
rank函数
e函数
2
3
4
5
6
其它
图3.1主函数模块的流程图
3.2学生信息输入模块
创建结构体
structstudent
{
charnum[10];
/*学号*/
charname[8];
/*学生姓名*/
charsex[3];
/*性别*/
charsnum[10];
/*课程号*/
charsubject[10];
/*课程名*/
intcredit;
/*学分*/
intscore1;
/*平时分*/
intscore2;
/*实验分*/
intscore3;
/*卷面分*/
doubleadd;
/*平均分*/
doublefinal;
/*最后学分*/
}stu[10],temp;
用scanf输入学生信息,详见图3.2
图3.2information()函数流程图
3.3显示菜单模块
menu()函数中包含着菜单界面,调用此函数可输出菜单,并应客户选择调用函数执行任务。
其函数的流程图见图3.3.
图3.3menu()函数的流程图
3.4学生信息输出模块
此模块主要是将输入的学生信息以表格的形式在屏幕上显示出来。
输出信息后调用choose函数让客户选择是否返回主菜单。
其函数流程图见图3.4
图3.4output_函数流程图
3.5学生信息查询模块
首先显示提示信息,询问使用者是否输出所有的原始数据,根据使用者的选择若要输出则调用output_函数来实现输出功能。
若不输出则直接输出查询功能的主界面。
使用者可以选择按学号查询或按姓名查询学生信息。
若输入的学号或姓名在数据库中找不到,则提示使用者“****数据库中无此人的信息,是否重新输入?
****”。
根据使用者的选择再调用相应的函数。
其流程图见3.5
图3.5find()函数流程图
3.6删除学生信息模块
首先显示提示信息,询问使用者是否输出所有的原始数据,根据使用者的选择若要输出则调用output_函数来实现输出功能。
若不输出则直接输出删除功能的主界面,将0赋值给flag。
使用者可选择按学号删除,或者是按名字删除。
若按姓名删除,则调用delete1函数(delete1函数中先提示使用者输入对应的姓名,将输入的姓名与数据库中的姓名用strcmp进行对比,值恒等于0则删除学生信息并且将一赋值给flag。
)若按学号删除则调用delete2函数(delete2函数中先提示使用者使用者输入对应的学生学号与数据库中的学生学号用strcmp进行对比,将值恒等于0的学生信息删除并且将一赋值给flag。
)
若flag恒等于一则全局变量c减一,调用choose函数。
否则提示使用者“找不到您要删除的数据,是否重新输入?
”若果选1的话递归调用delete_函数,如果选2的话返回主菜单,如果选三的话退出,否则调用error函数报错。
函数流程图见图3.6。
图3.6.1delete1函数按学生姓名删除学生信息流程图
图3.6.2delete2函数按学生学号删除学生信息流程图
3.7排序模块
若不输出则直接输出排序功能的主界面。
rank设置四种排序方式,分别为:
函数rank1----按综合成绩降序
函数rank2----按综合成绩升序
函数rank3----按实得学分降序
函数rank4----按实得学分升序
根据使用者的选择调用相应的函数实现相应的排序功能。
排序结束后询问使用者是否输出排序后的表格,使用者若选择1则调用output_函数实现输出功能。
若是选择2则返回主菜单。
若选择三则推出。
否则调用error函数报错。
具体见流程图图3.7
图3.7rank()函数流程图
图3.7.1rank1函数按综合成绩降序排列
图3.7.2rank2函数按综合成绩升序排列
图3.7.3rank3函数按平均成绩降序排列
图3.7.4rank4函数按平均成绩升序排列
3.8退出模块
当使用者决定退出整个操作时调用此函数实现退出功能。
其流程图如图3.8所示。
图3.8e()函数流程图
4功能模块的调试及测试
4.1主函数及显示主菜单模块
用户进入学生管理系统就会出现如下菜单,选择相应的序号就会进行相应的操作。
在测试时此模块没有出现错误。
运行结果如图4.1
图4.1主菜单界面
4.2创建文件模块
4.2.1调试时错误分析与改正
错误:
文件打开失败
原因与改正:
运行时总是出现此错误,经认真检查后发现文件b.txt的引入路径错误。
原引用路径为“e:
\\源程序2\\b.txt”经检查后发现“b.txt”错误,中间多了空格键,这是编写程序时不容易注意到的。
4.2.2调试结果
调试正确结果见图4.2-1。
用户通过此操作可以成功计算学生的综合成绩和实得学分。
图4.2学生管理系统菜单
4.3显示学生管理系统的成绩基本信息模块
4.3.1调试时错误分析与改正
文件显示的信息虽然为文件中的信息,但是为无规律的乱错乱信息。
经过多次修改发现程序无错。
返回文件b.txt,并把该文件第一行“学号课程编号课程名称学分平时成绩实验成绩卷面成绩综合成绩实得学分”这些文字后,调试程序可以正常运行。
4.3.2调试结果
调试正确结果见图4.3。
用户通过此操作可以成功显示学生的成绩信息。
图4.3显示学生管理系统成绩基本信息
4.4查询学生基本信息模块
4.4.1调试时错误分析与改正
在按宿舍号码查询时,总是出现如下错误见图4.4-1
图4.4按宿舍查询时的错误结果
程序运行时跳过是否符合条件的判断。
删除fread(&
stu[i],sizeof(structstudent),1,fp);
改正后运行结果如图4.4-2
4.4.2调试结果
由于按学号、姓名、与宿舍号码运行结果有很大的相似性,为行文的简洁本文仅列举按宿舍号码查询的正确结果如图4.4-2.
图4.5按宿舍查询学生基本信息
4.5查询学生成绩信息模块
查询学生信息模块调试时没有遇到错误,由于该模块与4.3模块十分相似,为行文的简洁,本文不再累述。
4.6删除学生信息模块
本模块程序在调试时没有什么错误。
假设用户进行如下操作见图4.6。
图4.6进行删除学号为01的学生的信息的操作。
进行完该操作后得运行结果见图4.7.
图4.7删除后显示的学生成绩基本信息
4.7排序模块
由于按综合成绩、实得学分排序运行结果有很大的相似性,为行文的简洁本文仅列举按综合成绩的降序排序的正确结果如图4.8.
图4.8按综合成绩的降序排序
5总结
本次课程设计主要利用了结构体数组、结构体指针以及文件,通过多次调用不同的函数实现创建文件、查询、删除学生信息模块和排序得基本功能。
本次课程设计主要是通过建立不同得模块,在不同的条件下主函数调用不同的函数来实现各种不同的功能,各个模块的函数比较容易,各个函数的接口是否处能理好,是本次课程设计能否成功的关键。
本次课程设计用到的文件比较多,由于上课时文件讲的比较少,加之文件平时用的也很少,所以课程设计一开始,我就遇到了很多的困难,只好查阅资料使自己先了解文件的读写等基本知识。
但是仅仅了解还是远远不够的,经过初步的编程发现,现在我还是处于能读懂不能正确的编写程序的阶段。
第一次编完程序后有30多个错误,最重要的原因还是没有养成良好的编程习惯,甚至会犯语句不完整,重复定义变量等最初级的错误。
以前由于计算机二级考的如鱼得水非常顺利,曾经认为三级不过是编一个程序而已,现在想想自己还有很多的不足,我发现数组、结构体、指针等C语言最精华的部分,我掌握的还是不牢固,有许多地方还是很模糊,通过编程及调试的过程,我不断发现错误,不断翻书纠正错误,弥补自己的不足。
通过这次为其两周的课程设计,是我深刻理解到了“指针是C语言的灵魂”这句话得含义;
深刻理解到了“函数是C语言的载体”这句话得意义;
同时也深刻认识到了自己的不足。
在两个星期的设计过程中,我遇到的了很多困难,一度不知从何开始,代码的调试过程更是困难重重,不过在老师的耐心指导下,同学的鼓励下,一步步走过来,最终完成了设计。
在这里我想谢谢陈维老师给予的细心帮助,谢谢我的同学们。
通过这次的设计任务,加深了对C语言的理解,提高了实践动手能力,谢谢学校、学院安排这次设计任务。
[1]谭浩强.C程序设计.第三版.北京:
清华大学出版社,2005.242-256330-344
[2]曹衍龙,林瑞仲,徐慧.C语言实例解析精粹.北京:
人民邮电出版社,2005.196-218
[3]陈宝贤,莫裕清,杨小毛.C语言程序设计实验指导.北京:
人民邮电出版社,2005.87-96
[4]王为青,刘变红.C语言高级编程及实例剖析.北京:
人民邮电出版社,2007.375-401
[5]宁正元,王秀丽.算法与数据结构.北京:
清华大学出版社,2005.125-134
附录:
源程序
/*Note:
YourchoiceisCIDE*/
#include<
stdio.h>
stdlib.h>
string.h>
conio.h>
#defineN100
charname[10];
chartel[11];
charsex[2];
intdom;
/*宿舍*/
charcousenum[3];
/*课程编号*/
floatcousecount;
/*课程学分*/
charcousename[25];
/*课程名称*/
floatcomscore;
/*平时成绩*/
signedintexpscore;
/*实验成绩*/
floatpaperscore;
/*卷面成绩*/
floatsumscore;
/*综合成绩*/
floatcount;
/*实得学分*/
}stu[12];
/*以下是函数原型说明,被调函数的定义在主调函数后面时,要加此部分*/
voidmyprint();
/*创建主菜单*/
voidmycreate();
/*创建管理系统*/
voidmydisplay();
/*显示*/
voidmysearchbase();
/*基本情况查询*/
/*schbase_numsch_dom与schbase_name函数被mysearchbase调用*/
voidsch_num(FILE*fp);
voidsch_name(FILE*fp);
voidsch_dom(FILE*fp);
voidmysearch();
/*查询*/
voidmysearchscore();
/*成绩查询*/
voidschscore_num(FILE*fp,FILE*f);
voidmydelete();
/*删除*/
/*del_num函数被mydelete调用*/
voiddel_num(FILE*fp,FILE*f);
voidmysort();
/*排序*/
/*sort_sumscore与sort_count函数被mysort调用*/
voidsort_sumscore();
voidsort_count();
/*主函数*/
voidmain()
{
charchoose,yes_no;
/*system("
color8e"
);
system("
cls"
*/
do
{
myprint();
/*显示主菜单*/
printf("
"
choose=getch();
switch(choose)
{
case'
1'
:
mycreate();
break;
/*创建*/
2'
mydisplay();
break;
/*显示*/
3'
mysearch;
/*查询*/
4'
mydelete();
/*删除*/
5'
mysort();
/*排序*/
0'
default:
printf("
\n%c为非法选项!
\n"
choose);
}
if(choose=='
break;
\n要继续选择吗(Y/N)?
do
yes_no=getch();
}while(yes_no!
='
Y'
&
yes_no!
y'
N'
n'
}while(yes_no!
||yes_no!
}
voidmyprint()/*显示菜单界面*/
/*clrscr();
*/
printf("
\n\n\n\n\n\n\n\n"
学生管理系统\n"
作者:
仲亚杰专业班级:
自普本061学号:
2006440745\n"
|*************************************************************|\n"
|请输入选项编号(0-6):
|\n"
|-----------------------------------------|\n"
|1--创建学生信息|\n"
|2--显示学生信息|\n"
|3--查询学生信息|\n"
|4--删除学生信息|\n"
|5--排序学生信息|\n"
|0--退出|\n"
|*****************************************************************|\n"
欢迎进入学生管理系统——请选择要进行的操作!
\n"
/*定义创建信息管理系统的函数*/
voidmycreate()
inti=0;
FILE*fp;
FILE*fp2;
fp=fopen("
e:
\\源程序2\\b.txt"
"
r+"
fp2=fopen("
\\源程序2\\c.txt"
w+"
if(fp==NULL)
\n打开文件失败!
return;
}
rewind(fp);
\n\n"
for(i=0;
i<
12;
i++)
{
fscanf(fp,"
%s%s%s%f%f%d%f"
&
stu[i].num,&
stu[i].cousenum,&
stu[i].cousename,&
stu[i].cousecount,&
stu[i].comscore,&
stu[i].expscore,&
stu[i].paperscore);
if(stu[i].expscore==-1)
stu[i].sumscore=stu[i].comscore*3/10+stu[i].paperscore*7/10;
else
stu[i].sumscore=stu[i].comscore*15/100+stu[i].expscore*15/100+stu[i].paperscore*7/10;
if(90<
stu[i].sumscore&
stu[i].sumscore<
=100)
stu[i].count=stu[i].cousecount;
if(80<
=90)
stu[i].count=stu[i].cousecount*8/10;
if(70<
=80)
stu[i].count=stu[i].cousecount*3/4;
if(60<
=stu[i].sumscore&
=70)
stu[i].count=stu[i].cousecount*3/5;
if(stu[i].sumscore<
60)
stu[i].count=0;
fprintf(fp2,"
%-10s%-7s%-15s%-5.0f%-8.2f%-5d%-8.2f%-8.2f%-8.2f\n"
stu[i].num,stu[i].cousenum,stu[i].cousename,stu[i].cousecount,stu[i].comscore,stu[i].expscore,stu[i].paperscore,stu[i].sumscore,stu[i].count);
}
fp=fopen("
rewind(fp2);
i=getc(fp2);
while(!
feof(fp2))
putc(i,fp);
fclose(fp);
创建成功!
!
fclose(fp2);
remove("
/*定义显示信息管理系统的函数*/
voidmydisplay()
{inti=0;
intn=0;
structstudenttemp;
r"
\n学号课程编号课程名称学分平时成绩实验成绩卷面成绩综合成绩实得学分\n"
while(feof(fp)==0)
{fscanf(fp,"
%s%s%s%f%f%d%f%f%f\n"
&
stu[i].paperscore,&
stu[i].sumscore,&
stu[i].count);
%-4s%-7s%-15s%-5.0f%-8.2f%-5d%-8.2f%-8.2f%-8.2f\n"
stu[i].num,st