数据结构课程设计-宿舍管理系统

        为期三天的课程设计到此就告一段落,一个宿舍系统的也已经初具雏形。以下是我的代码及演示。
/*****************************************
*版权所有(c)2015,Yao Zhaoyan;
*文件名称:宿舍系统
*文件标识:无
*内容摘要:该代码用于宿舍管理
*其他内容:无
*当前版本:v1.0
*作者:姚昭彦
*完成日期:20151225
*****************************************/
头文件Header.h:
#ifndef LIST_H_INCLUDED//防止重复定义出错
#define LIST_H_INCLUDED

#define MaxSize 700//宏定义变量
#define MaxLen 12                //单词的最大长度
#define Radix  10   
typedef char String[MaxLen+1];  //定义String为字符数组类型
typedef struct member//定义结构体
{
	String stu_num;//学号
	char sushe[5];//宿舍号
	char name[20];//名字长20字符
	struct member *next;

}Mem;//定义700个学生,数组序号即为宿舍号

//MSD
void Distribute(Mem *R,Mem *head[],Mem *tail[],int j,int n);//分配
void Collect(Mem *R,Mem *head[]);//收集
void RadixSort(Mem *R,int top);//基数排序
//FIND
int BinSearch1(Mem R[],int low,int high,String k);

void hello();//欢迎界面
void getinformation(Mem *p);//录入学生信息
void showinformation(Mem *p);//打印学生信息
void disinformation(Mem *p);//消除学生信息函数
void print(Mem *p);
void over();//退出程序
void savedate();
void readdate();
void memb();

#endif

各主要功能函数other.cpp:
#include"Header.h"
#include <stdio.h>//清屏头文件
#include<fstream>//读写文件表头
#include<iostream>//C++头文件
#include<iomanip>//输出格式的头文件
using namespace std;

Mem M[MaxSize];
int top;
int num;//作为用户做出选择时,输入的变量
/***************************************
*功能描述:输出程序选择界面
*输入参数:num,
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
***************************************/
void hello()//欢迎界面
{
	system("cls");//清屏
	cout<<"*******************************"<<endl;
	cout<<"**  ╭╮       ╭╮  ***"<<endl;  
	cout<<"** ││**号楼管理系统││  ***"<<endl;  
	cout<<"**╭┴┴———————┴┴╮***"<<endl;
	cout<<"**│ ●       ● │***"<<endl;
	cout<<"**│○  ╰┬┬┬╯  ○│***"<<endl;
	cout<<"**│    ╰—╯    │***"<<endl;
	cout<<"**╰——┬O———O┬——╯***"<<endl;
	cout<<"**   ╭╮    ╭╮     ***"<<endl;
	cout<<"**   ╰┴————┴╯     ***"<<endl;
	cout<<"******* <1>录入学生信息 *******"<<endl;
	cout<<"******* <2>查询宿舍信息 *******"<<endl;
	cout<<"******* <3>消除学生信息 *******"<<endl;
	cout<<"******* <4>所有学生信息 *******"<<endl;
	cout<<"******* <0>退出管理系统 *******"<<endl;
	cout<<"*******************************"<<endl;
	cout<<"Please Enter Your Selection:";
	
	cin>>num;//输入选项
	switch(num)
	{
		case 1:getinformation(M);break;//进入录入信息函数
		case 2:showinformation(M);break;//进入打印信息函数
		case 3:disinformation(M);break;//进入消除信息界面
		case 4:print(M);break;
		case 0:over();break;//结束程序
	}	
}
/***************************************
*功能描述:录入学生信息
*输入参数:M(学生信息通过指针p输入)
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
***************************************/
void getinformation(Mem *p)//录入学生信息函数
{
	system("cls");//清屏
	String k;
	int j;
	for(int i=0;i<MaxSize;i++)//持续循环输入
	{	
		cout<<"请输入宿舍号"<<endl;
		cin>>(p+top)->sushe;
		cout<<"请输入名字:"<<endl;
		cin>>(p+top)->name;
		cout<<"请输入学号:"<<endl;
		cin>>(p+top)->stu_num;
		strcpy(k,(p+top)->stu_num);
		j=BinSearch1(p,0,top-1,k);
		if(j==0)
		{
			top++;//人数加1
			cout<<"========================================================"<<endl;
			cout<<"		1.next"<<"		"<<"2.back"<<endl;//next继续录入下一个,back返回主界面
			cout<<"========================================================"<<endl;
			cin>>num;//输入选择(1 or 2)
			if(num==2) break;//num=1 不作处理,for循环继续。num=2中断循环。
		}
		else
		{
			cout<<"========================================================"<<endl;
			cout<<"               该学号的学生已存在!"<<endl;
			cout<<"========================================================"<<endl;
			break;
		}
	}
	RadixSort(p,top);//基数排序
	savedate();//——————————————————————保存
	cout<<"按任意键返回"<<endl;
	system("pause");
	hello();//返回主界面
}
/***************************************
*功能描述:按宿舍打印信息
*输入参数:room(宿舍号)
*输出参数:M(学生信息通过指针p输出)
*返回值:
*其他说明:消息字段之间用分号(;)分隔
***************************************/
void showinformation(Mem *p)//按宿舍打印信息
{
	char room[5];//用户输入查询的宿舍
	int j,k=1;
	system("cls");//清屏
	cout<<"输入宿舍号"<<endl;
	cin>>room;
	system("cls");//清屏
	cout<<"====================================================="<<endl;
	cout<<"===========您现在查看的是"<<room<<"宿舍的学生信息==========="<<endl;
	cout<<"====================================================="<<endl;
	cout<<"========================================================"<<endl;
	cout<<setiosflags(ios::right)<<setw(15)<<"姓名"<<setw(15)<<"学号"<<setw(15)<<"值日"<<endl;
	cout<<"========================================================"<<endl;

	for(int i=0;i<top;i++)//循环查询每个结构体中的宿舍号
	{
		j=strcmp(room,(p+i)->sushe);//数组比较函数,两数组相等时返回0
		if(j==0&&k<7)//如果返回0,输出这个人的信息,最多输出6个人
		{
			
			cout<<setiosflags(ios::right)<<setw(15)<<(p+i)->name<<setw(15)<<(p+i)->stu_num<<setw(15)<<"周"<<k<<endl;
			cout<<"========================================================"<<endl;
			k++;
		}
	}

	cout<<"按任意键返回"<<endl;
	system("pause");
	hello();//调用主界面
}
/******************************************************
*功能描述:按宿舍打印信息
*输入参数:studentnum(用户输入要查询的学生的学号),num
*输出参数:M(学生信息通过指针p输出)
*返回值:
*其他说明:消息字段之间用分号(;)分隔
*******************************************************/
void disinformation(Mem *p)//消除学生信息函数
{
	system("cls");//清屏
	String studentnum;
	int j,k;
	cout<<"请输入学号:"<<endl;
	cin>>studentnum;//用户输入要查询的学生的学号
	j=BinSearch1(p,0,top-1,studentnum);

	if(j==0)//如果没有找到此学号的学生,输出错误信息
		{
		cout<<"没有此人信息!"<<endl;
		cout<<"按任意键返回"<<endl;
		system("pause");
		}
	else
		{
			cout<<"========================================================"<<endl;
			cout<<setiosflags(ios::right)<<setw(15)//输出这个学生的信息加以确认
				<<(p+j)->sushe<<"宿舍"<<setw(15)
				<<(p+j)->name<<setw(15)
				<<(p+j)->stu_num<<setw(15)<<endl;
			cout<<"========================================================"<<endl;
			cout<<"你确定要消除信息吗?"<<endl;
				
			cout<<"========================================================"<<endl;
			cout<<"		1.next"<<"		"<<"2.back"<<endl;
			cout<<"========================================================"<<endl;
			cin>>num;
			if(num==1) //输入1继续消除
			{
				for(k=j+1;k<top;k++)//循环把之后每人的信息前移一个
				{
					strcpy((p+k-1)->sushe,(p+k)->sushe);
					strcpy((p+k-1)->name,(p+k)->name);
					strcpy((p+k-1)->stu_num,(p+k)->stu_num);
				}
				top--;//总人数减少一人
				system("cls");//清屏

				savedate();//——————————————————————保存
				cout<<"信息消除成功!"<<endl;//输出成功信息
				cout<<"按任意键返回"<<endl;
				system("pause");
			}
		}
	hello();//调用主界面
}

/******************************************************
*功能描述:结束程序
*输入参数:
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
*******************************************************/
void over()//结束程序函数
{
	return;
}
/******************************************************
*功能描述:打印所有学生信息
*输入参数:
*输出参数:M(学生信息通过指针p输出)
*返回值:
*其他说明:消息字段之间用分号(;)分隔
*******************************************************/
void print(Mem *p)//打印所有学生信息
{

	system("cls");//清屏
	for(int i=0;i<top;i++)
	{
		cout<<setiosflags(ios::right)<<setw(15)
			<<(p+i)->stu_num<<setw(15)
			<<(p+i)->sushe<<"宿舍"<<setw(15)
			<<(p+i)->name<<endl;
	}
	cout<<"按任意键返回"<<endl;
	system("pause");
	hello();//调用主界面
}

/******************************************************
*功能描述:打印所有学生信息
*输入参数:
*输出参数:top(现存录入学生信息条数),M(学生信息通过指针p输出)
*返回值:
*其他说明:消息字段之间用分号(;)分隔
*******************************************************/
void savedate()//——————————————————————保存
{
	ofstream outfile("Acount.dat",ios::binary);
	if(!outfile)
	{
		cerr<<"open error!"<<endl;
		abort();
	}
	outfile.write((char*)&top,sizeof(top));
	for(int i=0;i<=top;i++)
		outfile.write((char*)&M[i],sizeof(M[i]));
	outfile.close();
}
/******************************************************
*功能描述:打印所有学生信息
*输入参数:【通过文件写入】top(现存录入学生信息条数),M(学生信息通过指针p输出)
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
*******************************************************/
void readdate()//——————————————————————读取
{
	top=0;
	ifstream infile("Acount.dat",ios::binary);
	if(!infile)
	{
		cerr<<"open error!"<<endl;
		abort();
	}
	infile.read((char*)&top,sizeof(top));
	for(int i=0;i<top;i++)		
		infile.read((char*)&M[i],sizeof(M[i]));
	infile.close();
}

基数排序MSD.cpp:
#include"Header.h"
#include <stdio.h>
#include <malloc.h>
#include <string.h>

/***************************************
*功能描述:基数排序-分配
*输入参数:
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
***************************************/
void Distribute(Mem R[],Mem *head[],Mem *tail[],int j,int top)
//按关键字的第j个分量进行分配,进入此过程时各队列一定为空
{
    int i,k;
    Mem *p;
    for (i=0; i<top; i++)         //依次扫描R[i],将其入队
    {           
        k=R[i].stu_num[j]-48;//从最低位开始扫描,0时放入0号队列中,1时放入1号队列中,…
        p=(Mem *)malloc(sizeof(Mem)); //创建新结点

        strcpy(p->stu_num,R[i].stu_num);//赋值,数据全部跟着关键字“学号”转移
		strcpy(p->sushe,R[i].sushe);
		strcpy(p->name,R[i].name);
        p->next=NULL;//指针指向空
		//赋head,tail
        if (head[k]==NULL)//如果这个队列还没有数的话
        {
            head[k]=p;
            tail[k]=p;
        }
        else//如果已有其他数
        {
            tail[k]->next=p;
            tail[k]=p;
        }
    }
}
/***************************************
*功能描述:基数排序-收集
*输入参数:
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
***************************************/
void Collect(Mem R[],Mem *head[])
//依次将各非空队列中的记录收集起来
{
    int k=0,i;
    Mem *p;
    for (i=0; i<Radix; i++)	//i取1-10
	{
        for (p=head[i]; p!=NULL; p=p->next)//p作为循环变量,循环一次指向下一个数据
		{
            strcpy(R[k].stu_num,p->stu_num);//把经过排序的数据覆盖到原来的数组
			strcpy(R[k].sushe,p->sushe);
			strcpy(R[k].name,p->name);
			k++;
		}
	}
}
/***************************************
*功能描述:基数排序
*输入参数:
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
***************************************/
void RadixSort(Mem R[],int top)    //进行基数排序
{
    Mem *head[Radix],*tail[Radix]; //定义Radix个队列
    int i,j;
    for (i=MaxLen-1; i>=0; i--)             //从低位到高位做d趟箱排序 (最后一位,i>0,从最后一位往前数)
    {
        for (j=0; j<Radix; j++)				//Radix基数,十进制为10		
		{head[j]=tail[j]=NULL;}  //队列置空

        Distribute(R,head,tail,i,top);        //分配
        Collect(R,head);                    //收集
    }
}

折半查找FIND.cpp
#include"Header.h"
#include<iostream>//C++头文件
using namespace std;
/***************************************
*功能描述:折半查找
*输入参数:
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
***************************************/
int BinSearch1(Mem R[],int low,int high,String k)//low为0,high为top-1
{
    int mid;
    if (low<=high)      //查找区间存在一个及以上元素
    {
        mid=(low+high)/2;  //求中间位置
        if (strcmp(R[mid].stu_num,k)==0) //查找成功返回其逻辑序号mid+1
            return mid;
        if (strcmp(R[mid].stu_num,k)>0)  //在R[low..mid-1]中递归查找
            BinSearch1(R,low,mid-1,k);
        else              //在R[mid+1..high]中递归查找
            BinSearch1(R,mid+1,high,k);
    }
    else
        return 0;
}

主函数main.cpp:
#include"Header.h"
#include <stdio.h>//清屏头文件
#include<iostream>//C++头文件
#include<string>//字符串头文件
using namespace std;

int main()
{	
	string ID,key;//进入程序所需账号密码
	cout<<"pleace enter your username:";//管理员名	
	for(int i=0;i<3;i++)	
	{
		cin>>ID;
		if(ID!="admin") 
		{
			cout<<"ID can't be found!"<<endl;
			cout<<"pleace enter your username:";
			if(i==2)exit(0);//三次错误跳出
		}
		else break;
	}
	
	cout<<"pleace enter your password:";//管理员密码	
	for(i=0;i<3;i++)
	{
		cin>>key;
		if(key!="admin") 
		{
			cout<<"key is wrong!"<<endl;
			cout<<"pleace enter your password:";
			if(i==2)exit(0);//三次错误跳出
		}
		else break;
	}

	readdate();//——————————————————————读取
	hello();//欢迎界面		

	cout<<"按任意键返回"<<endl;
	system("pause");
	
	return 0;
}

运行结果:
1.验证管理员用户的账号和密码,三次不对跳出程序。

2.登陆后的主选择界面

3.选择1,录入学生信息,完成后选择1.next继续输入下一个,选择2.back返回选择界面

4.如果录入的学号已经存在,则出现提示信息并返回选择界面。

5.选择2查询宿舍信息,输入要查询的宿舍号,则出现宿舍全员的信息。

6.选择3消除学生信息,输入要消除学生的学号,若没有此人则出现提示并返回选择界面,若查找到则弹出学生信息加以确认,删除后返回选择界面。

7.选择4打印所有学生信息,则出现按学号排序的所有学生信息



评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值