要求:用文件保存,对学生学籍进行注册,修改,查找,统计,学籍变化
1,以菜单方式工作
2,登记学生的学号,姓名,性别,年龄,籍贯,学院,专业,班级
3,修改已知学号的学业信息
4,查找已知学号的学生信息
5,按学号和专业输出学生籍贯表
6,查询学生学籍变化,如:入学,转专业,退学,降级,休学,毕业
我的编译显示没有出错,但是录入不了的信息,急需帮助(今天之内
#include<stdlib.h>
#include<string.h>
#include <conio.h>
#define MAX 100
struct student
{
short status; /*数据状态,0:正常 1:删除*/
int num; /*学生的学号*/
char name[9]; /*姓名*/
char sex[3]; /*性别*/
int age; /*年龄*/
char origin[21]; /*籍贯*/
char depart[21]; /*学院*/
char major[21]; /*专业*/
int clas[20]; /*班级*/
char change[30]; /*学籍*/
};
/*子函数部分*/
void add_data(); /*登记数据*/
void update_data(); /*修改数据*/
void search_data(); /*查询数据*/
void list_data(); /*学籍表数据*/
void change_data(); /*查询学籍数据*/
/*主函数*/
FILE *fp;
main()
{
int select; /*选择变量*/
if((fp=fopen("stu.dat","rb+"))==NULL) /*stu.dat文件不存在*/
{
if((fp=fopen("stu.dat","wb+"))==NULL) /*打开stu.dat文件失败*/
{
printf("打开文件stu.dat失败!");
system("PAUSE"); /*暂时停一下,等待下一个操作*/
exit(1); /*退出程序*/
}
}
do
{
printf(" \n\n \n\n");
printf("************************************************************\n\n");
printf(" * 学生信息管理系统 * \n \n");
printf("------------------------------------------------------------\n\n");
printf("********************系 统 功 能 菜 单*************************\n");
printf("--------------------------------------------------------------\n");
printf(" \n");
printf("******* 1.登记学生信息 *******\n");
printf("--------------------------------------------------------------\n");
printf("******* 2.修改学生信息 *******\n");
printf("--------------------------------------------------------------\n");
printf("******* 3.查询学生信息 *******\n");
printf("--------------------------------------------------------------\n");
printf("******* 4.学生籍贯表 ******\n");
printf("--------------------------------------------------------------\n");
printf("******* 5.查询学生学籍变化 *******\n");
printf("--------------------------------------------------------------\n");
printf("******* 6.退出系统 *******\n");
printf("**************************************************************\n");
printf("--------------------------------------------------------------\n");
printf("\n请选择:\n");
scanf("%d",&select);
while(select<1||select>6)
{
printf("请输入1至6的数:");
scanf("%d",&select);
}
switch(select)
{
case 1:
add_data(); /*增加数据*/
break;
case 2:
update_data(); /*更新数据*/
break;
case 3:
search_data(); /*查询数据*/
break;
case 4:
list_data(); /*显示数据*/
break;
case 5:
change_data(); /*查询学籍数据*/
break;
}
}while(select!=6); /*选择6退出循环*/
fclose(fp); /*关闭文件*/
system("PAUSE"); /*暂时停一下,等待下一个操作*/
}
/*登记数据函数*/
void add_data()
{
struct student stu; /*定义学生变量stu*/
char tag; /*设置标志是否继续添加数据*/
stu.status=0; /*数据状态,0:正常 1:删除*/
do
{
printf("学号:");
scanf("%d",&stu.num);
printf("姓名:");
scanf("%s",stu.name);
printf("性别:");
scanf("%s",stu.sex);
printf("年龄:");
scanf("%d",&stu.age);
printf("籍贯:");
scanf("%s",stu.origin);
printf("学院:");
scanf("%s",stu.depart);
printf("专业:");
scanf("%s",stu.major);
printf("班级:");
scanf("%d",&stu.clas);
printf("学籍变化:");
scanf("%s",stu.change);
fseek(fp,0,SEEK_END); /*将指针移动到文件尾部*/
/*将学生信息存入文件中*/
fwrite(&stu,sizeof(struct student),1,fp);
printf("继续添加吗(y/n):");
while (getchar()!='\n'); /*跳过当前行*/
tag=getchar(); /*将大写字母转化为小写字母*/
while(tag!='y'&&tag!='n')
{
printf("输入非法,从新输入(y/n):");
while(getchar()!='\n'); /*跳过当前行*/
tag=getchar(); /*将大写字母转化为小写字母*/
}
}while(tag=='y'); /*当回答要求循环时*/
}
/*修改数据函数*/
void update_data()
{
struct student stu; /*学生*/
int num; /*要修改的学生的学号*/
printf("输入要修改的学生的学号:");
scanf("%d",&num);
rewind(fp); /*使位置指针返回到文件的开头*/
fread(&stu,sizeof(struct student),1,fp); /*读入学生信息*/
while(!feof(fp))
{
/*文件未结束*/
/*查找学号相同且数据状态正常未作删除标记*/
if(stu.num==num&&stu.status==0)
break;
fread (&stu,sizeof(struct student),1,fp);/*继续读取学生信息*/
}
if(!feof(fp))
{
/*查询成功*/
printf("更新前学生的信息:\n");
printf("\n学生的信息如下:\n");
printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s%10s\n",
"学号","姓名","性别","年龄","籍贯","学院","专业","班级","学籍");
printf("%-10s%-10s%10s%-10s%-10s%-10s%-10s%-10s%-10s\n",
stu.num,stu.name,stu.sex,stu.age,stu.origin,
stu.depart,stu.major,stu.clas,stu.change);
printf("输入更新后的数据:\n");
printf("1—学号:");
scanf("%d",&stu.num);
printf("2—姓名:");
scanf("%s",stu.name);
printf("3—性别:");
scanf("%s",stu.sex);
printf("4—年龄:");
scanf("%d",&stu.age);
printf("5—籍贯:");
scanf("%s",stu.origin);
printf("6—学院:");
scanf("%s",stu.depart);
printf("7—专业:");
scanf("%d",stu.major);
printf("8—班级:");
scanf("%d",&stu.clas);
printf("9—学籍变化:");
scanf("%s",stu.change);
/*将指针从当前位置移动到一个学生信息之前*/
fseek(fp,sizeof(struct student),1);
fwrite(&stu,sizeof(struct student),1,fp); /*写入数据*/
}
else
{
/*查询失败*/
printf("无此学号的学生!\n");
clearerr(fp); /*清除文件结束标志*/
}
}
/*查询数据函数*/
void search_data()
{
struct student stu; /*学生*/
int num; /*学生的学号*/
printf("输入要查询的学生的学号:");
scanf("%d",&num);
rewind(fp);
fread(&stu,sizeof(struct student),1,fp); /*读入学生信息*/
while(!feof(fp))
{
/*文件未结束*/
/*学生的学号相同且数据正常,未作删除标记*/
if(stu.num==num&&stu.status==0) /*查询成功*/
break;
fread(&stu,sizeof(struct student),1,fp);/*读入学生信息*/
}
if(!feof(fp))
{
/*查询成功*/
printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s%10s\n",
"学号","姓名","性别","年龄","籍贯","学院","专业","班级","学籍变化");
printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n",
stu.num,stu.name,stu.sex,stu.age,stu.origin,
stu.depart,stu.major,stu.clas,stu.change);
}
else
{
/*查询失败*/
printf("无此学号的学生:");
clearerr(fp);
}
}
/*学籍表数据函数*/
void list_data()
{
struct student stu[MAX],tstudent;
int select; /*选择变量*/
int stcout=0,n; /*stcout表示学生的个数*/
int i,j;
printf("请选择:\n");
printf("1.按学号显示 2.按专业显示\n");
scanf("%d",&select);
while(select<1||select>3)
{
printf("请输入1或2的数:");
scanf("%d",&select);
}
rewind(fp); /*使位置指针返回到文件的开头*/
fread(&stu[0],sizeof(struct student),1,fp); /*读入学生信息*/
while(!feof(fp))
{
/*计算文件中学生信息的学生数*/
stcout++;
/*继续读入学生信息*/
fread(&stu[stcout],sizeof(struct student),1,fp);
}
if(select==1)
{
/*用冒泡排序法把学生信息按学号大小排序*/
for(i=1;i<=stcout;i++)
for(j=0;j<stcout-i;j++)
{
if(stu[j].num>stu[j+1].num)
{
tstudent=stu[j];
stu[j]=stu[j+1];
stu[j+1]=tstudent;
}
}
printf("按学生的学号排序:\n");
printf("%-10s%-10s%10s\n",
"学号","姓名","籍贯");
for(i=0;i<stcout;i++) /*按学号顺序输出学生信息*/
{
if(stu[i].status==0) /*数据状态正常,未作删除标志*/
{
printf("%-10s%-10s%-10s%\n",
stu[i].num,stu[i].name,stu[i].origin);
}
}
}
else
{
/*用冒泡排序法把学生信息按专业排序*/
for(i=0;i<stcout;i++)
for(j=0;j<stcout-i;j++)
{
if(strcmp(stu[j].major,stu[j+1].major)>0)
{
tstudent=stu[j];
stu[j]=stu[j+1];
stu[j+1]=tstudent;
}
}
printf("按专业排序:\n");
printf("%-10s%-10s%10s%\n",
"学号","姓名","籍贯");
for(i=0;i<stcout;i++) /*按专业顺序输出学生信息*/
{
if(stu[i].status==0)
{
printf("%-10d%-10s%-10s%\n",
stu[i].num,stu[i].name,stu[i].origin);
}
}
}
clearerr(fp); /*清除文件结束标记*/
}
/*学籍查询数据函数*/
void change_data()
{
struct student stu; /*学生*/
int num; /*学生的学号*/
printf("输入要查询的学生的学号:");
scanf("%d",&num);
rewind(fp); /*使位置指针返回到文件的开头*/
fread(&stu,sizeof(stu.change),1,fp); /*读入学生信息*/
while(!feof(fp))
{
/*文件未结束*/
/*学生的学号相同且数据正常,未作删除标记*/
if(stu.num==num&&stu.status==0) /*查询成功*/
break;
fread(&stu,sizeof(stu.change),1,fp);/*读入学生信息*/
}
if(!feof(fp))
{
/*查询成功*/
printf("\n%d的学籍情况如下:\n",stu.num);
printf("%-10s\n","学籍变化");
}
else
{
/*查询失败*/
printf("无此学号的学生:");
clearerr(fp);
}
}