数据结构 学生信息管理系统.docx
《数据结构 学生信息管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构 学生信息管理系统.docx(8页珍藏版)》请在冰豆网上搜索。
![数据结构 学生信息管理系统.docx](https://file1.bdocx.com/fileroot1/2023-2/3/6a311fb6-67c4-452d-af80-b52cb21a5c43/6a311fb6-67c4-452d-af80-b52cb21a5c431.gif)
数据结构学生信息管理系统
设计报告
设计要求:
已知在磁盘上有一个文本文件(stuin.txt),此文件存放了一组学生的成绩信息,按照如下格式存放:
1001Student189
1002Student278
1003Student360
……
1010Student10100
a.定义一个结构体类型数组,结构体类型含有学号、姓名和成绩三个域;
b.将文本文件的内容读入到结构体数组中;
c.显示成绩最高的人的学号、姓名和成绩(如果有相同的人要全部显示);
d.显示平均成绩、高于、低于和等于平均成绩的人数;
e.显示成绩为优秀(100~90)、良好(89~80)、中等(79~70)、及格(69~60)、不及格(59~0)的人数和所占百分比;
f.将以上显示的信息存放到stuout.txt文件中;
设计过程:
我采用模块化设计思想,将不同的任务交由不同的函数来实现。
一、首先是文件的读写过程,因为对语法规则了解的不多,所以浪费了很多时间。
原先试图采用“fread”和“fwrite”来实现读写过程,估计是二进制和字符转换还有回车键处理得不好,显示时有乱码;最后决定采用“fprint”和“fscanf”这两个比较容易操作的函数,问题得到了解决。
第一个函数“voidread()”设计完成。
二、求最大值是老问题,很好解决,但题目还要求显示出重复的最大值的位置。
开始设想在比较最大值的同时记录并列数据的位置,但遇到一个更大的数据时,前面记录的重复数据就要被清空并重新记录,代码有些繁琐;最后采用先用一个循环判断出最大值,再用一个循环判断是否有并列的数据,并记录其位置(“num[j]”记录的是位置,“j”是并列最大值的个数)。
三、计算平均成绩也比较简单,采用“if”语句就能够解决。
四、成绩分类时使用了“switch语句”。
程序代码:
/*程序目的:
从磁盘读取数据,分析整理后将新数据显示出来并保存之新文件*/
/*作者:
陈扬君*/
/*完成时间:
2008年6月20日*/
#include"stdio.h"
#defineSIZE10//原数据的序列数
voidread();//声明读取数据函数
voidmax_score();//声明求最大值的函数
voidaverage();//声明求平均数的函数
voidrow();//声明排列顺序的函数
structstudent//定义student结构体
{
intnum;
charname[10];
floatscore;
}stud[SIZE];
voidmain()
{
read();//调用读取数据函数
max_score();//调用求最大值的函数
average();//调用求平均数的函数
row();//调用排列顺序的函数
}
voidread()//定义读取数据函数
{
FILE*fp;
inti;
if((fp=fopen("stuin.txt","r+"))==NULL)//如果文件无法打开则显示提示信息
{
printf("can'topenfile!
\n");
return;
}
printf("学生成绩如下:
\n");
for(i=0;i{
fscanf(fp,"%d%s%f",&stud[i].num,stud[i].name,&stud[i].score);
printf("%d%s%3.1f\n",stud[i].num,stud[i].name,stud[i].score);
}
fp=fopen("stuout.txt","w+");//创建新文档并将显示的数据保存
fprintf(fp,"学生成绩如下:
\n");
for(i=0;i{
fprintf(fp,"%d%s%3.1f\n",stud[i].num,stud[i].name,stud[i].score);
}
fclose(fp);
}
voidmax_score()//定义求最大值的函数
{
FILE*fp;
floatm;
intnum[SIZE];//确定最大值所在的位置
inti,j=0,k;
m=stud[0].score;
num[j]=0;
for(i=0;i{
if(m{
m=stud[i+1].score;
num[j]=i+1;
}
}
for(i=0;i{
if(m==stud[i+1].score)
num[j++]=i+1;
}
fp=fopen("stuout.txt","a+");//将新数据追加至stuout.txt文件
printf("\n成绩最高的学生是:
\n");
fprintf(fp,"\n成绩最高的学生是:
\n");
for(i=0;i{
k=num[i];
printf("%d%s%3.1f\n",stud[k].num,stud[k].name,stud[k].score);
fprintf(fp,"%d%s%3.1f\n",stud[k].num,stud[k].name,stud[k].score);
}
fclose(fp);
}
voidaverage()//定义求平均数的函数
{
FILE*fp;
floatave,sum=0;
inthigh=0,low=0,equ=0,i;
for(i=0;isum+=stud[i].score;
ave=sum/SIZE;//计算平均分
for(i=0;i{
if(ave>stud[i].score)low++;
if(aveif(ave==stud[i].score)equ++;
}
printf("\n平均成绩为:
%4.2f\n",ave);
printf("高于平均成绩的有%d个,占总人数的%3.1f%%\n",high,high*1.0/SIZE*100);
printf("低于平均成绩的有%d个,占总人数的%3.1f%%\n",low,low*1.0/SIZE*100);
printf("等于平均成绩的有%d个,占总人数的%3.1f%%\n",equ,equ*1.0/SIZE*100);
fp=fopen("stuout.txt","a+");//追加新数据
fprintf(fp,"\n平均成绩为:
%4.2f\n",ave);
fprintf(fp,"高于平均成绩的有%d个,占总人数的%3.1f%%\n",high,high*1.0/SIZE*100);
fprintf(fp,"低于平均成绩的有%d个,占总人数的%3.1f%%\n",low,low*1.0/SIZE*100);
fprintf(fp,"等于平均成绩的有%d个,占总人数的%3.1f%%\n",equ,equ*1.0/SIZE*100);
fclose(fp);
}
voidrow()//定义排列顺序的函数
{
FILE*fp;
inti,score,perfect=0,good=0,medium=0,pass=0,failed=0;//定义各档次人数的变量
for(i=0;i{
score=(int)stud[i].score/10;//依靠分数判断属于哪个档次
switch(score)//计数
{
case10:
perfect++;break;
case9:
perfect++;break;
case8:
good++;break;
case7:
medium++;break;
case6:
pass++;break;
default:
failed++;
}
}
printf("\n优秀(100~90)的有%d人\n",perfect);
printf("良好(89~80)的有%d人\n",good);
printf("中等(79~70)的有%d人\n",medium);
printf("及格(69~60)的有%d人\n",pass);
printf("不及格(59~50)的有%d人\n",failed);
fp=fopen("stuout.txt","a+");//追加新数据
fprintf(fp,"\n优秀(100~90)的有%d人\n",perfect);
fprintf(fp,"良好(89~80)的有%d人\n",good);
fprintf(fp,"中等(79~70)的有%d人\n",medium);
fprintf(fp,"及格(69~60)的有%d人\n",pass);
fprintf(fp,"不及格(59~50)的有%d人\n",failed);
fclose(fp);
}
个人总结:
通过设计本程序,我了解了大型程序的开发步骤,熟悉了C语言中重要语句和函数的用法,提高了自己分析问题解决问题的能力;同时也看到了自己在一些细节问题上容易粗心大意的毛病。
总之,通过设计这个程序,我自身的到了锻炼。