版权声明:[email protected] https://blog.csdn.net/qq_271334644/article/details/85387168
此篇博客内容与百度文库中 https://wenku.baidu.com/view/3cb7659332d4b14e852458fb770bf78a65293ad0 均为本人个人所写,希望大家支持点击获得浏览量!
#include<stdio.h> //编译预处理指令
#include<string.h> //定义处理字符串函数
#include<process.h> //宏指令的声明
#include<conio.h> //定义通过控制台进行数据输入以及输出
#define N 2000 //最多的人数人
#define M 3 //统计成绩
typedef struct student //定义类型
{ char number[10]; //保存所有人的学号
char name[20]; //保存学生姓名
char sex[10]; //保存性别
float score[M]; //保存所有课程成绩
float aver; //保存每个人的平均成绩
float total; //总计成绩
}STU;
STU stu[N];
int n;
void inputscore(void); //学生成绩新建
void savescore(void); //学生成绩保存
void avergescore(void); //学生平均成绩
void total(void); //学生成绩总计
void modifyscore(void); //学生成绩修改
void lookscore(void); //学生成绩查看
void searchscore(void); //学生成绩查询
void statistic(void); //学生成绩统计
void add(void); //学生成绩添加
void modify(void); //学生成绩修改
void delscore(void); //学生成绩删除
void menu(void); //学生成绩菜单
void main()
{ short int flag=0;
menu();
do
{ flag=1;
switch(getch())
{ case '1' : inputscore();break; //在菜单界面输入1,调用i函数nputscore()实现输入学生成绩信息功能
case '2' : lookscore();break; //在菜单界面输入2,调用函数lookscore()实现学生成绩按平均分高低排序输出,同时lookscore()函数调用avregescore()函数实现各个学生的平均分计算
case '3' : searchscore();break; //在菜单界面输入3,调用searchscore()函数实现通过学号查找学生成绩信息功能
case '4' : statistic();break; //在菜单界面输入4,调用statistic()函数输出每一门课程的最高分,平均分以及不及格人员
case '5' : modify();break; //在菜单界面输入5,调用modify()函数实现通过学号修改学生成绩的功能
case '6' : add();break; //在菜单界面输入6,调用add()函数实现添加学生成绩
case '7' : delscore();break; //在菜单界面输入7,调用delscore()函数实现删除指定学生的成绩
case '8' : savescore();break; //在菜单界面输入8,调用savescore()函数将学生成绩信息保存
case '9' :exit(0); break; //在菜单界面输入9,退出成绩管理系统
default : printf("输入有误\n");
}
printf("按任意键继续\n");
getch(); //按任意键继续,起到暂停的作用,函数头文件conio.h已经定义过
menu(); // 菜单
}while (flag==1);
}
void menu(void)
{
system("cls"); //清屏
printf("\n");
printf(" ★★★★★★★欢迎进入学生成绩管理系统★★★★★★★\n");
printf(" 菜单 \n");
printf(" ☆输入成绩-------------------------------------1\n");
printf(" ☆查看成绩及成绩排序---------------------------2\n");
printf(" ☆查询学生成绩---------------------------------3\n");
printf(" ☆成绩统计-------------------------------------4\n");
printf(" ☆修改成绩-------------------------------------5\n");
printf(" ☆添加成绩-------------------------------------6\n");
printf(" ☆删除成绩-------------------------------------7\n");
printf(" ☆保存成绩-------------------------------------8\n");
printf(" ☆退出系统-------------------------------------9\n");
printf(" ★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf(" 请输入您的选择(1~9)\n");
}
/***************输入各个同学的学生信息******************************/
void inputscore(void) //输入成绩
{ int i,j;
system("cls"); //清屏专用,以下出现位置作用相同
printf(" 已经转到输入成绩菜单\n");
printf("请输入学生总数:\n");
scanf("%d",&n);
printf("提示:输入学号时请输入9位学生编号:图书借阅证上的学号\n"); //因二维表上下需对正故有此要求
for(i=0;i<n;i++)
{ printf("\n");
printf("请输入第%d位学生的学号:\n",i+1);
scanf("%s",stu[i].number); //输入学生学号
printf("姓名:\n");
scanf("%s",stu[i].name); //输入学生名字
printf("请输入该学生性别\n");
scanf("%s",stu[i].sex); //输入性别
printf("请输入学生成绩:\n");
printf("高数分\t英语分\tC语言分\n");
for(j=0;j<M;j++)
scanf("%f",&stu[i].score[j]); //输入高数、英语、C语言的成绩
}
printf(" 成功输入(按任意键继续后请输入8进行保存)\n");
}
/*****************计算各个同学的总分*****************************/
void total(void)
{ int i,j; //定义变量i,j;i用来表示学生个数,j则用来表示学生每门课的分数
for(i=0;i<n;i++)
{ stu[i].total=0;
for(j=0;j<M;j++) //M表示科目在头文件出已经定义
{
stu[i].total+=stu[i].score[j];
}
}
}
/*****************计算各个同学的平均分*****************************/
void avergescore(void)
{ int i,j; //定义变量i,j;i用来表示学生个数,j则用来表示学生每门课的分数
for(i=0;i<n;i++)
{ stu[i].aver=0;
for(j=0;j<M;j++) //M表示科目在头文件出已经定义
{
stu[i].aver+=stu[i].score[j];
}
stu[i].aver=stu[i].aver/M; //计算平均分
}
}
/************查看学生成绩及根据平均分对学生进行排序*********************/
void lookscore(void)
{ int i,j,k; // i,j,k都表示学生成绩比较用来调换顺序
STU t;
total(); // 此处用来对调用函数的声明
avergescore();
system("cls"); // 清屏专用
printf(" 已经转到查看成绩及成绩排序菜单\n");
for(i=0;i<n-1;i++)
{ for(k=i,j=i+1;j<n;j++)
if(stu[j].aver>stu[k].aver)
k=j;
if(k!=j)
{ t=stu[k];
stu[k]=stu[i];
stu[i]=t;
}
}
printf("名次\t学号\t\t姓名\t性别\t高数分\t英语分\tC语言分\t总分\t平均分\n");
for(i=0;i<n;i++)
{ printf("%d\t%s\t%s\t%s\t",i+1,stu[i].number,stu[i].name,stu[i].sex);
for(j=0;j<M;j++)
printf("%4.2f\t",stu[i].score[j]);
printf("%4.2f\t",stu[i].total);
printf("%4.2f",stu[i].aver);
printf("\n");
}
}
/*****************通过输入学号查找学生成绩***************************/
void searchscore(void)
{ char a[10]; //定义数组a的类型可输入数字,字母或字符
int i,j;
system("cls"); //清屏
printf(" 已经转到查询学生成绩菜单\n");
printf("请输入需查询的学生学号\n");
scanf("%s",a);
for(i=0;i<n;i++)
{ if(strcmp(a,stu[i].number)==0) //如果输入的学号为真则输出相关信息
{ printf("名次\t学号\t\t姓名\t性别\t高数分\t英语分\tC语言分\t总分\t平均分\n");
printf("%d\t%s\t%s\t%s\t",i+1,stu[i].number,stu[i].name,stu[i].sex);
for(j=0;j<M;j++)
printf("%4.2f\t",stu[i].score[j]);
printf("%4.2f\t",stu[i].total);
printf("%4.2f",stu[i].aver);
printf("\n");
break; //找到该学生成绩信息后跳出for循环
}
else
printf("未找到该学生信息\n");
}
}
/*******统计学生成绩信息,计算出每一门课的最高分****************/
void statistic()
{
int i,j=0,k=0,c1;
char str[2];
float average[M],sum=0; printf("没有可被查找的记录\n"); //
system("cls");
if(M==0) //如果没有输入成绩则输出没有可查找的记录
printf("没有可被查找的记录\n");
else
{
while(1)
{
printf("下面将统计考试成绩\n");
printf("请选择你要统计哪科的成绩 1.高数\t2.英语\t3.C语言\n");
scanf("%d",&c1);
printf("\t一共有%d个记录\n",M); /*总共记录数*/
switch(c1)
{
case 1: //用来判断高数的最高分,平均分,输出不及格人员名单
for(i=0;i<M;i++)
{
sum+=stu[i].score[0];
if(stu[k].score[0]>stu[i].score[0]) k=i;
if(stu[j].score[0]<stu[i].score[0]) j=i;
}
average[0]=sum/M;
printf("\t高数的最高分:\n");
printf("\t\t学号:%s 姓名:%s 分数:%.2f\n",stu[j].number,stu[j].name,stu[j].score[0]);
printf("\t高数的最低分是:\n");
printf("\t\t学号:%s 姓名:%s 分数:%.2f\n",stu[k].number,stu[k].name,stu[k].score[0]);
printf("\t高数的平均分是 %5.2f\n",average[0]);
printf("平均分低于60分的学生成员名单\n");
for(i=0;i<M;i++)
{
if(stu[i].score[0]<60)
printf("%s\n",stu[i].name);
}
break;
case 2: // 用来判断英语的最高分,平均分,输出不及格人员名单
for(i=0;i<M;i++)
{
sum+=stu[i].score[1];
if(stu[k].score[1]>stu[i].score[1]) k=i;
if(stu[j].score[1]<stu[i].score[1]) j=i;
}
average[1]=sum/M;
printf("\t英语的最高分:\n");
printf("\t\t学号:%s 姓名:%s 分数:%.2f\n",stu[j].number,stu[j].name,stu[j].score[1]);
printf("\t英语的最低分是:\n");
printf("\t\t学号:%s 姓名:%s 分数:%.2f\n",stu[k].number,stu[k].name,stu[k].score[1]);
printf("\t英语的平均分是 %5.2f\n",average[1]);
printf("平均分低于60分的学生成员名单\n");
for(i=0;i<M;i++)
{
if(stu[i].score[1]<60)
printf("%s\n",stu[i].name);
}
break;
case 3: //用来判断C语言的最高分,平均分,输出不及格人员名单
for(i=0;i<M;i++) /*循环输入判断*/
{
sum+=stu[i].score[2];
if(stu[k].score[2]>stu[i].score[2]) k=i;
if(stu[j].score[2]<stu[i].score[2]) j=i;
}
average[2]=sum/M;
printf("\tC语言的最高分:\n"); /*最高分*/
printf("\t\t学号:%s 姓名:%s 分数:%.2f\n",stu[j].number,stu[j].name,stu[j].score[2]);
printf("\tC语言的最低分是:\n"); /*最低分*/
printf("\t\t学号:%s 姓名:%s 分数:%.2f\n",stu[k].number,stu[k].name,stu[k].score[2]);
printf("\tC语言的平均分是 %5.2f\n",average[2]);
printf("平均分低于60分的学生成员名单\n");
for(i=0;i<M;i++)
{
if(stu[i].score[2]<60)
printf("%s\n",stu[i].name);
}
break;
default: //如果输入的数字不符合要求则显示错误信息
printf("输入错误!请输入1~3之间的数\n");
}
sum=0;
getchar();
printf("是否继续进行统计?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y') statistic();
else break;
}
}
}
/***************修改学生成绩*****************/
void modify(void)
{
char a[10];
int i,j;
system("cls");
printf(" 已经转到修改成绩菜单\n");
printf("请输入需要修改成绩的学生学号\n");
scanf("%s",a);
for(i=0;i<n;i++)
{ if(strcmp(a,stu[i].number)==0)
{ printf("名次\t学号\t\t姓名\t性别\t高数分\t英语分\tC语言分\t总分\t平均分\n");
printf("%d\t%s\t%s\t%s\t",i+1,stu[i].number,stu[i].name,stu[i].sex);
for(j=0;j<M;j++)
printf("%4.2f\t",stu[i].score[j]);
printf("%4.2f",stu[i].total);
printf("%4.2f",stu[i].aver);
printf("\n");
printf("请重新输入该学生的姓名:\n");
scanf("%%s",stu[i].number);
printf("\n");
scanf("%s",stu[i].name);
printf("请输入该学生性别\n");
scanf("%s",stu[i].sex);
printf("请重新输入该学生成绩:\n");
printf("高数分\t英语分\tC语言分\n");
for(j=0;j<M;j++)
scanf("%f",&stu[i].score[j]);
printf("修改成功\n");
break; //找到该学生成绩后进行修改,跳出for循环
}
else
printf("请确认该学生是否为该校学生!\n");
}
}
/*****************添加学生成绩********************/
void add(void)
{
int a,i,j; //i定义为学生,j为学生分数,a代表加入学生的数量
system("cls");
printf(" 已经转到添加成绩菜单\n");
printf("请输入新增加的学生人数:\n");
scanf("%d",&a);
n=n+a;
for(i=n-a;i<n;i++)
{ printf("\n");
printf("请输入第%d位学生的学号:\n",i+1);
scanf("%s",stu[i].number);
printf("姓名:\n");
scanf("%s",stu[i].name);
printf("输入该学生性别\n");
scanf("%s",stu[i].sex);
printf("请输入学生成绩:\n");
printf("高数分\t英语分\tC语言分\n");
for(j=0;j<M;j++)
scanf("%f",&stu[i].score[j]);
printf("添加成功\n");
}
}
/*******************删除学生成绩*************************/
void delscore(void)
{
int i,j,c;
char m,a[10]; //m用来存放后面输入删除的字母y或n
system("cls");
printf(" 已经转到删除成绩菜单\n");
printf("请输入学生学号\n");
scanf("%s",a);
for(i=0;i<n;i++)
{ if(strcmp(a,stu[i].number)==0)
{ printf("名次\t学号\t\t姓名\t性别\t高数分\t英语分\tC语言分\t总分\t平均分\n");
printf("%d\t%s\t%s\t%s\t",i+1,stu[i].number,stu[i].name,stu[i].sex);
for(j=0;j<M;j++)
printf("%4.2f\t",stu[i].score[j]);
printf("%4.2f\t",stu[i].total);
printf("%4.2f",stu[i].aver);
printf("\n");
c=i;
break;
}
else
printf("未找到该学生信息\n");
}
printf("是否删除该学生成绩(y/n)\n");
scanf("%s",&m);
if(m=='y')
{
for(i=c;i<n-1;i++)
stu[i]=stu[i+1]; //结构体整体赋值将后一位学生成绩信息拷贝进入前一位学生信息的存储位置
n=n-1; //删除该学生信息后学生总数减一
printf("删除成绩成功\n");
}
else
printf("删除成绩失败\n");
}
/******************保存学生成绩************************/
void savescore(void)
{
FILE *fp; //定义指针
int i,flag=1;
char m;
system("cls");
printf(" 已经转到保存成绩菜单\n");
puts("是否保存学生成绩(y/n)");
scanf("%s",&m);
if(m=='y')
{ if((fp=fopen("score.dat","wb"))==NULL) //从文件score中打开
{ printf("文件打开失败\n");
return;
}
for(i=0;i<n;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) //学生成绩写入
{ printf("保存失败\n");
flag=0;
}
if(flag==1)
printf("保存成功!\n");
fclose(fp); //界面关闭
}
else
return;
}