|
|
#include"stdio.h" //标准的输入输出函数文件头部说明
|
|
|
#include"math.h" // 数学函数头部说明
|
|
|
#include"string.h"
|
|
|
#include"stdlib.h" //通过该函数头部里的函数,改变控制台的背景和颜色
|
|
|
#include"windows.h" //头文件声明,下文用到了改变控制台的宽度和高度
|
|
|
#define M 100
|
|
|
struct student
|
|
|
{
|
|
|
char name[20]; //姓名
|
|
|
char num[20]; //学号
|
|
|
int sex; // 性别
|
|
|
char nl[20]; //年龄
|
|
|
char term[20]; // 学期
|
|
|
char id[20];// 身份证号
|
|
|
char native[20]; //籍贯
|
|
|
char tel[20]; //电话
|
|
|
int major; //专业
|
|
|
int math,yy,sz,js,cyy,pe;//数学,英语,思政,军事,c语言,体育
|
|
|
int fail; //不及格
|
|
|
int pass; //及格
|
|
|
int bj; //班级
|
|
|
double sum; // 总分
|
|
|
double aver; // 平均
|
|
|
double passl;
|
|
|
double max;
|
|
|
double min;
|
|
|
int failer;
|
|
|
};
|
|
|
void input(struct student stu[M]); //输入函数
|
|
|
void output(struct student stu[M]); //各类用户自定义函数的声明
|
|
|
void lookfor(struct student stu[M]); //查询函数
|
|
|
void modify(struct student stu[M]); //修改函数
|
|
|
void order(struct student stu[M]); //排序函数
|
|
|
void delete_student(struct student stu[M]); //删除函数
|
|
|
void xuehao(struct student stu[M]);
|
|
|
void xingming(struct student stu[M]);
|
|
|
void xueqi(struct student stu[M]);
|
|
|
void analyse(struct student stu[M]);
|
|
|
void fsd(struct student stu[M]);
|
|
|
void fileread(struct student stu[M]);
|
|
|
void filewrite(struct student stu[M]);
|
|
|
int count=0;
|
|
|
struct student t;
|
|
|
void xingming(struct student stu[M])
|
|
|
{
|
|
|
}
|
|
|
int main()
|
|
|
{
|
|
|
int choice=0,sum=0;
|
|
|
struct student stu[M];
|
|
|
system("mode con:cols=400 lines=30000"); //调节控制台的宽度和高度
|
|
|
system("color 0E"); //调节控制台的背景和字体颜色
|
|
|
printf("\t\t\t\t\t\t\t\t\3\3\3\3\3\3\3\3\3\3\3\3\3欢迎你使用学生成绩管理系统\3\3\3\3\3\3\3\3\3\3\n");
|
|
|
while(choice!=10)
|
|
|
{
|
|
|
printf("\t\t\t\t\t\t\t\t-------------------------------------------------\n");
|
|
|
printf("\t\t\t\t\t\t\t\t+ 学生信息管理系统 +\n");
|
|
|
printf("\t\t\t\t\t\t\t\t-------------------------------------------------\n");
|
|
|
printf("\t\t\t\t\t\t\t\t\t\t ***************\n");
|
|
|
printf("\t\t\t\t\t\t\t\t\t\t 1、添加学生信息\n");
|
|
|
printf("\t\t\t\t\t\t\t\t\t\t 2、浏览学生信息\n");
|
|
|
printf("\t\t\t\t\t\t\t\t\t\t 3、查询学生信息\n");
|
|
|
printf("\t\t\t\t\t\t\t\t\t\t 4、修改学生信息\n");
|
|
|
printf("\t\t\t\t\t\t\t\t\t\t 5、删除学生信息\n");
|
|
|
printf("\t\t\t\t\t\t\t\t\t\t 6、排列学生信息\n");
|
|
|
printf("\t\t\t\t\t\t\t\t\t\t 7、查看分析报告\n");
|
|
|
printf("\t\t\t\t\t\t\t\t\t\t 8、读取文件学生\n"); //从文件读取
|
|
|
printf("\t\t\t\t\t\t\t\t\t\t 9、保存到文件\n"); //保存到文件
|
|
|
printf("\t\t\t\t\t\t\t\t\t\t 10、退出系统\n");
|
|
|
printf("\t\t\t\t\t\t\t\t\t\t ***************\n");
|
|
|
printf("请输入你的选择\n");
|
|
|
scanf("%d",&choice);
|
|
|
fflush(stdin); //清除输入缓冲区
|
|
|
if(choice<1||choice>10)
|
|
|
{
|
|
|
sum++;
|
|
|
if(sum==3)
|
|
|
{
|
|
|
printf("输入错误次数过多,程序将重新开始\n");
|
|
|
|
|
|
system("cls"); //清屏语句
|
|
|
sum=0;
|
|
|
}
|
|
|
}
|
|
|
switch(choice)
|
|
|
{
|
|
|
case 1:input(stu);break;
|
|
|
case 2:output(stu);break;
|
|
|
case 3:lookfor(stu);break;
|
|
|
case 4:modify(stu);break;
|
|
|
case 5:delete_student(stu);break;
|
|
|
case 6:order(stu);break;
|
|
|
case 7:analyse(stu);break;
|
|
|
case 8:fileread(stu);break;
|
|
|
case 9:filewrite(stu);;break;
|
|
|
case 10:printf("感谢你使用学生信息管理系统,请关掉程序!!!\n");system("pause");break;
|
|
|
default:printf("无效的选择!!!请重新输入!!!\n");break;
|
|
|
}
|
|
|
}
|
|
|
printf("the program is over!!!\n");
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
void input(struct student stu[M]) //自定义输入函数
|
|
|
{
|
|
|
int len,size,chang; //学生号长度,身份证号长度,手机号码长度
|
|
|
system("cls");
|
|
|
printf("请添加要输入学生的成绩\n");
|
|
|
do {
|
|
|
printf("请输入由11位数字组成的学生学号\n"); //do-while循环应用,提示输入位数为一确定数
|
|
|
scanf("%s",&stu[count].num);
|
|
|
len=strlen(stu[count].num);
|
|
|
}while(len!=11);
|
|
|
printf("请输入同学的姓名\n");
|
|
|
scanf("%s",&stu[count].name);
|
|
|
printf("请输入同学的年龄\n");
|
|
|
scanf("%s",&stu[count].nl);
|
|
|
printf("请输入同学的性别:1、男 2、女\n");
|
|
|
scanf("%d",&stu[count].sex);
|
|
|
printf("请输入同学的学期: 如:大一上 、大一下\n");
|
|
|
scanf("%s",&stu[count].term);
|
|
|
do {
|
|
|
printf("请输入由18位数字组成的学生身份证号\n"); //同上
|
|
|
scanf("%s",&stu[count].id);
|
|
|
size=strlen(stu[count].id);
|
|
|
}while(size!=18);
|
|
|
printf("请输入学生的籍贯\n");
|
|
|
scanf("%s",&stu[count].native);
|
|
|
do{
|
|
|
printf("请输入学生11位的手机号码\n");
|
|
|
scanf("%s",&stu[count].tel);
|
|
|
chang=strlen(stu[count].tel);
|
|
|
}while(chang!=11);
|
|
|
printf("请输入所需要的专业代号:1、计算机科学 2、软件工程 3、网络工程 4、物联网\n"); //采用如此方法解决了专业输入难问题
|
|
|
scanf("%d",&stu[count].major);
|
|
|
printf("请输入对应的学生班级号码: 如:1801 、1802 \n");
|
|
|
scanf("%d",&stu[count].bj);
|
|
|
do {
|
|
|
printf("请依次输入不大于100的学生各科成绩\n");
|
|
|
scanf("%d%d%d%d%d%d",&stu[count].math,&stu[count].yy,&stu[count].sz,&stu[count].js,&stu[count].cyy,&stu[count].pe);
|
|
|
}while(stu[count].math>100||stu[count].yy>100||stu[count].sz>100||stu[count].js>100||stu[count].cyy>100||stu[count].pe>100); //同上同上
|
|
|
stu[count].aver=(stu[count].math+stu[count].yy+stu[count].sz+stu[count].js+stu[count].cyy+stu[count].pe)/6.0; //求出平均值
|
|
|
stu[count].sum=(stu[count].math+stu[count].yy+stu[count].sz+stu[count].js+stu[count].cyy+stu[count].pe);
|
|
|
|
|
|
count++;
|
|
|
}
|
|
|
void output(struct student stu[M]) //自定义输出函数
|
|
|
{
|
|
|
int j;
|
|
|
system("cls");
|
|
|
if (count==0)
|
|
|
{
|
|
|
printf("当前已存学生信息为0个\n");
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
printf("学号 \t姓名\t性别\t年龄\t学期\t\t身份证号\t籍贯\t\t手机号 \t\t专业\t\t班级\t数学\t英语\t思政\t军事\tC语言\t体育\t总分\t平均分\n\n");
|
|
|
for (j=0;j<count;j++){ //for循环控制输出的个数
|
|
|
printf("%s\t",stu[j].num);
|
|
|
printf("%s\t",stu[j].name);
|
|
|
if(stu[j].sex==1)
|
|
|
printf("男");
|
|
|
if(stu[j].sex==2)
|
|
|
printf("女");
|
|
|
printf("\t%s\t",stu[j].nl);
|
|
|
printf("%s\t",stu[j].term) ;
|
|
|
printf("%s\t",stu[j].id);
|
|
|
printf("%s\t\t",stu[j].native);
|
|
|
printf("%s\t",stu[j].tel);
|
|
|
if (stu[j].major==1)
|
|
|
printf("计算机科学\t");
|
|
|
else if (stu[j].major==2)
|
|
|
printf("软件工程\t");
|
|
|
else if(stu[j].major==3)
|
|
|
printf("网络工程\t");
|
|
|
else
|
|
|
printf("物联网\t");
|
|
|
printf("%d\t",stu[j].bj) ;
|
|
|
printf("%d\t",stu[j].math);
|
|
|
printf("%d\t",stu[j].yy);
|
|
|
printf("%d\t",stu[j].sz);
|
|
|
printf("%d\t",stu[j].js);
|
|
|
printf("%d\t",stu[j].cyy);
|
|
|
printf("%d\t",stu[j].pe);
|
|
|
printf("%.1lf\t",stu[j].sum);
|
|
|
printf("%.1lf\t\n",stu[j].aver);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
void lookfor(struct student stu[M])
|
|
|
{
|
|
|
|
|
|
int j,flag=0,choice;
|
|
|
char xh[25],xm[25];
|
|
|
system("cls");
|
|
|
if(count==0)
|
|
|
{
|
|
|
printf("当前无任何信息");
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
printf("1、学号查询(推荐) 2、姓名查询\n");
|
|
|
scanf("%d",&choice);
|
|
|
fflush(stdin);
|
|
|
if(choice==1)
|
|
|
{
|
|
|
printf("请输入需查询学号:\n");
|
|
|
scanf("%s",&xh) ;
|
|
|
fflush(stdin);
|
|
|
for (j=0;j<count;j++)
|
|
|
{
|
|
|
if (strcmp(stu[j].num,xh)==0) //通过字符函数对已存入的学生信息进行比较,找出要查看的学生
|
|
|
{
|
|
|
printf("\t学号\t\t姓名\t性别\t年龄\t学期\t\t身份证号\t籍贯\t\t手机号\t\t专业\t\t班级\t数学\t英语\t思政\t军事\tC语言\t体育\t总分\t平均分\n\n");
|
|
|
printf(" %s\t",stu[j].num);
|
|
|
printf("%s\t",stu[j].name);
|
|
|
if(stu[j].sex==1)
|
|
|
printf("男");
|
|
|
if(stu[j].sex==2)
|
|
|
printf("女");
|
|
|
printf("\t%s\t",stu[j].nl);
|
|
|
printf("%s\t",stu[j].term) ;
|
|
|
printf("%s\t",stu[j].id);
|
|
|
printf("%s\t\t",stu[j].native);
|
|
|
printf("%s\t",stu[j].tel);
|
|
|
if (stu[j].major==1)
|
|
|
printf("计算机科学\t");
|
|
|
else if (stu[j].major==2)
|
|
|
printf("软件工程\t");
|
|
|
else if(stu[j].major==3)
|
|
|
printf("网络工程\t");
|
|
|
else
|
|
|
printf("物联网\t");
|
|
|
printf("%d\t",stu[j].bj) ;
|
|
|
printf("%d\t",stu[j].math);
|
|
|
printf("%d\t",stu[j].yy);
|
|
|
printf("%d\t",stu[j].sz);
|
|
|
printf("%d\t",stu[j].js);
|
|
|
printf("%d\t",stu[j].cyy);
|
|
|
printf("%d\t",stu[j].pe);
|
|
|
printf("%.1lf\t",stu[j].sum);
|
|
|
printf("%.1lf\t",stu[j].aver);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
if(choice==2)
|
|
|
{
|
|
|
printf("请输入需查询姓名:\n");
|
|
|
scanf("%s",&xm) ;
|
|
|
fflush(stdin);
|
|
|
for (j=0;j<count;j++)
|
|
|
{
|
|
|
if (strcmp(stu[j].name,xm)==0) //通过字符函数对已存入的学生信息进行比较,找出要查看的学生
|
|
|
{
|
|
|
printf("\t学号\t\t姓名\t性别\t年龄\t学期\t\t身份证号\t籍贯\t\t手机号\t\t专业\t\t班级\t数学\t英语\t思政\t军事\tC语言\t体育\t总分\t平均分\n\n");
|
|
|
printf(" %s\t",stu[j].num);
|
|
|
printf("%s\t",stu[j].name);
|
|
|
if(stu[j].sex==1)
|
|
|
printf("男");
|
|
|
if(stu[j].sex==2)
|
|
|
printf("女");
|
|
|
printf("\t%s\t",stu[j].nl);
|
|
|
printf("%s\t",stu[j].term) ;
|
|
|
printf("%s\t",stu[j].id);
|
|
|
printf("%s\t\t",stu[j].native);
|
|
|
printf("%s\t",stu[j].tel);
|
|
|
if (stu[j].major==1)
|
|
|
printf("计算机科学\t");
|
|
|
else if (stu[j].major==2)
|
|
|
printf("软件工程\t");
|
|
|
else if(stu[j].major==3)
|
|
|
printf("网络工程\t");
|
|
|
else
|
|
|
printf("物联网\t");
|
|
|
printf("%d\t",stu[j].bj) ;
|
|
|
printf("%d\t",stu[j].math);
|
|
|
printf("%d\t",stu[j].yy);
|
|
|
printf("%d\t",stu[j].sz);
|
|
|
printf("%d\t",stu[j].js);
|
|
|
printf("%d\t",stu[j].cyy);
|
|
|
printf("%d\t",stu[j].pe);
|
|
|
printf("%.1lf\t",stu[j].sum);
|
|
|
printf("%.1lf\t",stu[j].aver);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
void modify(struct student stu[M]) //自定义修改函数
|
|
|
{
|
|
|
int i,j,flag=0,course,choice,key;
|
|
|
char xh[20];
|
|
|
system("cls");
|
|
|
if (count==0)
|
|
|
{
|
|
|
printf("当前已存学生信息为0个,无法修改!!!\n");
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
printf("你确定要修改学生的信息吗???确定请按1,不确定请按2\n");
|
|
|
scanf("%d",&key);
|
|
|
if(key==1)
|
|
|
{
|
|
|
printf("请输入你想要修改的同学学号\n");
|
|
|
scanf("%s",&xh);
|
|
|
fflush(stdin);
|
|
|
for (j=0;j<count;j++)
|
|
|
if (strcmp(stu[j].num,xh)==0) //同上
|
|
|
{
|
|
|
printf("请输入你要修改的学生信息:1、姓名\n2、性别\n3、年龄\n4、学期\n5、身份证\n6、手机号\n7、专业\n8、班级\n9、学科成绩\n");
|
|
|
scanf("%d",&choice);
|
|
|
switch(choice)
|
|
|
{
|
|
|
case 1:printf("请输入你想要修改的学生姓名\n");
|
|
|
scanf("%s",&stu[j].name);break;
|
|
|
case 2:printf("请输入你想要修改后的学生性别:1、男 2、女\n");
|
|
|
scanf("%d",&stu[j].sex);break;
|
|
|
case 3:printf("请输入你想要修改后的学生年龄\n");
|
|
|
scanf("%s",&stu[j].nl);break;
|
|
|
case 4:printf("请输入你想要修改后的学生学期\n");
|
|
|
scanf("%s",&stu[j].term);break;
|
|
|
case 5:printf("请输入你想要修改后的学生身份证\n");
|
|
|
scanf("%s",&stu[j].id);break;
|
|
|
case 6:printf("请输入你想要修改后的同学手机号\n");
|
|
|
scanf("%s",&stu[j].tel);break;
|
|
|
case 7:printf("请输入你想要修改后的学生专业:1、计算机科学 2、软件工程 3、网络工程 4、物联网\n");
|
|
|
scanf("%d",&stu[j].major);break;
|
|
|
case 8: printf("请输入你想要修改的同学班级\n");
|
|
|
scanf("%s",&stu[j].bj);break;
|
|
|
case 9: {printf("选择课程: 1、数学 2、英语 3、思政 4、军事 5、c语言 6、体育\n");
|
|
|
scanf("%d",&course);
|
|
|
printf("请输入你想要修改后的学生成绩\n");
|
|
|
switch(course)
|
|
|
{
|
|
|
case 1:scanf("%d",&stu[j].math);break;
|
|
|
case 2:scanf("%d",&stu[j].yy);break; //switch控制语句
|
|
|
case 3:scanf("%d",&stu[j].sz);break;
|
|
|
case 4:scanf("%d",&stu[j].js);break;
|
|
|
case 5:scanf("%d",&stu[j].cyy);break;
|
|
|
case 6:scanf("%d",&stu[j].pe);break;
|
|
|
default:printf("无效的选择!!!请重新输入!!!\n");break;
|
|
|
}
|
|
|
break;}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void delete_student(struct student stu[M]) //自定义删除函数
|
|
|
{
|
|
|
int choice;
|
|
|
system("cls");
|
|
|
if (count==0)
|
|
|
{
|
|
|
printf("当前已存学生信息为0个,无法删除!!!\n");
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
printf("请选择你所要删除的方式:1、学号 2、姓名(如果你的姓名是中文,那么无法删除,请选择学号删除) 3、取消\n");
|
|
|
scanf("%d",&choice);
|
|
|
switch(choice) //switch语句对用户要删除的方式进行选择
|
|
|
{
|
|
|
case 3:return;break;
|
|
|
case 2:xingming(stu);break; //用户自定义函数之间的套用
|
|
|
case 1:xuehao(stu);break;
|
|
|
default:printf("无效的选择!!!请重新输入!!!\n");break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
void order(struct student stu[M]) //排序函数的定义
|
|
|
{
|
|
|
int j,k,choice,m;
|
|
|
system("cls");
|
|
|
printf("请输入你想要进行排序的方式(所有排序的方式均是降序)!!!\n");
|
|
|
printf("1、数学 2、英语 3、思政 4、军事 5、C语言 6、体育 7、平均分\n");
|
|
|
scanf("%d",&choice);
|
|
|
switch (choice)
|
|
|
{
|
|
|
case 1:for (j=0;j<count;j++)
|
|
|
{ m=j;
|
|
|
for (k=j+1;k<count;k++)
|
|
|
if (stu[k].math>stu[m].math)
|
|
|
{t=stu[k];stu[k]=stu[m];stu[m]=t;}
|
|
|
};break;
|
|
|
case 2:for (j=0;j<count;j++)
|
|
|
{ m=j;
|
|
|
for (k=j+1;k<count;k++)
|
|
|
if (stu[k].yy>stu[m].yy)
|
|
|
{stu[k]=stu[m];} //整个为排序部分,采用了所谓的选择排序的方法
|
|
|
};break;
|
|
|
case 3:for (j=0;j<count;j++)
|
|
|
{ m=j;
|
|
|
for (k=j+1;k<count;k++)
|
|
|
if (stu[k].sz>stu[m].sz)
|
|
|
{t=stu[k];stu[k]=stu[m];stu[m]=t;}
|
|
|
};break;
|
|
|
case 4:for (j=0;j<count;j++)
|
|
|
{ m=j;
|
|
|
for (k=j+1;k<count;k++)
|
|
|
if (stu[k].js>stu[m].js)
|
|
|
{t=stu[k];stu[k]=stu[m];stu[m]=t;}
|
|
|
};break;
|
|
|
case 5:for (j=0;j<count;j++)
|
|
|
{ m=j;
|
|
|
for (k=j+1;k<count;k++)
|
|
|
if (stu[k].cyy>stu[m].cyy)
|
|
|
{t=stu[k];stu[k]=stu[m];stu[m]=t;}
|
|
|
};break;
|
|
|
case 6:for (j=0;j<count;j++)
|
|
|
{ m=j;
|
|
|
for (k=j+1;k<count;k++)
|
|
|
if (stu[k].pe>stu[m].pe)
|
|
|
{t=stu[k];stu[k]=stu[m];stu[m]=t;}
|
|
|
};break;
|
|
|
case 7:for (j=0;j<count;j++)
|
|
|
{ m=j;
|
|
|
for (k=j+1;k<count;k++)
|
|
|
if (stu[k].aver>stu[m].aver)
|
|
|
{t=stu[k];stu[k]=stu[m];stu[m]=t;} //强制类型转换符号只能用于有操作数,根据赋值运算中的类型转换问题可知
|
|
|
};break;
|
|
|
default:printf("无效的选择!!!请重新输入!!!\n");break;
|
|
|
}
|
|
|
}
|
|
|
void xuehao(struct student stu[M]) //自定义通过学号方式删除学生信息函数
|
|
|
{
|
|
|
int j,k=count;
|
|
|
char xh[25];
|
|
|
system("cls");
|
|
|
printf("请输入你想要删除的同学学号\n");
|
|
|
scanf("%s",xh);
|
|
|
fflush(stdin);
|
|
|
for (j=0;j<count;j++)
|
|
|
{ if (strcmp(stu[j].num,xh)==0)
|
|
|
{
|
|
|
for (j;j<count;j++)
|
|
|
stu[j]=stu[j+1];
|
|
|
count--;
|
|
|
if (count<k)
|
|
|
printf("你已经删除成功\n");
|
|
|
}
|
|
|
}
|
|
|
if (j==count)
|
|
|
printf("抱歉!!!没有你所需要删除的学生信息!*_*!\n");
|
|
|
}
|
|
|
|
|
|
void filewrite(struct student stu[M]) //写入文件函数定义
|
|
|
{
|
|
|
int j=0;
|
|
|
char c;
|
|
|
FILE *fp;
|
|
|
printf("请选择是否要存入已输入的学生信息:'y'还是'n'???\n");
|
|
|
scanf("%c",&c);
|
|
|
fflush(stdin);
|
|
|
while(c!='y'&&c!='n'){
|
|
|
if (c!='y'&&c!='n')
|
|
|
printf("输入错误,请重新输入\n");
|
|
|
printf("以下操作将会覆盖已存储的数据,确定请输入'y'或'n'???\n");
|
|
|
scanf("%c",&c);
|
|
|
fflush(stdin);
|
|
|
}
|
|
|
if (c=='y')
|
|
|
{
|
|
|
if((fp=fopen("stu.dat","wb"))==NULL)
|
|
|
{
|
|
|
printf("文件打开错误,程序无法进行\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
for(j=0;j<count;j++)
|
|
|
{fwrite(&stu[j],sizeof(struct student),1,fp);
|
|
|
}
|
|
|
fclose(fp);
|
|
|
if(count==0)
|
|
|
printf("没有文件,无法保存\n");
|
|
|
else
|
|
|
printf("数据存储完毕\n");
|
|
|
}
|
|
|
else
|
|
|
return;
|
|
|
}
|
|
|
void fileread(struct student stu[M]) //读取文件信息函数定义
|
|
|
{
|
|
|
int j=0;
|
|
|
char c;
|
|
|
FILE *fp;
|
|
|
system("cls");
|
|
|
printf("请选择是否要存入已输入的学生信息:'y'还是'n'???\n");
|
|
|
scanf("%c",&c);
|
|
|
fflush(stdin);
|
|
|
while(c!='y'&&c!='n'){
|
|
|
if (c!='y'&&c!='n')
|
|
|
printf("输入错误,请重新输入\n");
|
|
|
printf("以下操作将会覆盖已存储的数据,确定请输入'y'或'n'???\n");
|
|
|
scanf("%c",&c);
|
|
|
fflush(stdin);
|
|
|
}
|
|
|
if (c=='y')
|
|
|
{
|
|
|
if((fp=fopen("stu.dat","rb"))==NULL)
|
|
|
{
|
|
|
printf("文件打开错误,程序无法进行\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
fread(&stu[j],sizeof(struct student),1,fp);
|
|
|
count=0;
|
|
|
count++;
|
|
|
j++;
|
|
|
while(fread(&stu[j],sizeof(struct student),1,fp))
|
|
|
{
|
|
|
j++;
|
|
|
count++;
|
|
|
}
|
|
|
fclose(fp);
|
|
|
printf("数据读取完毕!!!\n");
|
|
|
system("pause");
|
|
|
}
|
|
|
else
|
|
|
return;
|
|
|
}
|
|
|
void analyse(struct student stu[M])
|
|
|
{
|
|
|
int i,j=0,m=0,n=0,a=0,b=0,c=0;//用来计算不及格的人数的
|
|
|
int max1=stu[0].math,max2=stu[0].yy,max3=stu[0].sz,max4=stu[0].js,max5=stu[0].cyy,max6=stu[0].pe;
|
|
|
int min1=stu[0].math,min2=stu[0].yy,min3=stu[0].sz,min4=stu[0].js,min5=stu[0].cyy,min6=stu[0].pe;
|
|
|
double q,w,e,r,t,y;//用来计算及格率的
|
|
|
double SUM1=0,SUM2=0,SUM3=0,SUM4=0,SUM5=0,SUM6=0;
|
|
|
double average1,average2,average3,average4,average5,average6;
|
|
|
system("cls");
|
|
|
if(count==0)
|
|
|
{
|
|
|
printf("无任何数据!请先输入数据。");
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
|
|
|
{ printf("\t\t\t\t本次考试总体情况\n\n");
|
|
|
printf(" \t数学 \t\t英语 \t\t思政 \t\t军事 \t\tc语言 \t\t体育\n\n平均分") ;
|
|
|
for(i=0;i<count;i++)//算各科目平均分 //math,yy,sz,js,cyy,pe
|
|
|
{
|
|
|
SUM1+=stu[i].math;
|
|
|
average1=SUM1/count;
|
|
|
if(stu[i].math>=60)
|
|
|
j++;
|
|
|
if(stu[i].math>max1)
|
|
|
max1=stu[i].math;
|
|
|
if(stu[i].math<min1)
|
|
|
min1=stu[i].math;
|
|
|
|
|
|
}
|
|
|
for(i=0;i<count;i++)
|
|
|
{
|
|
|
SUM2+=stu[i].yy;
|
|
|
average2=SUM2/count;
|
|
|
if(stu[i].yy>=60)
|
|
|
m++;
|
|
|
if(stu[i].yy>max2)
|
|
|
max2=stu[i].yy;
|
|
|
if(stu[i].yy<min2)
|
|
|
min2=stu[i].yy;
|
|
|
}
|
|
|
for(i=0;i<count;i++)
|
|
|
{
|
|
|
SUM3+=stu[i].sz;
|
|
|
average3=SUM3/count;
|
|
|
if(stu[i].sz>=60)
|
|
|
n++;
|
|
|
if(stu[i].sz>max3)
|
|
|
max3=stu[i].sz;
|
|
|
if(stu[i].sz<min3)
|
|
|
min3=stu[i].sz;
|
|
|
}
|
|
|
for(i=0;i<count;i++)
|
|
|
{
|
|
|
SUM4+=stu[i].js;
|
|
|
average4=SUM4/count;
|
|
|
if(stu[i].js>=60)
|
|
|
a++;
|
|
|
if(stu[i].js>max4)
|
|
|
max4=stu[i].js;
|
|
|
if(stu[i].js<min4)
|
|
|
min4=stu[i].js;
|
|
|
}
|
|
|
for(i=0;i<count;i++)
|
|
|
{
|
|
|
SUM5+=stu[i].cyy;
|
|
|
average5=SUM5/count;
|
|
|
if(stu[i].cyy>=60)
|
|
|
b++;
|
|
|
if(stu[i].cyy>max5)
|
|
|
max5=stu[i].cyy;
|
|
|
if(stu[i].cyy<min5)
|
|
|
min5=stu[i].cyy;
|
|
|
}
|
|
|
for(i=0;i<count;i++)
|
|
|
{
|
|
|
SUM6+=stu[i].pe;
|
|
|
average6=SUM6/count;
|
|
|
if(stu[i].pe>=60)
|
|
|
c++;
|
|
|
if(stu[i].pe>max6)
|
|
|
max6=stu[i].pe;
|
|
|
if(stu[i].pe<min6)
|
|
|
min6=stu[i].pe;
|
|
|
}
|
|
|
|
|
|
printf("\t%.1lf \t\t%.1lf \t\t%.1lf \t\t%.1lf \t\t%.1lf \t\t%.1lf\n\n",average1,average2,average3,average4,average5,average6);
|
|
|
printf("最高分");
|
|
|
printf("\t%d \t\t%d \t\t%d \t\t%d \t\t%d \t\t%d\n\n",max1,max2,max3,max4,max5,max6);
|
|
|
printf("最低分") ;
|
|
|
printf("\t%d \t\t%d \t\t%d \t\t%d \t\t%d \t\t%d\n\n",min1,min2,min3,min4,min5,min6);
|
|
|
printf("及格率");
|
|
|
q=j/count,w=m/count,e=n/count,r=a/count,t=b/count,y=c/count;
|
|
|
printf("\t%.2lf%% \t\t%.2lf%% \t%.2lf%% \t%.2lf%% \t%.2lf%% \t%.2lf%%\n\n",q*100,w*100,e*100,r*100,t*100,y*100);
|
|
|
printf("未及格");
|
|
|
printf("\t%d \t\t%d \t\t%d \t\t%d \t\t%d \t\t%d\n\n",count-j,count-m,count-n,count-a,count-b,count-c);
|
|
|
fsd(stu);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
void fsd(struct student stu[M])
|
|
|
{ int ab=0,ac=0,ad=0,ae=0,af=0;
|
|
|
int A,B,C,D,E,F;
|
|
|
int q=0,w=0,e=0,r=0,t=0,y=0,u=0,i=0,o=0,p=0,a=0,s=0,d=0,f=0,g=0,h=0,j=0,k=0,l=0,z=0,x=0,c=0,v=0,b=0,n=0,m=0;//用来表示各分数段人数的
|
|
|
for(i=0;i<count;i++)
|
|
|
{
|
|
|
A=stu[i].math,B=stu[i].yy,C=stu[i].sz;
|
|
|
D=stu[i].js,E=stu[i].cyy,F=stu[i].pe;
|
|
|
switch(A/10)
|
|
|
{ case 9:
|
|
|
case 10:
|
|
|
q++;
|
|
|
break;
|
|
|
case 8:w++;break;
|
|
|
case 7: e++;break;
|
|
|
case 6:r++;break;
|
|
|
default: t++;break;
|
|
|
}
|
|
|
switch(B/10)
|
|
|
{ case 10:
|
|
|
case 9:y++;break;
|
|
|
case 8:u++;break;
|
|
|
case 7: o++;break;
|
|
|
case 6:p++;break;
|
|
|
default: a++;break;
|
|
|
}
|
|
|
switch(C/10)
|
|
|
{ case 10:
|
|
|
case 9:s++;break;
|
|
|
case 8:d++;break;
|
|
|
case 7: f++;break;
|
|
|
case 6:g++;break;
|
|
|
default: h++;break;
|
|
|
}
|
|
|
switch(D/10)
|
|
|
{ case 10:
|
|
|
case 9:j++;break;
|
|
|
case 8:k++;break;
|
|
|
case 7: l++;break;
|
|
|
case 6:z++;break;
|
|
|
default: x++;break;
|
|
|
}
|
|
|
switch(E/10)
|
|
|
{ case 10:
|
|
|
case 9:c++;break;
|
|
|
case 8:v++;break;
|
|
|
case 7: b++;break;
|
|
|
case 6:n++;break;
|
|
|
default: m++;break;
|
|
|
}
|
|
|
switch(F/10)
|
|
|
{ case 10:
|
|
|
case 9:ab++;break;
|
|
|
case 8:ac++;break;
|
|
|
case 7:ad++;break;
|
|
|
case 6:ae++;break;
|
|
|
default: af++;break;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
printf("各科目分数段人数\n\n");
|
|
|
printf("90~100\t%d \t\t%d \t\t%d \t\t%d \t\t%d \t\t%d\n\n",q,y,s,j,c,ab);
|
|
|
printf("80~90\t%d \t\t%d \t\t%d \t\t%d \t\t%d \t\t%d\n\n",w,u,d,k,v,ac);
|
|
|
printf("70~80\t%d \t\t%d \t\t%d \t\t%d \t\t%d \t\t%d\n\n",e,o,f,l,b,ad);
|
|
|
printf("60~70\t%d \t\t%d \t\t%d \t\t%d \t\t%d \t\t%d\n\n",r,p,g,z,n,ae);
|
|
|
printf("60以下\t%d \t\t%d \t\t%d \t\t%d \t\t%d \t\t%d\n\n",t,a,h,x,m,af);
|
|
|
}
|
|
|
|