学生成绩管理系统C语言程序论文.docx
《学生成绩管理系统C语言程序论文.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统C语言程序论文.docx(24页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统C语言程序论文
C语言大作业
一.目的
(报告正文部分):
(要求:
正文部分一律用小四号字,宋体,1.5倍行距。
)
随着大学生人数的增加,各种专业学科的增加,各班级各科成绩存储量提高同时也会导致教务系统的数据量也不断上涨。
面对资料的繁多复杂,工作的辛苦,以及纸质保存方式的不便与容易丢失。
针对此实际问题的存在,学生成绩管理系统,便应运而生。
运用所学的C语言知识,构建简单的学生成绩管理系统,不仅强化上级动手能力,在理和实践的基础上进一步巩固《C语言程序设计》课程所容,掌握工程化软件设计的方法。
而且学会将知识用于实际的方法,进一步提高个人的问题分析解决能力,有利于个人综合能力的提高。
还能够为之后的专业实践或者学习打下务实坚定的基础。
同时明确学生对成绩管理系统的功能需求和性能需求,并将这些需要用规的C语言和规的结构完整准确的表达清楚,由此达到对学生管理系统软件的理解和对C语言的知识规使用。
二.题目描述和要求
从分析问题入手,设计可行的算法,进而编出相应的C程序。
强调上机实践过程,从实际应用出发,运用ViusalC++6.0编写学生成绩管理系统。
应用链表及外部文件,独立设计上述应用系统,并编程实现以下功能:
①信息录入
录入学生信息(包括、学号、各科成绩)。
②信息查询
输入学号,查询与学号相对应的信息(包括成绩),并按可选的自定义规则进行排序。
按班级统计学科总分、平均分等。
③信息删除与修改
输入学号,删除该学号对应的成绩信息。
输入学号,查询并显示出该学号信息,并在此基础上进行修改。
④计算学生成绩
计算每位学生的总分。
计算每位学生的平均分。
成绩排序。
⑤信息保存
将学生信息保存在文件中。
⑥根据以上功能需求,定义通讯录信息结构,并采用链表结构对数据进行存储。
⑦提供友好的用户界面,方便用户操作。
三.报告容
3.1需求分析
设计题目:
学生成绩管理系统
设计要求:
应用链表及外部文件,独立设计上述应用系统,并编程实现以下功能:
①信息录入
录入学生信息(包括、学号、各科成绩)。
②信息查询
输入学号,查询与学号相对应的信息(包括成绩),并按可选的自定义规则进行排序。
按班级统计学科总分、平均分等。
③信息删除与修改
输入学号,删除该学号对应的成绩信息。
输入学号,查询并显示出该学号信息,并在此基础上进行修改。
④计算学生成绩
计算每位学生的总分。
计算每位学生的平均分。
成绩排序。
⑤信息保存
将学生信息保存在文件中。
⑥根据以上功能需求,定义通讯录信息结构,并采用链表结构对数据进行存储。
⑦提供友好的用户界面,方便用户操作。
系统功能分析:
1输入功能:
可以一次完成无数条信息的输入。
2输出功能:
能按输出排序功能多个学生的成绩单或者按查找功能输出学生的成绩单。
3修改功能:
完成对单个学生成绩的修改。
4查找功能:
按学号完成对单个学生信息查找,并显示。
5排序功能:
按学生成绩进行排序,并显示。
6保存功能:
能够将输入的信息保存,并能读取
7有一个清晰美观界面来调用各个功能
3.2概要设计
系统总体设计框架:
主菜单:
提供平台选择界面,供用户选择功能,其他模块的工作,以及包含退出系统。
1.Student_Insert:
输入模块,录入学生学号,以及三科成绩,并运算平均分和总分
2.Student_Search:
匹配已知学号与输入学号是否正确,并返回结果
2.1Student_Select:
查找学生信息,并输出
2.2Student_Delete:
删除存在的学生成绩
2.3Student_Modify:
修改学生信息,并输出
3.Student_Sort_Average&Student_Sort_Mark1:
按学生的平均分或者学生的英语成绩排序
3.1Student_Display:
输出多名学生的按平均分或者英语成绩排名的
4.Read:
运用fread将文件从已保存文件里读出
5.Write:
运用fprintf和fwrite函数分别保存输入的学生信息
系统功能模块图:
3.3详细设计
主要功能模块的算法设计思路:
学生成绩管理系统的设计一开始由主程序界面设计出发,运用case函数8个子模块:
1:
输入学生的资料;2:
查询学生成绩;3:
修改学生资料;4:
删除学生成绩;5:
排序学生成绩;6:
保存输入的学生资料;7:
从文件调入学生信息;8:
退出程序;操作者可以根据不同需求选择不同的操作。
首先设计的主模块程序设计中,运用main,功能:
通过调用Student_Insert,Student_Search,Student_Select,Student_Delete,Student_Modify,Student_Sort_Average,Student_Sort_Mark1,Student_Display,Read,Write等函数,实现学生成绩查询与管理功能首先用while
(1)控制,保障在每次菜单操作后返回主页面。
之后用swtich对用户输入值进行判断,决定进行何种操作。
对于具体的返回值,又调用其他函数,实现对学生成绩管理系统的各个功能的操作。
子模块程序当中,首先编写的是输入程序主要运用scanf函数接受用户输入的学号,,英语,数学,物理的学生信息。
然后依次编写的学生信息查询,学生信息修改,学生信息删除都建立在学号匹配的Student_Search函数上,运用for和if函数对输入的学号依次对以保存的学号进行一一的对比,若寻找到正确的学号就返回学号,若寻找不到着返回-1值。
若返回-1值,紧接的Student_Search,Student_Select,Student_Delete,三个函数则输出学号不存在。
若返回得到学号值则:
1.Student_Search:
运用printf输入相应的学号结构体的信息。
2.Student_Select:
首先输出相应的学号结构体的信息,然后运用scanf重新获取用户输入的学生信息。
3.Student_Delete:
首先输出相应的学号结构体的信息,然后运用for函数,依次将后面一个的学号结构体的信息赋予给前一个学号结构体的信息,从而达到删除的目的。
然后就编写排序Student_Sort_Average,Student_Sort_Mark1排序模块,同样运用for和if函数对每一个学生结构体信息相应的平均分和英语成绩进行一一对比,然后赋值进行排序的目的。
在这两个函数的基础上Student_Display函数就运用printf依次输出上述的排序结果。
接下来则编写Read和Write函数,后者主要运用fprintf和fwrite将用户输入的数据写进去txt文档,fprintf实践当中产生的txt文档更加方便用户直接的观看信息,fwrite产生的txt文档则更加方便系统下一次读入文件使用。
Read主要运用fread函数,主要用于读取fwrite写出txt文档。
最后写得是退出函数由于比较简单直接嵌入在主函数当中,直接用exit来退出系统。
工作流程图:
3.4主要源程序代码
存储结构设计说明:
系统的运行过程中,运用学生信息输入的子模块程序首先输入学生信息,存储过程中主要运用fwrite和fprintf将输入的学生信息存放在txt文件当中。
在运行当中fwrite存储的学生数据文件一般为二进制文件仅能通过系统中编写的得读取程序子模块来读取存储的文件信息。
因此,特意加入fprintf函数,对学生的信息进行直观的存储,用户可以直接通过txt文件打开查看学生信息。
完整源程序清单:
#include/*延时程序所在的头文件*/
#include
#include
#include
structStudent
{
charID[20];
charName[20];
floatMark1;
floatMark2;
floatMark3;
doubleMark_ave;
doubleMark_tot;
}student[1000];/*声明学生数组及学生数量*/
intnum=0;
structStudent*p;
/*输入记录函数*/
voidStudent_Insert()
{
while
(1)
{
printf("请输入学号:
");
scanf("%s",&student[num].ID);
getchar();//清除回车符
printf("请输入:
");
scanf("%s",student[num].Name);
getchar();//清除回车符
printf("请输入英语:
");
scanf("%f",&student[num].Mark1);
getchar();//清除回车符
printf("请输入数学:
");
scanf("%f",&student[num].Mark2);
getchar();//清除回车符
printf("请输入物理:
");
scanf("%f",&student[num].Mark3);
getchar();//清除回车符student[num].Mark_ave=(student[num].Mark1+student[num].Mark2+student[num].Mark3)/3;/*求平均值*/
student[num].Mark_tot=student[num].Mark1+student[num].Mark2+student[num].Mark3;/*求总分*/
num++;
printf("是否继续?
(y/n)");
if(getchar()=='n')
{
break;
}
}
}
/*寻找匹配学号*/
intStudent_Search(charname[])
{
inti;
for(i=0;i{
if(strcmp(student[i].ID,name)==0)
{
returni;
}
}
return-1;
}
/*查找显示函数*/
voidStudent_Select()
{
while
(1)
{
charname[20];
intindex;
printf("请输入要查询的学生的学号:
");
scanf("%s",&name);
getchar();
index=Student_Search(name);
if(index==-1)
{
printf("学生不存在!
\n");
Sleep(2000);/*让错误警告显示延时一秒*/
gotolab;
}
else
p=&student[index];
{
printf("你要查询的学生信息为:
\n");/*显示单条学生记录*/
printf("%10s%10s%8s%8s%8s%10s%10s\n","学号","","英语","数学","物理","平均成绩","总分");
printf("----------------------------------------------------------------\n");printf("%10s%10s%8.2f%8.2f%8.2f%10.2f%10.2f\n",(*p).ID,(*p).Name,(*p).Mark1,(*p).Mark2,(*p).Mark3,(*p).Mark_ave,(*p).Mark_tot);
}
printf("是否继续?
(y/n)");
if(getchar()=='n')
{
break;
}
lab:
break;
}
}
/*删除记录函数*/
voidStudent_Delete()
{
while
(1)
{
charid[20];
intindex;
printf("请输入要删除的学生的学号:
");
scanf("%s",&id);
getchar();
index=Student_Search(id);
if(index==-1)
{
printf("学生不存在!
\n");
Sleep(2000);/*让错误警告显示延时一秒*/
break;
}
else
p=&student[index];
{
printf("你要删除的学生信息为:
\n");/*显示单条学生记录*/
printf("%10s%10s%8s%8s%8s%10s%10s\n","学号","","英语","数学","物理","平均成绩","总分");printf("----------------------------------------------------------------\n");printf("%10s%10s%8.2f%8.2f%8.2f%10.2f%10.2f\n",(*p).ID,(*p).Name,(*p).Mark1,(*p).Mark2,(*p).Mark3,(*p).Mark_ave,(*p).Mark_tot);
printf("是否真的要删除?
(y/n)");
if(getchar()=='y')
{
for(p;p<&student[num-1];p++)
{
(*p)=(*(p++));//把后边的对象都向前移动
}
num--;
}
getchar();
}
printf("是否继续删除y/n)");
if(getchar()=='n')
{
break;
}
}
}
/*修改记录函数*/
voidStudent_Modify()
{
while
(1)
{
charid[20];
intindex;
printf("请输入要修改的学生的学号:
");
scanf("%s",&id);
getchar();
index=Student_Search(id);
if(index==-1)
{
printf("学生不存在!
\n");
Sleep(2000);/*让错误警告显示延时一秒*/
break;
}
else
{
printf("你要修改的学生信息为:
\n");/*显示单条学生记录*/
printf("%10s%10s%8s%8s%8s%10s%10s\n","学号","","英语","数学","物理","平均成绩","总分");printf("----------------------------------------------------------------\n");printf("%10s%10s%8.2f%8.2f%8.2f%10.2f%10.2f\n",student[index].ID,student[index].Name,student[index].Mark1,student[index].Mark2,student[index].Mark3,student[index].Mark_ave,student[index].Mark_tot);
printf("--请输入新值--\n");
printf("请输入学号:
");
scanf("%s",&student[index].ID);
getchar();
printf("请输入:
");
scanf("%s",&student[index].Name);
getchar();
printf("请输入英语:
");
scanf("%f",&student[index].Mark1);
getchar();
printf("请输入数学:
");
scanf("%f",&student[index].Mark2);
getchar();
printf("请输入物理:
");
scanf("%f",&student[index].Mark3);
getchar();student[index].Mark_ave=(student[index].Mark1+student[index].Mark2+student[index].Mark3)/3;
student[index].Mark_tot=student[index].Mark1+student[index].Mark2+student[index].Mark3;
}
printf("是否继续?
(y/n)");
if(getchar()=='n')
{
break;
}
}
}
/*按平均值排序记录函数*/
voidStudent_Sort_Average()
{
inti,j;
structStudenttmp;
for(i=0;i{
for(j=1;j{
if(student[j-1].Mark_ave{
tmp=student[j-1];
student[j-1]=student[j];
student[j]=tmp;
}
}
}
}
/*按英语值排序记录函数*/
voidStudent_Sort_Mark1()
{
inti,j;
structStudenttmp;
for(i=0;i{
for(j=1;j{
if(student[j-1].Mark1{
tmp=student[j-1];
student[j-1]=student[j];
student[j]=tmp;
}
}
}
}
/*显示记录函数*/
voidStudent_Display()
{
printf("%10s%10s%8s%8s%8s%10s%10s\n","学号","","英语","数学","物理","平均成绩","总分");printf("--------------------------------------------------------------------\n");
for(p=student;p<&student[num];p++)
{
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f%10.2f\n",(*p).ID,(*p).Name,(*p).Mark1,(*p).Mark2,(*p).Mark3,(*p).Mark_ave,(*p).Mark_tot);
}
}
/*将学生信息从文件读出*/
voidRead()
{
FILE*fp;
inti;
if((fp=fopen("Database.txt","rb"))==NULL)
{
printf("不能打开文件!
\n");
return;
}
if(fread(&num,sizeof(i),1,fp)!
=1)/*将fp文件中每项四个字节的i写入到num当中*/
{
num=-1;
}
else
{
for(i=0;i{
fread(&student[i],sizeof(structStudent),1,fp);/*读取fp文件里面每项的全部容写入到结构体当中*/
}
}
fclose(fp);
printf("已经成功读取文件");
getchar();
getchar();
}
/*将学生信息写入文件*/
voidWrite()
{
FILE*fp;
inti;
if((fp=fopen("Database.txt","wb"))==NULL)
{
printf("不能打开文件!
\n");
return;
}
if(fwrite(&num,sizeof(i),1,fp)!
=1)/*将输入学生的num指针以每项4个字节输入到fp文件当中*/
{
printf("写入文件错误!
\n");
}
for(i=0;i{
if(fwrite(&student[i],sizeof(structStudent),1,fp)!
=1)/*从结构体学生信息当中获取资料填写到fp文件当中*/
{
printf("写入文件错误!
\n");
}
}
fclose(fp);
p=student;
fp=fopen("学生成绩.txt","w");
fprintf(fp,"%8s","学号");
fprintf(fp,"%8s","");
fprintf(fp,"%8s","英语");
fprintf(fp,"%8s","数学");
fprintf(fp,"%8s","物理");
fprintf(fp,"%12s","平均分");
fprintf(fp,"%12s\n","总分");fprintf(fp,"========================================================================\n");
putchar('\n');
for(i=0;i{
fprintf(fp,"%8s",(*p).ID);
fprintf(fp,"%8s",(*p).Name);
fprintf(fp,"%8.1lf",(*p).Mark1);
fprintf(fp,"%8.1lf",(*p).Mark2);
fprintf(fp,"%10.1lf",(*p).Mark3);
fprintf(fp,"%12.1lf",(*p).Mark_ave);
fprintf(fp,"%10.1lf\n",(*p).Mark_tot);
}fprintf(fp,"========================================================================\n");
fclose(fp);
printf("文件已保存到\"学