学生成绩管理系统c语言结构体以及文件操作实验报告.doc
《学生成绩管理系统c语言结构体以及文件操作实验报告.doc》由会员分享,可在线阅读,更多相关《学生成绩管理系统c语言结构体以及文件操作实验报告.doc(12页珍藏版)》请在冰点文库上搜索。
哈尔滨工业大学(威海)软件学院
C程序设计实验报告
编号:
姓名
孟令鑫
院系
软件学院
学号
131110412
任课教师
于水
指导教师
实验地点
研究院中507-508
实验时间
2013年12月12日
实验名称
文件操作
同组人
无
预习报告(对实验主要内容的认识)
得分
实验目的:
练习使用C语言的标准I/O函数系列处理文件
熟悉二维数组的操作函数、模块化程序设计以及增量测试方法
熟悉结构体类型、结构体数组、写钩体数组函数参数、体会结构体类型代替普通的数组类型实现数据库管理的优越性
熟悉文件的基本操作以及增量的测试方法
实验内容(问题,思路,程序,结果)
得分
一、设计思路:
仔细阅读系统要求,首先将此系统化分为如下模块(即如下函数)
1、输入初始的学生信息:
其中包括学生的学号、姓名、数学、物理、英语成绩等相关信息;使用for循环,以及结构体成员调用一次录入每个学生的成绩等学生信息
2、计算平均和总分模块:
利用两层for循环,计数变量i累加一次循环一个学生、计数变量j进行与科目次数相同的累加循环每个科目的成绩进行累加。
3、按照学生成绩以及姓名字典排序模块:
比较学生成绩的高低以及姓名字典的大小,使用选择法进行排序
4、查询模块:
遍历结构体数组,如果姓名相同则循环输出学生的信息。
5、写文件模块:
使用fopen函数打开文件以后进行循环写入。
一直到最后一个学生。
6、读文件操作模块:
打开文件以后,进行循环输出,一直循环的文件的最末尾。
利用feof()。
7、退出函数,使用exit函数进行操作。
将整个程序模块化编写之后,在主函数中使用while循环调用,使用switc函数进行选择相应的函数功能。
为了防止用户不按照正常的操作流程操作,不进行学生成绩的输入就进行后续操作导致的系统报错或者弹出错误,在调用函数之前使用while循环增加一段容错代码,如果用户第一次选择的不是输入功能则提示用户选择错误并返回循环重新要求用户选择功能,直到用户输出成绩为止,跳出容错的处理循环进行正常的功能选择循环。
最后进行相应的用户使用界面的设计和优化。
二、菜单设计
***************欢迎进入学生成绩管理系统****************
*********programmedbyMenglingxin131110412************
*************************菜单***************************
**1、录入每个学生的学号,姓名,和各科考试成绩!
**
**2、计算每个学生的总分和平均分!
**
**3、按每个学生的总分和平均分从高到低排出名次表!
**
**4、按姓名的字典顺序排出成绩!
**
**5、按姓名查询学生学生排名和考试成绩!
**
**6、输出每个学生的学号,姓名,各科成绩!
**
**7、将每个学生的信息写入文件!
**
**8、从文件读取信息并显示!
**
**9、退出程序!
**
*******************************************************
三、退出界面
***************************************
****谢谢您的使用****
***************************************
四、错误提示界面
***************************************
*****请先录入学生信息和成绩****
***************************************
五、函数代码
1、主函数
/*编程:
孟令鑫131110412
时间:
2013年12月24日
内容;结构体实现学生成绩管理系统*/
#include
#include
#defineCOURSE3
#defineSTUD_N30
#include"lab1.h"
#include"lab2.h"
#include"lab3.h"
#include"lab4.h"
#include"lab5.h"
#include"lab6.h"
#include"lab7.h"
intmain()
{
intchoice,n,pos,j;
STUDENTstu[STUD_N];
charx[10],ch;//定义一个十个字节的字符数组用来存放要查找的姓名
printf("***************欢迎进入学生成绩管理系统****************\n");
printf("*********programmedbyMenglingxin131110412***********\n");
printf("*************************菜单**************************\n");
printf("**1、录入每个学生的学号,姓名,和各科考试成绩!
**\n");
printf("**2、计算每个学生的总分和平均分!
**\n");
printf("**3、按每个学生的总分和平均分从高到低排出名次表!
**\n");
printf("**4、按姓名的字典顺序排出成绩!
**\n");
printf("**5、按姓名查询学生学生排名和考试成绩!
**\n");
printf("**6、输出每个学生的学号,姓名,各科成绩!
**\n");
printf("**7、将每个学生的信息写入文件!
**\n");
printf("**8、从文件读取信息并显示!
**\n");
printf("**9、退出程序!
**\n");
printf("*******************************************************\n");
while
(1)//用来处理用户的错误输入
{
printf("请输入您要进行的操作:
\t");
scanf("%d",&choice);
if(choice==1)
{
n=InputScore(stu,3);//调用录入函数
printf("分数录入完毕!
\n");
break;//如果用户正确的先录入了学生成绩则跳出该错误处理循环
}
elseif(choice==9)
{
printf("***************************************\n");
printf("****谢谢您的使用****\n");
printf("***************************************\n");
exit(0);
}
else//如果没有先录入成绩用户直接进行其他操作则提示用户请先录入学生成绩并反复循环。
{
printf("***************************************\n");
printf("*****请先录入学生信息和成绩****\n");
printf("***************************************\n");
}
}
while
(1)//用while循环实现功能循环操作
{
printf("请输入您要进行的操作:
\t");
scanf("%d",&choice);
switch(choice)
{
case1:
n=InputScore(stu,3);//调用录入函数
printf("分数录入完毕!
\n");
break;
case2:
AverforStudent(stu,n,COURSE);//调用平均数函数
printf("平均分计算完毕!
\n");
break;
case3:
AverforStudent(stu,n,COURSE);//调用平均数函数
sortbystudentsumS(stu,n);//调用排序
printf("《按学生平均分进行降序排序:
》\n");
Print(stu,n,COURSE);
break;
case4:
AverforStudent(stu,n,COURSE);
SortbyName(stu,n);
printf("《按姓名字典输出:
》\n");
Print(stu,n,COURSE);
break;
case5:
AverforStudent(stu,n,COURSE);
do{
printf("请输入您要查找的姓名:
\n");
scanf("%s",x);
pos=LinrSearch(stu,x,n);
if(pos!
=-1)//循环输出学生的成绩和学号等
{
printf("%ld%8s",stu[pos].studentID,stu[pos].studentName);
for(j=0;j{
printf("%4d",stu[pos].score[j]);
}
printf("%4d",stu[pos].sumS);
printf("%6.1f\n",stu[pos].averS);
}
else
{
printf("没有找到这个学生的信息!
\n");
}
printf("您还想继续进行查找吗?
(y/n)");
scanf("%c",&ch);
}while(ch=='y');
break;
case6:
//成绩输出
AverforStudent(stu,n,COURSE);
printf("《成绩输出:
》\n");
Print(stu,n,COURSE);
break;
case7:
//写文件
AverforStudent(stu,n,COURSE);
WritetoFile(stu,n,COURSE);
printf("已经成功写入文件!
\n");
break;
case8:
//读文件
ReadfromFile(stu,COURSE);
PrintScore(stu,n,COURSE);
break;
case9:
printf("***************************************\n");
printf("*********谢谢您的使用********\n");
printf("***************************************\n");
exit(0);
break;
default:
//容错处理
printf("输入错误!
");
break;
}
}
return0;
}
2、各个模块
#include
#include
#defineCOURSE3
#defineSTUD_N30
typedefstructstudent//定义学生的信息结构体
{
longstudentID;
charstudentName[10];
intscore[3];
floataverS;
intsumS;
}STUDENT;
//函数功能:
利用循环输入学生的学号姓名以及成绩等信息。
intInputScore(STUDENTstu[],intm)
{
inti,j,n;
printf("请输入参加考试的人数:
");
scanf("%d",&n);
for(i=0;i{
printf("请输入第%d个学生的信息:
学号,姓名,成绩(数学、英语,物理)\n",i+1);
scanf("%ld",&stu[i].studentID);
scanf("%s",stu[i].studentName);
for(j=0;j{
scanf("%d",&stu[i].score[j]);
}
}
returni;//返回学生人数
}
#include
#include
#defineCOURSE3
#defineSTUD_N30
typedefstructstudent//定义学生信息的结构体
{
longstudentID;
charstudentName[10];
intscore[3];
floataverS;
intsumS;
}STUDENT;
//函数功能:
计算学生的平均分、总分
voidAverforStudent(STUDENTstu[],intn,intm)
{
inti,j;
for(i=0;i{
stu[i].sumS=0;
for(j=0;j{
stu[i].sumS=stu[i].sumS+stu[i].score[j];
}
stu[i].averS=stu[i].sumS/m;
}
}
//函数功能:
循环输出学生的成绩信息
voidPrint(STUDENTstu[],intn,intm)
{
inti,j;
for(i=0;i{
printf("%10ld%8s\t",stu[i].studentID,stu[i].studentName);
for(j=0;j{
printf("%d\t",stu[i].score[j]);
}
printf("%d\t",stu[i].sumS);
printf("%6.1f\t",stu[i].averS);
printf("\t%d\n",i+1);
}
}
#include
#include
#include
#defineCOURSE3
#defineSTUD_N30
typedefstructstudent//定义学生的信息结构体
{
longstudentID;
charstudentName[10];
intscore[3];
floataverS;
intsumS;
}STUDENT;
//声明打印的函数
voidPrint(STUDENTstu[],intn,intm);
//函数功能:
按照学生的总分进行排序
voidsortbystudentsumS(STUDENTstu[],intn)
{
inti,j,k,t,d;
longa;
charb[10];
intc;
floate;
for(i=0;i{
k=i;
for(j=i+1;j{
if(stu[j].sumS>stu[k].sumS)
{
k=j;
}
}
if(k!
=i)
{
//交换学号。
a=stu[k].studentID;
stu[k].studentID=stu[i].studentID;
stu[i].studentID=a;
//交换姓名
strcpy(b,stu[k].studentName);
strcpy(stu[k].studentName,stu[i].studentName);
strcpy(stu[i].studentName,b);
//交换成绩
for(t=0;t{
d=stu[i].score[t];
stu[i].score[t]=stu[k].score[t];
stu[k].score[t]=d;
}
//交换总分。
c=stu[k].sumS;
stu[k].sumS=stu[i].sumS;
stu[i].sumS=c;
//交换平均分。
e=stu[k].averS;
stu[k].averS=stu[i].averS;
stu[i].averS=e;
}
}
}
#include
#include
#include
#defineCOURSE3
#defineSTUD_N30
typedefstructstudent
{
longstudentID;
char