資料結構課程設計-宿舍管理系統
為期三天的課程設計到此就告一段落,一個宿舍系統的也已經初具雛形。以下是我的程式碼及演示。
/*****************************************
*版權所有(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列印所有學生資訊,則出現按學號排序的所有學生資訊
相關文章
- 資料庫課程設計-宿舍管理系統資料庫
- 資料結構課程設計——學生資訊管理系統資料結構
- 資料結構 課程設計 員工管理系統(C語言)資料結構C語言
- 航班資訊查詢和檢索系統-資料結構課程設計資料結構
- OCP課程23:管理Ⅰ之資料庫體系結構資料庫
- 學生資訊管理系統課程設計
- 資料結構課程設計報告——暢通工程資料結構
- 學生成績管理系統——課程設計報告
- javaweb課程設計之XXX管理系統JavaWeb
- 【C++課程設計】通訊錄管理系統C++
- C++課程設計:學生資訊管理系統C++
- 課程管理系統
- 資料庫課程設計—超市零售資訊管理系統(Python實現)資料庫Python
- 資料庫課程設計資料庫
- JAVA學生宿舍管理系統Java
- 【管理系統課程設計】美少女手把手教你後臺管理
- 資料庫課設(校友錄資訊管理系統)資料庫
- 【C語言課程設計】學生學籍管理系統C語言
- 作業系統課程設計感受作業系統
- 競拍系統設計和核心資料結構資料結構
- 【web】資料庫應用系統設計體系結構Web資料庫
- EasyUI+JavaWeb獎助學金管理系統[3]-資料庫結構設計UIJavaWeb資料庫
- Java圖書管理系統,課程設計必用(原始碼+文件)Java原始碼
- 《資料庫系統原理》課程筆記資料庫筆記
- 大一課程設計:基於資料庫的學生資訊系統資料庫
- Springboot+Vue宿舍管理系統Spring BootVue
- 資料管理系統設計和實現
- 系統架構設計之-任務排程系統的設計架構
- PDM系統的結構設計
- 資料結構與演算法課程筆記(二)資料結構演算法筆記
- 《軟體工程》課程設計總結軟體工程
- 資料密集型系統架構設計架構
- 20145216《資訊保安系統設計基礎》課程總結
- 太原ATC系統計劃資料結構明細資料結構
- 【系統設計】系統設計中經常使用的20個高階資料結構和演算法資料結構演算法
- 5分鐘課程:物聯網的系統設計
- 2013資料結構課程設計之通訊錄(複習連結串列與檔案知識)資料結構
- HBase 系統架構及資料結構架構資料結構