資料結構課程設計-宿舍管理系統

喬克叔叔丶發表於2015-12-27
        為期三天的課程設計到此就告一段落,一個宿舍系統的也已經初具雛形。以下是我的程式碼及演示。
/*****************************************
*版權所有(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列印所有學生資訊,則出現按學號排序的所有學生資訊



相關文章