谁帮我看看这个学生管理有什么可以改进和改正的地方啊?
fread 总是多读出来一组数据(乱码)。。。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
struct basmes
{
char name[20];
char sex;
int id;
char stuclass[20];
struct basmes *next;
};
struct markmes
{
char name[20];
int id;
float math;
float english;
float C;
int reward;
struct markmes *next;
};
typedef struct basmes base;
typedef struct markmes mark;
void mainmenu(base *head_1,mark *head_2,FILE *fp1,FILE *fp2);
void password(void);
int menu(void);
void searchmenu(base *head_1);
base *addstudent(base *head_1);
void delmenu(base *head_1);
void changemenu(base *head_1);
base* lookover(base *head_1);
void searchmarkmenu(mark *head_2);
mark* addmark(mark *head_2);
void changemarkmenu(mark *head_2);
mark* lookovermark(mark *head_2);
base* readfilestu(base *head_1,FILE *fp1);
mark* readfilemark(mark *head_2,FILE *fp2);
void savefilestu(base *head_1,FILE *fp1);
void savefilemark(mark *head_2,FILE *fp2);
void namesearchstu(base *head_1,char name[]);
void idsearchstu(base *head_1,int id);
void classsearchstu(base *head_1,char stuclass[]);
void sexsearchstu(base *head_1,char sex);
void searchmarkmenu(mark *head_2);
void namesearchmark(mark *head_2,char name[]);
void idsearchmark(mark *head_2,int id);
void mathsearchmark(mark *head_2,float low,float high);
void englishsearchmark(mark *head_2,float low,float high);
void csearchmark(mark *head_2,float low,float high);
void delmenu(base *head_1);
void namedelstu(base *head_1,char name[]);
base* iddelstu(base *head_1,int id);
void delmarkmenu(mark *head_2);
mark* iddelmark(mark *head_2,int id);
void namedelmark(mark *head_2,char name[]);
void scholarshipmenu(mark *head_2);
void lookoverscholarship(mark *head_2);
void idscholarship(mark *head_2,int id);
mark *figureout(mark *head_2);
void changemenu(base *head_1);
void namechange(base *head_1,int id,char name[]);
void classchange(base *head_1,int id,char stuclass[]);
void sexchange(base *head_1,int id,char sex);
void changemarkmenu(mark *head_2);
void englishchange(mark *head_2,int id,float english);
void Cchange(mark *head_2,int id,float C);
void mathchange(mark *head_2,int id,float maths);
void main()
{
base *head_1=(base *)malloc(sizeof(base));
mark *head_2=(mark *)malloc(sizeof(mark));
FILE *fp1;
FILE *fp2;
head_1->next=NULL;
head_2->next=NULL;
password();
system("cls");
printf("\t欢迎来到学生信息管理系统。\n");
mainmenu(head_1,head_2,fp1,fp2);
}
//先编写菜单函数
void password(void)
{
int k,i;
char print[10]={0};
char password[]="2811012";
k=3;
while((k--)>=1)
{
printf("你还有%d次机会,请输入密码:",k+1);
for(i=0;i<7;i++)
{
print[i]=getch();
printf("*");
}
getch();
if(strcmp(print,password)==0)
{
printf("\n密码正确.\n");
return;
}
}
printf("密码输入错误!!退出。");
exit(0);
}
void mainmenu(base *head_1,mark *head_2,FILE *fp1,FILE *fp2)
{
int getchoose,choose,choose_1;
while(1)
{
getchoose=menu();
switch(getchoose)
{
case 1:
while(1)
{
printf(" 学生基本信息管理\n");
printf(" 1 查找信息\n");
printf(" 2 添加信息\n");
printf(" 3 删除信息\n");
printf(" 4 修改信息\n");
printf(" 5 遍历信息\n");
printf(" 6 返回\n");
printf("请选择\n");
scanf("%d",&choose);
if(choose==1)
{
searchmenu(head_1);
}
else if(choose==2)
{
head_1=addstudent(head_1);
}
else if(choose==3)
{
delmenu(head_1);
}
else if(choose==4)
{
changemenu(head_1);
}
else if(choose==5)
{
head_1=lookover(head_1);
}
else if(choose==6)
{
break;
}
else
{
printf("输入错误");
printf("重新输入:\n");
}
}
break;
case 2:
while(1)
{
printf(" 学生成绩信息管理\n");
printf(" 1 查找成绩信息\n");
printf(" 2 添加成绩信息\n");
printf(" 3 删除成绩信息\n");
printf(" 4 修改成绩信息\n");
printf(" 5 遍历成绩信息\n");
printf(" 6 奖学金信息\n");
printf(" 7 返回\n");
printf("请选择\n");
scanf("%d",&choose);
if(choose==1)
{
searchmarkmenu(head_2);
}
else if(choose==2)
{
head_2=addmark(head_2);
}
else if(choose==3)
{
delmarkmenu(head_2);
}
else if(choose==4)
{
changemarkmenu(head_2);//只改分数
}
else if(choose==5)
{
head_2=lookovermark(head_2);
}
else if(choose==6)
{
scholarshipmenu(head_2);
}
else if(choose==7)
{
break;
}
else
{
printf("输入错误.");
printf("重新输入:\n");
}
}
break;
case 3:
while(1)
{
printf(" \n文件管理\n");
printf(" 1 从文件读取信息;\n");
printf(" 2 保存学生信息到文件;\n");
printf(" 3 返回。\n");
printf("请选择:");
scanf("%d",&choose);
if(choose==1)
{
printf(" 1 读取学生基本信息;\n");
printf(" 2 读取学生成绩信息;\n");
printf(" 输入其他数字返回。");
printf("请选择:\n");
scanf("%d",&choose_1);
if(choose_1==1)
{
head_1=readfilestu(head_1,fp1);
}
else if(choose_1==2)
{
head_2=readfilemark(head_2,fp2);
}
}
else if(choose==2)
{
printf(" 1 保存学生基本信息\n");
printf(" 2 保存学生成绩信息\n");
printf(" 输入其他数字返回。\n");
printf("请选择:\n");
scanf("%d",&choose_1);
if(choose_1==1)
{
savefilestu(head_1,fp1);
}
else if(choose_1==2)
{
savefilemark(head_2,fp2);
}
}
else if(choose==3)
{
break;
}
else
{
printf("输入错误,重新输入。\n");
}
}
break;
case 4:
return;
break;
}
}
}
int menu(void)
{
int choose=1;//先让choose 为1,进入循环。
while(choose==1||choose==2||choose==3||choose==4)
{
printf("**********************************************\n");
printf("* 学生信息管理系统 *\n");
printf("* 1 学生基本信息管理 *\n");
printf("* 2 学生成绩信息管理 *\n");
printf("* 3 文件管理 *\n");
printf("* 4 退出 *\n");
printf("**********************************************\n");
printf("请选择\n");
scanf("%d",&choose);
if(choose!=1&&choose!=2&&choose!=3&&choose!=4)
{
printf("输入错误,请重新输入!\n");
choose=1;//让choose=1,重新进入循环
continue;
}
return choose;
}
}
void searchmenu(base *head_1)
{
char name[20],stuclass[20],sex;
int choose_2,id;
int i=1;
while(i!=0)
{
printf("\n*************************************************\n");
printf(" 查找方式\n");
printf(" 1 姓名查找;\n");
printf(" 2 学号查找;\n");
printf(" 3 班级查找;\n");
printf(" 4 性别查找;\n");
printf(" 5 返回;\n");
printf(" *************************************************\n");
printf("请选择\n");
scanf("%d",&choose_2);
printf("\n");
switch(choose_2)
{
case 1:
fflush(stdin);
printf("请输入姓名:");
gets(name);
namesearchstu(head_1,name);
fflush(stdin);
printf("按任意键返回:");
getch();
break;
case 2:
printf("请输入学号:");
scanf("%d",&id);
idsearchstu(head_1,id);
printf("按任意键返回:");
getch();
break;
case 3:
fflush(stdin);
printf("请输入班级:");
gets(stuclass);
classsearchstu(head_1,stuclass);
printf("按任意键返回:");
getch();
break;
case 4:
fflush(stdin);
printf("请输入性别:");
sex=getchar();
sexsearchstu(head_1,sex);
printf("按任意键返回:");
getch();
break;
case 5:
i=0;//让i=0,从而退出while
break;
default:
printf("输入错误,重新输入。\n");
break;
}
}
}
void searchmarkmenu(mark *head_2)
{
char name[20];
int i,id,j;
int choose_3,choose_3_1;
float low,high;//分数区间
i=j=1;
while(i!=0)
{
printf("\n*************************************************\n");
printf(" 查找方式\n");
printf(" 1 姓名查找;\n");
printf(" 2 学号查找;\n");
printf(" 3 分数段查找;\n");
printf(" 4 返回;\n");
printf(" *************************************************\n");
printf("请选择\n");
scanf("%d",&choose_3);
switch(choose_3)
{
case 1:
fflush(stdin);
printf("请输入姓名:");
gets(name);
namesearchmark(head_2,name);
fflush(stdin);
printf("按任意键返回:");
getch();
break;
case 2:
printf("请输入学号:");
scanf("%d",&id);
idsearchmark(head_2,id);
fflush(stdin);
printf("按任意键返回:");
getch();
break;
case 3:
while(i!=0)
{
printf("\n*****************************************************\n");
printf(" 1 数学成绩查询;\n");
printf(" 2 英语成绩查询;\n");
printf(" 3 C语言成绩查询;\n");
printf(" 4 返回。 \n");
printf("*********************************************************\n");
printf("请输入\n");
scanf("%d",&choose_3_1);
switch(choose_3_1)
{
case 1:
printf("\n输入数学分数段(可相同):(格式如90 90)");
scanf("%f %f",&low,&high);
mathsearchmark(head_2,low,high);
fflush(stdin);
printf("按任意键返回");
getch();
break;
case 2:
printf("\n输入英语分数段(可相同):(格式如90 90)");
scanf("%f %f",&low,&high);
englishsearchmark(head_2,low,high);
fflush(stdin);
printf("按任意键返回");
getch();
break;
case 3:
printf("\n输入C分数段(可相同):(格式如90 90)");
scanf("%f %f",&low,&high);
csearchmark(head_2,low,high);
fflush(stdin);
printf("按任意键返回");
getch();
break;
case 4:
i=0;
break;
default:
printf("输入错误,重新输入。\n");
break;
}
}
break;
case 4:
i=0;
break;
default:
printf("输入错误,重新输入。\n");
break;
}
}
}
void delmenu(base *head_1)
{
int choose_4;
int i=1;
char name[20]={0};
int id;
while(i)
{
printf("\n***********************************************************\n");
printf(" 删除学生基本信息\n");
printf(" 1 按学号删除;\n");
printf(" 2 返回;\n");
printf(" ***********************************************************\n");
printf("请输入\n");
scanf("%d",&choose_4);
printf("\n");
switch(choose_4)
{
case 1:
printf("请输入学号:");
scanf("%d",&id);
head_1=iddelstu(head_1,id);
fflush(stdin);
printf("按任意键返回:");
getch();
break;
case 2:
i=0;
break;
default:
printf("输入错误,重新输入。\n");
break;
}
}
}
void delmarkmenu(mark *head_2)
{
int choose_5;
int i=1;
char name[20]={0};
int id;
while(i)
{
printf("\n***********************************************************\n");
printf(" 删除学生成绩信息\n");
printf(" 1 按学号删除;\n");
printf(" 2 返回;\n");
printf(" ***********************************************************\n");
printf("请输入\n");
scanf("%d",&choose_5);
printf("\n");
switch(choose_5)
{
case 1:
printf("请输入学号:");
scanf("%d",&id);
head_2=iddelmark(head_2,id);
fflush(stdin);
printf("按任意键返回:");
getch();
break;
case 2:
i=0;
break;
default:
printf("输入错误,重新输入。\n");
break;
}
}
}
void scholarshipmenu(mark *head_2)
{
int i;
int choose_6;
int id;
i=1;
while(i!=0)
{
printf("\n******************************************************************\n");
printf(" 奖学金信息\n");
printf(" 1 遍历奖学金信息;\n");
printf(" 2 按学号查询奖学金信息;\n");
printf(" 3 计算奖学金; \n");
printf(" 4 返回;\n");
printf(" ******************************************************************\n");
printf("请选择:");
scanf("%d",&choose_6);
printf("\n");
switch(choose_6)
{
case 1:
lookoverscholarship(head_2);
break;
case 2:
printf("\n请输入学号:");
scanf("%d",&id);
idscholarship(head_2,id);
break;
case 3:
printf("正在计算奖学金。。。\n");
head_2=figureout(head_2);
break;
case 4:
i=0;
break;
default:
printf("输入错误,重新输入。\n");
break;
}
}
}
void changemenu(base *head_1)
{
int choose_7;
char name[20]={0};
char sex;
char stuclass[20];
int id;
int i=1;
while(i)
{
printf("******************************************************************\n");
printf(" 修改学生基本信息\n");
printf(" 1 修改学生姓名;\n");
printf(" 2 修改学生班级; \n");
printf(" 3 修改学生性别;\n");
printf(" 4 返回; \n");
printf("******************************************************************\n");
printf("请输入:");
scanf("%d",&choose_7);
switch(choose_7)
{
case 1:
printf("请输入学生ID:");
scanf("%d",&id);
printf("输入姓名:");
fflush(stdin);
gets(name);
namechange(head_1,id,name);
break;
case 2:
printf("请输入学生ID:");
scanf("%d",&id);
printf("输入班级:");
fflush(stdin);
gets(stuclass);
classchange(head_1,id,stuclass);
break;
case 3:
printf("请输入学生ID:");
scanf("%d",&id);
printf("输入性别:");
fflush(stdin);
sex=getchar();
sexchange(head_1,id,sex);
break;
case 4:
i=0;
break;
default:
printf("输入错误,重新输入。\n");
break;
}
}
}