commit first

master
许高峰.com 6 years ago
parent f9ca22fdea
commit 509a141b52

Binary file not shown.

@ -0,0 +1,697 @@
#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("d:\\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("d:\\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);
}

Binary file not shown.
Loading…
Cancel
Save