C程序设计之学生信息管理报告.docx
《C程序设计之学生信息管理报告.docx》由会员分享,可在线阅读,更多相关《C程序设计之学生信息管理报告.docx(33页珍藏版)》请在冰豆网上搜索。
C程序设计之学生信息管理报告
目录
一﹑需求分析……………………………………………………………2
二﹑概要设计……………………………………………………………2
三﹑详细设计……………………………………………………………4
四﹑调试分析……………………………………………………………8
五﹑用户手册……………………………………………………………9
六﹑测试数据……………………………………………………………9
七﹑附录………………………………………………………………10
一﹑需求分析
学生信息管理系统主要提供成绩查询,方便管理的网上信息查阅平台,根据开发要求,学生信息管理系统主要应用于教育系统,完成对学生成绩的计算机化的管理。
程序需要以下规定:
1.输入形式也输入值范围:
需要输入的包括学生姓名﹑学号﹑chinese﹑math﹑chinesepingshi﹑mathpingshi﹑percentage等信息,因为分数信息都是采用int类型,所以输入的数据是需要是整数,输入值的范围在0-100之间。
2.输出的形式:
将所输入的信息全部显示出来。
3.程序所能达到的功能:
⑴更新学生成绩信息:
录入学生成绩信息:
姓名,学号,chinese,math,chinesepingshi,mathpingshi,percentage;
增加学生成绩信息;
修改学生成绩信息:
输入密码“888888”,再按照学生姓名进行修改。
⑵查询学生成绩信息:
按照姓名查询学生的信息。
⑶排序:
计算总评成绩,将学生的总评成绩按照由大到小的顺序进行排序。
⑷统计信息:
该模块主要应用于计算chinese和math的平均成绩average,之后再显示和比较出低于chinese和math的平均分的学生的信息。
⑸显示信息:
该模块主要是显示出文件中的所有学生信息,并且找出chinese和math成绩中,90分以上和60分以下的学生成绩信息。
⑹文件操作:
保存和读取文件中的数据信息。
⑺退出程序。
二﹑概要设计
1.本程序所用的数据类型是整型int,所用的调用函数也是整型int。
2.本程序所用的是数据结构,定义了一个结构体类型structstudent,来保存学生信息的数据到结构体,形式为stu[i].name,stu[i].num,stu[i].chinese,stu[i].math,stu[i].chinesepingshi,stu[i].mathpingshi,stu[i].percentage。
3.各自定义的子函数的名称分别为录入函数intinput(),增加函数intadd(),查找函数intsearch(),修改函数intmodify(),排序函数intsort(),统计函数intcount(),打印函数intdisplay(),保存文件函数voidsave(),读出文件函数intout()
4.本程序模块结构
主函数模块:
Voidmain
{定义变量i;
While{
Menu();
Switch(i){
选择调用函数接受命令;
Break;}
}
}
主程序流程和个函数之间的层次关系:
三﹑详细设计
模块流程图:
#include
#include
#defineN20
#defineM2/*宏定义学生样本容量*/
voidsave();/*保存文件函数*/
typedefstructstudent{/*定义结构体变量structstudent*/
charname[N];
intnum;
intchinese;
intmath;
intchinesepingshi;/*语文平时成绩*/
intmathpingshi;/*数学平均成绩*/
intpercentage;/*平时成绩所占百分比*/
}Stu;
Stustu[M];
//----------基本操作的算法描述--------------------
1.录入函数input():
输入学生成绩信息,实现录入功能,将成绩保存在结构体数组stu[i]中。
intinput()
{
inti;/*定义变量i*/
for(i=0;i{
printf("Name:
\n");/*输入姓名*/
scanf("%s",&stu[i].name);/*保存在结构体数组stu中*/
printf("Num:
\n");/*输入学号*/
scanf("%d",&stu[i].num);
printf("chinese:
\n");/*输入语文成绩*/
scanf("%d",&stu[i].chinese);
printf("math:
\n");/*输入数学成绩*/
scanf("%d",&stu[i].math);
printf("chinesepingshi:
\n");/*输入语文平时成绩*/
scanf("%d",&stu[i].chinesepingshi);
printf("mathpingshi:
\n");/*输入数学平时成绩*/
scanf("%d",&stu[i].mathpingshi);
printf("percentage:
\n");/*平时成绩所占百分比*/
scanf("%d",&stu[i].percentage);
}
for(i=0;i{
printf("Name:
%s\n",stu[i].name);
printf("Num:
%d\n",stu[i].num);
printf("chinese:
%d\n",stu[i].chinese);
printf("math:
%d\n",stu[i].math);
printf("chinesepingshi:
%d\n",stu[i].chinesepingshi);
printf("mathpingshi:
%d\n",stu[i].mathpingshi);
}
save();/*保存信息到文件*/
}
2.增加函数add():
添加学生信息到结构体stu[i]并保存到文件中,实现添加功能。
intadd()
{
inti;/*定义结构体变量*/
for(i=0;iout();/*读入信息*/
{
printf("Name:
\n");
scanf("%s",&stu[i].name);
printf("Num:
\n");
scanf("%d",&stu[i].num);
printf("chinese:
\n");
scanf("%d",&stu[i].chinese);
printf("math:
\n");
scanf("%d",&stu[i].math);
printf("chinesepingshi:
\n");
scanf("%d",&stu[i].chinesepingshi);
printf("mathpingshi:
\n");
scanf("%d",&stu[i].mathpingshi);
printf("percentage:
\n");
scanf("%d",&stu[i].percentage);
}
save();/*保存信息*/
}
3.查找函数intsearch():
查询个别学生成绩信息,实现查询功能。
通过用字符串比较函数strcmp比较学生姓名的字符串来实现通过学生姓名来查询学生成绩信息。
intsearch()
{
charb[N];/*定义字符b*/
inti;/*定义变量i*/
out();/*读入信息*/
printf("pleaseinputthenameofthestudentyouwanttofind:
\n");/*输入查找的学生姓名*/
scanf("%s",b);/*接受字符b*/
for(i=0;i{
if(strcmp(b,stu[i].name)==0)/*比较字符串的长度*/
{
printf("thisisthedatawhichyouwanttofind:
\n");
printf("name:
%s\n",stu[i].name);
printf("num:
%d\n",stu[i].num);
printf("chinese:
%d\n",stu[i].chinese);
printf("math:
%d\n",stu[i].math);
printf("chinesepingshi:
%d\n",stu[i].chinesepingshi);
printf("mathpingshi:
%d\n",stu[i].mathpingshi);
getche();/*添加getche语句使程序暂停*/
break;/*退出循环*/
}
else
printf("sorry!
notfindyourdata");
}
}
4.修改函数intmodify():
修改个别学生成绩信息,实现修改功能。
首先输入密码,有三次机会输入密码,用i来控制输入密码的次数,密码正确才可输入修改学生的姓名。
通过用字符串比较函数strcmp比较学生姓名的字符串来实现通过学生姓名来修改学生成绩信息。
intmodify()
{
charpassword[7]="888888";/*设定密码*/
inti,flag;/*定义变量i,flag*/
charb[M],s[8];/*定义字符b,s*/
flag=0;/*给变量赋值*/
out();/*读入信息*/
for(i=0;i<3&&(flag==0);i++)/*在机会小于三次时循环*/
{
printf("pleaseinputthepassword:
\n");/*输入密码*/
scanf("%s",&s);
if(strcmp(s,password)==0)/*通过字符串比较来验证密码正确性*/
{
flag=1;/*密码正确*/
break;/*退出循环*/
}
else
{
printf("error,inputthepasswordagain:
\n");/*密码错误,再次输入*/
}
}
if(i==3)/*若i为3*/
{
printf("youhaveover3time!
");/*超过三次就会*/
getche();/*暂停程序*/
}
if(flag==1)/*密码输入成功*/
{
printf("pleaseinputthenameofthestudentyouwanttofind:
\n");/*输入需要修改的名字*/
scanf("%s",&b);
for(i=0;i{
if(strcmp(b,stu[i].name)==0)/*通过字符串比较出结构体中名字的正确性*/
{
printf("chinese:
\n");/*输入需要修改的语文成绩*/
scanf("%d",&stu[i].chinese);
printf("math:
\n");
scanf("%d",stu[i].math);
printf("chinesepingshi:
\n");
scanf("%d",stu[i].chinesepingshi);
printf("mathpingshi:
\n");
scanf("%d",stu[i].mathpingshi);
printf("percentage:
\n");
scanf("%d",stu[i].percentage);
}
}
}
}
5.排序函数intsort():
将信息按顺序输出,便于浏览,实现排序功能。
将总评成绩的高低来排序输出学生信息。
此模块的排序用到冒泡排序法来实现总评排序。
intsort()
{
intsum[M],i,t,j;/*定义数组sum和临时变量t*/
out();/*读入信息*/
for(i=0;i{
sum[i]=stu[i].chinesepingshi*stu[i].percentage+stu[i].chinese*(100-stu[i].percentage)/100+stu[i].mathpingshi*stu[i].percentage+stu[i].math*(100-stu[i].percentage)/100;/*计算总评成绩*/
for(i=0;i{
for(j=0;j{
if(sum[j]{
t=sum[j];
sum[j]=sum[j+1];
sum[j+1]=t;
}
}
}
for(i=0;i{
printf("%s\t",stu[i].name);
printf("%d\t",stu[i].num);
printf("%d\n",sum[i]);
}
getche();/*暂停程序*/
}
6.统计函数intcount():
统计学生成绩的信息,计算出学生的每门平均成绩以及打印出低于每门平均成绩的学生的信息。
intcount()
{
intchin_aver=0,math_aver=0,chin_sum=0,math_sum=0;
inti;
out();
for(i=0;i{
chin_sum+=stu[i].chinese;/*计算所有学生此科目总成绩*/
}
chin_aver=chin_sum/M;/*计算语文科目的平均成绩*/
printf("theaveragegradeofchinese:
%d\n",chin_aver);
for(i=0;i{
math_sum+=stu[i].math;/*计算所有科目此学生的总成绩*/
}
math_aver=math_sum/M;/*计算数学科目的平均成绩*/
printf("theaveragegradeofmath:
%d\n",math_aver);
for(i=0;i{
if(stu[i].chinese{
printf("lowerofchin_averstudentinformation:
\n%s\n%d\n%d\n",stu[i].name,stu[i].num,stu[i].chinese);
printf("lowerofmath_averstudentinformation:
\n%s\n%d\n%d\n",stu[i].name,stu[i].num,stu[i].math);
}
}
getche();
}
7.打印函数intdisplay():
打印出学生的所有成绩信息,再通过比较找出每门科目中高于90分和低于60分的学生信息,并打印出来。
intdisplay()
{
inti;
out();
for(i=0;i{
printf("Name:
%s\n",stu[i].name);
printf("Num:
%d\n",stu[i].num);
printf("chinese:
%d\n",stu[i].chinese);
printf("math:
%d\n",stu[i].math);
printf("chinesepingshi:
%d\n",stu[i].chinesepingshi);
printf("mathpingshi:
%d\n\n",stu[i].mathpingshi);
printf("percetage:
%d\n",stu[i].percentage);
}
for(i=0;i{
if(stu[i].chinese>90||stu[i].math>90)/*比较成绩是否高于90分*/
printf("higher90scorestudentinformation:
%s\n%d\n%d\n%d\n",stu[i].name,stu[i].num,stu[i].chinese,stu[i].math);
elseif(stu[i].chinese<60||stu[i].math<60)/*比较成绩是否低于60分*/
printf("lower60scorestudentinformation:
%s\n%d\n%d\n%d\n",stu[i].name,stu[i].num,stu[i].chinese,stu[i].math);
else
continue;
}
getche();
}
8.保存文件函数voidsave():
将信息保存到文件中,运行修改﹑增加﹑删除﹑排序﹑统计等功能后,可将文件另存为或保存到源文件中。
voidsave()
{
FILE*fp;
inti;
if((fp=fopen("e:
\\log.txt","wb"))==NULL)/*打开位于e盘的文件*/
{
printf("cannotopenfile");
return;
}
for(i=0;iif(fwrite(&stu[i],sizeof(structstudent),1,fp)!
=1)/*将fp指向的数组中每次写入一个信息到文件*/
printf("filewriteerror\n");/*写入错误*/
fclose(fp);/*关闭文件*/
}
9.读出文件函数intout():
将文件中的信息读出来,以便对其进行操作。
intout()
{
FILE*fp;
inti;
if((fp=fopen("e:
\\log.txt","rb"))==NULL)
{
printf("canopenfile\n");
return;
}
for(i=0;iif(fread(&stu[i],sizeof(structstudent),1,fp)!
=1)/*将fp指向的数组中每次读出一个信息循环读出*/
{
if(feof(fp))
{
fclose(fp);
return;
}
}
fclose(fp);/*关闭文件*/
}
10.主函数voidmain():
voidmain()
{
inti;
intmenu();/*菜单*/
while
(1)/*循环开始*/
{
printf("***********welcometonanchanghangkonguniversitytheschoolofsoftware!
**************");
menu();
printf("\n");
printf("enteryourchoicefrom1to8:
");/*进行选择语句1-8*/
scanf("%d",&i);
switch(i)/*switch语句选择功能*/
{
case1:
input();break;/*输入函数*/
case2:
add();break;/*增加函数*/
case3:
search();break;/*查找函数*/
case4:
modify();break;/*修改函数*/
case5:
sort();break;/*排序函数*/
case6:
count();break;/*统计函数*/
case7:
display();break;/*统计函数*/
case8:
exit();break;/*退出程序*/
default:
break;
}
}
}_
四﹑调试分析
1.调试过程中遇到的问题及解决方法:
⑴在成绩录入input模块中,第一名学生的成绩录入成功,但是后来的学生的成绩出现乱码的情况,无法录入学生的姓名等信息。
解决方法:
后来经过仔细检查发现各个子函数均采用的int类型,而平均成绩所占百分比percentage使用的是float类型,所以后来把其改为int类型后,在计算总评成绩时做了修改,避免了大范围的修改,同时也完成了原本的功能。
⑵在使用增加模块增加add学生信息后,使用打印模块display打印所有学生的成绩时出现了乱码的情况。
解决方法:
检查发现是程序所申请的样本空间太小,所以打印不出超出样本空间的数据,后来修改了样本空间,在前部分宏定义了defineM,解决了不能打印的情况。
⑶程序出现了警告warming,许多警告是指没有定义就使用了变量。
解决方法:
在主函数和子函数中均定义了变量,并对变量进行了赋值后,解决了问题,使得运行正常了。
2.经验与体会:
我体会到程序的设计需要经过精细的计算和设计,使用的变量之前都要先进行定义,遇到问题及困难的时候要多想想,自己独立查找资料来解决问题。
虽然采取了许多防止出错的方法,特别是对输入错误数据的防范措施,但系统测试仍然是发现系统存在错误,后来我在老师的帮助下进行了一系列的改正﹑修复﹑以及重新编写某些函数,并对程序中的每一个块﹑一条语句和逻辑思路都进行了反复测试,运行结果基本符合要求。
同时,我也积累了一定的经验,熟悉了许多子函数的编写以及循环的使用,这次课设是我对之前的知识漏洞有了一个补充和掌握,对之前学的知识进行了巩固。
多谢老师和同学的帮助!
五﹑用户手册
用户使用说明:
1.本程序运行环境为TC系统,按ctrl+f9进入运行界面,后会显示程序菜单;包括8个功能模块;
2.使用键盘输入需要选择功能的数字,如按下1+enter,则进入input输入界面,此时输入需要录入的学生信息,如按下name+enter,则将学生姓名的信息进行了输入,按照这个方式依据提示一次输入学生的姓名﹑学号﹑chinese﹑math﹑chinesepingshi﹑mathpingshi﹑percentage的信息,最后按下enter完成输入;
3.此时程序又进入到菜单界面,方法同上按下2+enter,则进入add增加界面,此时输入需要增加的学生信息,方法同上,最后按下enter完成学生成绩的增加输入;
4.此时程序又进入到菜单界面,方法同上按下3+enter,则进入到查找界面,此时显示打开文件“canopenfile”,之后输入需要查找的学生姓名按下enter,即完成查找,显示学生查找学生信息,最后按下e