这个系统中,有成绩录入、计算平均值、根据平均值进行排序、展示学生成绩、清屏、退出、通过学号查询成绩、展示帮助菜单这几个功能。比较简单,不过也是对之前的学习的一个汇总和检测,以后再进行复杂的系统开发。
话不多说,直接上程序
ps:这个清屏功能是Linux系统中的。Windows系统换一下它自己的就可以了。
也就是把这个改掉就行。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdlib.h>
int n = 0; //记录有多少名同学的分数已经被录入
struct student
{
char id[10];
float chinese;
float math;
float english;
float avg;
}stu[50]; //定义一个结构体数组,用来保存学生的学号和成绩
void help_menu();//帮助菜单
void score_get();//录入分数
void score_average();//获取某个同学的平均分数
void show_list();//展示学生的成绩列表
void sort_average();//根据平均值从高到低排序
int selectById(char *p); //通过学生的学号查询成绩
int main(int argc, char const *argv[])
{
char menu_ch;
help_menu();
while (1)
{
printf("请输入指令\n");
scanf("%c",&menu_ch);
getchar(); //这个getchar的功能是回收你在控制台输入的回车操作
switch (menu_ch) //对menu_ch进行判断,然后执行其操作
{
case 'H':
help_menu(); //展示帮助菜单
break;
case 'T':
score_get(); //成绩录入
break;
case 'A':
score_average(); //计算平均值
break;
case 'L':
show_list(); //展示成绩列表
break;
case 'P':
sort_average(); //以平均值从高到低排序
break;
case 'S':
printf("请输入你想查询学生的学号\n");
char ch[10];
scanf("%s",ch);
getchar();
int t = selectById(ch); //通过学号查询成绩
if(t != -1)
printf("%s的成绩:语文:%4.2f 数学:%4.2f 英语:%4.2f 平均分:%4.2f\n",stu[t].id,stu[t].chinese,stu[t].math,stu[t].english,stu[t].avg);
break;
case 'C':
system("clear"); //清屏
break;
case 'Q':
exit(0); //退出
default:
printf("您输入有误,请重新输入\n");
break;
}
}
return 0;
}
void help_menu()
{
printf("*******************************************\n");
printf(" *\t学生成绩管理系统——帮助菜单\t*\n");
printf("*******************************************\n");
printf(" *\tH = 显示帮助菜单\t\t*\n");
printf(" *\tT = 成绩录入 \t\t*\n");
printf(" *\tA = 计算学生平均分\t\t*\n");
printf(" *\tL = 列出成绩表\t\t*\n");
printf(" *\tP = 按平均成绩从高到低排序\t*\n");
printf(" *\tS = 按学号查询学生成绩\t\t*\n");
printf(" *\tC = 清屏\t\t*\n");
printf(" *\tQ = 退出系统\t\t*\n");
printf("*******************************************\n");
printf(" *For man is man and master of his fate.*\n");
printf("*******************************************\n");
}
void score_get()
{
printf("请输入学生人数:");
int num; //学生的人数
scanf("%d",&num);
printf("请输入%d名学生的三门课成绩:\n",num);
printf("学号 语文 数学 英语\n");
char id_1[10];
float C,M,E; //用来记录你输入的成绩,以便于之后的比较,看看是否已经录入过了
while (num)
{
scanf("%s %f %f %f",id_1,&C,&M,&E);
getchar();
int flag = 0; //学号没有存入过
if(n == 0) //没有录入过成绩,直接录入
{
strcpy(stu[n].id,id_1);
stu[n].chinese = C;
stu[n].math = M;
stu[n].english = E;
n++;
}
else //如果已经录入了成绩,那就和之前的学号进行比较,如果发现和之前的相等,那就flag=1,否则录入
{
for (int i = 0; i < n; i++)
{
if(strcmp(id_1,stu[i].id)) //当他们相等时返回值为0时,执行else中的语句.
{
continue;
}
else
{
flag = 1;
break;
}
}
if(flag) //flag为1说明录入的学号已经存在,则重新输入
{
printf("该学生已经录入,请重新输入\n");
continue;
}
else //否则录入
{
strcpy(stu[n].id,id_1);
stu[n].chinese = C;
stu[n].math = M;
stu[n].english = E;
n++;
}
}
num--;
}
}
void score_average()
{
if(n == 0)
printf("成绩为空!请先录入成绩!\n");
else
{
for (int i = 0; i < n; i++)
{
stu[i].avg = (stu[i].english + stu[i].chinese + stu[i].math)/3; //计算平均值
}
}
}
void show_list()
{
if(n == 0)
printf("成绩为空!请先录入成绩!\n");
else
{
for(int i = 0;i < n;i++)
{
printf("%s的成绩:语文:%4.2f 数学:%4.2f 英语:%4.2f 平均分:%4.2f\n",stu[i].id,stu[i].chinese,stu[i].math,stu[i].english,stu[i].avg);
}
}
}
void sort_average()
{
if(n == 0)
printf("成绩为空!请先录入成绩!\n");
else
{
struct student temp; //下面进行的是冒泡排序
for(int i = 0;i < n-1;i++)
{
for(int j = 0;j < n-i-1;j++)
{
if(stu[j].avg < stu[j+1].avg)
{
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp;
}
}
}
}
}
int selectById(char *p) //这个函数返回的是一个结构体类型的数据
{
if(n == 0)
{
printf("成绩为空!请先录入成绩!\n");
return -1;
}
else
{
while (1)
{
for(int i = 0;i < n;i++)
{
if(strcmp(p,stu[i].id)) //遍历每一个元素,并且进行学号比较
continue;
else
{
return i; //如果相等,就返回这个学号所在的结构体
}
}
printf("您输入的学号不存在,请重新输入:\n");
}
}
}
1. 帮助菜单
2. 成绩录入
3. 展示学生成绩
4. 计算平均值
5. 按平均值排序
6. 按学号查询
7. 清屏
加油努力!!