题目: 学生成绩管理系统
功能: 输入若干个学生信息(比如:学号,姓名及三门课成绩),能实现
学生信息的录入、查询、插入、排序等功能。
要求: 用数据文件保存学生信息。利用菜单可以循环完成各个操作。
进一步要求: 能够实现对成绩的修改更好。
(文件函数 、结构数组,排序等)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void first_print()
{
printf("\n=============================\n");
printf("欢迎进入该系统!!!");
printf("\n=============================\n");
}
void menu()
{
printf("\n*****************************\n");
printf("1、录入信息\n2、显示信息\n3、查询信息\n4、插入信息\n5、升序排序\n6、降序排序\n7、修改信息\n8、删除信息\n9、退出系统");
printf("\n*****************************\n");
}
struct MM{
char num[20];
char name[20];
float cj[3];
float score;
float ave;
}mm;
void scanf_1()
{
int n=0;
char ch,ck[20];
FILE *fp;
if((fp=fopen("ding.dat","w+"))==NULL)
{printf("cannot open file\n");
exit(0);
}
do{getchar();
printf("请输入学号:\n");
gets(ck);
if(strlen(ck)>20)
{
printf("输入字符过长,已退出输入!!");
break;
}
rewind(fp);
while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
{
if(strcmp(ck,mm.num)==0)
{
printf("学号输入重复,已退出输入!!");
n++;
break;
}
}
if(n)
break;
strcpy(mm.num,ck);
printf("请输入姓名:\n");
gets(mm.name);
if(strlen(mm.name)>20)
{
printf("输入字符过长,已退出输入!!");
break;
}
printf("请输入语文、数学、英语成绩:\n");
scanf("%f%f%f",&mm.cj[0],&mm.cj[1],&mm.cj[2]);
mm.score=mm.cj[0]+mm.cj[1]+mm.cj[2];
mm.ave=mm.score/3;
fprintf(fp,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
printf("是否继续 y or n?\n");
getchar();
ch=getchar();
}while(ch=='y'||ch=='Y');
fclose(fp);
}
void scanf_2()
{
int n=0;
char ch,ck[20];
FILE *fp;
if((fp=fopen("ding.dat","a+"))==NULL)
{printf("cannot open file\n");
exit(0);
}
do{getchar();
printf("请输入学号:\n");
gets(ck);
if(strlen(ck)>20)
{
printf("输入字符过长,已退出输入!!");
break;
}
rewind(fp);
while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
{
if(strcmp(ck,mm.num)==0)
{
printf("学号输入重复,已退出输入!!");
n++;
break;
}
}
if(n)
break;
strcpy(mm.num,ck);
printf("请输入姓名:\n");
gets(mm.name);
if(strlen(mm.name)>20)
{
printf("输入字符过长,已退出输入!!");
break;
}
printf("请输入语文、数学、英语成绩:\n");
scanf("%f%f%f",&mm.cj[0],&mm.cj[1],&mm.cj[2]);
mm.score=mm.cj[0]+mm.cj[1]+mm.cj[2];
mm.ave=mm.score/3;
fprintf(fp,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
printf("是否继续 y or n?\n");
getchar();
ch=getchar();
}while(ch=='y'||ch=='Y');
fclose(fp);
}
void print()
{FILE *fp;
printf("学号 姓名 语文 数学 英语 总分 平均分\n");
if((fp=fopen("ding.dat","r"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
{
printf("%-20s%-20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
}
fclose(fp);
}
void find()
{
int a=0,b=0;
char ch[20];
FILE *fp;
if((fp=fopen("ding.dat","r"))==NULL)
{printf("cannot open file\n");
exit(0); }
printf("请输入要查找成绩的方式\n1.按学号查找\n2.按姓名查找\n");
scanf("%d",&a);
getchar();
if(a==1)
{
printf("请输入学号:\n");
gets(ch);
while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
{
if(strcmp(mm.num,ch)==0)
{b++;
printf("学号 姓名 语文 数学 英语 总分 平均分\n");
printf("%-20s%-20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
}
}
if(b==0)
printf("no found\n");
}
if(a==2)
{
printf("请输入姓名:\n");
gets(ch);
while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
{
if(strcmp(mm.name,ch)==0)
{b++;
printf("学号 姓名 语文 数学 英语 总分 平均分\n");
printf("%-20s%-20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
}
}
if(b==0)
printf("no found\n");
}
fclose(fp);
}
void change()
{struct XX{
char num[20];
char name[20];
float cj[3];
float score;
float ave;
}xx;
int b=0;
char ch[20],ck;
FILE *fp;
FILE *fp2;
do{
if((fp=fopen("ding.dat","r"))==NULL)
{printf("cannot open file\n");
exit(0);}
if((fp2=fopen("temp.dat","w"))==NULL)
{printf("cannot open file\n");
exit(0);}
printf("请输入要修改成绩的学号:\n");
scanf("%s",ch);
while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
{
if(strcmp(mm.num,ch)==0)
{b++;
printf("学号 姓名 语文 数学 英语 总分 平均分\n");
printf("%-20s%-20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
getchar();
printf("请输入新学号:\n");
gets(xx.num);
printf("请输入新姓名:\n");
gets(xx.name);
printf("请输入新语文、数学、英语成绩:\n");
scanf("%f%f%f",&xx.cj[0],&xx.cj[1],&xx.cj[2]);
xx.score=xx.cj[0]+xx.cj[1]+xx.cj[2];
xx.ave=xx.score/3;
fprintf(fp2,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",xx.num,xx.name,xx.cj[0],xx.cj[1],xx.cj[2],xx.score,xx.ave);
}else
fprintf(fp2,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
}
if(b==0)
{printf("没有找到相关信息!!");
getchar();
}
rewind(fp);
printf("是否继续修改 y or n?\n");
getchar();
ck=getchar();
fclose(fp);
fclose(fp2);
remove("ding.dat");
rename("temp.dat","ding.dat");
}while(ck=='y'||ck=='Y');
if(b!=0)
printf("修改成功!!");
}
void del()
{
int b=0;
char ch[20],ck;
FILE *fp;
FILE *fp2;
do{
if((fp=fopen("ding.dat","r"))==NULL)
{printf("cannot open file\n");
exit(0);}
if((fp2=fopen("temp.dat","w"))==NULL)
{printf("cannot open file\n");
exit(0);}
printf("请输入要删除成绩的学号:\n");
scanf("%s",ch);
while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
{
if(strcmp(mm.num,ch)==0)
{b++;
printf("学号 姓名 语文 数学 英语 总分 平均分\n");
printf("%-20s%-20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
}else
fprintf(fp2,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
}
if(b==0)
{printf("没有找到相关信息!!");
getchar();
}
rewind(fp);
printf("是否继续删除 y or n?\n");
getchar();
ck=getchar();
fclose(fp);
fclose(fp2);
remove("ding.dat");
rename("temp.dat","ding.dat");
}while(ck=='y'||ck=='Y');
if(b!=0)
printf("删除成功!!");
}
void sort_1()
{struct PP{
char num[20];
char name[20];
float cj[3];
float score;
float ave;
}pp[100];
int i=0;
FILE *fp;
FILE *fp2;
if((fp=fopen("ding.dat","r"))==NULL)
{printf("cannot open file");
exit(0);}
if((fp2=fopen("d排序后.dat","w"))==NULL)
{printf("cannot open file");
exit(0);}
while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
{strcpy(pp[i].num,mm.num);
strcpy(pp[i].name,mm.name);
pp[i].cj[0]=mm.cj[0];
pp[i].cj[1]=mm.cj[1];
pp[i].cj[2]=mm.cj[2];
pp[i].score=mm.score;
pp[i].ave=mm.ave;
i++;}
for(int j=0;j<i;j++)
{int x=j;
float a,b,c,d,e;
char num[20],name[20];
for(int k=j+1;k<i;k++)
if(pp[x].score>pp[k].score)
x=k;
strcpy(num,pp[x].num);
strcpy(pp[x].num,pp[j].num);
strcpy(pp[j].num,num);
strcpy(name,pp[x].name);
strcpy(pp[x].name,pp[j].name);
strcpy(pp[j].name,name);
a=pp[x].cj[0];
pp[x].cj[0]=pp[j].cj[0];
pp[j].cj[0]=a;
b=pp[x].cj[1];
pp[x].cj[1]=pp[j].cj[1];
pp[j].cj[1]=b;
c=pp[x].cj[2];
pp[x].cj[2]=pp[j].cj[2];
pp[j].cj[2]=c;
d=pp[x].score;
pp[x].score=pp[j].score;
pp[j].score=d;
e=pp[x].ave;
pp[x].ave=pp[j].ave;
pp[j].ave=e;}
for(int n=0;n<i;n++)
fprintf(fp2,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",pp[n].num,pp[n].name,pp[n].cj[0],pp[n].cj[1],pp[n].cj[2],pp[n].score,pp[n].ave);
fclose(fp);
fclose(fp2);
remove("ding.dat");
rename("d排序后.dat","ding.dat");
printf("升序排序成功!!\n");
}
void sort_2()
{struct PP{
char num[20];
char name[20];
float cj[3];
float score;
float ave;
}pp[100];
int i=0;
FILE *fp;
FILE *fp2;
if((fp=fopen("ding.dat","r"))==NULL)
{printf("cannot open file");
exit(0);}
if((fp2=fopen("d排序后.dat","w"))==NULL)
{printf("cannot open file");
exit(0);}
while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
{strcpy(pp[i].num,mm.num);
strcpy(pp[i].name,mm.name);
pp[i].cj[0]=mm.cj[0];
pp[i].cj[1]=mm.cj[1];
pp[i].cj[2]=mm.cj[2];
pp[i].score=mm.score;
pp[i].ave=mm.ave;
i++;}
for(int j=0;j<i;j++)
{int x=j;
float a,b,c,d,e;
char num[20],name[20];
for(int k=j+1;k<i;k++)
if(pp[x].score<pp[k].score)
x=k;
strcpy(num,pp[x].num);
strcpy(pp[x].num,pp[j].num);
strcpy(pp[j].num,num);
strcpy(name,pp[x].name);
strcpy(pp[x].name,pp[j].name);
strcpy(pp[j].name,name);
a=pp[x].cj[0];
pp[x].cj[0]=pp[j].cj[0];
pp[j].cj[0]=a;
b=pp[x].cj[1];
pp[x].cj[1]=pp[j].cj[1];
pp[j].cj[1]=b;
c=pp[x].cj[2];
pp[x].cj[2]=pp[j].cj[2];
pp[j].cj[2]=c;
d=pp[x].score;
pp[x].score=pp[j].score;
pp[j].score=d;
e=pp[x].ave;
pp[x].ave=pp[j].ave;
pp[j].ave=e;}
for(int n=0;n<i;n++)
fprintf(fp2,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",pp[n].num,pp[n].name,pp[n].cj[0],pp[n].cj[1],pp[n].cj[2],pp[n].score,pp[n].ave);
fclose(fp);
fclose(fp2);
remove("ding.dat");
rename("d排序后.dat","ding.dat");
printf("降序排序成功!!\n");
}
void exit()
{char ch;
printf("确定退出 y or n?\n");
getchar();
ch=getchar();
if(ch=='y'||ch=='Y')
exit(0);
else
menu();
}
int main()
{
first_print();
menu();
while(1)
{int n;
scanf("%d",&n);
switch(n)
{case 1:scanf_1();break;
case 2:print();break;
case 3:find();break;
case 4:scanf_2();break;
case 5:sort_1();break;
case 6:sort_2();break;
case 7:change();break;
case 8:del();break;
case 9:exit();break;
default:printf("输入错误!!请重新输入:\n");
}
menu();
}
getchar();getchar();
return 0;
}
思路
1.可解决学号重复问题;
2.退出输入即为返回菜单;
总结
1.exit(0)与return 0的区别:exit()仍然会终止程序;但return将控制权移交给递归的前一级,
直到最初的那一级,此时return才会终止程序。(exit(0)的头文件为stdlib.h)
2.strlen(ck)可以测量字符串的长度(头文件为string.h);
3.fscanf的返回值:整型,成功返回读入的参数的个数,失败返回EOF(-1)
4.strcmp(str1,str2)字符串比较函数(头文件string.h)若str1==str2,则返回零;若str1<str2,
则返回负数;若str1>str2,则返回正数。
5.char *strcpy(char* dest, const char *src)字符串复制函数,(头文件string.h)
strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,
返回值的类型为char*。