一.题目要求:
学生成绩管理程序设计,具体如下:
(1)选项菜单集成各功能函数模块
(2)录入学生成绩(姓名、学号、语文、数学成绩,总分自动计算)
(3)按总分排名次
(4)按姓名查找某学生成绩
(5)统计各课程的平均分、及格率、最高分、最低分
(6)打印成绩表
二.设计分析:
1. 选项菜单如下:
请选择你要本系统实现的功能:
1:学生信息浏览功能
2:统计各课程的平均分、及格率、最高分、最低分
3:单用户信息查询功能
4:排序功能(按学生总分绩进行排序)
5:安全退出
请输入你要实现的功能选项:
2. 通过输入1~5,来执行相应的功能,每个功能项都对应于一个函数,根据用户的输入,去调用不同的函数,这样,模块比较清晰。
3. 将上面5个函数封装在一个函数中,即mixed(m,n),通过参数n的不同,从而调用不同的功能。
4. 提供了一个input函数,用于输入学生信息。
5. 在程序主函数(即main)中, 通过调用printf来显示选项菜单;调用input进行数据的录入;调用mixed去真正执行对应的功能。
6. 对于功能操作,有两点要注意:
(1)要对用户的输入进行check,如果是1~5之间的数据,则是正确的,就去调用mixed,否则,程序直接退出。
(2)在功能操作过程中,是一个无限循环,要退出这个循环,必须通过菜单选项“5:安全退出”功能才能退出这个循环,而且,退出循环的同时,也意味着程序结束了。
三.详细设计:
1. 函数调用关系图:
2. 主要函数说明:
(1)input
函数原型:int input()
功能: 录入学生数, 并输入每个学生的信息。
输入参数:void
返回:学生个数
(2)mixed
函数原型:void mixed(int m,int n)
功能: 根据用户的输入,调用相应功能的函数。
输入参数:m, 用于菜单功能选择;
n,学生个数
返回: void
(3)skim
函数原型:void skim(int n)
功能: 列出学生信息依次为学号、姓名、语文、数学的成绩、总分、平均分。
输入参数:n,学生个数
返回: void
(4)stati
函数原型:void stati(int n)
功能: 统计各课程的平均分、及格率、最高分、最低分。
输入参数:n,学生个数;
返回: void
(5)search
函数原型:void search(int n,char m[])
功能: 按姓名查找某学生成绩。
输入参数:n, 学生个数;
m,学生姓名
返回:void
(6)sort
函数原型:void sort(int n)
功能: 按学生的总分升序排序。
输入参数:n, 学生个数;
返回: void
(7)exit(0):这个函数是C库函数,用于退出程序。
3. 流程图:
四.原代码:
/* 学生成绩管理程序设计
(1)选项菜单集成各功能函数模块
(2)录入学生成绩(姓名、学号、语文、数学成绩,总分自动计算)
(3)按总分排名次
(4)按姓名查找某学生成绩
(5)统计各课程的平均分、及格率、最高分、最低分
(6)打印成绩表
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 175
typedef struct mark
{
double yuwen;
double shuxue;
}mark;
typedef struct
{
long number;
char name[20];
double sum;
double aver;
mark achie;
}student;
student stu[N];
double ymin,ymax,smax,smin,yper,sper,yaver=0,saver=0;
int input()
{
int i,n;
printf("请输入你要输入的学生数:/n");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("请输入第%d个学生的信息(包括学号、姓名、语文、数学的成绩)/n",i);
scanf(
"%ld%s%lf%lf",
&stu[i].number,
stu[i].name,
&stu[i].achie.yuwen,
&stu[i].achie.shuxue
);
}
return(n);
} /* end input() */
void skim(int n)
{
int i;
printf("列出的学生信息依次为学号、姓名、语文、数学的成绩、总分、平均分/n");
for(i=1;i<=n;i++)
{
stu[i].sum=stu[i].achie.yuwen+stu[i].achie.shuxue;
stu[i].aver=stu[i].sum/2.0;
printf("第%d个学生的信息为:/n",i);
printf(
"%d/t%s/t%lf/t%lf/t",
stu[i].number,
stu[i].name,
stu[i].achie.yuwen,
stu[i].achie.shuxue
);
printf("%lf/t%lf/n",stu[i].sum,stu[i].aver);
}
} /* end skim() */
void search(int n,char m[])
{
int i;
for(i=1;i<=n;i++)
if(strcmp(stu[i].name,m)==0)
break;
if(i>n)
printf("系统查找不到相应学生的信息,请确认输入后重新输入/n");
else
{
stu[i].sum=stu[i].achie.yuwen+stu[i].achie.shuxue;
stu[i].aver=stu[i].sum/2.0;
printf("你要查询的学生的信息是:");
printf("%d/t%s/t%lf/t%lf/t",stu[i].number,stu[i].name,stu[i].achie.yuwen,stu[i].achie.shuxue);
printf("%lf/t%lf/n",stu[i].sum,stu[i].aver);
}
} /* end search() */
void sort(int n)
{
int i,j;
student temp;
for(i=1;i<=n;i++)
{
stu[i].sum=stu[i].achie.yuwen+stu[i].achie.shuxue;
stu[i].aver=stu[i].sum/2.0;
}
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(stu[i].sum>stu[j].sum)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
printf("按学生的总分升序排序后的结果是:");
for(i=1;i<=n;i++)
{
printf("%d/t%s/t%lf/t%lf/t",stu[i].number,stu[i].name,stu[i].achie.yuwen,stu[i].achie.shuxue);
printf("%lf/t%lf/n",stu[i].sum,stu[i].aver);
}
} /* end sort() */
void stati(int n)
{
int i,a=0,b=0;
ymin=stu[1].achie.yuwen;smin=stu[1].achie.shuxue;
ymax=stu[1].achie.yuwen;smax=stu[1].achie.shuxue;
for(i=1;i<=n;i++)
{
if(stu[i].achie.yuwen<ymin)
ymin=stu[i].achie.yuwen;
if(stu[i].achie.yuwen>ymax)
ymax=stu[i].achie.yuwen;
if(stu[i].achie.shuxue<smin)
smin=stu[i].achie.shuxue;
if(stu[i].achie.shuxue>smax)
ymin=stu[i].achie.shuxue;
if(stu[i].achie.yuwen>=60) a++;
if(stu[i].achie.shuxue>=60) b++;
saver+=stu[i].achie.shuxue/2.0;
yaver+=stu[i].achie.yuwen/2.0;
}
yper=(double)a/n;sper=(double)b/n;
printf("语文的平均分、及格率、最高分、最低分分别为:%lf/t%lf/t%lf/t%lf/n",yaver,yper,ymax,ymin);
printf("数学的平均分、及格率、最高分、最低分分别为:%lf/t%lf/t%lf/t%lf/n",saver,sper,smax,smin);
} /* end stati() */
void mixed(int m,int n)
{
char k[N];
switch(m)
{
case 1:skim(n);
break;
case 2:stati(n);
break;
case 3:printf("请输入你要查询的学生的姓名:");
scanf("%s",k);
search(n,k);
break;
case 4:sort(n);
break;
case 5:exit(0);
}
} /* end mixed() */
void main()
{
int n,m;
printf("/n/t为使系统正常工作请先按提示输入学生信息/n/n");
n=input();
printf("%d",n);
do
{
printf("请选择你要本系统实现的功能:/n");
printf("1:学生信息浏览功能/n");
printf("2:统计各课程的平均分、及格率、最高分、最低分/n");
printf("3:单用户信息查询功能/n");
printf("4:排序功能(按学生总分绩进行排序)/n");
printf("5:安全退出/n");
printf("/t/t/t/t/t/t请输入你要实现的功能选项:");
scanf("%d",&m);
printf("/n");
if(m<0||m>4)
{
printf("程序即将退出!/n");
break;
}
else
mixed(m,n);
}while(1);
return;
} /* end main() */
五.测试:
1. 输入学生信息:
2. 学生信息浏览:
3. 统计各课程的平均分、及格率、最高分、最低分:
4. 单用户信息查询:
5. 按学生总分绩进行排序:
6. 安全退出: