/*教学成绩管理系统*/
/*说明:《教学成绩管理系统》基本信息包括班级、学号、姓名及语文、数学、外语、物理、化学五科成绩的信息,可以根据实际情况有所增减*/
/*教学成绩管理系统*/
/*说明:《教学成绩管理系统》基本信息包括班级、学号、姓名及语文、数学、外语、物理、化学五科成绩的信息,可以根据实际情况有所增减*/
#include "stdio.h" /*控制台I/O的头文件*/
#include "string.h" /*字符串函数的头文件*/
#include "stdlib.h" /*exit()函数的头文件*/
#define Max 100 /*定义最多可以输入的学生数*/
int Interface(char (*x)[20],int n); /*操作界面*/
int Add(int start,struct student *p); /*增加学生数*/
void Display(struct student *p,int start,int end); /*显示已存在的数据*/
void SortName(struct student *p,int n); /*按姓名排序*/
void SortTotal(struct student *p,int n); /*按总分排序(由高到低)*/
void SortChinese(struct student *p,int n); /*按语文排序(由高到低)*/
void SortMath(struct student *p,int n); /*按数学排序(由高到低)*/
void SortForeignLanguage(struct student *p,int n); /*按外文排序(由高到低)*/
void SortPhysics(struct student *p,int n); /*按物理排序(由高到低)*/
void SortChemistry(struct student *p,int n); /*按化学排序(由高到低)*/
int Search (struct student *p,char *t,int n); /*信息检索*/
int Find(struct student *p,int n); /*信息查找*/
void Modify(struct student *p,int n); /*信息修改*/
int Delete(struct student *p,int n); /*信息删除*/
void Swap(struct student *p1,struct student *p2); /*学生信息互换*/
void SaveFile(struct student *p,int n); /*文件保存*/
char password[8]="7654321"; /*设置系统管理员密码*/
struct student
{
char Class[30];
char StudentNumber[20];
char Name[20];
int Score[5];
int Total;
};
/**********************************************************\
主函数
\**********************************************************/
void main()
{
struct student stu[Max]; /*定义结构数组*/
FILE *fp; /*结构数组,即可输入的最大学生数,最大值为声明中预定义的Max*/

int s; /*设置变量,以用于用户输入信息的接收,并将其作为转向函数的参数*/
int n=0; /*整型变量*/
char choice;
char menu[][20]={"添加","显示","按姓名排序","按总分排序","按语文成绩排序",
"按数学成绩排序","按外语成绩排序","按物理成绩排序","按化学成绩排序",
"检索","修改","删除","存盘","返回"};
/**********************系统密码管理********************/

char pass[8];
int flag=0;
int w=3;
char openfile[10];
do{
printf("请输入管理员密码:\n");
scanf("%s",pass);
if(!strcmp(pass,password))
{
printf("PASS\n\n\n");
flag = 1;
break;
}
else
{
printf("密码错误,请重新输入:\n");
w--;
}
}
while(w>0);
if(!flag)
{
printf("你已连续三次输入错误,请确认后再使用本系统,谢谢!\n");
exit(0);
}
system("cls"); /*用system调用dos命令,清屏*/

/**********************打开已有文件********************/

printf ("\n 打开已有的文件\"d:\\student.txt\"?(y/n)");
scanf("%s",openfile);
if((strcmp(openfile,"y")==NULL))
{
if((fp=fopen("d:\\student.txt","r"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
while (feof(fp)==0)
{
fscanf(fp,"%s %s %s %d %d %d %d %d %d\n",stu[n].Class,stu[n].StudentNumber,stu[n].Name,
&stu[n].Total,&stu[n].Score[0],&stu[n].Score[1],&stu[n].Score[2],
&stu[n].Score[3],&stu[n].Score[4]);
n++;
}
fclose(fp);
}
else
printf("请创建一个新文件\"student.txt\".\n");
system("cls"); /*用system调用dos命令,清屏*/
printf("~~~~~~~~~~~~~\t\t\t\t\t~~~~~~~~~~~~~\n");
printf("~~~~~~~~~~~~~\t\t\t\t\t~~~~~~~~~~~~~\n");
printf("\t\t 欢迎进入教学成绩管理系统\n");
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%\t\t\t\t\t%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
printf("-------------------------------------------------------------");
printf("\n\n\n\n");
printf("单位:北京三零九中学\n");
printf("地址:北京市海淀区\n");
printf("电话:010-70000000");
printf("\n\n\n\n");
printf("==============\t\t==============\n");
printf("本系统由“天地人和软件有限公司”开发\n");
printf("地址:北京市海淀区学院路\n");
printf("编制人:天天\n");
printf("==============\t\t==============\n");
printf("\n\n");
printf("\t\t请任意输入一个值并回车进入系统\n");
scanf("%s",&choice);
if(choice=='n'||choice=='N')
exit(1);
system("cls"); /*用system调用dos命令,清屏*/
do
{
s=Interface(menu,14); /*调用Interface()函数*/
switch (s) /*转向语句,选择以实现不同的功能*/
{
case 0,n=Add(n,stu);break;
case 1,Display(stu,0,n-1);break;
case 2,SortName(stu,n);break;
case 3,SortTotal(stu,n);break;
case 4,SortChinese(stu,n);break;
case 5,SortMath(stu,n);break;
case 6,SortForeignLanguage(stu,n);break;
case 7,SortPhysics(stu,n);break;
case 8,SortChemistry(stu,n);break;
case 9,Find(stu,n);break;
case 10,Modify(stu,n);break;
case 11,n=Delete(stu,n);break;
case 12,SaveFile(stu,n);
}
}
while(s>=0&&s<=12);
}
/**********************************************************\
操作界面函数
\**********************************************************/
int Interface(char (*x)[20],int n)
{
int i;
int j;
printf("\n×××××××教学成绩管理系统×××××××\n");
do
{
for (j=0;j<n;j++)
printf("%2d.%s\n",j+1,x[j]);
printf("请从上述选项中选择:\n");
scanf("%d",&i); /*接收键盘输入的字符*/
}
while (i<0||i>n+1);
return (int)i-1;
}
/**********************************************************\
添加信息函数
\**********************************************************/
int Add(int start,struct student *p)
{
int n;
for (n=start;n<Max;n++)
{
printf("\n [%d]输入学生信息(按e键退出)\n",n+1); /*若要退出输入,则按e*/
printf("班级:");
scanf("%s",(p+n)->Class);
if (strcmp((p+n)->Class,"e")==0)break;
printf("学号:");
scanf("%s",(p+n)->StudentNumber);
printf("姓名:");
scanf("%s",(p+n)->Name);
printf("语文:");
scanf("%d",&((p+n)->Score[0]));
printf("数学:");
scanf("%d",&((p+n)->Score[1]));
printf("外语:");
scanf("%d",&((p+n)->Score[2]));
printf("物理:");
scanf("%d",&((p+n)->Score[3]));
printf("化学:");
scanf("%d",&((p+n)->Score[4]));
(p+n)->Total=0;
(p+n)->Total=((p+n)->Total+(p+n)->Score[0]+(p+n)->Score[1]
+(p+n)->Score[2]+(p+n)->Score[3]+(p+n)->Score[4]);

}
return n;
}
/**********************************************************\
显示信息函数
\**********************************************************/
void Display(struct student *p,int start,int end)
{
int i;
printf("\n%9s%10s%10s","班级","学号","姓名"); /*显示标题*/
printf("%8s%8s%8s%8s%8s%8s","总分","语文","数学","外语","物理","化学");
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
for(i=start;i<=end;i++)
{
printf("%9s%10s%10s",(p+i)->Class,(p+i)->StudentNumber,(p+i)->Name);
printf("%8d%8d%8d%8d%8d%8d",(p+i)->Total,(p+i)->Score[0],(p+i)->Score[1],
(p+i)->Score[2],(p+i)->Score[3],(p+i)->Score[4]);
printf("\n");
}
}
/**********************************************************\
按姓名排序函数
\**********************************************************/
void SortName(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if(strcmp((p+k)->Name,(p+j)->Name)>0)k=j; /*交换学生姓名*/
if(i!=k)Swap(p+k,p+i);
}
printf("\n 完成姓名排序!\n");
}
/**********************************************************\
按总分排序函数
\**********************************************************/
void SortTotal(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Total<(p+j)->Total)k=j;
if(i!=k)Swap(p+k,p+i); /*交换总分*/
}
printf("\n 完成总分排序(由高到低)!\n");
}
/**********************************************************\
按语文成绩排序函数
\**********************************************************/
void SortChinese(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score[0]<(p+j)->Score[0])k=j;
if(i!=k)Swap(p+k,p+i); /*交换语文成绩*/
}
printf("\n 完成语文成绩由高到低排序!\n");
}
/**********************************************************\
按数学成绩排序函数
\**********************************************************/
void SortMath(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score[1]<(p+j)->Score[1])k=j;
if(i!=k)Swap(p+k,p+i); /*交换数学成绩*/
}
printf("\n 完成数学成绩由高到低排序!\n");
}
/**********************************************************\
按外语成绩排序函数
\**********************************************************/
void SortForeignLanguage(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score[2]<(p+j)->Score[2])k=j;
if(i!=k)Swap(p+k,p+i); /*交换外语成绩*/
}
printf("\n 完成外语成绩由高到低排序!\n");
}
/**********************************************************\
按物理成绩排序函数
\**********************************************************/
void SortPhysics(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score[3]<(p+j)->Score[3])k=j;
if(i!=k)Swap(p+k,p+i); /*交换物理成绩*/
}
printf("\n 完成物理成绩由高到低排序!\n");
}
/**********************************************************\
按化学成绩排序函数
\**********************************************************/
void SortChemistry(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score[4]<(p+j)->Score[4])k=j;
if(i!=k)Swap(p+k,p+i); /*交换化学成绩*/
}
printf("\n 完成化学成绩由高到低排序!\n");
}
/**********************************************************\
按姓名检索函数
\**********************************************************/
int Find(struct student *p,int n)
{
int i;
char str[20];
printf("\n 请输入学生姓名:");
scanf("%s",str);
i=Search(p,str,n); /*调用Search()函数*/
if(i==-1)
printf("没有匹配信息,请重试 %s!\n",str);
else
Display(p,i,i);
getchar();
return i;
}
/**********************************************************\
修改信息函数
\**********************************************************/
void Modify(struct student *p,int n)
{
int i;
i=Find(p,n); /*调用Find()函数*/
if(i>=0) /*若找到匹配信息,则修改*/
{
printf("请输入新信息:\n");
printf("班级:");
scanf("%s",(p+i)->Class);
printf("学号:");
scanf("%s",(p+i)->StudentNumber);
printf("姓名:");
scanf("%s",(p+i)->Name);
printf("语文:");
scanf("%d",&((p+i)->Score[0]));
printf("数学:");
scanf("%d",&((p+i)->Score[1]));
printf("外语:");
scanf("%d",&((p+i)->Score[2]));
printf("物理:");
scanf("%d",&((p+i)->Score[3]));
printf("化学:");
scanf("%d",&((p+i)->Score[4]));
(p+i)->Total=0;
(p+i)->Total=((p+i)->Total+(p+i)->Score[0]+(p+i)->Score[1]
+(p+i)->Score[2]+(p+i)->Score[3]+(p+i)->Score[4]);
printf("\n修改已完成!\n");
}
}
/**********************************************************\
删除信息函数
\**********************************************************/
int Delete(struct student *p,int n)
{
int i;
i=Find(p,n); /*调用Find()函数*/
if(i>=0) /*若找到匹配信息,则删除*/
{
p[i]=p[n-1];
n=n-1;
printf("\n信息已删除!\n");
}
return n;
}
void Swap(struct student *p1,struct student *p2)
{
struct student temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
int Search(struct student *p,char *t,int n)
{
int i;
for (i=0;i<n;i++)
if(!strcmp((p+i)->Name,t))
return i;
return -1;
}
/**********************************************************\
保存文件函数
\**********************************************************/
void SaveFile(struct student *p,int n)
{
FILE *fp1;
char i;
if((fp1=fopen("d:\\student_new.txt","w"))==NULL) /*以文本方式生成并"写打开"文件*/
{
printf("不能打开文件!\n"); /*检测打开文件中出现的错误,并决定是否写入文件*/
exit(1);
}
for (i=0;i<n;i++)
{
if((fprintf(fp1,"%10s %10s %10s %10d %10d %10d %10d %10d %10d \n",(p+i)->Class,
(p+i)->StudentNumber,(p+i)->Name,(p+i)->Total,(p+i)->Score[0],(p+i)->Score[1],
(p+i)->Score[2],(p+i)->Score[3],(p+i)->Score[4]))==NULL)
printf("文件写入出错!\n"); /*写入文件,如果为空,则提示出错*/
}
printf("\n 文件已保存!\n");
fclose(fp1); /*关闭文件*/
}