#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#define M 1000
//******结构体
struct student{
char name[30];// 学生姓名
char num[30];//学号
int zy;//专业
int bj;//班级
int math;//数学成绩
int yy;//英语成绩
int dl;//语文成绩
int cyy;//C语言成绩
int ty;//体育成绩
int s;//总分
double pj;//平均分
};
//开始函数声明
void fileread(struct student stu[M]);//*读取文件函数
void filesave(struct student stu[M]);//*保存文件函数
void input(struct student stu[M]);//****输入数据函数
void output(struct student stu[M]);//***输出函数
void del(struct student stu[M]);//******删除学生信息函数 (1 、2)
void gai(struct student stu[M]);//******改成绩函数
void chakang(struct student stu[M]);//**查询学生成绩信息函数
void name_(struct student stu[M]);//****使用学生姓名删其信息 1
void num_(struct student stu[M]);//*****使用学生学号删其信息 2
void order(struct student stu[M]);//****进行排序函数
int count=0;//输入学生成绩信息的个数,一开始为零
struct student t;
//这个t是进行order排序时用的
int main()
{
int sum=0,xuan;//an一开始进入界面进行选择 ,
system(“mode con: cols=369 lines=3690”); //控制编译器高和宽
struct student stu[M];
//*代码运行界面
printf("\t\t\t\t\t\t 欢迎使用学生成绩管理信息系统\n");
do{
printf("\t\t\t\t\t -------------------------------------------\n");
printf("\t\t\t\t\t\t 学生成绩信息管理系统\n");
printf("\t\t\t\t\t\t\t ****************\n");
printf("\t\t\t\t\t\t\t 1、 输入学生信息\n");
printf("\t\t\t\t\t\t\t 2、 浏览学生信息\n");
printf("\t\t\t\t\t\t\t 3、 查看学生信息\n");
printf("\t\t\t\t\t\t\t 4、 修改学生成绩\n");
printf("\t\t\t\t\t\t\t 5、 删除学生信息\n");
printf("\t\t\t\t\t\t\t 6、 学生信息排序\n");
printf("\t\t\t\t\t\t\t 7、 读取文件信息\n"); //从文件读取
printf("\t\t\t\t\t\t\t 8、 保存到文件\n"); //保存到文件
printf("\t\t\t\t\t\t\t 9、 退出系统\n");
printf("\t\t\t\t\t\t\t 10、帮助系统\n");
printf("\t\t\t\t\t\t\t ***************\n");
printf("\t\t\t\t\t\t\t 请输入你的选择\n");
scanf("%d",&xuan); //进行选择功能
fflush(stdin); //清除输入缓冲区
if (xuan>9||xuan<=0)
{
sum++;
if (sum>=8)
{
printf(“输入错误次数过8次,程序将重新开始\n”);
//通过限制错误输入,避免进入死胡同
system(“pause”); //程序暂停,重新选择
system(“cls”); //清屏语句
}
}
switch (xuan) //根据选择,调用不同的函数来完成不同的任务
{
case 1:input(stu);break; //输入
case 2:output(stu);break; //输出
case 3:chakang(stu);break; //查询
case 4:gai(stu);break; //修改
case 5:del(stu);break; //删除
case 6:order(stu);break; //排序
case 7:fileread(stu);break;//读取文件数据
case 8:filesave(stu);break;//保存文件数据
case 9:printf(“使用完毕,请关掉程序\n”);system(“pause”);break;
default:printf(“无效的选择,请重新输入\n”);break;
}
}while (xuan!=9);
printf(“本程序结束 over\n”);
return 0;
}
void filesave(struct student stu[M])//保存文件函数
{
int a=0;
char b;
FILE *fp;
printf(“请确认一边是否已经输入学生信息了:‘y’ or ‘n’?\n”);
scanf("%c",&b);
fflush(stdin);//清除输入缓冲区
while(b!=‘y’&&b!=‘n’)
{
if(b!=‘y’&&b!=‘n’)
printf(“输入错误,重新输入\n”);
printf(“确定请输入’y’ or ‘n’?\n”);
scanf("%c",&b);
fflush(stdin);//清除输入缓冲区
}
if(b==‘y’)
{
if((fp=fopen(“E:\123\新建文件夹”,“wb”))NULL)
{
printf(“文件打开错误,程序无法进行\n”);
exit(0);
}
for(a=0;a<count;a++)
{
fwrite(&stu[a],sizeof(struct student),1,fp);
}
fclose(fp);
if(count0)
printf(“无学生成绩信息,不能保存\n”);
else
printf(“数据已经保存 ok\n”);
}
else
return;
}
void fileread(struct student stu[M])//读取文件函数
{
int a=0;
char b;
FILE fp;
system(“cls”);//清屏语句
printf(“请确认是否已经输入或存有学生信息:‘y’or’n’?\n”);
scanf("%c",&b);
fflush(stdin);//清除输入缓冲区
while(b!=‘y’&&b!=‘n’)
{
if(b!=‘y’&&b!=‘n’)
printf(“输入错误,重新输入\n”);
printf(“请确认是否已经输入或存有学生信息:‘y’or’n’?\n”);
scanf("%c",&b);
fflush(stdin);//清除输入缓冲区
}
if(b==‘y’)
{
if((fp=fopen(“E:\123\新建文件夹”,“rb”))==NULL)
{
printf(“文件打开错误,程序不能进行\n”);
exit(0);
}
fread(&stu[a],sizeof(struct student),1,fp);
count=0;
count++;
a++;
while(fread(&stu[a],sizeof(struct student),1,fp))
{
a++;
count++;
}
fclose(fp);
printf(“数据读取完毕!!!\n”);
system(“cls”);//清屏语句
system(“pause”);//系统重新开始 ,进行选择功能(1~9)
}
else
return;
}
void input(struct student stu[M]) //输入函数
{
int len;
system(“cls”);//清屏语句
printf(“请添加要输入学生的信息\n”);
do {
printf(“输入学生学号(6位数)\n”);
//do-while循环,输错时,有提示(学号为6个数字)
scanf("%s",&stu[count].num);
len=strlen(stu[count].num);
}while(len!=6);
printf("输入学生的姓名\n");
scanf("%s",stu[count].name);
printf("输入学生的专业代码:1电子信息工程 2计算机科学与技术 3自动化 4电气与自动化工程 \n");
//采用如此方法解决了专业输入难问题
scanf("%d",&stu[count].zy);
printf("输入学生班级号码:1、1601 2、1602 3、1603 \n");
scanf("%d",&stu[count].bj);
do {
printf("按顺序输入不大于100的学生各科成绩\n");
printf("数学、英语、语文、C语言、体育\n");
scanf("%d%d%d%d%d",&stu[count].math,&stu[count].yy,&stu[count].dl,&stu[count].cyy,&stu[count].ty);
}while(stu[count].math>100||stu[count].yy>100||stu[count].dl>100||stu[count].cyy>100||stu[count].ty>100);
//判断分数值是否超过100 ,若超过则重新输入
stu[count].s=(stu[count].math+stu[count].yy+stu[count].dl+stu[count].cyy+stu[count].ty);
//先求总分
stu[count].pj=stu[count].s/5.0; //求出平均值
count++; //输入学生成绩信息的个数
}
void output(struct student stu[M]) //*输出函数
{
int j;
system(“cls”);//清屏语句
if (count0)
{
printf(“目前没有学生信息记录\n”);
return;
}
for (j=0;j<count;j++)
{
for (j=0;j<count;j++)
{ //for循环控制输出的个数
printf("学号:%s ",stu[j].num);
printf("姓名:%s ",stu[j].name);
if (stu[j].zy1)
printf("专业:电子信息工程 ");
else if (stu[j].zy2)
printf("专业:计算机科学与技术 ");
else if(stu[j].zy3)
printf("专业:自动化 ");
else
printf("专业:电气与自动化工程 ");
printf("班级:184%d ",stu[j].bj);
printf("数学:%d ",stu[j].math);
printf("英语:%d ",stu[j].yy);
printf("语文:%d ",stu[j].dl);
printf(“C语言:%d “,stu[j].cyy);
printf(“体育:%d “,stu[j].ty);
printf(“总分:%d “,stu[j].s);
printf(“平均:%.1lf “,stu[j].pj);
printf(“顺序:%d \n”,j+1);
}
}
}
void chakang(struct student stu[M]) //*****查看函数 ***
{
int j=0;
char xh[25];//通过学号查找学生信息
system(“cls”);
if(count0)
{
printf(“目前没有学生信息\n”);
return;
}
else
{
printf(“请输入你想要查看的同学学号(12位数字)\n”);
scanf("%s",&xh);
fflush(stdin);//清除输入缓冲区
for(j=0;j<count;j++)
{
if(strcmp(stu[j].num,xh)0)//判断大小是否相等
{
printf("学号:%s ",stu[j].num);
printf("姓名:%s ",stu[j].name);
if (stu[j].zy1)
printf("专业:电子信息工程 ");
else if (stu[j].zy2)
printf(“专业:计算机科学与技术 “);
else if(stu[j].zy3)
printf("专业:自动化 ");
else
printf("专业:电气与自动化工程 ");
printf("班级:184%d ",stu[j].bj);
printf("数学:%d ",stu[j].math);
printf("英语:%d ",stu[j].yy);
printf("语文:%d ",stu[j].dl);
printf("C语言:%d ",stu[j].cyy);
printf("体育:%d ",stu[j].ty);
printf("总分:%d ",stu[j].s);
printf("平均:%.1lf ",stu[j].pj);
// **在查看个人学生成绩时,可以看到总分排名
int a,b,c=j;
for (a=0;a<count;a++) //**冒泡排序
{
for (b=a+1;b<count;b++)
{
if (stu[b].s>stu[a].s)
{
t=stu[b];
stu[b]=stu[a];
stu[a]=t;
}
}
}
int d=1;
for(a=0;a<count;a++)
{
if(stu[c].s<stu[a].s)
d++;
else
break;
}
printf(“总分排名:%d\n”,d);
}
}
if(jcount)//判断是否有学生成绩信息
printf(“没有你所查看的学生信息\n”);
}
}
void gai(struct student stu[M]) //修改成绩函数
{
int j,course;
char xh[25];
system(“cls”);//清屏语句
if (count==0)//判断是否有学生成绩信息
{
printf(“目前没有学生信息\n”);
return;
}
else
{
printf(“修改的学生学号为:\n”);
scanf(”%s”,&xh);
fflush(stdin);//清除输入缓冲区
for (j=0;j<count;j++)
if (strcmp(stu[j].num,xh)0) //
{
printf(“修改学生成绩\n”);
printf(“选择课程: 1、数学 2、英语 3、语文 4、C语言 5、体育\n”);
scanf("%d",&course);
printf(“改为多少分:\n”);
switch(course)
{ //进行修改所选学生的一门的成绩
case 1:scanf("%d",&stu[j].math);break;
case 2:scanf("%d",&stu[j].yy);break;
case 3:scanf("%d",&stu[j].dl);break;
case 4:scanf("%d",&stu[j].cyy);break;
case 5:scanf("%d",&stu[j].ty);break;
default:printf(“请重新输入\n”);break;
}
}
}
}
void del(struct student stu[M]) //自定义删除函数
{
int choice;
system(“cls”);//清屏语句
if (count0)
{
printf(“目前没有学生信息\n”);
return;
}
else
{
printf(“请选择你所要删除的方式:1、学号 2、姓名 3、取消\n”);
scanf(”%d”,&choice);
switch(choice)
{
case 3:return;break;
case 2:name_(stu);break;
case 1:num_(stu);break;
default:printf(”,输入错误,重新输入\n”);break;
}
}
}
void num_(struct student stu[M]) //通过学号删除学生信息函数
{
int j,index=0,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=index;j<count;j++)
stu[j]=stu[j+1];
count–;
if (count<k)
printf(“删除成功\n”);
}
index++;}
if (jcount)
printf(“没有你所要删除的学生的信息\n”);
}
void name_(struct student stu[M]) //通过姓名方式删除学生信息函数
{
int flag=0,j,k=count;
char xm[25];
system(“cls”);//清屏语句
printf(“所要删除的学生学号为:\n”);
scanf(”%s”,xm);
fflush(stdin);//清除输入缓冲区
for (j=0;j<count;j++)
{
if (strcmp(stu[j].num,xm)==0)
{
for (j=flag-1;j<count;j++)
stu[j]=stu[j+1];
count--;
if (count<k)
printf("删除成功\n");
}
flag++;}
if (j==count)
printf("没有你所要删除的学生的信息\n");
}
void order(struct student stu[M]) //排序函数
{
int j,choice,i;
system(“cls”);//清屏语句
printf(“请输入你想要进行排序的方式(所有排序的方式均是降序)!!!\n”);
printf(“1、数学 2、英语 3、语文 4、C语言 5、体育 6、平均分 7、学号 \n”);
scanf("%d",&choice);
//以下都使用冒泡排序 *****
switch (choice)
{
case 1:for (i=0;i<count;i++) // ** 数学排名(高分–>低分)
{
for (j=i+1;j<count;j++)
{
if (stu[j].math>stu[i].math)
{ t=stu[j];
stu[j]=stu[i];
stu[i]=t;
}
}
};break;
case 2:for (i=0;i<count;i++) // 英语排名(高分–>低分)
{
for (j=i+1;j<count;j++)
{
if (stu[j].yy>stu[i].yy)
{ t=stu[j];
stu[j]=stu[i];
stu[i]=t;
}
}
}
break;
case 3:for (i=0;i<count;i++) // ** 专业课导论排名(高分–>低分)
{
for (j=i+1;j<count;j++)
{
if (stu[j].dl>stu[i].dl)
{ t=stu[j];
stu[j]=stu[i];
stu[i]=t;
}
}
}
break;
case 4:for (i=0;i<count;i++) // *** C语言排名(高分–>低分)**
{
for (j=i+1;j<count;j++)
{
if (stu[j].cyy>stu[i].cyy)
{ t=stu[j];
stu[j]=stu[i];
stu[i]=t;
}
}
}
break;
case 5:for (i=0;i<count;i++) // ** 体育排名(高分–>低分)**
{
for (j=i+1;j<count;j++)
{
if (stu[j].ty>stu[i].ty)
{ t=stu[j];
stu[j]=stu[i];
stu[i]=t;
}
}
}
break;
case 6:for (i=0;i<count;i++) //平均分(总分)排名(高分–>低分) ***
{
for (j=i+1;j<count;j++)
{
if (stu[j].pj>stu[i].pj)
{
t=stu[j];
stu[j]=stu[i];
stu[i]=t;
}
}
}
break;
case 7:for (i=0;i<count;i++) // ** 学号排名(小到大) **
{
for (j=i+1;j<count;j++)
{
if (strcmp(stu[j].num,stu[i].num)<0)
{ t=stu[j];
stu[j]=stu[i];
stu[i]=t;
}
}
}
break;
default:printf("请重新输入\n");break;
}
}