设计一个学生成绩排名系统。
1) 具备对成绩的管理功能(添加、删除、排序)
2) 具备对成绩的统计功能(最高分,最低分,平均分,及格率等)
3) 具备按学号、姓名、或课程名查询成绩的功能。
4)学生成绩应该保存在文件中。
备注:成绩记录以下信息:班级,学号,姓名,课程名,成绩(百分制)。可以用能表示学生成绩的结构体数组存储数据。
1.根据题目要求成绩记录以下信息:班级,学号,姓名,课程名,成绩。可以把这些信息设为结构体成员,用结构体数组来存放45个学生的信息,并且为方便输入信息可以定义一个全局变量N。
2.将系统功能分为五大模块:读取,管理,统计,查询和保存。另外在程序中需要增加读取文件信息的功能,以保证可以正确执行四大模块功能。
3.细化具体系统的功能,并用函数的嵌套调用来实现
4.函数调用方法:用switch语句实现多分支选择结构。在主函数中用switch语句调用四大模块函数,在前三大模块函数中用switch语句调用细化的功能函数。各个模块的函数功能相互独立,不会影响别的函数的功能。
5.程序界面设计:在三大主函数中加入printf语句具体提示用户具体功能信息,以保证用户在使用时能逐步实现具体的系统功能。
①:首先声明结构体,然后定义结构体数组,数组的每一个元素都包含结构体中的所有成员即学号、姓名、班级、课程名以及分数。
②:为节省输入信息的时间,定义一个全局变量N=20。(同时为保证更接近信息真实情况,数字不能过小)。
代码如下:
struct Student
{
int num;
char name[20];
int clas;
char course[10];
float score;
}stu[45];
int N=20;
代码如下:
int main()
{
void manage(struct Student stu[]); //声明管理信息函数
void count(struct Student stu[]); //声明统计信息函数
void search(struct Student *p); //声明查找信息函数
void save(); //声明保存信息函数
void read(); //声明读入信息函数
read(); //调用读入信息函数(此处需特别注意read函数的位置:只有先读入文本文件信息,才能进行后续操作)
printf("*****************************学生成绩管理系统***********************************");
printf("* *");
printf("* 管理学生信息(请输入1) 统计学生信息(请输入2) *");
printf("* 查询学生信息(请输入3) 保存学生信息(请输入4) *");
printf("* *");
printf("********************************************************************************");
printf("请输入功能选项(1-manage/2-count/3-search/4-save):\n");
int order;
scanf("%d",&order);
switch(order) //用switch选择结构来调用四个不同的函数
{
case 1:
manage(stu);break;
case 2:
count(stu);break;
case 3:
search(stu);break;
case 4:
save();break;
}
return 0;
}
首先定义一个文件指针变量
用fopen函数,以“r”的方式打开一个文本文件(在此之前需建立好一个文本文件),并判断是否能正常打开。
用for循环来以格式化的方式读取磁盘文件中的信息。
void read() //定义读入函数(注意read函数在主函数中调用的位置)
{
FILE *fp;
int i;
if((fp=fopen("student.txt","r"))==NULL) //r表示为了输入数据打开一个文本文件
{
printf("cannot open the file!\n");
exit(0);
}
for(i=0;i
将管理信息模块分为增加、删除和排序三个功能。用switch选择语句进行判断用户的功能选择,进而调用这三个函数。
代码如下:
void manage(struct Student stu[]) //定义管理函数
{
printf("**********************欢迎来到学生成绩系统管理界面******************************");
int choice;
printf("请输入功能选项(1-add/2-delete/3-sort):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
add();break; //当选择为1时,调用增添函数
case 2:
delet();break; //当选择为2时,调用删除函数
case 3:
sort();break; //当选择为3时,调用排序函数
}
}
将统计模块分为四个小功能:求最大值、最小值、平均值和及格率。通过switch选择结构来实现用户对不同功能的选择。程序上则是对不同函数的调用。
代码如下:
void count(struct Student stu[]) //定义统计函数
{
printf("************************欢迎来到学生系统统计界面********************************");
int choice;
printf("请输入功能选项(1-max/2-min/3-average/4-pass_rate):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
max();break; //当选择为1时,调用max函数
case 2:
min();break; //当选择为2时,调用min函数
case 3:
average();break; //当选择为3时,调用average函数
case 4:
pass_rate();break;
}
}
六、查询函数信息模块
将查询模块分为三个功能实现:按学号、姓名和班级三种不同的路径实现对成绩的查询。
用switch语句对用户输入的命令选择,实现对不同函数的调用和实现不同的功能。
void search(struct Student stu[]) //定义查询函数
{
printf("**********************欢迎来到学生成绩系统查询界面******************************");
int choice;
printf("请输入功能选项(1-num_search/2-name_search/3-clas_search):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
num_search();break;
case 2:
name_search();break;
case 3:
clas_search();break;
}
}
#include
#include
#include
struct Student
{
int num;
char name[20];
int clas;
char course[10];
float score;
}stu[45]; //定义结构体数组,用来存放每一个学生的信息
int N=20; //定义一个全局变量N,用来控制需要输入的学生个数,此处为以后输入节省时间,设为20
int main()
{
void manage(struct Student stu[]); //声明管理信息函数
void count(struct Student stu[]); //声明统计信息函数
void search(struct Student stu[]); //声明查找信息函数
void save(); //声明保存信息函数
void read(); //声明读入信息函数
read(); //调用读入信息函数(此处需特别注意read函数的位置:只有先读入信息,才能进行后续操作)
printf("*****************************学生成绩管理系统***********************************");
printf("* *");
printf("* 管理学生信息(请输入1) 统计学生信息(请输入2) *");
printf("* 查询学生信息(请输入3) 保存学生信息(请输入4) *");
printf("* *");
printf("********************************************************************************");
printf("请输入功能选项(1-manage/2-count/3-search/4-save):\n");
int order;
scanf("%d",&order);
switch(order) //用switch选择结构来调用四个不同的函数
{
case 1:
manage(stu);break;
case 2:
count(stu);break;
case 3:
search(stu);break;
case 4:
save();break;
}
return 0;
}
//以下为读取保存函数
void read() //定义读入函数(注意read函数在主函数中调用的位置)
{
FILE *fp;
int i;
if((fp=fopen("student.txt","r"))==NULL) //r表示为了输入数据打开一个文本文件
{
printf("cannot open the file!\n");
exit(0);
}
for(i=0;istu[j].score)
k=j;
}
if(k!=i)
{
t=stu[i]; //将学生的信息进行交换
stu[i]=stu[k];
stu[k]=t;
}
}
printf("********************************排序的结果为:***********************************");
printf("\n学生成绩为(由小到大排列):\n");
printf(" 学号 姓名 班级 课程 分数\n");
for(i=0;istu[i].score)
k=i;
}
printf("******************************统计最小值的结果为:*******************************");
printf("获得最低分数的学生的信息为:\n");
printf(" 学号 姓名 班级 课程 分数\n");
printf("%3d %3s %3d %5s %5.2f\n",stu[k].num,stu[k].name,stu[k].clas,stu[k].course,stu[k].score);
}
void average() //定义取平均值函数
{
float aver,sum=0;
int i;
for(i=0;i=60) //如果输入的学生成绩大于60,则n自增1
n++;
}
rate=(float)n/N; //求及格率
printf("***************************统计及格率的结果为:**********************************");
printf("这门课程的及格率为:%-5.2f%%\n",rate*100); //以百分制形式输出及格率
}
//以下为查询函数
void search(struct Student stu[]) //定义查询函数
{
printf("**********************欢迎来到学生成绩系统查询界面******************************");
int choice;
printf("请输入功能选项(1-num_search/2-name_search/3-clas_search):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
num_search();break;
case 2:
name_search();break;
case 3:
clas_search();break;
}
}
void num_search() //定义按学号查询函数
{
int n;
int i;
printf("请输入你想要查询的学生的学号:\n");
scanf("%d",&n);
while(n>=2016120&&n<=2016139) //用while语句判断输入的学号是否在范围内
{
printf("*****************************按学号查询的结果为:********************************");
printf(" 学号 姓名 班级 课程 分数\n");
for(i=0;i2016139)
{
printf("您输入的学号有误!请重新输入!\n");
break;
}
}
void name_search() //定义按姓名查询函数
{
char name[20];
int i;
printf("请输入你想要查询的学生的姓名:\n");
scanf("%s",name); //name就本身为数组名,值为地址,因此此处不需要再加&符号
printf("*****************************按姓名查询的结果为:********************************");
printf("学号 姓名 班级 课程 分数\n");
for(i=0;i=001&&c<=020)
{
printf("*****************************按班级查询的结果为:********************************");
printf(" 学号 姓名 班级 课程 分数\n");
for(i=0;i020)
{
printf("您输入的班级有误!请重新输入!\n");
break;
}
}
二、设计心得