程序设计实验报告.docx
《程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《程序设计实验报告.docx(38页珍藏版)》请在冰豆网上搜索。
程序设计实验报告
程序设计报告
(2012/2013学年第一学期)
题目:
学生信息管理系统
专业
学生姓名
班级学号
指导教师
指导单位计算机学院软件教学中心
日期
学生信息管理系统
一、课题要求
该系统要求对一个文件中所存储的学生数据进行各种常规操作,如:
排序、查找、计算、显示等功能。
通过此课题,熟练掌握文件、数组、结构体的各种数据描述和操作,以及一些算法思想的应用,实现一个简单的学生管理系统。
功能要求:
(1)学生信息包括:
学号,姓名,性别,出生(年,月,日),三门课成绩和总分(数学,英语,C语言,总分)。
(2)数据格式:
测试数据,以文件方式提供,studf.txt,数据文件自己建立。
(3)需要实现的功能
1)建立学生信息结构数组 从文件中读入数据
2)按姓名递增冒泡排序
3)按总分递减选择排序
4)按学号递增冒泡排序
5)显示按总分排序后学生信息
6)按学号查学生信息和平均分数
7)按姓名查学生信息和平均分数
8)查各门课平均分数
二、需求分析
本系统应具有以下功能:
1.数据输入功能:
数据包括学生学号、性别、出生(年,月,日)、三门成绩和总分(数学,英语,c语言,总分)等。
以及输入的学生姓名等操作。
2、计算功能:
在输入学生分数及学生信息时,自动查找和显示学生的成绩。
3、查询功能:
(1)按学号查学生信息和平均分数。
(2)也可以按姓名查学生信息和平均分数来显示学生信息。
4、排序功能:
可按姓名递增选择排序法排序,按学号冒泡排序法排序以及按总分递减排序。
5、数据显示功能:
可浏览输入、查询或排序后的数据,显示学生的个人信息。
三、概要设计
方案设计
(1)、输入模块:
录入需要管理的学生信息并将信息保存于文件中,以方便日后进行打印、读取、修改等操作。
(2)、输出模块:
将所有学生信息或想要查询的学生信息显示于屏幕,用于打印学生信息或查找某些学生信息。
(3)、查询模块:
可对已建立的学生信息进行查询,并且可根据需要选择按姓名,学号,总分查询。
(4)、统计模块:
对学生四门成绩平均成绩的统计。
(5)、排序模块:
对学生成绩由高到低的排序。
(6)、退出系统:
选择该项,自动退出该系统。
四、详细设计
数据结构:
structdate
{
intyear;
charmonth;
charday;
};
structstudent
{
charno[10];
charname[9];
charsex[3];
structdatebirthday;
intscore[4];
intrescore[4];
};
(1)、输入模块
voidreadsi(structstudentstud[],int*n)
{
FILE*fp;
inti;
if((fp=fopen("J:
\\studf.txt","r"))==NULL)
{
printf("无法打开studf.txt文件!
\n");
exit
(1);
}
for(i=0;!
feof(fp);i++)
{
(*n)++;
if(*n>N)
{
printf("最多处理30位学生信息!
\n");
return;
}
fscanf(fp,"%s%s%s%d%d%d%d%d%d",stud[i].no,stud[i].name,stud[i].sex,&stud[i].birthday.year,&stud[i].birthday.month,&stud[i].birthday.day,&stud[i].score[0],&stud[i].score[1],&stud[i].score[2]);
stud[i].score[3]=stud[i].score[0]+stud[i].score[1]+stud[i].score[2];
}
fclose(fp);
}
(2)、输出模块(显示学生信息)
voidprintsi(structstudent*pstud,intn)
{
inti,k=0;
printf("学号姓名性别年月日数学英语C语言总分\n");
printf("┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉\n");
printf("======================================================================\n");
for(i=0;i{
printf("%-8s%-8s%-2s%4d%2d%2d%4d%4d%4d%5d\n",pstud[i].no,pstud[i].name,pstud[i].sex,pstud[i].birthday.year,pstud[i].birthday.month,pstud[i].birthday.day,
pstud[i].score[0],pstud[i].score[1],pstud[i].score[2],pstud[i].score[3]);
k++;
}
}
(3)、查询模块
1按照学号查找学生成绩(顺序查找)的关键代码
for(i=0;i{
if(strcmp(no,pstud[i].no)==0)
printf("已找到学号为%-8s的学生\n学号:
%-8s\n姓名:
%-8s\n性别:
%-2s\n%4d年%2d月%2d日\n数学:
%4d\n英语:
%4d\nc:
%4d\n总分%4d\n平均分数为:
%4d\n",pstud[i].no,pstud[i].no,pstud[i].name,pstud[i].sex,pstud[i].birthday.year,pstud[i].birthday.month,pstud[i].birthday.day,pstud[i].score[0],pstud[i].score[1],pstud[i].score[2],pstud[i].score[3],pstud[i].score[3]/3);
else
j++;
}
if(j==30)
printf("未找到学号为%-8s的学生\n",no);
}
2按照姓名查找学生成绩
折半查找函数intbsrch(structstudentpname[],intn,char*name)的代码:
intlower=0,upper=n-1,mid;
if(strcmp(name,pname[lower].name)==0)returnlower;
elseif(strcmp(name,pname[upper].name)==0)returnupper;
else
while(lower<=upper)
{
mid=(lower+upper)/2;
if(strcmp(name,pname[mid].name)==0)
returnmid;
elseif(strcmp(name,pname[mid].name)>0)
lower=mid+1;
else
upper=mid-1;
}
return-1;
此处按照学生姓名查找成绩是运用了折半查找的方法,根据折半查找函数的返回值确定有没有找到该学生:
i=bsrch(pname,n,name);
if(i!
=-1)
printf("已找到该学生信息:
%-8s%-8s%-2s%4d%2d%2d%4d%4d%4d%5d\n",pname[i].no,pname[i].name,pname[i].sex,
pname[i].birthday.year,pname[i].birthday.month,pname[i].birthday.day,pname[i].score[0],pname[i].score[1],pname[i].score[2],pname[i].score[3]);
else
printf("%d没有找到该学生资料!
\n",name);
for(;;)
{i=i-1;
if(strcmp(name,pname[i].name)==0)printf("已找到该学生信息:
%-8s%-8s%-2s%4d%2d%2d%4d%4d%4d%5d\n",
pname[i].no,pname[i].name,pname[i].sex,
pname[i].birthday.year,pname[i].birthday.month,
pname[i].birthday.day,
pname[i].score[0],pname[i].score[1],pname[i].score[2],
pname[i].score[3]);
else
break;
}
i=bsrch(pname,n,name);
for(;;)
{i=i+1;
if(strcmp(name,pname[i].name)==0)printf("已找到该学生信息:
%-8s%-8s%-2s%4d%2d%2d%4d%4d%4d%5d\n",
pname[i].no,pname[i].name,pname[i].sex,
pname[i].birthday.year,pname[i].birthday.month,
pname[i].birthday.day,
pname[i].score[0],pname[i].score[1],pname[i].score[2],
pname[i].score[3]);
else
break;
3查询各门课程的平均分数
关键代码:
staticsum1=0,sum2=0,sum3=0,score=0;
inti;
for(i=0;i{
sum1=sum1+pstud[i].score[0];
sum2=sum2+pstud[i].score[1];
sum3=sum3+pstud[i].score[2];
}
printf("数学平均分数:
%4d\n",sum1/n);
printf("英语平均分数:
%4d\n",sum2/n);
printf("c语言平均分数:
%4d\n",sum3/n);
(4)、排序模块
1根据姓名排序信息
A姓名递增选择法排序的关键代码:
structstudenttemp;
for(k=0;k{
index=k;
for(i=k+1;iif(strcmp(pname[i].name,pname[index].name)<0)
index=i;
if(index!
=k)
{
temp=pname[k];
pname[k]=pname[index];
pname[index]=temp;
}
B显示姓名排序后的学生信息的关键代码:
printf("学号姓名性别年月日数学英语C总分\n");
printf("=====================================================\n");
for(i=0;i{
printf("%-8s%-8s%-2s%4d%2d%2d%4d%4d%4d%5d\n",
parray[i].no,parray[i].name,parray[i].sex,
parray[i].birthday.year,parray[i].birthday.month,parray[i].birthday.day,
parray[i].score[0],parray[i].score[1],parray[i].score[2],parray[i].score[3]);
}
2根据总分排序信息
按照总分选择法排序的代码和按姓名排序代码类似,
for(i=0;ifor(j=0;jif(ptscore[j].score[3]{
temp=ptscore[j];
ptscore[j]=ptscore[j+1];
ptscore[j+1]=temp;
}
然后显示按总分排序后的学生信息表:
printf("按总分排序后的学生信息表\n");
printf("┏━━━━┳━━━━┳━━━┳━━━━━━┳━━━┳━━━┳━━━┳━━━┓\n");
printf("┃学号┃姓名┃性别┃年月日┃数学┃英语┃C┃总分┃\n");
printf("┣━━━━╋━━━━╋━━━╋━━━━━━╋━━━╋━━━╋━━━╋━━━┫\n");
for(i=0;i{
printf("┃%-8s┃%-8s┃%-2s┃%4d%2d%2d┃%4d┃%4d┃%4d┃%4d┃\n",stud[i].no,stud[i].name,stud[i].sex,stud[i].birthday.year,stud[i].birthday.month,stud[i].birthday.day,stud[i].score[0],stud[i].score[1],stud[i].score[2],stud[i].score[3]);
if(i==n-1)
printf("┗━━━━┻━━━━┻━━━┻━━━━━━┻━━━┻━━━┻━━━┻━━━┛\n");
else
printf("┣━━━━╋━━━━╋━━━╋━━━━━━╋━━━╋━━━╋━━━╋━━━┫\n");
k++;
}
3根据学号排序信息
首先利用冒泡法按照学号排序;
for(i=0;ifor(j=0;jif(strcmp(stud[j].no,stud[j+1].no)>0)
{
strcpy(t,stud[j].no);
strcpy(stud[j].no,stud[j+1].no);
strcpy(stud[j+1].no,t);
strcpy(x,stud[j].name);
strcpy(stud[j].name,stud[j+1].name);
strcpy(stud[j+1].name,x);
strcpy(y,stud[j].sex);
strcpy(stud[j].sex,stud[j+1].sex);
strcpy(stud[j+1].sex,y);
p=stud[j].birthday.year;
stud[j].birthday.year=stud[j+1].birthday.year;
stud[j+1].birthday.year=p;
q=stud[j].birthday.month;
stud[j].birthday.month=stud[j+1].birthday.month;
stud[j+1].birthday.month=q;
r=stud[j].birthday.day;
stud[j].birthday.day=stud[j+1].birthday.day;
stud[j+1].birthday.day=r;
s=stud[j].score[0];
stud[j].score[0]=stud[j+1].score[0];
stud[j+1].score[0]=s;
w=stud[j].score[1];
stud[j].score[1]=stud[j+1].score[1];
stud[j+1].score[1]=w;
u=stud[j].score[2];
stud[j].score[2]=stud[j+1].score[2];
stud[j+1].score[2]=u;
v=stud[j].score[3];
stud[j].score[3]=stud[j+1].score[3];
stud[j+1].score[3]=v;
}
然后输出信息:
for(i=0;i{
printf("%-8s%-8s%-2s%4d%2d%2d%4d%4d%4d%5d\n",stud[i].no,stud[i].name,stud[i].sex,stud[i].birthday.year,stud[i].birthday.month,stud[i].birthday.day,stud[i].score[0],stud[i].score[1],stud[i].score[2],stud[i].score[3]);}
4插入补考或休学学生信息后排序
如果选择了插入补考后成绩,则会先输入该学生的学号,if(strcmp(no,rescore[i].no)==0)
printf("已找到学号为%-8s的学生\n学号:
%-8s\n姓名:
%-8s\n性别:
%-2s\n%4d年%2d月%2d日\n语文:
%4d\n数学:
%4d\n英语:
%4d\n总分%4d\n平均分数:
%4d\n",rescore[i].no,rescore[i].no,rescore[i].name,rescore[i].sex,rescore[i].birthday.year,rescore[i].birthday.month,rescore[i].birthday.day,rescore[i].score[0],rescore[i].score[1],rescore[i].score[2],rescore[i].score[3],rescore[i].score[3]/3);然后选择要修改的某一门成绩:
printf("1.插入语文补考成绩\n");
printf("2.插入数学补考成绩\n");
printf("3.插入英语补考成绩\n");
scanf("%d",&b);
switch(b)
{
case1:
printf("请输入语文补考成绩\n");
scanf("%d",&c);
rescore[i].score[0]=c;
break;
case2:
printf("请输入数学补考成绩\n");
scanf("%d",&c);
rescore[i].score[1]=c;
break;
case3:
printf("请输入英语补考成绩\n");
scanf("%d",&c);
rescore[i].score[2]=c;
break;
default:
printf("请在1--3之间选择!
\n");
break;
}
如果选择了显示补考后的总分排序情况,则会先根据选择法排序信息,接着输出信息:
for(i=0;ifor(j=0;jif(rescore[j].score[3]{
temp=rescore[j];
rescore[j]=rescore[j+1];
rescore[j+1]=temp;
}
(5)、统计模块
统计每门课程的平均成绩
for(i=0;i{
sum1=sum1+pstud[i].score[0];
sum2=sum2+pstud[i].score[1];
sum3=sum3+pstud[i].score[2];
}
printf("数学平均分数:
%4d\n",sum1/n);
printf("英语平均分数:
%4d\n",sum2/n);
printf("c语言平均分数:
%4d\n",sum3/n);
五,测试
开始程序
******************欢迎使用学生信息管理系统********************
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃******************1.显示所有学生信息************************┃
┃******************2.根据姓名排序信息************************┃
┃******************3.根据总分排序信息************************┃
┃******************4.根据学号排序信息************************┃
┃******************5.按照学号查找学生成绩********************┃
┃******************6.按照姓名查找学生成绩********************┃
┃******************7.查询各门课程平均分数********************┃
┃******************8.插入补考或休学学生信息后排序************┃
┃******************0.退出信息管理系统************************┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
请选择功能<0,1,2,3,4,5,6,7,8>:
1
学号姓名性别年月日数学英语C语言总分
┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉
====================================================================
110203李红女199324877685248
110226海明男19941018677687230
110210周强男1992825878996272
110213王杰男199429564565166
110208张娟女199358877981247
110216刘明男1994918676881216
110205马克男1992812588990237
110204吕婷女199474797685240
110214张国男19941018817687244
110222李强男1