为期三天的课程设计到此就告一段落,一个宿舍系统的也已经初具雏形。以下是我的代码及演示。
/*****************************************
*版权所有(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打印所有学生信息,则出现按学号排序的所有学生信息