1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 宿舍管理软件

宿舍管理软件

时间:2020-08-20 23:58:02

相关推荐

宿舍管理软件

设计要求:

1) 任务:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求: 

A. 采用交互工作方式 

B. 建立数据文件 ,数据文件按关键字(姓名、学号、宿舍号)进行排序(冒泡、选择、插入排序等任选一种)   

2) 查询菜单: (用二分查找实现以下操作)   

A. 按姓名查询    

B. 按学号查询    

C. 按宿舍号查询 

3) 打印任一查询结果(可以连续操作)

需求分析:

根据上述要求,我觉得系统应该具备以下的功能

① 该创建一个操作主界

② 统没有输入任何信息数据,要建立数据文件,需编写一个信息输入的函数,所以得创建一个学员线性表,这样我们就可以将数据暂时保存在内存中

③ 息输入后都保存在内存中后,还需要设计一个信息显示功能,信息的显示应该便于査询,所以需具备按各种关键字显示的功能

④ 系统按关键字(姓名、学号、房号)进行冒泡排序,采用二分査找方式分别实现按关键字(姓名、学号、房号)査询功能

⑤ 由于有些同学会离校,所以增加了删除功能。

⑥ 由于有新同学的家人,所以增加了插入功能。

⑦ 用户操作完毕需要退出时,我们提供了退出选项,便于使用者退出

程序框架

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>using namespace std;#define N 40 //线性表存储空间的初始分配量#define increase 10 //线性表存储空间的分配量增量int choice; //定义全局变量typedef struct{char name[20];int num; //学号和房号都为整型int room;}stu;stu stud;typedef struct{int length; //当前长度stu *elem; //存储空间基址int listsize; //当前分配的存储容量}linklist;void Init(linklist &L)//线性表初始化{L.length = 0;L.elem = (stu *)malloc(N * sizeof(stu));L.listsize = N;}void Menu()//操作菜单{cout << "\t\t *** " << endl;cout << "\t\t ** **" << endl;cout << "\t\t *** *** " << endl;cout << "\t\t *** *** " << endl;cout << "\t\t ******" << endl;cout << "\t\t****** " << endl;cout << "\t\t *** 欢迎进入宿舍管理系统***" << endl;cout << "\t\t **************************************" << endl;cout << "\t\t *制作人: 17信管 邹丽云*" << endl;cout << "\t\t **************************************" << endl;cout << "\t\t * 1. 新建宿舍名单 *" << endl;cout << "\t\t * 2. 排序宿舍信息 *" << endl;cout << "\t\t * 3. 查询宿舍信息 *" << endl;cout << "\t\t * 4. 插入宿舍信息 *" << endl;cout << "\t\t * 5. 删除宿舍信息 *" << endl;cout << "\t\t * 0. 退出系统*" << endl;cout << "\t\t **************************************" << endl;cout << endl << endl;printf("请输入数字键(0~5为操作键):");//1~8为有效数字操作键scanf("%d", &choice);if (choice<0 || choice>5){system("cls");printf("\n");printf("输入数字不对,请在原处重输!\n"); printf("\n");Menu();}}void Display(linklist &L)//打印学生信息{int i;printf("\n");printf("姓名学号 房号\n"); printf("\n");for (i = 0; i<L.length; i++)printf("%-15s %-3d %5d\n", L.elem[i].name, L.elem[i].num, L.elem[i].room);}void Ret()//返回主界面{char c;fflush(stdin);printf("\n");printf("请按任意键进入主界面:");scanf("%c", &c);system("cls");}void Create(linklist &L)//创建学生信息表{if (L.length >= L.listsize) //判断学生的人数是否超过初值,如果超过,则重新分配{stu *newbase;newbase = (stu*)realloc(L.elem, (N + increase) * sizeof(stu));L.elem = newbase;L.listsize += increase;}int i = 2;char ch;printf("\n");printf(" **************************开始创建线性表***************************\n"); printf("\n");printf("请输入第1个学生的信息\n");printf("请输入姓名:");fflush(stdin);// 清空输入缓冲区,得到正确的输入数据gets(stud.name); //输入一行字符串(姓名)printf("请输入学号:");scanf("%d", &stud.num);printf("请输入房号:");scanf("%d", &stud.room);ch = getchar();strcpy(L.elem[L.length].name, stud.name);L.elem[L.length].num = stud.num;L.elem[L.length].room = stud.room;L.length++;printf("\n");printf("是否继续输入?<y/n>:");scanf("%c", &ch);printf("\n"); printf("\n");while (ch == 'y'){printf("请输入第%d个学生的信息\n", i);printf("请输入姓名:");fflush(stdin);// 清空输入缓冲区,得到正确的输入数据gets(stud.name); //输入一行字符串(姓名)printf("请输入学号:");scanf("%d", &stud.num);printf("请输入房号:");scanf("%d", &stud.room);strcpy(L.elem[L.length].name, stud.name);L.elem[L.length].num = stud.num;L.elem[L.length].room = stud.room;i++;L.length=i-1;ch = getchar(); printf("\n");printf("是否继续输入?<y/n>:");scanf("%c", &ch);printf("\n"); printf("\n");}if (ch == 'n') system("cls");}void sort1(linklist &L)//按姓名排序(采用冒泡排序){int i, j;stu temp;for (i = 0; i<L.length - 1; i++)for (j = 0; j<L.length-1-i; j++)if (strcmp(L.elem[j].name, L.elem[j+1].name)>0){temp = L.elem[j];L.elem[j] = L.elem[j+1];L.elem[j+1] = temp;}}void sort2(linklist &L)//按学号排序(采用折半插入排序){int i, j, mid, low, high;stu temp;for (i = 1; i < L.length; i++){if(L.elem[i].num<L.elem[i-1].num){temp = L.elem[i]; low = 0; high = i-1; while (low <= high){mid = (low + high) / 2; if (temp.num < L.elem[mid].num) high = mid - 1;elselow = mid + 1;}for (j = i - 1; j >= high+1; j--) L.elem[j+1]=L.elem[j];L.elem[high+1]=temp;}}}void sort3(linklist &L)//按房号排序(采用简单选择排序){int i,j,k;for(i=0;i<L.length-1;i++){k=i;for(j=i+1;j<L.length;j++)if(L.elem[j].room<L.elem[k].room)k=j;if(k!=i)swap(L.elem[i],L.elem[k]);}void Sort(linklist &L)//排序函数{int c;printf("请输入排序的方式(1:按名字排序,2:按学号排序,3:按房号排序):\n");scanf("%d", &c);switch (c){case 1:sort1(L);if (L.length == 0){printf("已无学生记录\n");printf("\n");Ret();Menu();}else{printf("按姓名排序:\n");Display(L);Ret(); //调用返回主界面Menu();}break;case 2:sort2(L);if (L.length == 0){printf("已无学生记录\n");printf("\n");Ret();Menu();}else{printf("按学号排序:\n");Display(L);Ret(); //调用返回主界面Menu();}break;case 3:sort3(L);if (L.length == 0){printf("已无学生记录\n");printf("\n");Ret();Menu();}else{printf("按房号排序:\n");Display(L);Ret(); //调用返回主界面Menu();}break;default:break;}}int Select()//选择是否继续查找{char ch;scanf("%c", &ch);printf("是否继续查找?<y/n>:");fflush(stdin);scanf("%c", &ch);if (ch == 'y'){system("cls");return(1);}elsereturn 0;}void search1(linklist &L)//按姓名从小到大查找(采用二分查找){if (L.length == 0){printf("\n");printf("已无学生记录\n");printf("\n");Ret();Menu();}else{int low = 0, high = L.length, mid, flag = 0;printf("\n"); printf("\n");printf("按姓名查找----->请输入要查找的姓名:");char a[15], ch;scanf("%s", a);printf("\n");while (low <= high){mid = (low + high) / 2;if (strcmp(a, L.elem[mid].name) == 0){flag = 1;break;}else if (strcmp(a, L.elem[mid].name)>0)low = mid + 1;elsehigh = mid - 1;}if (flag == 1){printf("查找成功----->该学生信息为:\n");printf("姓名学号 房号\n"); printf("\n");printf("%-15s %-5d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);if (Select())search1(L);else{system("cls");Menu();}}else{printf("该学生不存在");if (Select()) search1(L);else{system("cls");Menu();}}}}void search2(linklist &L)//按学号从小到大查找(采用二分查找){if (L.length == 0){printf("\n");printf("已无学生记录\n");printf("\n");Ret();Menu();}else{int low = 0, high = L.length, mid, flag = 0;int n;char ch;printf("\n"); printf("\n");printf("按学号查找----->请输入要查找的学号:");scanf("%d", &n);printf("\n");while (low <= high){mid = (low + high) / 2;if (n == L.elem[mid].num){flag = 1;break;}else if (n>L.elem[mid].num)low = mid + 1;elsehigh = mid - 1;}if (flag == 1){printf("查找成功----->该学生信息为:\n");printf("姓名学号 房号\n"); printf("\n");printf("%-15s %-5d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);if (Select())search2(L);else{system("cls");Menu();}}else{printf("该学生不存在");if (Select())search2(L);else{system("cls");Menu();}}}}void search3(linklist &L)//按房号从小到大查找(采用二分查找){if (L.length == 0) //此函数功能为:返回主界面{printf("\n");printf("已无学生记录\n");printf("\n");Ret();Menu();}else{int low = 0, high = L.length, mid, flag = 0;//flag作为标志符,为1则表示查找成功,否则没有所要查找的学生int m;char ch;printf("\n"); printf("\n");printf("按房号查找----->请输入要查找的房号:");scanf("%d", &m);printf("\n");while (low <= high){mid = (low + high) / 2;if (m == L.elem[mid].room){flag = 1;break;}else if (m>L.elem[mid].room)low = mid + 1;elsehigh = mid - 1;}if (flag == 1){printf("查找成功----->该学生信息为:\n");printf("姓名学号 房号\n"); printf("\n");printf("%-15s %-5d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);if (Select()) //调用判断函数1search3(L);else{system("cls");Menu();}}else{printf("该学生不存在");if (Select()) //调用判断函数2search3(L);else{system("cls");Menu();}}}}void Search(linklist &L)//查找函数{int c;printf("请输入查找的方式(1:按名字查找,2:按学号查找,3:按房号查找):\n");scanf("%d", &c);switch (c){case 1:sort1(L); search1(L); break;//先进行二分查找排序case 2:sort2(L); search2(L); break;case 3:sort3(L); search3(L); break;default:break;}}void Insert(linklist &L)//按学号从小到大插入该学生{int i, j, k;char ch;printf("\n");printf("插入的学生信息为:\n");printf("姓名:");fflush(stdin);// 清空输入缓冲区,得到正确的输入数据gets(stud.name);printf("学号:"); scanf("%d", &stud.num);printf("房号:"); scanf("%d", &stud.room);if (L.length == 0){strcpy(L.elem[L.length].name, stud.name);L.elem[L.length].num = stud.num;L.elem[L.length].room = stud.room;}for (i = 0; i<L.length; i++){if (stud.num<L.elem[i].num){k = i;for (j = L.length; j>k; j--)L.elem[j] = L.elem[j - 1];strcpy(L.elem[k].name, stud.name);L.elem[k].num = stud.num;L.elem[k].room = stud.room;break;}else{strcpy(L.elem[L.length].name, stud.name);L.elem[L.length].num = stud.num;L.elem[L.length].room = stud.room;}}L.length++;fflush(stdin);printf("\n");printf("是否继续插入?<y/n>:");scanf("%c", &ch);if (ch == 'y') Insert(L);else system("cls");}void Delete(linklist &L)//按学号删除该学生{int i, j, k = -1;char ch;printf("\n"); printf("\n");printf("请输入要删除学生的学号:");scanf("%d", &stud.num);for (i = 0; i<L.length; i++){if (stud.num == L.elem[i].num){printf("该学生的信息为:\n"); printf("\n");printf("姓名:%s \n学号:%d \n房号:%d\n", L.elem[i].name, L.elem[i].num, L.elem[i].room);k = i;for (j = k; j<L.length - 1; j++)L.elem[j] = L.elem[j + 1];printf("已成功删除\n");break;}}if (i >= L.length) printf("该学生不存在\n");if (k >= 0)L.length--;fflush(stdin);printf("\n");printf("是否继续删除操作?<y/n>:");scanf("%c", &ch);system("cls");if (ch == 'y') Delete(L);else system("cls");}int main() //主函数{linklist L; //定义线性表 LInit(L);Menu(); //调用主菜单函数while (choice != 0){system("cls");switch (choice){case 1: Create(L); //调用线性表创建函数Menu();break;case 2: Sort(L); break;//调用排序函数case 3: Search(L); break;//调用查找函数进行(二分)查找case 4: sort2(L);//调用学号排序函数Insert(L); //按学号序列插入system("cls");printf("插入后的学生信息:\n"); Display(L);Ret();Menu();break;case 5: Delete(L); //调用删除函数if (L.length == 0){printf("\n");printf("学生记录已被删除完\n");printf("\n");Ret();Menu();}else{printf("显示删除后的学生信息:\n");Display(L);Ret();Menu();}break;}}}

调试分析

操作初始界面: 新建学生信息: 三种排序功能: 三种查找方式:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。