1.问题分析:
宿舍管理信息管理系统是一个教育单位不可缺少的部分,通过该系统软件可以更好为用户提供充足的信息和快捷查询以及处理信息的手段。为方便学生宿舍信息的管理,我们设计了一个宿舍管理查询系统,该系统能输入每个人的基础信息,存入文件中进行归档;打印出文件中已存在的所有学生信息;可以根据学生的各种关键字(学号,姓名,班级,年龄,性别,宿舍号)对学生信息进行查找;能根据学号查找到学生信息后对学生信息进行修改或删除操作;也能够通过不同的方式对学生信息(学号排序,班级排序,宿舍排序,姓名排序)进行排序。
具体要求:
- 录入学生信息:输入学生的学号、姓名、性别、年龄、班级、宿舍号等各项基本信息,并能录入文件中存档。
- 查询学生信息:采用二分查找方法对学生信息进行查找,能按学号,姓名,性别,年龄,班级,宿舍号等各项信息分别查找学生的完整记录信息。
- 修改学生信息:能修改学生各项信息。
- 打印学生信息:能够打印存储在数据库中的所有学生宿舍信息。
- 排序学生信息:采用冒泡、选择和插入排序对学生信息进行排序。
2.数据需求分析:
本次课程设计的题目是宿舍管理查询软件,要求可以存入学生信息,学生信息包括学号,姓名,班级,年龄,宿舍号等各项基本信息,如表1.1。该系统主要有以下六个功能,即对学生信息进行:输入,打印,查询,修改,删除,排序等功能。
表1.1学生宿舍信息表示例
3.功能模块描述:
1.系统登录模块:打开系统首先进入登录界面,正确输入密码和用户名后会出现颜色变化的爱心欢迎图案界,然后进入到主菜单控制模块。如果密码或用户名输入错误则屏幕与字体的颜色发生变化。若密码或用户名三次输入错误则系统自动退出。
2.主菜单控制模块:主菜单直接控制六个模块,在各模块间起到纽带的作用。在主菜单,可以通过选择进入其他模块,其他模块运行结束后也可回到主菜单继续选择。
3.学生宿舍信息录入模块:初次打开系统,依次输入学生信息,建立学生宿舍信息数据库并保存文件,下次打开系统时,之前录入的信息依然存在并且可以选择继续输入或进行其他操作。
4.学生宿舍信息打印模块:打印出存储在学生宿舍信息数据库的所有学生的各项信息。
5.学生宿舍信息查询模块:根据学生的学号、姓名、班级等其他信息进行查找,如果学生信息不存在则给出提示,查询成功会显示该学生全部信息,并可以选择继续查询或返回主菜单。
6.学生宿舍信息修改模块:根据学号查找到要修改的学生信息后,可对该学生的各项信息进行选择并修改,修改成功后可选择继续修改或返回主菜单
7.学生宿舍信息删除模块:通过学号查找到要删除的学生宿舍信息后,对其进行删除。成功删除后可选择继续删除其他学生信息或返回主菜单。
8.学生宿舍信息排序模块:选择不同的条件对学生信息进行排序,可以选择学号、班级、宿舍号或姓名对所有在数据库中的学生信息进行排序。排序成功后可选择继续用其他方式排序或者返回主菜单。
4.算法描述
- 二分法查找算法:通过二分法查找算法可以快速的查找你所需要查询的学生信息。二分法查找算法也叫折半查找算法。其使用思维为:首先找出有序数字(姓名,学号,班级,宿舍号)的中间值,每次都跟区间的中间值对比,再次将查找的区间缩小到之前的一半,直到找到你要查找的元素为止。
- 冒泡排序算法:通过冒泡排序算法将学生的宿舍号从小到大进行排序,其算法的思路为:将待排序的宿舍号中左边的值大于右边的值交换一趟排下来最大的在最右边。
- 选择排序算法:通过选择排序算法将学生的班级从大到小进行排序。其算法思路为:每次从待排序的班级中选出一个最小值,然后放在序列的起始位置,直到全部数据排完即可。
- 折中插入排序算法:通过折中插入排序算法将学生的姓名从大到小排序。其算法思路为:将寻找插入位置由右到左遍历比较变为二分法查找比较(减少比较次数)即通过二分法查找学生的姓名进行比较。
- 希尔排序算法:通过希尔排序算法将学生的学号从大到小排序。其算法思路为:先将待要排序的学号进行预排序,使待排序的学号接近有序,然后再对该序列进行一次插入排序。
5.功能流程图
1.整体结构
2.创建学生宿舍信息
3. 打印学生信息
4.修改学生宿舍信息
5.删除学生宿舍信息
6.查询学生宿舍信息
7.学生宿舍信息排序
6.源代码
-
#include"stdio.h" #include"stdlib.h" #include"string.h" #include "conio.h" #include "windows.h" #define MAX 1000 /*结构体类型*/ typedef struct { int num;/*学号*/ char name[20];/*姓名*/ char sex[5];/*性别*/ int age;/*年龄*/ char studentclass[20];/*班级*/ int dorm;/*宿舍号*/ }STUDENTS; //查找指针 typedef struct Points { int a; struct Points *points; }Points; char xiugai[10]="修改"; char chaxun[10]="查询"; char xuehao[]="学号"; char xingming[]="姓名"; char xingbie[]="性别"; char nianling[]="年龄"; char banji[]="班级"; char sushe[]="宿舍"; /*共用的功能块 */ void gotoxy(int x, int y) { COORD pos; pos.X = x; //横坐标 pos.Y = y; //纵坐标 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } enum Color { black, blue, green, lakeBlue, red, purple, yellow, white, gray, lightBlue, lightGreen, lightSimpleGreen, lightRed, lightPurple, lightYellow, brightWhite }; void setColor(unsigned short textColor=0, unsigned short backColor=7){ char command[9]="color 07"; //默认颜色 command[6]='0'+backColor; //将backColor变量改为字符型 command[7]='0'+textColor; //将textColor变量改为字符型 system(command); //调用系统函数 } void pause() { int i; printf("\n\n按任意键加回车返回主菜单!"); scanf("%d",&i); getchar(); } void print(STUDENTS stu[],int point) { printf("\n\n\n学号:%d,姓名:%s,性别:%s,年龄:%d,班级:%s,宿舍号: %d\n", stu[point].num,stu[point].name,stu[point].sex,stu[point].age,stu[point].studentclass,stu[point].dorm); } void printfNotFound() { printf("找不到该数据\n"); } void printSearch(STUDENTS stu[],int i) { printf(" %7d%11s%10s%10d%12s%12d\n\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].dorm); } void printHead(){ printf(" -------------------------------------------------------------------------------\n"); printf(" -------------------------------------------------------------------------------\n"); printf(" 学号: 姓名: 性别: 年龄: 班级: 宿舍号: \n"); printf(" -------------------------------------------------------------------------------\n"); printf(" -------------------------------------------------------------------------------\n\n\n"); } //默认继续 int a=1; void selectOperate() { button: printf("继续操作请按1,返回主菜单请按0 "); scanf("%d",&a); if(!(a==1||a==0)) { printf("请输入正确的指令"); goto button; } } //读取文件,返回的是总个数 int read_file(STUDENTS stu[]) { FILE *fp; int point=-1; fp=fopen("stu.txt","rt"); if(fp==NULL) { printf("\n\n*****库存文件不存在!请创建"); return 0; } while(!feof(fp)) { point++; fread(&stu[point],sizeof(STUDENTS),1,fp); } fclose(fp); return point; } //存储数据到文件中 void save_file(STUDENTS stu[],int sum)//sum是总个数 { FILE *fp; int i; if((fp=fopen("temp.txt","w"))==NULL) { printf("写文件错误!\n"); return; } for(i=0;i<sum;i++) if(fwrite(&stu[i],sizeof(STUDENTS),1,fp)!=1) printf("写文件错误!\n"); fclose(fp); remove("stu.txt"); rename("temp.txt","stu.txt"); } /*创建学生信息*/ //返回的是总数 int input(STUDENTS stu[],int sum) { setColor(blue,white); for(;sum<MAX;sum++) { system("cls"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf(" ▄ ▄\n"); printf(" ▄ 录入学生宿舍信息 ▄\n"); printf(" ▄ ▄\n"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf("\n\n 录入学生信息 (最多%d个)\n",MAX); printf(" ----------------------------\n"); printf("\n 第%d个学生\n",sum+1); printf("\n 请输入学生的学号:"); scanf("%d",&stu[sum].num); printf("\n 请输入学生的姓名:"); scanf("%s",stu[sum].name); printf("\n 请输入学生的性别:"); scanf("%s",stu[sum].sex); printf("\n 请输入学生的年龄:"); scanf("%d",&stu[sum].age); printf("\n 请输入学生的班级:"); scanf("%s",stu[sum].studentclass); printf("\n 请输入学生的宿舍号:"); scanf("%d",&stu[sum].dorm); printf(" 创建成功!"); //选择操作 selectOperate(); if(a==0) return sum+1; } return sum+1; } /*打印学生信息*/ void output(STUDENTS stu[],int sum) { int i; setColor(purple,white); system("cls"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf(" ▄ ▄\n"); printf(" ▄ 打印学生宿舍信息 ▄\n"); printf(" ▄ ▄\n"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printHead(); for(i=0;i<sum;i++) printSearch(stu,i); pause(); } /*排序 */ /*复制student*/ //将排好的装在一个新的students数组里 ,不要存到文件中 void cpStu(STUDENTS stu0[],STUDENTS stu[],int sum) { int i; for(i=0;i<sum;i++) { stu[i].num=stu0[i].num; strcpy(stu[i].name,stu0[i].name); strcpy(stu[i].sex,stu0[i].sex); stu[i].age=stu0[i].age; strcpy(stu[i].studentclass,stu0[i].studentclass); stu[i].dorm=stu0[i].dorm; } } /*对数据元组排序*/ void exchangeData(STUDENTS *stu1,STUDENTS *stu2) { stu1->num=stu2->num; stu1->dorm=stu2->dorm; stu1->age=stu2->age; strcpy(stu1->name,stu2->name); strcpy(stu1->sex,stu2->sex); strcpy(stu1->studentclass,stu2->studentclass); } int selectSort() { int choice; setColor(blue,white); printf("\n\n\n ********请您选择条件进行排序********\n\n"); printf(" 1. 学号\n\n"); printf(" 2. 班级\n\n"); printf(" 3. 宿舍号\n\n"); printf(" 4. 姓名\n\n"); printf(" 0. 返回主菜单\n\n"); printf(" 请选择(0-3):"); scanf("%d",&choice); return choice; } /*根据宿舍号从小到大排序 冒泡*/ void sortByDorm(STUDENTS stu0[],int sum,STUDENTS stup[]) { STUDENTS stu1; //中间变量 int i,j; cpStu(stu0,stup,sum); for(i=0;i<sum-1;i++) for(j=0;j<sum-1-i;j++) if(stup[j].dorm>stup[j+1].dorm) { exchangeData(&stu1,&stup[j]); exchangeData(&stup[j],&stup[j+1]); exchangeData(&stup[j+1],&stu1); } } /*根据班级从小到大排序 选择*/ void sortByClass(STUDENTS stu0[],int sum,STUDENTS stup[]) { STUDENTS stu1; //中间变量 int i,j,k; cpStu(stu0,stup,sum); for(i=0;i<sum-1;i++) { k=i; for(j=i+1;j<sum;j++) if(strcmp(stup[k].studentclass,stup[j].studentclass)>0) k=j; if(k!=i) { exchangeData(&stu1,&stup[i]); exchangeData(&stup[i],&stup[k]); exchangeData(&stup[k],&stu1); } } } /*根据姓名从大到小排序 折半插入排序*/ //因为这里是从stu[1]开始操作的,所以得再创个中间变量 void sortByName(STUDENTS stu0[],int sum,STUDENTS stup[]) { STUDENTS stu1; //中间变量 STUDENTS stu[1000]; int i,j,low,high,mid; for(i=0;i<sum;i++){ stu[i+1].num=stu0[i].num; strcpy(stu[i+1].name,stu0[i].name); strcpy(stu[i+1].sex,stu0[i].sex); stu[i+1].age=stu0[i].age; strcpy(stu[i+1].studentclass,stu0[i].studentclass); stu[i+1].dorm=stu0[i].dorm; } for(i=2;i<sum+1;i++) { exchangeData(&stu1,&stu[i]); /*保存待插入元素到stu1*/ low=1;high=i-1; while(low<=high) { mid=(low+high)/2; if(strcmp(stu1.name,stu[mid].name)>0) low=mid+1; else high=mid-1; } for(j=i-1;j>=high+1;j--) exchangeData(&stu[j+1],&stu[j]);//后移元素,留出插入空位 exchangeData(&stu[high+1],&stu1); } for(i=0;i<sum;i++) { stup[i].num=stu[i+1].num; strcpy(stup[i].name,stu[i+1].name); strcpy(stup[i].sex,stu[i+1].sex); stup[i].age=stu[i+1].age; strcpy(stup[i].studentclass,stu[i+1].studentclass); stup[i].dorm=stu[i+1].dorm; } } /*根据学号从小到大排序 插入的希尔排序*/ void ShellInsert(STUDENTS stup[],int sum,int dk) { int i,j,k; STUDENTS stu1;//中间变量 for(k=0;k<dk;k++) for(i=dk+k;i<sum;i=i+dk) if(stup[i].num<stup[i-dk].num) { exchangeData(&stu1,&stup[i]); for(j=i-dk;j>=0&&stu1.num<stup[j].num;j=j-dk)//记录向后移 exchangeData(&stup[j+dk],&stup[j]); exchangeData(&stup[j+dk],&stu1); } } void sortByNum(STUDENTS stu[],int sum,STUDENTS stup[]) { int x; cpStu(stu,stup,sum); int dlta[5]={5,4,3,2,1}; for(x=0;x<5;x++) ShellInsert(stup,sum,dlta[x]); } //总的函数 void sortStudent(STUDENTS stu[],int sum) { setColor(green,white); STUDENTS stup[1000];//引用,把排好序的放在这里,不跟原来的混淆 int choice,x,i; do { system("cls"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf(" ▄ ▄\n"); printf(" ▄ 学生宿舍信息排序 ▄\n"); printf(" ▄ ▄\n"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); select: choice=selectSort(); system("cls"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf(" ▄ ▄\n"); printf(" ▄ 学生宿舍信息排序 ▄\n"); printf(" ▄ ▄\n"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); switch(choice) { case 1: sortByNum(stu,sum,stup); break;/*学生学号信息顺序*/ case 2: sortByClass(stu,sum,stup);break;/*学生班级信息顺序*/ case 3: sortByDorm(stu,sum,stup); break;/*学生宿舍信息顺序*/ case 4: sortByName(stu,sum,stup); break;/*学生姓名信息顺序*/ case 0: break; } //打印排好序的 printHead(); for(i=0;i<sum;i++) printSearch(stup,i); if(choice==1||choice==2||choice==3||choice==4) { printf("\n\n"); button: printf("继续查询请按1,返回主菜单请按0 "); scanf("%d",&x); if(x==1) x=1; else if(x==0) continue; else { printf("请输入正确的指令\n"); goto button; } } else if(choice==0) x=0; else { printf("\n\t\t请输入正确的指令\n"); goto select; } }while(x==1); } /* 根据条件查找指针point*/ /// //查询或者修改的选择; int selectChoice(char tiaojian[20]) { int choice; setColor(purple,white); printf("\n\n\n ********您想根据哪个条件%s********\n\n",tiaojian); printf(" 1. 学号\n\n"); printf(" 2. 姓名\n\n"); printf(" 3. 性别\n\n"); printf(" 4. 年龄\n\n"); printf(" 5. 班级\n\n"); printf(" 6. 宿舍号\n\n"); printf(" 0. 返回主菜单\n\n"); printf(" 请选择(0-6):"); scanf("%d",&choice); return choice; } ///????????????????????????????为什么这里的指针得返回菜可行,参数不是指针,操作的是地址的???? Points *connectPoint(Points *r,Points *p,int i) { p=(Points *)malloc(sizeof(Points)); p->a=i; r->points=p; r=p; return r; } //choice是指主菜单中的功能选项,字符数组tiaojian为相应的字符,比如如果选择查询的话, //tiaojian传参进来的应该为 "查询",这里是为了提高函数的复用性。 Points *findPoint(STUDENTS stu[],int sum,int choice,char tiaojian[]) { int i,j=0; Points *p,*q,*r; q=(Points *)malloc(sizeof(Points)); r=q; int num,age,dorm; char classs[20],sex[5],name[20]; printf(" \n\n请输入您要查找的学生的%s",tiaojian); switch(choice) { case 1: scanf("%d",&num); for(i=0;i<sum;i++) if(num==stu[i].num) r=connectPoint(r,p,i); break; case 2: scanf("%s",name); for(i=0;i<sum;i++) if(strcmp(name,stu[i].name)==0) r=connectPoint(r,p,i); break; case 3: scanf("%s",sex); for(i=0;i<sum;i++) if(strcmp(sex,stu[i].sex)==0) r=connectPoint(r,p,i); break; case 4: scanf("%d",&age); for(i=0;i<sum;i++) if(age==stu[i].age) r=connectPoint(r,p,i); break; case 5: scanf("%s",classs); for(i=0;i<sum;i++) if(strcmp(classs,stu[i].studentclass)==0) r=connectPoint(r,p,i); break; case 6: scanf("%d",&dorm); for(i=0;i<sum;i++) if(dorm==stu[i].dorm)r=connectPoint(r,p,i); break; } r->points=NULL; return q; } // /*查询学生信息*/ void inquire(STUDENTS stu[],int sum) { int choice; Points *p; setColor(blue,white); do{ system("cls"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf(" ▄ ▄\n"); printf(" ▄ 查询学生宿舍信息 ▄\n"); printf(" ▄ ▄\n"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); button: choice=selectChoice(chaxun); system("cls"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf(" ▄ ▄\n"); printf(" ▄ 查询学生宿舍信息 ▄\n"); printf(" ▄ ▄\n"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); switch里面不能调用排序功能,为什么????????? switch(choice) { case 1:p=findPoint(stu,sum,choice,xuehao); break; case 2:p=findPoint(stu,sum,choice,xingming); break; case 3:p=findPoint(stu,sum,choice,xingbie); break; case 4:p=findPoint(stu,sum,choice,nianling); break; case 5:p=findPoint(stu,sum,choice,banji); break; case 6:p=findPoint(stu,sum,choice,sushe); break; case 0:return; default :printf("请输入正确的指令"); goto button;//不断循环; } if(p->points!=NULL) { p=p->points; printHead(); while(p!=NULL) { printSearch(stu,p->a); p=p->points; } } else printfNotFound(); //选择操作 selectOperate(); }while(a); } //二分法只适用于查找一个 目前只有学号,姓名,宿舍排序 Points *findPoint2(STUDENTS stu[],int sum,int choice,char tiaojian[]) { int i,j=0; Points *p,*q,*r; q=(Points *)malloc(sizeof(Points)); r=q; int num,age,dorm; char classs[20],sex[5],name[20]; printf(" \n\n请输入您要查找的学生的%s",tiaojian); switch(choice) { case 1: scanf("%d",&num); break; case 2: scanf("%s",name); break; case 3: scanf("%d",&dorm); break; } int flag=0; int low=0,high=sum-1,mid; while(low<=high) { mid=(low+high)/2; switch(choice) { case 1:if(num==stu[mid].num) { r=connectPoint(r,p,mid); printf("mid==%d",mid); flag=1; } else if(stu[mid].num>num) high=mid-1; else low=mid+1; break; case 2: if(strcmp(name,stu[mid].name)==0) { r=connectPoint(r,p,mid); flag=1; } if(strcmp(stu[mid].name,name)>0) high=mid-1; else low=mid+1; break; case 3: if(dorm==stu[mid].dorm) { r=connectPoint(r,p,mid); flag=1; } if(stu[mid].dorm>dorm) high=mid-1; else low=mid+1; break; } //如果找到,就跳出循环 if(flag) break; } r->points=NULL; return q; } /*二分法查询学生信息*/ void inquire2(STUDENTS stu[],int sum) { STUDENTS stup1[1000];//引用,把排好序的放在这里,不跟原来的混淆 STUDENTS stup2[1000];//引用,把排好序的放在这里,不跟原来的混淆 STUDENTS stup3[1000];//引用,把排好序的放在这里,不跟原来的混淆 //二分法得先排序 sortByNum(stu,sum,stup1); sortByName(stu,sum,stup2); sortByDorm(stu,sum,stup3); setColor(blue,white); int choice; Points *p; do { system("cls"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf(" ▄ ▄\n"); printf(" ▄ 查询学生宿舍信息 ▄\n"); printf(" ▄ ▄\n"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); button: gotoxy(40,5); printf("**您想根据哪个条件查询**"); gotoxy(40,7); printf("1. 学号"); gotoxy(40,9); printf("2. 姓名"); gotoxy(40,11); printf("3. 宿舍号"); gotoxy(40,13); printf("0. 返回主菜单"); gotoxy(40,15); printf("请选择(0-3):"); scanf("%d",&choice); system("cls"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf(" ▄ ▄\n"); printf(" ▄ 查询学生宿舍信息 ▄\n"); printf(" ▄ ▄\n"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); switch里面不能调用排序功能,为什么????????? switch(choice) { case 1:p=findPoint2(stup1,sum,choice,xuehao); break;//二分法查询 case 2:p=findPoint2(stup2,sum,choice,xingming); break;//二分法查询 case 3:p=findPoint2(stup3,sum,choice,sushe); break;//二分法查询 case 0: return; default :printf("请输入正确的指令"); goto button;//不断循环; } if(p->points!=NULL) { p=p->points; printHead(); while(p!=NULL) { if(choice==1) { printSearch(stup1,p->a); p=p->points; } if(choice==2) { printSearch(stup2,p->a); p=p->points; } if(choice==3) { printSearch(stup3,p->a); p=p->points; } } } else printfNotFound(); //选择操作 selectOperate(); }while(a); } //修改和删除判断输入学生个数 int operateNum(int sum) { int n; printf("请输入你要操作的学生的个数:"); scanf("%d",&n); if(n>sum) { printf("\n\n 输入学生个数超过总量,操作失败\n"); selectOperate(); return 0; } else if(n<=0) { printf("\n\n 输入学生个数不能小于或等于0,操作失败\n"); selectOperate(); return 0; } return n; } /*只能根据学号删除学生信息*/ void exchangeData(STUDENTS *stu1,STUDENTS *stu2); //返回总数 int deletel(STUDENTS stu[],int sum) { a=1; system("cls"); setColor(blue,white); int i,j=0,n=0,flag=1; Points *p; printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf(" ▄ ▄\n"); printf(" ▄ 删除学生宿舍信息 ▄\n"); printf(" ▄ ▄\n"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); while(n==0)//这里接收到的两个数,n判断学生个数,a判断是否返回主菜单 { n=operateNum(sum); //选择操作 if(a==0) return sum; //0就返回主菜单 } do { if(flag) { system("cls"); Points *p; printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf(" ▄ ▄\n"); printf(" ▄ 删除学生宿舍信息 ▄\n"); printf(" ▄ ▄\n"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); } //查一个删一个 p=findPoint(stu,sum,1,xuehao); p=p->points; if(p!=NULL) { i=p->a; //把后面的一次覆盖掉前面一个 for(;i<sum-1;i++) exchangeData(&stu[i],&stu[i+1]); printf("删除成功\n"); flag=0; j++; if(j==n) { printf("\n\n删除操作已完成\n"); //选择操作 selectOperate(); if(a==0) return sum-n; else deletel(stu,sum-n); } } else{ printf("输入的学号不存在,操作失败\n"); //选择操作 selectOperate(); if(a==0) return sum-j; } }while(a==1&&j<n); return 0; } /*只能根据学号修改学生信息*/ void change(STUDENTS stu[],int sum) { int choice; Points *p; setColor(purple,white); do { system("cls"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf(" ▄ ▄\n"); printf(" ▄ 修改学生宿舍信息 ▄\n"); printf(" ▄ ▄\n"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); p=findPoint(stu,sum,1,xuehao); p=p->points; if(p!=NULL) { system("cls"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); printf(" ▄ ▄\n"); printf(" ▄ 修改学生宿舍信息 ▄\n"); printf(" ▄ ▄\n"); printf(" ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n"); int i=p->a; print(stu,i); button: choice=selectChoice(xiugai); switch(choice) { case 1: printf(" 请输入你改的新学号"); scanf("%d",&stu[i].num); break; case 2: printf(" 请输入你改的新姓名"); scanf("%s",stu[i].name); break; case 3:printf(" 请输入你改的新性别"); scanf("%s",stu[i].sex); break; case 4: printf(" 请输入你改的新年龄"); scanf("%d",&stu[i].age); break; case 5: printf(" 请输入你改的新班级"); scanf("%s",stu[i].studentclass); break; case 6: printf(" 请输入你改的新宿舍"); scanf("%d",&stu[i].dorm); break; case 0: return; default : printf(" 请输入正确的指令"); goto button; } printf("\n 修改成功:"); print(stu,i); } else printfNotFound(); //选择操作 selectOperate(); if(a==0) return; }while(a); } void pagedis() { setColor(yellow,lakeBlue); gotoxy(40,5); printf("**********************************"); gotoxy(40,6); printf("* *"); gotoxy(40,7); printf("* *"); gotoxy(40,8); printf("* *"); gotoxy(40,9); printf("* 欢迎进入学生宿舍信息管理系统 *"); gotoxy(40,10); printf("* *"); gotoxy(40,11); printf("* *"); gotoxy(40,12); printf("* *"); gotoxy(40,13); printf("**********************************"); } //欢迎 void welcome() { int i,j; for(i=0;i<3;i++) { setColor(lakeBlue,white); char heart[30][150]={ " ************ ************", " ****************** ******************", " ******************#******* **************************", " **********************#********* ********************************", " **********************##########*** **************#******************** ", " **********************#*********#**** **##********#************************ ", " *********##########**#****#****#**********##****#************************** ", " **********#*******#*#*****#***#***************#********#########*********** ", " **********#*****#********#***********#####***#********#*******#********** ", " ***********#***#********#***************#***#******#*#****#**#********* ", " ***********##**********#**************#*****#****#***#*****#*#******* ", " **********##*********#*#************#*****####*****#*******#******* ", " ********#**#*******#***#************#*************#************** ", " *****#****#*****#*****#************#************#************ ", " **#**********#*******#******######************#********** ", " **********#*********#*****########################### ", " ************************************************** ", " ********************************************** ", " ****************************************** ", " ************************************** ", " ********************************** ", " ****************************** ", " ************************** ", " ********************** ", " ****************** ", " ************** ", " ********** ", " ****** ", " ** " }; for(j=0;j<29;j++) //逐行打印 printf("%s\n",heart[j]); Sleep(50); setColor(yellow,white); Sleep(50); setColor(green,white); Sleep(50); setColor(purple,white); Sleep(50); setColor(red,white); Sleep(50); } } void bye(){ system("cls"); int i; printf("\n\n\n\n\n\n\n Bye ~\n\n"); setColor(green,white); char heart[11][150]={ "\t\t _____ _ _ ", "\t\t |_ _| | |_ __ _ _ _ | |__ ___ o O O ", "\t\t | | | ' \\ / _` | | ' \\ | / / (_-< o ", "\t\t _|_|_ |_||_| \\__,_| |_||_| |_\\_\\ /__/_ TS__[O] ", "\t\t_|\"\"\"\"\"|_|\"\"\"\"\"|_|\"\"\"\"\"|_|\"\"\"\"\"|_|\"\"\"\"\"|_|\"\"\"\"\"| {======| ", "\t\t\"`-0-0-\'\"`-0-0-\'\"`-0-0-\'\"`-0-0-\'\"`-0-0-\'\"`-0-0-\'./o--000' " }; printf("\n\n"); for(i=0;i<6;i++) //逐行打印 printf("%s\n",heart[i]); Sleep(500); setColor(red,white); Sleep(500); } void check() { char userName[20]; // 增加用户名数组的大小 char userPWD[20]; // 增加密码数组的大小 int i; setColor(black, yellow); for (i = 1; i < 6; i++) { printf("\n 请输入您的用户名:"); fgets(userName, sizeof(userName), stdin); // 使用fgets代替scanf userName[strcspn(userName, "\n")] = 0; // 去除fgets读取的换行符 printf("\n 请输入您的密码:"); fgets(userPWD, sizeof(userPWD), stdin); // 使用fgets代替scanf userPWD[strcspn(userPWD, "\n")] = 0; // 去除fgets读取的换行符 if ((strcmp(userName, "202301") == 0) && (strcmp(userPWD, "123456") == 0)) { // 验证用户名和密码 system("cls"); welcome(); printf("\n 3秒后自动跳转"); Sleep(3000); return; } else { setColor(red, white); if (i < 3) printf("用户名或密码错误,请重新输入!"); else { printf("您已连续3次将用户名或密码输错,系统将退出!"); exit(1); } } } } void menu() { STUDENTS stu[20]; int choice,sum; setColor(blue,white); sum=read_file(stu); if(sum==0) { printf("首先录入基本库存信息!按回车后进入*****\n"); getch(); sum=input(stu,sum); } system("cls"); do { system("cls"); button: gotoxy(40,5);//调用gotoxy()函数 printf("**学生宿舍信息管理系统**"); gotoxy(40,7); printf("1. 录入学生宿舍信息"); gotoxy(40,9); printf("2. 打印学生宿舍信息"); gotoxy(40,11); printf("3. 查询学生宿舍信息"); gotoxy(40,13); printf("4. 修改学生宿舍信息"); gotoxy(40,15); printf("5. 删除学生宿舍信息"); gotoxy(40,17); printf("6. 学生宿舍信息排序"); gotoxy(40,19); printf("0. 退出系统"); gotoxy(40,21); printf(" 请选择(0-6):"); scanf("%d",&choice); switch(choice) { case 1: sum=input(stu,sum); break;/*录入学生信息*/ case 2: output(stu,sum) ; break;/*打印学生信息*/ case 3: inquire(stu,sum); break;/*查询学生信息*/ case 4: change(stu,sum); break;/*修改学生信息*/ case 5: sum=deletel(stu,sum); break;/*删除学生信息*/ case 6: sortStudent(stu,sum); break;/*学生信息顺序*/ case 0: bye(); break; default:system("cls"); printf("\n 请输入正确的指令!\n"); goto button; } }while(choice!=0); save_file(stu,sum); } int main() { pagedis(); check(); menu(); getch();//清除pass any key to continue return 0; }
6.程序调试情况