#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
char id[20];
char name[20];
int score1;
int score2;
int score3;
int average;
}stu[100] = {0};
int setnum; //设置当前记录并显示
//功能函数
void swap(struct student *a,struct student *b);
void showmenu();
void creat_base(void);
//界面函数
void list();
void add();
void rem();
void edit();
void set();
void sort();
void help();
void save();
int main()
{
int m;
creat_base();
do
{
showmenu();
scanf("%d",&m);
switch(m)
{
case 1:list();break;
case 2:add();break;
case 3:rem();break;
case 4:edit();break;
case 5:set();break;
case 6:sort();break;
case 7:help();break;
case 8:save();break;
default:printf("输入错误,请重试!");getchar();
}
}while(m!=8);
printf("Bye~~~~!\n");
return 0;
}
//操作命令详解
/*7help帮助:*/
void help()
{
char Eflag;
while(1)
{
printf("具体命令已详细分配到各功能列表,如有不懂,请致电:\t18860958876\n");
printf("是否退出帮助:y/n");
fflush(stdin);
scanf("%c",&Eflag);
if(Eflag == 'y')
break;
}
}
/*6排序学生记录:
1、sort:根据平均分排序;
2、sort x:根据学号排序;
3、sort n:根据姓名排序;
4、sort s1:根据分数1排序;
5、sort s2:根据分数2排序;
6、sort s3:根据分数3排序;*/
void sort()
{
int i,j;
char flag,Eflag;
for(i=0; strlen(stu[i].id) != 0; i++)
{
for(j=i+1; strlen(stu[j].id) != 0; j++)
{
if(stu[i].average < stu[j].average)
swap(&stu[i],&stu[j]);
}
}
printf("已按平均分排序\n");
while(1)
{
printf("是否退出排序界面:y/n\t");
fflush(stdin);
scanf("%c",&Eflag);
if(Eflag == 'y')
break;
printf("\t**x:根据学号排序;\n\t**n:根据姓名排序;\n\t**1:根据分数1排序;\n\t**2:根据分数2排序;\n\t**3:根据分数3排序;\n");
fflush(stdin);
scanf("%c",&flag);
switch(flag)
{
case 'x':
{
for(i=0; strlen(stu[i].id) != 0; i++)
{
for(j=i+1; strlen(stu[j].id) != 0; j++)
{
if(strcmp(stu[i].id,stu[j].id) > 0)
swap(&stu[i],&stu[j]);
}
}
printf("已按学号排序\n");
break;
}
case 'n':
{
for(i=0; strlen(stu[i].id) != 0; i++)
{
for(j=i+1; strlen(stu[j].id) != 0; j++)
{
if(strcmp(stu[i].name,stu[j].name) > 0)
swap(&stu[i],&stu[j]);
}
}
printf("已按姓名排序\n");
break;
}
case '1':
{
for(i=0; strlen(stu[i].id) != 0; i++)
{
for(j=i+1; strlen(stu[j].id) != 0; j++)
{
if(stu[i].score1 < stu[j].score1)
swap(&stu[i],&stu[j]);
}
}
printf("已按成绩1排序\n");
break;
}
case '2':
{
for(i=0; strlen(stu[i].id) != 0; i++)
{
for(j=i+1; strlen(stu[j].id) != 0; j++)
{
if(stu[i].score2 < stu[j].score2)
swap(&stu[i],&stu[j]);
}
}
printf("已按成绩2排序\n");
break;
}
case '3':
{
for(i=0; strlen(stu[i].id) != 0; i++)
{
for(j=i+1; strlen(stu[j].id) != 0; j++)
{
if(stu[i].score3 < stu[j].score3)
swap(&stu[i],&stu[j]);
}
}
printf("已按成绩3排序\n");
break;
}
default :printf("输入错误!\n");break;
}
}
}
//功能函数,两个结构体交换数据
void swap(struct student *a,struct student *b)
{
struct student * temp = malloc(sizeof(struct student));
memcpy(temp,a,sizeof(struct student));
memcpy(a,b,sizeof(struct student));
memcpy(b,temp,sizeof(struct student));
free(temp);
}
/*5设置当前记录并显示
set n:设置当前记录并显示*/
void set()
{
char id_temp[20] = {0};
int i,flag = 0;
//printf("请输入你想设置的当前记录序号:\t");
//fflush(stdin);
//scanf("%d",&setnum);
printf("请输入你想设置的当前记录学生的学号:\t");
fflush(stdin);
scanf("%s",id_temp);
for(i=0; strlen(stu[i].id) != 0; i++)
{
if(!strcmp(id_temp,stu[i].id))
{
setnum = i;
flag = 1;
break;
}
}
if(flag == 1)
{
printf("设置成功\n");
printf("当前记录学生:\n");
printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[setnum].id,stu[setnum].name,stu[setnum].score1,stu[setnum].score2,stu[setnum].score3,stu[setnum].average);
}
else
printf("没有这个学号\n");
}
/*4修改当前记录
1、edit:修改当前记录,需要输入所有项
2、edit a:修改当前记录所有项
3、edit x: 只修改当前记录学号;(要进行新输入学号存在性判断)
4、edit n:只修改当前记录姓名;
5、edit s1:只修改当前记录分数1;
6、edit s2:只修改当前记录分数2;
7、edit s3:只修改当前记录分数3*/
void edit()
{
char ch,Eflag;
char id_temp[20];
int i,flag = 0;
while(1)
{
printf("当前记录学生:\n");
printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[setnum].id,stu[setnum].name,stu[setnum].score1,stu[setnum].score2,stu[setnum].score3,stu[setnum].average);
printf("\t1、 a:修改当前记录所有项\n\t2、 x: 只修改当前记录学号;(要进行新输入学号存在性判断)\n\
\t3、 n:只修改当前记录姓名;\n\
\t4、 1:只修改当前记录分数1;\n\
\t5、 2:只修改当前记录分数2;\n\
\t6、 3:只修改当前记录分数3\n");
printf("请输入你想进行的操作命令;\t");
fflush(stdin);
scanf("%c",&ch);
switch(ch)
{
case 'a':
{
printf("请输入学生的学号:\n");
scanf("%s",id_temp);
getchar();
for(i=0; strlen(stu[i].id) != 0; i++)
{
if(!strcmp(id_temp,stu[i].id))
{
printf("该学号学生的成绩已存在于成绩库\n");
printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[i].id,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].average);
break ;
}
}
strcpy(stu[setnum].id,id_temp);
printf("请输入学生的姓名:\n");
scanf("%s",stu[setnum].name);
getchar();
printf("请输入学生的成绩1:\n");
scanf("%d",&stu[setnum].score1);
printf("请输入学生的成绩2:\n");
scanf("%d",&stu[setnum].score2);
printf("请输入学生的成绩3:\n");
scanf("%d",&stu[setnum].score3);
stu[setnum].average = (stu[setnum].score1+stu[setnum].score2+stu[setnum].score3)/3;
break;
}
case 'x':
{
printf("请输入学生的学号:\n");
scanf("%s",id_temp);
getchar();
for(i=0; strlen(stu[i].id) != 0; i++)
{
if(!strcmp(id_temp,stu[i].id))
{
flag = 1;
printf("该学号学生的成绩已存在于成绩库\n");
printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[i].id,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].average);
break ;
}
}
if(flag == 0)
{
strcpy(stu[setnum].id,id_temp);
printf("修改成功!\n");
}
else
flag = 0;
break;
}
case 'n':
{
printf("请输入学生的姓名:\n");
scanf("%s",stu[setnum].name);
break;
}
case '1':
{
printf("请输入学生的成绩1:\n");
scanf("%d",&stu[setnum].score1);
stu[setnum].average = (stu[setnum].score1+stu[setnum].score2+stu[setnum].score3)/3;
break;
}
case '2':
{
printf("请输入学生的成绩1:\n");
scanf("%d",&stu[setnum].score2);
stu[setnum].average = (stu[setnum].score1+stu[setnum].score2+stu[setnum].score3)/3;
break;
}
case '3':
{
printf("请输入学生的成绩1:\n");
scanf("%d",&stu[setnum].score3);
stu[setnum].average = (stu[setnum].score1+stu[setnum].score2+stu[setnum].score3)/3;
break;
}
default:printf("命令输入错误!\n");break;
}
printf("是否继续修改:y/n");
fflush(stdin);
scanf("%c",&Eflag);
if(Eflag == 'n')
break;
}
}
/*3删除学生记录:
1、rem:删除当前记录;
2、rem a:删除所有记录;
3、rem x:删除指定学号对应记录*/
void rem()
{
char Eflag,temp;
int i,flag = 0;
char id_temp[20];
while(1)
{
printf("\t** rem c:删除当前记录 **\n");
printf("\t** rem a:删除所有记录 **\n");
printf("\t** rem x:删除指定学号对应记录 **\n");
fflush(stdin);
scanf("%c",&temp);
if(temp == 'a')
{
memset(stu,0,sizeof(stu));
}
else if(temp == 'x')
{
printf("请输入指定学号:\t");
fflush(stdin);
scanf("%s",id_temp);
printf("\nerr1\n");
for(i=0; strlen(stu[i].id) != 0; i++)
{
if(!strcmp(id_temp,stu[i].id))
{
flag = 1;
break;
}
}
printf("\nerr1\n");
if(flag == 1)
{
while(strlen(stu[i].id))
{
memcpy(&stu[i],&stu[i+1],sizeof(struct student));
i++;
}
printf("删除成功\n");
}
else
printf("没有这个学号\n");
}
else if(temp == 'c')
{
i = setnum;
while(strlen(stu[i].id))
{
memcpy(&stu[i],&stu[i+1],sizeof(struct student));
i++;
}
printf("删除成功\n");
}
else
printf("输入错误!\n");
printf("是否继续删除:y/n");
fflush(stdin);
scanf("%c",&Eflag);
if(Eflag == 'n')
break;
}
}
/* 8保存退出*/
void save()
{
FILE *fp;
int i = 0;
fp = fopen("database.bin","wb"); //建立二进制文件
if(fp == NULL)
{
printf("open database.bin error\n");
exit(0);
}
for(i=0; strlen(stu[i].id) != 0; i++)
{
fwrite(&stu[i],sizeof(struct student),1,fp);
}
fclose(fp);
fp = fopen("database.txt","w"); //建立或打开文本文件
if(fp == NULL)
{
printf("open database.txt error\n");
exit(0);
}
for(i=0; strlen(stu[i].id) != 0; i++)
{
fwrite(&stu[i],sizeof(struct student),1,fp);
}
fclose(fp);
}
/*2增加学生记录:
①add 根据提示输入(要进行新输入学号存在性判断)
②add 学号 姓名 分数1 分数2 分数3*/
void add()
{
int i,flag = 0;
char Eflag;
char id_temp[20] = {0};
while(1)
{
printf("请输入学生的学号:\n");
scanf("%s",id_temp);
getchar();
for(i=0; strlen(stu[i].id) != 0; i++)
{
if(!strcmp(id_temp,stu[i].id))
{
flag = 1;
printf("该学号学生的成绩已存在于成绩库\n");
printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[i].id,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].average);
break ;
}
}
if(flag == 1)
{
flag = 0;
continue;
}
strcpy(stu[i].id,id_temp);
printf("请输入学生的姓名:\n");
scanf("%s",stu[i].name);
getchar();
printf("请输入学生的成绩1:\n");
scanf("%d",&stu[i].score1);
printf("请输入学生的成绩2:\n");
scanf("%d",&stu[i].score2);
printf("请输入学生的成绩3:\n");
scanf("%d",&stu[i].score3);
stu[i].average = (stu[i].score1+stu[i].score2+stu[i].score3)/3;
i++;
fflush(stdin);
printf("是否继续录入成绩:y/n");
scanf("%c",&Eflag);
if(Eflag == 'n')
break;
}
}
/*1显示记录
①list 显示当前记录
②list a:显示所有记录
③list x:显示指定学号记录,并不改变当前记录
④list n:显示所有“姓名 = ”的记录,并不改变当前记录;
*/
void list()
{
char ch,flag;
char id_temp[20],name_temp[20];
int i,flag_id = 0;
printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[setnum].id,stu[setnum].name,stu[setnum].score1,stu[setnum].score2,stu[setnum].score3,stu[setnum].average);
while(1)
{
printf("\t** list a:显示所有记录 **\n");
printf("\t** list x:显示指定学号记录,并不改变当前记录 **\n");
printf("\t** list n:显示所有“姓名 = ”的记录,并不改变当前记录 **\n");
fflush(stdin);
scanf("%c",&ch);
getchar();
switch(ch)
{
case 'a':
{
for(i=0; strlen(stu[i].id) != 0; i++)
{
printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[i].id,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].average);
}
break;
}
case 'x':
{
printf("请输入您想查询的学生的学号:\n");
scanf("%s",id_temp);
for(i=0; strlen(stu[i].id) != 0; i++)
{
if(!strcmp(id_temp,stu[i].id))
{
printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[i].id,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].average);
flag_id = 1;
}
}
if(flag_id == 0)
{
printf("成绩库中没有这个学号\n");
}
break;
}
case 'n':
{
printf("请输入您想查询的学生的姓名:\n");
scanf("%s",name_temp);
for(i=0; strlen(stu[i].id) != 0; i++)
{
if(!strcmp(name_temp,stu[i].name))
{
printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[i].id,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].average);
flag_id = 1;
}
}
if(flag_id == 0)
{
printf("成绩库中没有这个学生姓名\n");
}
break;
}
default :
{
printf("输入错误\n");break;
}
}
printf("是否退出显示记录页面:y/n\n");
fflush(stdin);
scanf("%c",&flag);
if(flag == 'y')
break;
}
}
//0显示菜单
void showmenu()
{
system("cls");
printf("------------------------------------------------------\n");
printf("* 欢迎使用学生成绩管理系统 *\n");
printf("------------------------------------------------------\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("------------------------------------------------------\n");
printf("选择操作<1-8> \n");
return;
}
//1建立相关数据库,并从相关数据库中读取数据
void creat_base(void)
{
FILE *fp;
int i = 0;
fp = fopen("database.bin","rb"); //建立二进制文件
if(fp == NULL)
{
printf("open database.bin error\n");
exit(0);
}
fclose(fp);
fp = fopen("database.txt","r"); //建立或打开文本文件
if(fp == NULL)
{
printf("open database.txt error\n");
exit(0);
}
fseek(fp,0,0);
while(!feof(fp))
{
fread(&stu[i],sizeof(struct student),1,fp);
i++;
if(i >= 100)
{
printf("memory overload!\n");
break;
}
}
fclose(fp);
}