#include<string.h>
#include <stdlib.h>
#define M 100
struct score //学生成绩信息结构体定义
{
int china;
int english;
int math;
int add;
};
struct info //学生信息结构体定义
{
int num; //学生学号5
char name[10]; //学生姓名
struct score mark; //学生成绩
};
float guake[10]; //定义一个各科挂科率
float aver[10]; //定义一个各科平均分
struct info student[M]; //定义一个全局数组student,用来存放学生信息,最多存放100个学生。
char ch[20]={"物联1161学生信息"}; //定义一个数据库文件名称
int count=0; //存放实际输入的学生人数
int input(struct info st[]) ; //录入学生信息函数声明
void show(struct info st[],int n) ; //显示学生信息函数声明
int del(struct info st[],int n); //删除学生信息函数声明
int add_up(struct info st[],int n); //统计学生信息函数声明
void change(struct info st[],int n); // 修改学生信息函数声明
void search(struct info st[],int n); //查询学生信息函数声明
void read(); //遍历以往学生信息数据库声明
void write(); //用于修改和删除 重新写入数据库
void all_del(); //清空以往所有学生信息
void add_date(); //自定义学生信息存储文件库
void read_date(); //打开自定义学生信息存储文件库
char b[20]={"物联1161学生信息"}; //保存文件名称 用于打开失败 原名称变回
main()
{
int select;
system("color E");
read();
while(1)
{
system("cls");
printf(" ******************欢迎使用****************** ");
printf(" **************学生信息管理系统************** ");
printf(" *--------------作者:徐伟明--------------* ");
printf(" * 1--录入/增加学生信息 * ");
printf(" * 2--显示学生信息 * ");
printf(" * 3--查询学生信息 * ");
printf(" * 4--修改学生信息 * ");
printf(" * 5--统计学生信息 * ");
printf(" * 6--删除学生信息 * ");
printf(" * 7--清空数据库的学生信息 * ");
printf(" * 8--自定义存储学生信息文件库 * ");
printf(" * 9--打开自定义存储学生信息文件库* ");
printf(" * 0--退出 * ");
printf(" *------------------------------------------* ");
printf(" *目前存储信息文件名为<<%s>>* ",ch);
printf(" 你要输入的功能号是(0--9):");
scanf("%d",&select);
if(select==0) break;
switch(select){
case 1: count=input(student); //调用input函数录入数据
break;
case 2: show(student,count); //调用show函数显示学生信息
system("pause");
break;
case 3: search(student,count); //调用search函数查询学生信息
system("pause");
break;
case 4: change(student,count); //调用change函数修改学生信息
system("pause");
break;
case 5: count=add_up(student,count); //调用add_up函数统计学生信息
system("pause");
break;
case 6: count=del(student,count); // 调用del函数删除学生信息
system("pause");
break;
case 7: all_del(); // //清空以往学生信息数据库声明
system("pause");
break;
case 8: add_date(); // //自定义增加数据库声明
system("pause");
break;
case 9: read_date(); // //打开自定义增加数据库声明
system("pause");
break;
case 0: exit(0); // //打开自定义增加数据库声明
system("pause");
break;
default:printf("没有此选项,请重新选择! "); system("pause");
getchar();
}
}
}
void all_del()
{
int a=0;
FILE *fp;
printf("请输入欲清空文件库名:");
strcpy(b,ch);
scanf("%s",&ch);
if((fp=fopen(ch,"rb"))==NULL)
{
printf("清空失败~~未发现文件名%s ",ch);
strcpy(ch,b);
fclose(fp);
goto end;
}
fclose(fp);
fp=fopen(ch,"wb");
strcpy(ch,b);
fp=fopen(ch,"rb");
while(fread(&student[a],sizeof(struct info),1,fp)!=0)
{
a++;
}
count=a;
printf("成功清除%s所有学生信息 ",ch);
fclose(fp);
end:;
}
void read()
{
int a=0;
FILE *fp;
if((fp=fopen(ch,"rb"))==NULL)
{
printf("~~~~~~~~~~~~~~!!!!!!!!!!未发现该文件!!!!!!!!!!~~~~~~~~~~~~~~");
strcpy(ch,b);
fclose(fp);
goto end;
}
while(fread(&student[a],sizeof(struct info),1,fp)!=0)
{
a++;
}
count=a;
fclose(fp);
printf("··············恭喜遍历%s成功················ ",ch);
end:;
}
void write() //格式化文件 重新录入所有信息
{
FILE *fp;
int i;
if((fp=fopen(ch,"wb"))==NULL)
{
printf("error");
exit(0);
}
for(i=0;i<count;i++)
{
if(fwrite(&student[i],sizeof(struct info),1,fp)!=1)
{
printf("error");
fclose(fp);
}
}
fclose(fp);
}
void add_date()
{
FILE *fp;
int a=0;
printf("请输入数据库文件名称:");
scanf("%s",&ch);
if(!(fp=fopen(ch,"wb")))
{
printf("cannoe open the file");
}
fclose(fp);
fp=fopen(ch,"rb");
while(fread(&student[a],sizeof(struct info),1,fp)!=0)
{
a++;
}
count=a;
printf("···················成功创建数据库%s··················· ",ch);
fclose(fp);
}
void read_date()
{
printf("输入你下要打开数据库名称:");
strcpy(b,ch);
scanf("%s",&ch);
char b[20]={"a"};
read();
}
int input(struct info st[]) //录入学生信息的函数
{
char sel;
FILE *fp;
if((fp=fopen(ch,"ab+"))==NULL)
{
printf("sfsdf");
exit(0);
}
int i=count;
do
{
printf(" 请输入第%d个学生信息: ",i+1);
printf(" 学生学号:");
scanf("%d",&st[i].num);
printf(" 学生姓名:");
scanf("%s",&st[i].name);
printf(" 语文成绩:");
scanf("%d",&st[i].mark.china);
printf(" 英语成绩:");
scanf("%d",&st[i].mark.english);
printf(" 数学成绩:");
scanf("%d",&st[i].mark.math);
st[i].mark.add=st[i].mark.china+st[i].mark.english+st[i].mark.math;
if(fwrite(&student[i],sizeof(struct info),1,fp)!=1) //录入数据库
printf("error");
i++;
printf(" 是否要继续录入学生信息(Y/N):");
getchar(); //此处是读走缓冲区的换行符
sel=getchar();
}while(sel=='Y' || sel=='y' );
fclose(fp); //关闭文件
return i;
}
void show(struct info st[],int n) //显示所有学生信息函数
{
int i,j,min;
for(i=0;i<count-1;i++) //步骤:学号排序
{ min=i;
for(j=i+1;j<count;j++)
if(st[min].num>st[j].num)
{
st[99]=st[min]; st[min]=st[j]; st[j]=st[99];
}
}
printf(" %-10s%-15s%-10s%-10s%-10s%-10s ","学生学号","学生姓名","语文","英语","数学","总分");
for(i=0;i<n;i++)
{
printf(" %-10d%-15s%-10d%-10d%-10d%-10d ",st[i].num,st[i].name,st[i].mark.china,st[i].mark.english,st[i].mark.math,st[i].mark.add);
}
printf(" ");
}
void search(struct info st[],int n) //根据学号查询学生信息
{
int num,i;
printf(" 请输入需要查询的学号:");
scanf("%d",&num);
for(i=0;i<count;i++)
{
if(num==st[i].num)
{
printf(" %-10s%-15s%-10s%-10s%-10s%-10s ",
"学生学号","学生姓名","语文","英语","数学","总分");
printf(" %-10d%-15s%-10d%-10d%-10d%-10d ",st[i].num,st[i].name,st[i].mark.china,st[i].mark.english,st[i].mark.math,st[i].mark.add);
}
}
return;
}
void change(struct info st[],int n) //修改学生信息
{
int num,i;
printf(" %-10s%-15s%-10s%-10s%-10s%-10s ",
"学生学号","学生姓名","语文","英语","数学","总分");
for(i=0;i<count;i++)
{
printf(" %-10d%-15s%-10d%-10d%-10d%-10d ",st[i].num,st[i].name,st[i].mark.china,st[i].mark.english,
st[i].mark.math,st[i].mark.add);
}
printf(" 请输入需要修改信息的学号:");
scanf("%d",&num);
for(i=0;i<count;i++)
{
if(num==st[i].num)
{
printf(" %-10s%-15s%-10s%-10s%-10s%-10s ",
"学生学号","学生姓名","语文","英语","数学","总分");
printf(" %-10d%-15s%-10d%-10d%-10d%-10d ",st[i].num,st[i].name,st[i].mark.china,st[i].mark.english,st[i].mark.math,st[i].mark.add);break;
}
if(i==count-1){ printf("修改失败~未发现学号%d ",num);goto end;}
}
printf(" 请输入学号为%d学生信息: ",st[i].num);
printf(" 学生学号:");
scanf("%d",&st[i].num);
printf(" 学生姓名:");
scanf("%s",&st[i].name);
printf(" 语文成绩:");
scanf("%d",&st[i].mark.china);
printf(" 英语成绩:");
scanf("%d",&st[i].mark.english);
printf(" 数学成绩:");
scanf("%d",&st[i].mark.math);
getchar();
printf("。。。。。。。。。。。修改成功。。。。。。。。。。。。 ");
write();
end:;
}
int add_up(struct info st[],int n) //统计学生信息
{
int a,b,c,d,e,f;
int i,j,max;
float add=0.0,g=0.0;
for(i=0;i<count-1;i++) //步骤:总分排序
{ max=i;
for(j=i+1;j<count;j++)
if(st[max].mark.add<st[j].mark.add)
{
st[99]=st[max]; st[max]=st[j]; st[j]=st[99];
}
}
printf(" %-10s%-15s%-10s%-10s%-10s%-10s%-10s ",
"学生学号","学生姓名","语文","英语","数学","总分","名次");
max=1;
for(i=0;i<count;i++)
{
printf(" %-10d%-15s%-10d%-10d%-10d%-10d%-10d ",st[i].num,st[i].name,st[i].mark.china,st[i].mark.english,st[i].mark.math,st[i].mark.add,max++);
}
for(i=0;i<count;i++) //步骤:统计平均分
add=st[i].mark.china+add;
aver[0]=add/count;
add=0;
for(i=0;i<count;i++)
add+=st[i].mark.english;
aver[1]=add/count;
add=0;
for(i=0;i<count;i++)
add+=st[i].mark.math;
aver[2]=add/count;
printf(" 平均分: %-10.2f%-10.2f%-10.2f ",aver[0],aver[1],aver[2]) ;
for(i=0;i<count;i++) //步骤: 统计各科挂科率
{if(st[i].mark.china<60) g++; } guake[0]=(g/count)*100;
g=0;
for(i=0;i<count;i++)
{if(st[i].mark.english<60) g++; } guake[1]=(g/count)*100;
g=0;
for(i=0;i<count;i++)
{if(st[i].mark.math<60) g++; } guake[2]=(g/count)*100;
printf(" 挂科率: %-10.2f%-10.2f%-10.2f ",guake[0],guake[1],guake[2]) ;
printf(" 各科状元郎: ");
printf(" %-10s%-15s%-15s%-10s ","状元科目","分数","姓名","学号");
a=0;
for(j=1;j<count;j++) //步骤: 通过打雷法寻最高分
if(st[a].mark.china<st[j].mark.china) a=j;
b=0;
for(j=1;j<count;j++)
if(st[b].mark.english<st[j].mark.english)
{
b=j;
}
c=0;
for(j=1;j<count;j++)
if(st[c].mark.math<st[j].mark.math)
{
c=j;
}
printf("%-10s%-15d%-15s%-10d ","语文",st[a].mark.china,st[a].name,st[a].num);
printf("%-10s%-15d%-15s%-10d ","英语",st[b].mark.english,st[b].name,st[b].num);
printf("%-10s%-15d%-15s%-10d ","数学",st[c].mark.math,st[c].name,st[c].num);
return i;
}
int del(struct info st[],int n) //删除学生信息
{
int num,i;
printf(" %-10s%-15s%-10s%-10s%-10s%-10s ",
"学生学号","学生姓名","语文","英语","数学","总分");
for(i=0;i<count;i++)
{
printf(" %-10d%-15s%-10d%-10d%-10d%-10d ",st[i].num,st[i].name,st[i].mark.china,st[i].mark.english,
st[i].mark.math,st[i].mark.add);
}
printf(" 请输入需要删除信息的学号:");
scanf("%d",&num);
for(i=0;i<count;i++)
{
if(num==st[i].num) break;
if(i==count-1) {printf("删除失败~未发现学号%d ",num);goto end;}
}
for(;i<count-1;i++)
{
st[i]=st[i+1];
}
count--;
printf("。。。。。。。。。。。删除成功。。。。。。。。。。。。 ");
write();
end:
return i;
}