宿舍管理软件

设计要求:
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;
			else                                    
				low = 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);
	}
	else
		return 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;
			else
				high = 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;
			else
				high = 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;
			else
				high = 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())    //调用判断函数1
				search3(L);
			else
			{
				system("cls");
				Menu();
			}
		}
		else
		{
			printf("该学生不存在");
			if (Select())  //调用判断函数2
				search3(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;    //定义线性表 L
	Init(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;
		}
	}
}

调试分析

  1. 操作初始界面:

在这里插入图片描述

  1. 新建学生信息:

在这里插入图片描述

  1. 三种排序功能:

在这里插入图片描述

  1. 三种查找方式:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Yun_Ge/article/details/85234422