学生宿舍管理系统
运用了结构体,文件指针。其实写起来不算难,主要是文件的指针很少用到,所以花了很长时间不断的调试。最终的程序还是有一点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; }

浙公网安备 33010602011771号