#include
#include
#include
#include
/*作者:北京交通大学运输10级 lenhal
功能:成绩管理系统
时间:2012年7月
*/
int n=2; //全局变量,要输入的学生数,自行改变其值
struct student
{
char num[10];
char name[10];
float score[3];
float avg;
}stu[200];
/**********************************************************************************************/
void enter(struct student t[])//输入数据
{
int i,j,k,a;
system("cls");
printf("输入数据之前,请确定输入的人数\n你是否已经确定了人数\n");
printf("是输入1回车继续\n否输入0回车退出程序,改变全局变量的值\n");
scanf("%d",&a);
if(a!=1)
exit(0);
for(i=0;i{
system("cls"); //清屏
printf("请输入第%d个学生的学号:\n",i+1);
scanf("%s",t[i].num);
for(j=0;j if(strcmp(t[i].num,t[j].num)==0) //避免有相同的学号
{
i--;
printf("此学号的学生已存在,请重新输入:");
Sleep(3000);
break;
}
}
for(i=0;i{
system("cls");
printf("请输入学号为%s学生的:(用空格隔开) \n名字 第一门成绩 第二门成绩 第三门成绩\n",t[i].num);
//t[i].score[0]=0;t[i].score[1]=0;t[i].score[2]=0;
scanf("%s%f%f%f",t[i].name,&t[i].score[0],&t[i].score[1],&t[i].score[2]);
t[i].avg=(t[i].score[0]+t[i].score[1]+t[i].score[2])/3.0;
}
}
/**********************************************************************************************/
int list(struct student t[]) //显示所有信息
{
int i;
system("cls");
printf("所有%d个学生信息如下:\n\n",n);
printf("学号 名字 第一门成绩 第二门成绩 第三门成绩 平均分\n");
for(i=0; ;i++)
{
if(strlen(t[i].num)!=0) //判断是否结束
printf("%s\t%s\t %5.2f\t %5.2f\t %5.2f\t %5.2f\t\n",
t[i].num,t[i].name,t[i].score[0],t[i].score[1],t[i].score[2],t[i].avg);
else
break;
}
putchar(10);
}
/**********************************************************************************************/
void research(struct student t[]) //按学号查找某个信息
{
int i,a,y;
char s[10];
while(1)
{
system("cls");
printf("请输入要查询的学号:");
scanf("%s",&s);
for(i=0; ;i++)
{
system("cls");
if (!(strcmp(s,t[i].num))) //如果找到该学号,则输出
{
printf("学号为%s的学生成绩如下:\n\n",t[i].num);
printf("学号 名字 第一门成绩 第二门成绩 第三门成绩 平均分\n");
printf("%s\t%s\t %5.2f\t %5.2f\t %5.2f\t %5.2f\t\n",
t[i].num,t[i].name,t[i].score[0],t[i].score[1],t[i].score[2],t[i].avg);
putchar(10);
break;
}
else if((strcmp(s,t[i].num))!=0 && strlen(t[i].num)==0)//查找完毕后找不到该学号,结束
{
printf("\n没有此学号的信息:\n\n");
break;
}
}
printf("************************************\n");
printf(" 继续查询,输入1回车\n");
printf(" 返回主菜单,输入2回车\n");
printf(" 退出程序,输入任意回车\n");
printf("************************************\n");
scanf("%d",&a);
if(a==1)
research(stu,n);
else if(a==2)
break;
else
{
system("cls");
printf("是否退出?直接退出输入1回车,保存数据退出输入2回车,输入22回主菜单\n建议退出前先保存数,否则数据将丢失");
scanf("%d",&y);
if(y==1)
exit(0);
else if(y==2)
save(stu);
else
main();
}
}
main();
}
/**********************************************************************************************/
void del(struct student t[]) //删除某一学生的信息
{
int i,j,a,z,y;
char b[10];
system("cls");
printf("请输入要删除的学号:");
scanf("%s",b);
for(i=0; ;i++)
if(strcmp(b,t[i].num)==0)
break;
else if((strcmp(b,t[i].num))!=0 && strlen(t[i].num)==0)
{
printf("没有此学号的信息:\n\n");
Sleep(3000);
break;
}
if(strlen(t[i].num)!=0)
{
system("cls");
printf("确认删除? 是输入1回车\n");
scanf("%d",&z);
if(z==1)
for(j=i; ;j++)
{
if(strlen(t[j].num)==0)
break;
else
{
t[j]=t[j+1];
n=n-1;
}
}
}
system("cls");
printf("************************************\n");
printf(" 继续删除,输入1回车\n");
printf(" 返回主菜单,输入2回车\n");
printf(" 退出程序,输入任意回车\n");
printf("************************************\n");
scanf("%d",&a);
if(a==1)
del(stu);
else if(a==2)
main();
else
{
system("cls");
printf("是否退出?直接退出输入1回车,保存数据退出输入2回车,输入22回主菜单\n建议退出前先保存数,否则数据将丢失");
scanf("%d",&y);
if(y==1)
exit(0);
else if(y==2)
save(stu);
else
main();
}
}
/**********************************************************************************************/
void add(struct student t[]) //增加学生数据
{
int i,j,m,a,y;
system("cls");
printf("请输入要增加的记录数:\nm=");
scanf("%d",&m);
for(i=n;i{
system("cls");
printf("请输入第%d个新增学生的学号:",i-n+1);
scanf("%s",t[i].num);
for(j=0;j if(strcmp(t[i].num,t[j].num)==0) //避免学号重复
{
i--;
printf("此学号的学生已存在,请重新输入:");
Sleep(3000);
break;
}
}
for(i=n;i{
system("cls");
printf("请输入增加学号为%s学生的:(用空格隔开) \n名字 第一门成绩 第二门成绩 第三门成绩\n",t[i].num);
//t[i].score[0]=0;t[i].score[1]=0;t[i].score[2]=0;
scanf("%s%f%f%f",t[i].name,&t[i].score[0],&t[i].score[1],&t[i].score[2]);
t[i].avg=(t[i].score[0]+t[i].score[1]+t[i].score[2])/3.0;
}
n=n+m; //学生数等于本来学生数加新加的学生数
printf("************************************\n");
printf(" 继续添加,输入1回车\n");
printf(" 返回主菜单,输入2回车\n");
printf(" 退出程序,输入任意回车\n");
printf("************************************\n");
scanf("%d",&a);
if(a==1)
add(stu);
else if(a==2)
main();
else
{
system("cls");
printf("是否退出?直接退出输入1回车,保存数据退出输入2回车,输入22回主菜单\n建议退出前先保存数,否则数据将丢失");
scanf("%d",&y);
if(y==1)
exit(0);
else if(y==2)
save(stu);
else
main();
}
}
/**********************************************************************************************/
int save(struct student t[]) //保存数据到文件中
{
FILE *fp;
char s[20],ch;
int i,a,y;
system("cls");
printf("保存到新的文件输入1回车\n保存到已有文件输入2回车\n");
scanf("%d",&a);
ch=getchar(); //接收回车字符,否则gets()函数将空格赋给s,出错
if(a==1)
{
printf("请输入新的文件名:\n(包括其拓展名,20个字符以下)\n");
gets(s);
if((fp=fopen(s,"w+"))==NULL) //使fp指向文件
{
printf("没有此文件\n");
exit(0);
}
}
else if(a==2)
{
printf("请输入已有文件名:\n(包括其拓展名,20个字符以下)\n");
gets(s);
if((fp=fopen(s,"w+"))==NULL)
{
system("cls");
printf("没有此文件\n");
exit(0);
}
}
fprintf(fp,"%d\n",n); //将学生数写的文件中
for(i=0; ;i++)
if(strlen(t[i].num)!=0) //如果学号不为空,将数据写到指定文件中
{
fprintf(fp,"%s\t%s\t%-5.2f\t%-5.2f\t%-5.2f\t%-5.2f",
t[i].num,t[i].name,t[i].score[0],t[i].score[1],t[i].score[2],t[i].avg);
fprintf(fp,"\n");
}
else
break;
fclose(fp);
system("cls");
printf(" \n保存完成!\n");
}
/**********************************************************************************************/
void read(struct student t[]) //读取文件中的数据
{
FILE *fp;
int y,m,i,x;
char s[20],ch;
ch=getchar(); //接收回车字符,否则gets()函数将空格赋给s,出错
system("cls");
printf("请输入要读取数据的文件名:\n(包括其拓展名,20个字符以下)\n");
gets(s);
if((fp=fopen(s,"r"))==NULL)
{
system("cls");
printf("没有此文件\n");
Sleep(3000);
system("cls");
printf("是否退出?直接退出输入1回车,保存数据退出输入2回车,输入22回主菜单\n建议退出前先保存数,否则数据将丢失");
scanf("%d",&y);
if(y==1)
exit(0);
else if(y==2)
save(stu);
else
main();
}
fscanf(fp,"%d",&x);//读取学生数
for(i=0;ifscanf(fp,"%s%s%f%f%f%f",t[i].num,t[i].name,&t[i].score[0],
&t[i].score[1],&t[i].score[2],&t[i].avg);
fclose(fp);
system("cls");
n-=n; //将n置0
n=x;
printf(" \n读取完成!\n");
}
/**********************************************************************************************/
menu() //选择菜单
{
int x;
printf("请选择相应的菜单:\n");
printf("************************************\n");
printf(" 输入新记录,输入0回车\n");
printf(" 显示全部学生成绩,输入1回车\n");
printf(" 查询相应的记录,输入2回车\n");
printf(" 删除相应的记录,输入3回车\n");
printf(" 增加新的记录,输入4回车\n");
printf(" 从文件中读入记录,输入5回车\n");
printf(" 按平均分从高到低排序并输出,输入6回车\n");
printf(" 按学号从低到高排序并输出,输入7回车\n");
printf(" 查找每门成绩的最高分,输入8回车\n");
printf(" 保存成绩到文本中,输入9回车\n");
printf(" 退出程序,输入11回车\n");
printf("************************************\n");
scanf("%d",&x);
return x;
}
/**********************************************************************************************/
void to_exit() //退出
{
int y;
system("cls");
printf("是否退出?直接退出输入1回车,保存数据退出输入2回车,输入22回主菜单\n建议退出前先保存数,否则数据将丢失");
scanf("%d",&y);
if(y==1)
exit(0);
else if(y==2)
save(stu);
else
main();
}
/**********************************************************************************************/
void avg_arrange(struct student t[])//按平均分从高到低排序
{
int i,j;
struct student temp[1];
for(i=0;ifor(j=i+1;j if(t[i].avg < t[j].avg)
{
temp[0]=t[i];
t[i]=t[j];
t[j]=temp[0];
}
list(stu);
}
/**********************************************************************************************/
void num_arrange(struct student t[])//按学号从小到大排序
{
int i,j;
struct student temp[1];
for(i=0;ifor(j=0;j if(strcmp(t[j].num,t[j+1].num)>0)
{
temp[0]=t[j];
t[j]=t[j+1];
t[j+1]=temp[0];
}
list(t);
}
/**********************************************************************************************/
void high(struct student t[])//查找某门科目的最高成绩
{
int i,j,k;
struct student max[1];
max[0]=t[0];
system("cls");
printf("请输入要查找的科目: 1 or 2 or 3\n");
scanf("%d",&k);
for(i=1;imax[0]=max[0].score[k-1] > t[i].score[k-1] ? max[0]:t[i];
system("cls");
printf("第 %d 科目: 最分为:%-5.2f 学号为%s\n",k,max[0].score[k-1],max[0].num);
}
/**********************************************************************************************/
main()
{
int a;
while(1)
{
a=menu();
switch(a)//根据选择菜单做相应的操作
{
case 0 : enter(stu);break;
case 1: list(stu);break;
case 2: research(stu);break;
case 3: del(stu);break;
case 4: add(stu);break;
case 5: read(stu);break;
case 6: avg_arrange(stu);break;
case 7: num_arrange(stu);break;
case 8: high(stu);break;
case 9: save(stu);break;
default : to_exit();break;
}
}
}
/**********************************************************************************************/
斯蒂芬感到十分告诉对方告诉对方个
用结构体加上链表呗