学生宿舍管理系统

运用了结构体,文件指针。其实写起来不算难,主要是文件的指针很少用到,所以花了很长时间不断的调试。最终的程序还是有一点BUG的,比如双人互换宿舍必须在单人调换宿舍前面使用,不然后面的读取数据会出错,还有互换宿舍时A同学的记录必须在B同学的前面,否则会出错。这都是文件指针的问题,还有待改善。尽管花了很长时间,老师并不认可这样的作业,因为没有可视化界面,他说,一个程序员必须考虑用户使用的感受,所以只要是没有可视化界面的,无论你写的多么好,都不会得到好的分数。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct{
 char ID[20]; //学号
char name[20]; //姓名
char gender[10]; //性别
char dormitory[4]; //宿舍号
}Student;
typedef struct{
    char ID[4]; //宿舍号
int max_num; //可容纳人数
int current_num; //已入住人数
char gender[10]; //男舍或女舍
}Dormitory;

char filename[20];
FILE *fp; //学生信息文件指针
FILE *_fp; //宿舍信息文件指针

void create(){
 printf("\n请输入新增楼栋名称:\n");
 scanf("%s",filename);
 _fp=fopen(filename,"rb+");
 if( _fp==NULL){ //如果文件不存在则建立文件否则提示文件已存在
_fp=fopen(filename,"wb+");
 fp=fopen(strcat( filename, "学生"),"wb+");
 if(fp==NULL || _fp==NULL){
 printf("File not open!\n");
 exit(-1);
 }
 }else
 printf("文件已存在!\n");
 fclose(fp);
 fclose(_fp);
}

void open(){
 printf("请输入学生宿舍所在楼栋:\n");
 scanf("%s",filename);
 _fp=fopen(filename,"rb+");
 fp=fopen(strcat( filename, "学生"),"rb+");
 if(fp==NULL || _fp==NULL){
 printf("File not open!\n");
 exit(-1);
 }
}

void insert_dorm(){
 Dormitory * d=(Dormitory*)malloc(sizeof(Dormitory));
 open();
 printf("\n请输入宿舍号,可容纳学生数,已容纳学生数,男舍/女舍(空格隔开,‘#’结束):\n");
 scanf("%s",d->ID);
 while(strcmp(d->ID,"#")){
 scanf("%d %d %s",&d->max_num,&d->current_num,d->gender);
 fwrite(d,sizeof(Dormitory),1,_fp);
 scanf("%s",d->ID);
 }
 fclose(_fp);
 fclose(fp);
}

void insert_stu(){
 long locate,pre_locate;
 int flag=0;
 Student *s=(Student*)malloc(sizeof(Student));
 Dormitory * d=(Dormitory*)malloc(sizeof(Dormitory));

open();
 printf("\n请输入学号、姓名、性别、宿舍号(空格隔开,‘#’结束):\n");
 scanf("%s",s->ID);
 while(strcmp(s->ID,"#")){ //不相等继续读取,相等为0便退出循环不再读取数据
scanf("%s %s %s",s->name,s->gender,s->dormitory);
 locate=ftell(_fp);
 while(fread(d,sizeof(Dormitory),1,_fp)){
 if(!strcmp(d->ID,s->dormitory)){ //每增加一个学生,相应寝室的实际人数应当增加一个
fseek(_fp,locate,SEEK_SET);
 d->current_num++;
 fwrite(d,sizeof(Dormitory),1,_fp);
 flag=1;
 break;
 }
 locate=ftell(_fp);
 }
 if(flag==0){
 printf("不存在该宿舍!\n");
 exit(-1);
 }
 fwrite(s,sizeof(Student),1,fp);
 rewind(_fp);
 scanf("%s",s->ID);
 }
 fclose(_fp);
 fclose(fp);
}

void dormnumsearch(){
 int flag=0,tag=0;
 char input_dormnum[4];
 Student *s=(Student*)malloc(sizeof(Student));
 Dormitory * d=(Dormitory*)malloc(sizeof(Dormitory));
 open();
 printf("请输入需要搜索的宿舍号:\n");
 scanf("%s",input_dormnum);
 while(fread(d,sizeof(Dormitory),1,_fp)){
 if(!strcmp(input_dormnum,d->ID)){
 flag=1;
 printf("\n寝室信息如下:\n%-20s%-20s%-20s%-20s\n","宿舍号","可容纳学生数","已容纳学生数","男舍/女舍");
printf("%-20s%-20d%-20d%-20s\n",d->ID,d->max_num,d->current_num,d->gender);
 break;
 }
 }
 if(flag){
 printf("该宿舍学生信息如下:\n%-20s%-20s%-20s%-20s\n","学号","姓名","性别","宿舍号");
while(fread(s,sizeof(Student),1,fp)){
 if(!strcmp(input_dormnum,s->dormitory)){
 tag=1;
 printf("%-20s%-20s%-20s%-20s\n",s->ID,s->name,s->gender,s->dormitory);
 }
 }
 if(tag==0)
 printf("\n该宿舍没有学生入住!\n");
 }else
 printf("不存在该宿舍记录!!\n");
 fclose(_fp);
 fclose(fp);
}

void change(){
 int flag=0,tag=0;
 long locate,locate_b,locate_c;
 char input_stunum[20];
 char input_dormnum[4];
 char previous_dormnum[4];
 Student *s=(Student*)malloc(sizeof(Student));
 Dormitory * d=(Dormitory*)malloc(sizeof(Dormitory));
 open();
 printf("\n请输入需要调换宿舍学生学号:\n");
 scanf("%s",input_stunum);

locate=ftell(fp);
 while(fread(s,sizeof(Student),1,fp)){
 if(!strcmp(input_stunum,s->ID)){
 flag=1;
 printf("该学生信息如下:\n%-20s%-20s%-20s%-20s\n","学号","姓名","性别","宿舍号");
printf("%-20s%-20s%-20s%-20s\n",s->ID,s->name,s->gender,s->dormitory);
 strcmp(previous_dormnum,s->dormitory);
 printf("\n请输入新宿舍的宿舍号:\n");
 scanf("%s",input_dormnum);
 locate_b=ftell(_fp);
 while(fread(d,sizeof(Dormitory),1,_fp)){
 if(!strcmp(input_dormnum,d->ID)){
 tag=1;
 if(d->current_num==d->max_num)
 printf("该宿舍已满员!");
else{
 //更换学生宿舍信息
fseek(fp,locate,SEEK_SET);
 strcpy(s->dormitory,input_dormnum);
 fwrite(s,sizeof(Student),1,fp);

//更换新宿舍信息
fseek(_fp,locate_b,SEEK_SET);
 d->current_num++;
 fwrite(d,sizeof(Dormitory),1,_fp);
 rewind(_fp);

//更换旧宿舍信息
locate_c=ftell(_fp);
 while(fread(d,sizeof(Dormitory),1,_fp)){
 if(!strcmp(previous_dormnum,d->ID)){
 fseek(_fp,locate_c,SEEK_SET);
 d->current_num--;
fwrite(d,sizeof(Dormitory),1,_fp);
 break;
 }
 locate_c=ftell(_fp);
 }
 }
 break;
 }
 locate_b=ftell(_fp);
 }
 if(tag==0){
 printf("不存在该宿舍!");
exit(-1);
 }
 break;
 }
 locate=ftell(fp);
 }
 if(flag==0)
 printf("\n不存在该学生!\n");
 fclose(_fp);
 fclose(fp);
}

void namesearch(){
 int flag=0,tag=0;
 long locate;
 char input_name[20];
 char dor_num[4];
 char ID[20];

Student *s=(Student*)malloc(sizeof(Student));
 Dormitory * d=(Dormitory*)malloc(sizeof(Dormitory));
 open();
 printf("\n请输入需要搜索的姓名:\n");
 scanf("%s",input_name);


 while(fread(s,sizeof(Student),1,fp)){
 locate=ftell(fp); //记录下按名字搜索到达的位置
if(!strcmp(input_name,s->name)){
 flag=1;
 printf("\n学生信息如下:\n%-20s%-20s%-20s%-20s\n","学号","姓名","性别","宿舍号");
printf("%-20s%-20s%-20s%-20s\n",s->ID,s->name,s->gender,s->dormitory);
 strcpy(dor_num,s->dormitory);
 strcpy(ID,s->ID);
 rewind(fp); //指针重置于文件头,查找室友
printf("\n其室友信息如下:\n%-20s%-20s%-20s%-20s\n","学号","姓名","性别","宿舍号");

while(fread(s,sizeof(Student),1,fp)){ //室友宿舍号相同,学号不同
if( (!strcmp(dor_num,s->dormitory)) && (strcmp(s->ID,ID)) ){
 printf("%-20s%-20s%-20s%-20s\n",s->ID,s->name,s->gender,s->dormitory);
 tag=1;
 }
 }
 if(tag==0)
 printf("\n没有室友!\n");
 tag=0;
 while(fread(d,sizeof(Dormitory),1,_fp)){
 if(!strcmp(dor_num,d->ID)){
 printf("\n该学生所在寝室信息如下:\n%-20s%-20s%-20s%-20s\n","宿舍号","可容纳学生数","已容纳学生数","男舍/女舍");
printf("%-20s%-20d%-20d%-20s\n",d->ID,d->max_num,d->current_num,d->gender);
 break;
 }
 }
 //break;
 }
 //同名情况
if(flag)
 fseek(fp,locate,SEEK_SET);

}
 if(flag==0)
 printf("\n没有符合条件的学生的记录!\n");
 fclose(_fp);
 fclose(fp);
}

void check_out(){
 char stu_num[20];
 char dorm_num[20];
 long locate,locate_b;
 Student *s=(Student*)malloc(sizeof(Student));
 Dormitory * d=(Dormitory*)malloc(sizeof(Dormitory));
 open();
 printf("\n请输入退宿学生学号:\n");
 scanf("%s",stu_num);

locate=ftell(fp);
 while(fread(s,sizeof(Student),1,fp)){
 // locate=ftell(fp);
 if(!strcmp(s->ID,stu_num)){
 strcpy(dorm_num,s->dormitory);
 fseek(fp,locate,SEEK_SET);
 memset(s,0,sizeof(Student));
 fwrite(s,sizeof(Student),1,fp);
 break;
 }
 locate=ftell(fp);
 }
 locate_b=ftell(_fp);
 while(fread(d,sizeof(Dormitory),1,_fp)){
 if(!strcmp(d->ID,dorm_num)){
 fseek(_fp,locate_b,SEEK_SET);
 d->current_num--;
 //printf("111\n");
 //printf("%d\n",d->current_num);
 fwrite(d,sizeof(Dormitory),1,_fp);
 printf("删除成功!\n");
 break;
 }
 locate_b=ftell(_fp);
 }
 fclose(_fp);
 fclose(fp);
}

void numsearch(){
 int flag=0,tag=0;
 char input_num[20];
 char dor_num[4];
 Student *s=(Student*)malloc(sizeof(Student));
 Dormitory * d=(Dormitory*)malloc(sizeof(Dormitory));
 open();
 printf("\n请输入需要搜索的学号:\n");
 scanf("%s",input_num);
 while(fread(s,sizeof(Student),1,fp)){
 if(!strcmp(input_num,s->ID)){
 flag=1;
 printf("\n该学生信息如下:\n%-20s%-20s%-20s%-20s\n","学号","姓名","性别","宿舍号");
printf("%-20s%-20s%-20s%-20s\n",s->ID,s->name,s->gender,s->dormitory);
 break;
 }
 }
 strcpy(dor_num,s->dormitory);
 if(flag){
 rewind(fp);
 printf("\n室友信息如下:\n%-20s%-20s%-20s%-20s\n","学号","姓名","性别","宿舍号");
while(fread(s,sizeof(Student),1,fp)){
 if( (!strcmp(dor_num,s->dormitory)) && strcmp(input_num,s->ID) ){
 printf("%-20s%-20s%-20s%-20s\n",s->ID,s->name,s->gender,s->dormitory);
 tag=1;
 }
 }
 if(tag==0)
 printf("\n没有室友!\n");
 while(fread(d,sizeof(Dormitory),1,_fp)){
 if(!strcmp(dor_num,d->ID)){
 printf("\n该学生所在寝室信息如下:\n%-20s%-20s%-20s%-20s\n","宿舍号","可容纳学生数","已容纳学生数","男舍/女舍");
printf("%-20s%-20d%-20d%-20s\n",d->ID,d->max_num,d->current_num,d->gender);
 break;
 }
 }
 }else
 printf("\n没有该学生的记录!\n");
 fclose(_fp);
 fclose(fp);
}

void exchange(){
 int flag=0,tag=0;
 long locate_a,locate_b;
 char input_ID_a[20];
 char input_ID_b[20];
 char dor_num[4];
 Student *s=(Student*)malloc(sizeof(Student));
 Student *_s=(Student*)malloc(sizeof(Student));
 open();
 printf("\n请输入需要互换宿舍学生A的学号:\n");
 scanf("%s",input_ID_a);
 printf("\n请输入需要互换宿舍学生B的学号:\n");
 scanf("%s",input_ID_b);

locate_a=ftell(fp);
 while(fread(s,sizeof(Student),1,fp)){
 if(!strcmp(input_ID_a,s->ID)){
 printf("\n学生A信息如下:\n%-20s%-20s%-20s%-20s\n","学号","姓名","性别","宿舍号");
printf("%-20s%-20s%-20s%-20s\n",s->ID,s->name,s->gender,s->dormitory);
 flag=1;
 break;
 }
 locate_a=ftell(fp);
 }
 rewind(fp);
 locate_b=ftell(fp);
 while(fread(_s,sizeof(Student),1,fp)){
 if(!strcmp(input_ID_b,_s->ID)){
 printf("\n学生B信息如下:\n%-20s%-20s%-20s%-20s\n","学号","姓名","性别","宿舍号");
printf("%-20s%-20s%-20s%-20s\n",_s->ID,_s->name,_s->gender,_s->dormitory);
 tag=1;
 break;
 }
 locate_b=ftell(fp);
 }


 if(flag==0 || tag==0){
 printf("不存在A同学或B同学记录!");
exit(-1);
 }else{
 strcpy(dor_num,s->dormitory);
 strcpy(s->dormitory,_s->dormitory);
 strcpy(_s->dormitory,dor_num);
 //locate_a=locate_a-sizeof(Student);
 fseek(fp,locate_a,0);
 fwrite(s,sizeof(Student),1,fp);
 // locate_b=locate_b-sizeof(Student);
 fseek(fp,locate_b,0);
 fwrite(_s,sizeof(Student),1,fp);
 }
 printf("更换宿舍后:\n");
 rewind(fp);

locate_a=ftell(fp);
 while(fread(s,sizeof(Student),1,fp)){
 if(!strcmp(input_ID_a,s->ID)){
 printf("\n学生A信息如下:\n%-20s%-20s%-20s%-20s\n","学号","姓名","性别","宿舍号");
printf("%-20s%-20s%-20s%-20s\n",s->ID,s->name,s->gender,s->dormitory);
 break;
 }
 locate_a=ftell(fp);
 }

locate_b=ftell(fp);
 while(fread(_s,sizeof(Student),1,fp)){
 if(!strcmp(input_ID_b,_s->ID)){
 printf("\n学生B信息如下:\n%-20s%-20s%-20s%-20s\n","学号","姓名","性别","宿舍号");
printf("%-20s%-20s%-20s%-20s\n",_s->ID,_s->name,_s->gender,_s->dormitory);
 break;
 }
 locate_b=ftell(fp);
 }

fclose(_fp);
 fclose(fp);
}

void display(){
 long locate;
 Student *s=(Student*)malloc(sizeof(Student));
 Dormitory * d=(Dormitory*)malloc(sizeof(Dormitory));
 open();
 printf("\n请输入学号、姓名、性别:\n");
 scanf("%s %s %s",s->ID,s->name,s->gender);

locate=ftell(_fp);
 while(fread(d,sizeof(Dormitory),1,_fp)){
 if(d->max_num=d->current_num){
 strcpy(s->dormitory,d->ID);
 fwrite(s,sizeof(Student),1,fp);
 fseek(_fp,locate,0);
 d->current_num++;
 fwrite(d,sizeof(Dormitory),1,_fp);
 printf("分配的宿舍是:");
printf("%s\n",s->dormitory);
 break;
 }
 locate=ftell(fp);
 }
 fclose(_fp);
 fclose(fp);
}


int main(){
 int select,flag=1; //flag为0则退出程序
while(flag){
 printf("\t\t------------------------------------------------------\n");
 printf("\t\t\t 学生宿舍管理系统\n\n");
 printf("\t\t\t 0 ---------------- 新增楼栋\n");
 printf("\t\t\t 1 ---------------- 新增宿舍信息\n");
 printf("\t\t\t 2 ---------------- 新增学生住宿信息\n");
 printf("\t\t\t 3 ---------------- 互换宿舍\n");
 printf("\t\t\t 4 ---------------- 调换宿舍\n");
 printf("\t\t\t 5 ---------------- 学生毕业退宿\n");
 printf("\t\t\t 6 ---------------- 智能分配宿舍\n");
 printf("\t\t\t 7 ---------------- 学号查询\n");
 printf("\t\t\t 8 ---------------- 姓名查询\n");
 printf("\t\t\t 9 ---------------- 房号查询\n");
 printf("\t\t\t 10 ---------------- 退出系统\n");
 printf("\t\t------------------------------------------------------\n");
 printf("请输入你的操作编号(0~10):");
scanf("%d",&select);
 switch (select){
 case 0:
 create();
 break;
 case 1:
 insert_dorm();
 break;
 case 2:
 insert_stu();
 break;
 case 3:
 exchange();
 break;
 case 4:
 change();
 break;
 case 5:
 check_out();
 break;
 case 6:
 display();
 break;
 case 7:
 numsearch();
 break;
 case 8:
 namesearch();
 break;
 case 9:
 dormnumsearch();
 break;
 case 10:
 return 0;
 defaut:
 break;
    }
 }
    return 0;
}

 

posted @ 2016-03-13 10:42  我得是个大麻烦  阅读(1808)  评论(1)    收藏  举报