📄 学生成绩管理.cpp
字号:
//
void show2() //资料操作的显示
{
printf("下面为%s的全部资料.\n\n",name);
printf(" 学号 姓名 性别 英语 高数 线数 毛论 物理 体育 法律 电路 总分 平均\n");
fp=fopen(name,"rb");
for(i=0;i<N;i++)
if(fread(&stu[i],sizeof(struct student),1,fp)==1)
{
printf("\n%s%7s %2s",stu[i].num,stu[i].name,stu[i].sex);
for(j=0;j<M;j++)
printf(" %3.1f",stu[i].score[j]);
printf(" %3.1f",stu[i].total);
printf(" %3.1f",stu[i].average);
}
else
break;
printf("\n");
}//
/////////////////////////////////////////////////////////////////////
//
void arrange() //资料按平均分排序
{
int n;
char m[1],t[1];
while(1)
{
system("cls"); //清屏后选择操作
printf("\n\t\t请你选择操作: \n\t\t\t\t1.将学生资料按平均分排序\n \n\t\t\t\t0.退出:\t");
scanf("%s",t);
if(strlen(t)>1) //判断输入是否合法
{
printf("\n\t\t输入不合法,请重新选择!");
continue;
}
switch(t[0]) //对输入的选择操作菜单进行判断
{
case '1' :printf("\n\t\t请输入要排序的班级:");
while(1)
{
scanf("%s",name); //输入文件名并判断是否存在
if((fp=fopen(name,"rb"))==NULL)
{
printf("不存在你所输入的班级,请重新输入:");
continue;
}
else
break;
}
for(i=0;i<N;i++) //先逐个读资料
{
if(fread(&stu[i],sizeof(struct student),1,fp)==1)
++n; //计数器
else
break;
}
n=i; //总数记录
for(i=0;i<n;i++) //对资料进行排序
for(j=i+1;j<n;j++)
if(stu[i].average<stu[j].average) //定义一个临时结构变量
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
system("cls"); //清屏后显示排序结果
printf("按平均分进行排序后的%s的全部成绩为:\n\n",name);
printf(" 学号 姓名 性别 英语 高数 线数 毛论 物理 体育 法律 电路 总分 平均 名次\n");
fp=fopen(name,"wb");
for(i=0;i<n;i++)
{
fwrite(&stu[i],sizeof(struct student),1,fp);
printf("\n%s%7s %2s",stu[i].num,stu[i].name,stu[i].sex);
for(j=0;j<M;j++)
printf(" %3.1f",stu[i].score[j]);
printf(" %3.1f",stu[i].total);
printf(" %3.1f",stu[i].average);
printf(" %d\n",i+1);
}
printf("\n\n");
printf(" *************************************************** \n\n");
printf(" 已经成功将排序后的结果存储! \n\n");
printf(" *************************************************** \n\n");
fclose(fp); //关闭指针
printf("是否要进行其它班的排序?(y/n)\t"); //是否继续其它班的排序
while(1)
{
scanf("%s",m); //判断输入是否合法
if(strlen(m)>1)
{
printf("输入不合法,请重新输入(y/n):\t");
continue;
}
if(m[0]=='y') //判断要求继续进行其它班的排序
break;
else if(m[0]=='n') //判断要求中断,显示是否继续函数
go_on();
else //输入不合法,重新输入
{
printf("输入不合法,请重新输入(y/n):\t");
continue;
}
}
break;
case '0' :go_on(); //操作要求中断,显示是否继续函数
break;
default :printf("\n\t\t输入不合法,请重新选择!"); //输入不合法,重新输入
}
}
}//
/////////////////////////////////////////////////////////////////////////
//
void add() //单个资料增加
{
int h=0,k;
char l[1],m[1],t[1];
printf("\n\t\t请输入要增加的学生所在班级:");
while(1)
{
scanf("%s",name); //输入文件名后判断是否存在
if((fp=fopen(name,"rb"))==NULL)
{
printf("\n\t不存在你所输入的班级,请确认后重新输入:");
continue;
}
else
{
for(i=0;i<N;i++) //先逐个读取资料
if(fread(&stu[i],sizeof(struct student),1,fp)==1)h++;
fp=fopen(name,"ab"); //重新打开文件,以追加的方式
break;
}
}
while(1)
{
system("cls"); //清屏后显示操作菜单
printf("\n\t\t请你选择操作: \n\t\t\t\t1.增加学生资料\n \n\t\t\t\t0.退出:\t");
scanf("%s",t);
if(strlen(t)>1) //判断输入的合法性
{
printf("\n\t\t输入不合法,请重新选择!");
continue;
}
switch(t[0]) //对输入合法的操作
{
case '1' :printf("\n\t请输入要增加的学生的资料:\n"); //录入要增加的学生资料
while(1)
{
printf("学号(10位)");
scanf("%s",temp.num);
k=0;
if(strlen(temp.num)!=10)
{
printf("输入不合法,请重新输入!\n");
continue;
}
for(i=0;i<h;i++)
if(strcmp(stu[i].num,temp.num)==0)
{
printf("学号重复,请重新输入!\n");
k=1;
break;
}
if(k==1)
continue;
if(k==0)
break;
}
printf("姓名(中文):");
scanf("%s",temp.name);
while(1)
{
printf("性别(1.男 2.女):");
scanf("%s",l);
if(strlen(l)>1)
{
printf("输入不合法,请重新输入!\n");
continue;
}
if(l[0]!='1'&&l[0]!='2')
{
printf("输入不合法,请重新输入!\n");
continue;
}
else if(l[0]=='1')
{
strcpy(temp.sex,"男");
break;
}
else if(l[0]=='2')
{
strcpy(temp.sex,"女");
break;
}
}
temp.total=0;
for(j=0;j<M;j++)
{
while(1)
{
printf("分数%d(0-100):",j+1);
scanf("%f",&temp.score[j]);
if(temp.score[j]>100||temp.score[j]<0)
{
printf("输入不合法,请重新输入!\n");
continue;
}
else
break;
}
temp.total+=temp.score[j];
}
temp.average=float(temp.total/M);
fwrite(&temp,sizeof(struct student),1,fp); //写入打开的文件
fclose(fp);
printf(" *************************************************** \n\n");
printf(" 你已成功增加了一名学生资料! \n\n");
printf(" *************************************************** \n\n");
printf("\n\t是否继续增加学生资料?(y/n)\t"); //显示是否继续增加操作
while(1)
{
scanf("%s",m); //判断输入操作的合法性
if(strlen(m)>1)
{
printf("输入不合法,请重新输入(y/n):\t");
continue;
}
if(m[0]=='y')
{
fp=fopen(name,"ab");
break;
}
else if(m[0]=='n')
go_on();
else
{
printf("输入不合法,请重新输入(y/n):\t");
continue;
}
}
break;
case '0' :go_on(); //显示是否继续函数
break;
default :printf("\n\t\t输入不合法,请重新选择!");
}
}
}//
/////////////////////////////////////////////////////////////////////////////
//
void find() //单个资料查询
{
char n[11],t[1],na[11],m[1];
int h=0,flag=0;
printf("\n\t\t请输入要查询的学生所在班级:"); //输入文件名然后判断正确性
while(1)
{
scanf("%s",name);
if((fp=fopen(name,"rb"))==NULL)
{
printf("\n\t\t不存在你所输入的班级,请重新输入:");
continue;
}
else
{
fp=fopen(name,"rb"); //打开文件逐个读取
for(i=0;i<N;i++)
if(fread(&stu[i],sizeof(struct student),1,fp)==1)++h;
while(1) //选择所需操作
{
printf("\n\t\t请你选择查询方式: \n\t\t\t\t1.学生的学号\n \n\t\t\t\t2.学生的姓名\n \n\t\t\t\t0.退出:\t");
scanf("%s",t);
if(strlen(t)>1) //判断操作的正确性
{
printf("\n\t\t输入不合法,请重新选择!");
continue;
}
switch(t[0]) //对输入的操作进行选择
{
case '1' :printf("\n\t请输入你要查询的学生的学号:");
while(1)
{
scanf("%s",n); //学号查询方式
if(strlen(n)!=10)
printf("\n\t\t输入不合法,请重新输入:");
else
break;
}
for(i=0;i<h;i++) //循环寻找匹配学号后显示
{
if(strcmp(n,stu[i].num)==0)
{
printf("\n你所要查询的学生资料如下:\n\n");
printf(" 学号 姓名 性别 英语 高数 线数 毛论 物理 体育 法律 电路 总分 平均 名次\n");
printf("\n%s%7s %2s",stu[i].num,stu[i].name,stu[i].sex);
for(j=0;j<M;j++)
printf(" %3.1f",stu[i].score[j]);
printf(" %3.1f",stu[i].total);
printf(" %3.1f",stu[i].average);
printf(" %d\n\n",i+1);
flag=1;
}
}
if(flag==0) //判断是否存在输入的学生学号
{
printf("\n\t\t\t 不存在该学生的资料!\n");
continue;
}
break;
case '2' :printf("\n\t请输入你要查询的学生的姓名:");
scanf("%s",na); //用学生的姓名进行查找
for(i=0;i<h;i++)
{
if(strcmp(na,stu[i].name)==0) //循环查找匹配的学生然后显示学生资料
{
printf("\n你所要查询的学生资料如下:\n\n");
printf(" 学号 姓名 性别 英语 高数 线数 毛论 物理 体育 法律 电路 总分 平均 名次\n");
printf("\n%s%7s %2s",stu[i].num,stu[i].name,stu[i].sex);
for(j=0;j<M;j++)
printf(" %3.1f",stu[i].score[j]);
printf(" %3.1f",stu[i].total);
printf(" %3.1f",stu[i].average);
printf(" %d\n\n",i+1);
flag=1;
}
}
if(flag==0) //判断是否存在输入的学生姓名
{
printf("\n\t\t\t 不存在该学生的资料!\n");
continue;
}
break;
case '0' :go_on(); //显示是否继续函数
break;
default :printf("\n\t\t输入不合法,请重新选择!"); //输入不合法,重新输入
}
printf("\n\t\t是否继续查询?(y/n)"); //是否继续查询操作
while(1)
{
scanf("%s",m); //判断输入的正确性
if(strlen(m)>1)
{
printf("输入不合法,请重新输入(y/n):\t");
continue;
}
if(m[0]=='y')
break;
else if(m[0]=='n')
go_on();
else
{
printf("输入不合法,请重新输入(y/n):\t");
continue;
}
}
}
}
}
fclose(fp); //关闭指针
printf("\n");
go_on(); //显示是否继续函数
}//
//////////////////////////////////////////////////////////////////////////
//
void modify() //单个资料修改
{
char n[11],l[1],m[1]; //定义字符串变量
int k,s,h=0,flag=0; //定义整数型变量
printf("\n\t\t请输入要修改的学生所在班级:");
while(1)
{
scanf("%s",name); //输入文件名并进行判断
if((fp=fopen(name,"rb"))==NULL)
{
printf("\n\t\t不存在你所输入的班级,请重新输入:");
continue;
}
else
break;
}
while(1)
{
system("cls"); //清屏后显示所有资料
show2();
h=i;
printf("\n\t请你在上面选择你所要修改的学生学号:");
while(1)
{
scanf("%s",n); //选择学号
if(strlen(n)!=10)
printf("\n\t\t输入不合法,请重新输入:");
else
break;
}
for(i=0;i<h;i++) //找到匹配资料显示
if(strcmp(n,stu[i].num)==0)
{
k=i;
system("cls");
printf("\n你所要修改的学生原先资料如下:\n\n");
printf(" 学号 姓名 性别 英语 高数 线数 毛论 物理 体育 法律 电路 总分 平均 名次\n");
printf("\n%s%7s %2s",stu[i].num,stu[i].name,stu[i].sex);
for(j=0;j<M;j++)
printf(" %3.1f",stu[i].score[j]);
printf(" %3.1f",stu[i].total);
printf(" %3.1f",stu[i].average);
printf(" %d\n",i+1);
flag=1;
*stu[i].num='\0'; //将其学号清除,以便可以继续输入该学号
break;
}
if(flag==0) //不存在学生的资料
{
printf("\n\t\t资料不存在你要找的学生!");
printf("\n");
go_on();
}
printf("\n请重新输入要修改的学生的资料:\n");
while(1) //重新录入新的资料
{
printf("学号(10位):");
scanf("%s",temp.num);
s=0;
if(strlen(temp.num)!=10)
{
printf("输入不合法,请重新输入!\n");
continue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -