C语言 学生成绩管理系统.docx
《C语言 学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《C语言 学生成绩管理系统.docx(23页珍藏版)》请在冰点文库上搜索。
C语言学生成绩管理系统
C语言课程设计实习报告
——学生成绩管理系统
姓名:
赵力
学号:
20091000594
班号:
021094
指导老师:
赵曼
2011年1月
一、题目要求
请设计“学生成绩管理系统”,实现对在校某班学生几门课程的考试成绩进行统一管理。
每个学生记录包括学号、姓名、年龄、数学、物理、英语成绩,默认以学号为序存放。
(1)一个文件按以班为单位存储学生记录。
(2)将允许的操作分为六种,以A、C、D、E、F为标志(若设置菜单操作更佳)
A:
插入一个新的学生记录
B:
修改学生记录
C:
删除一个学生记录
D:
浏览全班信息
(3)计算学生的总成绩。
(4)按学号排序输出全班成绩表。
二、需求分析
根据题目要求,由于学生信息是存放在文件中,所以提供文件的输入、输出等操作;在程序中需要浏览学生的信息,应提供显示、排序等操作;另外还应该提供键盘式选择菜单实现功能。
三、总体设计
将这个系统的设计分为选择界面、录入模块、修改模块、删除模块、浏览模块、排序模块,以及若干个附加的公共函数。
四、详细设计
1、主函数
我的主函数设计风格比较简洁,只包含一个进入选择界面的语句,而其他模块的设计都包含在选择分项中,执行时,只要在选择功能代号,就可以执行其分属的模块。
其流程图如下:
N
Y
【程序】
/*******************主函数*********************/
voidmain()
{
menu();
}
2、选择界面
选择界面首先输出菜单选项,然后使用一组switch语句,用1~6代表各个功能模块,在switch语句之前,用了一个while语句实现输入数字是否为1~6的判断。
【程序】
/******************主界面******************/
{
intn,w1;
do
{
puts("\t\t\tStudents'GradesManageSystem");
puts("\t\t*********************MENU*********************\n\n");
puts("\t\t\t\t1.Enternewstudents'data");
puts("\t\t\t\t2.Modifydata");
puts("\t\t\t\t3.Deletedata");
puts("\t\t\t\t4.Browseall");
puts("\t\t\t\t5.Orderbynumber");
puts("\t\t\t\t6.Exit");
puts("\n\n\t\t*********************************************\n");
printf("Choicethenumberofthefunctionyouwanttorealise(1-6):
[]\b\b");
scanf("%d",&n);
if(n<1||n>6)
{w1=1;getchar();}
elsew1=0;
}while(w1==1);
/*选择功能*/
switch(n)
{
case1:
enter();break;/*录入信息模块*/
case2:
modify();break;/*修改模块*/
case3:
del();break;/*删除模块*/
case4:
browse();break;/*浏览模块*/
case5:
order();break;/*按学号排序模块*/
case6:
exit(0);break;/*退出*/
}
}
3、各种功能模块设计
(1)录入模块
【需求分析】
这个模块的目的就是将一个班学生的姓名、学号、年龄、三科成绩录入,然后系统会利用三科成绩得出一个总分。
单看各个数据信息,学号、姓名是字符型,可以采用字符型数据;分数为整数,采用整型。
数据信息存放在文件中,一条记录对应一个学生,既符合习惯也方便信息管理
参照书本的实例,我把学生的学号、姓名、年龄、三科成绩、总分作为结构体成员,存放的若干个学生信息就用结构体数组。
如下:
structstudent
{
charnum[11];
charname[20];
intscore[20];
intage[10];
intsum;
}stu[50];
首先要确定总共录入的人数,这个人数的上限在程序定义的时候设定为50人,输入完记录个数,就是使用输入函数进行输入,其中这个输入函数设计稍显复杂,里面还包括了学号输入函数,年龄输入函数,分数输入函数以及求总分函数,当所有的信息录入完之后,在用一个保存函数将这些信息保存函数,保存完后重新导入menu界面。
其流程图如下:
Y
N
【程序】
voidenter()
{
inti,n;
printf("Howmanystudents?
\n");
scanf("%d",&n);/*要输入的记录个数*/
printf("\nEnterdatanow\n\n");
for(i=0;i{
printf("\nInput%dthstudentrecord.\n",i+1);
input(i);/*调用输入函数*/
}
if(i!
=0)save(n);/*调用保存函数*/
menu();
}
(3)修改模块
【需求分析】
该模块的功能是用户输入要修改学生的学号,根据学号查找学生记录,再次调用录入函数,将该学生的信息再次录入一遍,然后存储,以实现修改的目的。
其流程图如下:
【程序】
/********************修改模块*********************/
voidmodify()
{
structstudents;
//FILE*fp;
inti,n,k;
n=load();/*加载函数*/
printf("\n\nEnterNO.thatyouwanttomotify!
NO.:
");
scanf("%s",s.num);/*输入要修改的记录*/
for(i=0;iif(strcmp(s.num,stu[i].num)==0)k=i;/*找到要修改的记录*/
modify_data(k,n);/*调用修改函数*/
printf("\nSuccessful^_^");
save(n);/*调用保存函数*/
menu();/*返回菜单*/
}
(4)删除模块
【需求分析】
该模块要求用户输入要删除学生的学号,根据学号查看学生记录并删除,删除记录时,一般的做法是将数据从文件中删除,删除位置后面的记录往前移,当数据结构不是单一变量、记录数较多时要考虑移动的效率,然后将数据保存。
其流程图如下:
【程序】
/**********************删除模块*********************/
voiddel()
{
structstudents;
//FILE*fp;
inti,n,k;
n=load();/*加载函数*/
printf("\n\nEnterNO.thatyouwanttodelete!
NO.:
");
scanf("%s",s.num);/*输入要删除的记录*/
for(i=0;iif(strcmp(s.num,stu[i].num)==0)k=i;/*找到要删除的记录*/
delete_data(k,n);/*调用删除函数*/
printf("\nSuccessful^_^");
save(n-1);/*调用保存函数*/
menu();/*返回菜单*/
}
voiddelete_data(inti,intn)
{
inta;
for(a=i;astu[a]=stu[a+1];
}
(5)浏览模块
【需求分析】
该模块的功能是显示所有学生的记录,其流程图如下:
【程序】
/**********************浏览模块********************/
voidbrowse()
{inti,n;
n=load();
printf_face();/*调用显示数据结构项目*/
for(i=0;iprintf_one(i);/*调用显示一个记录的函数*/
printf("\n\tThereare%drecord.\n",n);
printf("\nPressanykeytoback.\n\n\n\n\n\n");
getchar();
menu();
}
(6)排序模块
【需求分析】
该模块的功能是要求将学生记录按照学号排序。
其中排序的采取选择法。
其流程图如下:
【程序】
/********************按学号排序模块*****************/
voidorder()
{
inti,j,k,n;
structstudents;
n=load();
printf("%d\n",n);
for(i=0;i{
k=i;
for(j=i+1;js=stu[i];stu[i]=stu[k];stu[k]=s;
}
for(i=0;isave(n);
browse();
menu();
}
4、公共函数
(1)保存函数save(intn)
【说明】
形参n控制保存的个数。
当stu[k].sum=0表示删除,不保存该记录。
【程序】
/*保存函数*/
voidsave(intn)/*保存n个记录*/
{
FILE*fp;
inti;
if((fp=fopen("score.txt","wb"))==NULL)/*以只写方式为输出打开一个二进制文件*/
{printf("\nCannotopenfile\n");
return;
}
for(i=0;iif(stu[i].sum!
=0)/*stu[i].sum=0表此记录以删*/
if(fwrite(&stu[i],sizeof(structstudent),1,fp)!
=1)
printf("filewriteerror\n");
fclose(fp);
}
(2)加载函数load()
【说明】
该函数可以用来加载所有记录,并且可以返回所有记录个数。
【程序】
/*加载记录或可以计算记录的函数*/
intload()
{FILE*fp;
inti,j;
if((fp=fopen("score.txt","rb"))==NULL)/*以只读方式为输入打开一个二进制文件*/
{printf("\nCannotopenfiel\n");
return0;
}
for(i=0;!
feof(fp);i++)
fread(&stu[i],sizeof(structstudent),1,fp);
fclose(fp);
return(i-1);/*返回记录个数*/
}
(3)学号输入函数no_input(inti,intn)
【说明】
该函数对输入学号进行判断,确保输入的学号唯一。
形参i表示第i个学生记录,形参n表示总共有n个学生记录。
【程序】
/*学号输入函数*/
voidno_input(inti)
{
printf("NO.:
");
scanf("%s",stu[i].num);
}
(4)年龄输入函数age_input(inti)
【说明】
形参i表示第i个学生记录。
【程序】
/*年龄输入函数*/
voidage_input(inti)
{
printf("AGE:
");
scanf("%s",stu[i].age);
}
(5)输入三科分数函数score_input(inti)
【说明】
形参i表示第i个学生记录。
【程序】
/*分数输入函数*/
voidscore_input(inti)
{
intj;
for(j=0;j<3;j++)
{
printf("SCORE%d:
",j+1);
scanf("%d",&stu[i].score[j]);
}
}
(6)求总分函数sum(inti)
【说明】
形参i表示第i个学生记录。
【程序】
voidsum(inti)
{
intj,summ=0;
for(j=0;j<3;j++)summ+=stu[i].score[j];
stu[i].sum=summ;
}
(7)输入整个记录函数input(inti)
【说明】
形参i表示第i个学生记录。
【程序】
/*输入整个记录函数*/
voidinput(inti)
{
no_input(i);/*调用学号输入函数*/
printf("NAME:
");
scanf("%s",stu[i].name);
age_input(i);/*调用年龄输入函数*/
score_input(i);/*调用分数输入函数*/
sum(i);/*调用求总分函数*/
}
(8)修改记录函数modify_data(inti,intn)
【说明】
形参i表示第i个学生记录,形参n表示总共有n个学生记录。
【程序】
/*修改记录函数*/
voidmodify_data(inti,intn)
{
input(i);
}
(9)显示数据结构项目printf_face()
【程序】
/*显示数据结构项目*/
voidprintf_face()
{
printf("\n\tNO.NAMEAGEMATHPHYSICSENGLISHSUM\n");
}
(10)显示一个记录的函数printf_one(inti)
【说明】
形参i表示第i个学生记录。
【程序】
/*显示一个记录的函数*/
voidprintf_one(inti)
{intj;
printf("%10s%5s%3s",stu[i].num,stu[i].name,stu[i].age);
for(j=0;j<3;j++)
printf("%9d",stu[i].score[j]);
printf("\t\t%d\n",stu[i].sum);
}
五、上机操作
下面是个模块的界面图:
(1)
主菜单函数
(2)
输入模块
(3)追加条目
(4)
修改模块
(5)删除模块
(6)
浏览模块
(7)排序模块
六、实习心得
对于C语言程序设计这门课,我的态度还算比较认真,虽然也有上课听不懂或者一时无法理解的时候,但是一直在努力弄懂它。
期末的实习就是对我这门课的学习最真实的检验。
值得庆幸的是,我在抽题时抽到的题目是课本里的例题,只是有些要求不一样。
课本里的许多东西都是我值得借鉴的,那些程序很值得琢磨研究,虽然大多数东西都是我们课堂里讲过的,但是例题里把它们运用的那么灵活,这让我看到c语言本质的一些东西,也就是我们学这门课最应该学到的,即如何利用自己已得到的资源经过一些巧妙的变换组合以达到自己的目的。
当然,我不可能把例题里的程序照抄过来,许多地方还是在老师的反复指导与帮助下完成的。
再次深深地感谢老师!
老师在帮我改程序的时候,教会了我很多课本里没有的东西,比如程序一下子运行不出自己要的效果,可以用一些简单的程序检验一下自己的问题到底出在哪里,这也是利用c语言灵活的特点,让我很受启发。
总的来说,这次的实习让我学到最多最重要的东西就是c语言这门学科所显示的灵活性,以及它所代表的一种高效率、严密逻辑性和高度的条理性,可能我们今后接触c语言的机会不会很多,但我相信这些理念会给我们今后的学习和生活带来巨大的便利。