通過設計一個小型的快件管理系統,訓練綜合運用所學知識處理實際問題的能力,強化物件導向的程式設計理念,使自己的程式設計與偵錯水平有一個明顯的提高。
1、每個學生必須獨立完成;
2、課程設計時間爲1周;
3、設計語言採用C++;
4、學生有事離校必須請假。課程設計期間,無故缺席按曠課處理;缺席時間達四分之一以上者,未按規定上交實驗報告的學生,其成績按不及格處理。
有一個快遞服務代收點,現在需要你爲這個服務代收點開發一個簡單的快件管理系統,使收件人能夠查詢自己的快件情況,服務人員能夠使用該系統管理該點代收的所有快件,並通知收件人取件,加快工作效率,提高服務品質。
該系統爲兩種角色的使用者提供服務,一種是代收點服務人員,一種是收件人。代收點服務人員根據賬號、密碼登錄系統。收件人無需登錄即可使用系統。
1、 代收點服務人員可將快件資訊錄入系統,快件資訊包括快遞單號、快遞公司、收件人、收件人聯繫電話、收件人地址、郵編、寄件人、寄件人聯繫電話、寄件人地址、郵編,系統可自動爲該快件生成取件號。如收件人來取件,服務人員可根據手機號或者取件號查詢到該快件並標記取件成功。收件人可以通過手機號查詢自己在該代收點的快件的取件號以及是否收取的情況,成績≥60;
2、 系統退出後能儲存當天的快件資訊,要求每天一個文件,文件名按照日期命名。代收點服務人員可以根據快遞單號查詢、刪除、修改某個快件,還可以查詢所有未取快件,成績≥70;
3、 系統可根據歷史記錄對收取件情況進行統計,根據服務人員的輸入日期統計某天的收取件情況並顯示,包括當天的收件量、各快遞公司的收件量、取件量、各快遞公司的取件量、未取件數量、各快遞公司的未取件數量,成績≥80;
4、 取件號可以根據快件的大小、快遞公司等資訊實現自動編碼,成績≥90;
要求:
用物件導向的程式設計方法設計該系統。本系 本係統涉及的基本物件有快件物件、快件管理物件、系統介面對象。實現對這些物件的合理抽象和封裝,正確定義類之間的關係。介面合理,程式碼檔案組織清晰,命名符合規範,程式碼註釋清楚,課設報告書品質高。
快件管理系統
#ifndef CDATE_H
#define CDATE_H
#include <time.h>
#include <string>
using namespace std;
class Cdate
{
private:
int year, month, day;
public:
int GetYear() { return year; }
int GetMonth() { return month; }
int GetDay() { return day; }
string DateToString(int y, int m, int d);
void DatetoCdate(string date);
string NowDate();
bool IsLeapYear();
};
#endif
#ifndef LOCKER_H
#define LOCKER_H
#include <vector>
#include "Package.h"
#include <map>
using namespace std;
class Locker
{
private:
vector<Package> Locker_Floor[6]; //5層
string LockerID;
int Size_All; //總容量
int Size_Floor[6]; //每層容量
public:
Locker();
void SetLockerID(string id) { LockerID = id; }
string GetLockerID() { return LockerID; }
void Stock_In(Package& P);
bool SearchPackage(Package** P,string method);
bool IsLockerFull();
bool IsFloorFull(int Floor);
bool IsLockerEmpty();
void ReadInfo(Package& P);
void SaveInfo();
void WaybillSearch(int flag,string Waybill);
};
#endif
#ifndef MANAGER_H
#define MANAGER_H
#include <string>
#include "Package.h"
#include <map>
using namespace std;
class Manager
{
private:
string Username = "admin";
string Password = "admin";
public:
void SetUsername(string text) { Username = text; }
void SetPassword(string text) { Password = text; }
string GetUsername() { return Username; }
string GetPassword() { return Password; }
bool Stock_In(Package& P);
void SearchPackage(Package** SP,string method);
void ReadInfo(Package& P);
void SaveInfo();
void WaybillSearch(Package** SP, string method);
};
#endif
#ifndef PACKAGE_H
#define PACKAGE_H
#include <string>
using namespace std;
/*
快件資訊
快遞單號、快遞公司;
收件人:姓名、聯繫電話、地址、郵編;
寄件人:姓名、聯繫電話、地址、郵編;
*/
class Package
{
private:
string WaybillNum; //快遞單號
string ExpressCompany; //快遞公司
string Recipient; //收件人
string RecPhone; //收件人聯繫方式
string RecAddress; //收件人地址
string RecZip; //收件人郵編
string Sender; //寄件人
string SenPhone; //寄件人聯繫方式
string SenAddress; //寄件人地址
string SenZip; //寄件人郵編
string SearchID; //取件碼
string Date;
bool State; //狀態:true已取件 false未取件
bool Stores = false;
public:
Package();
void SetWaybillNum(const string& text) { WaybillNum = text; }
void SetExpressCompany(const string& text) { ExpressCompany = text; }
void SetRecipient(const string& text) { Recipient = text; }
void SetRecPhone(const string& text) { RecPhone = text; }
void SetRecAddress(const string& text) { RecAddress = text; }
void SetRecZip(const string& text) { RecZip = text; }
void SetSender(const string& text) { Sender = text; }
void SetSenPhone(const string& text) { SenPhone = text; }
void SetSenAddress(const string& text) { SenAddress = text; }
void SetSenZip(const string& text) { SenZip = text; }
void SetSearchID(const string& text) { SearchID = text; }
void SetDate(const string& text) { Date = text; }
void SetState(bool flag) { State = flag; }
void SetStores(bool flag) { Stores = flag; }
string GetWaybillNum() { return WaybillNum; }
string GetExpressCompany() { return ExpressCompany; }
string GetRecipient() { return Recipient; }
string GetRecPhone() { return RecPhone; }
string GetRecAddress() { return RecAddress; }
string GetRecZip() { return RecZip; }
string GetSender() { return Sender; }
string GetSenPhone() { return SenPhone; }
string GetSenAddress() { return SenAddress; }
string GetSenZip() { return SenZip; }
string GetSearchID() { return SearchID; }
bool GetState() { return State; }
bool GetStores() { return Stores; }
string GetDate() { return Date; }
void ShowInfo();
bool operator==(Package &temp);
};
#endif
/*
用來顯示各操作介面
*/
#ifndef SYSTEM_H
#define SYSTEM_H
#include "Package.h"
class System
{
public:
void Frame(); //初始邊框
void Start(); //身份選擇
void Error(int flag); //錯誤介面
void Exit(); //退出程式
bool SignIn(); //登錄系統
void SignOut(); //登出系統
void ManagerMeun(); //管理員介面
void Stock_In(); //快件入庫
void Stock_Pick(); //快件出庫
void SearchPackage(string text);
void RecipientMeun();
void ReadSurplusInfo();
void SaveInfo();
void StatisticsInfo();
void WayBillSearch(int type);
void CheckPackage(int type);
};
#endif
#include <iostream>
#include <direct.h>
#include <conio.h>
#include <cstdio>
#include <stdlib.h>
#include <windows.h>
#include "System.h"
#include "Package.h"
#include "Locker.h"
#include "Manager.h"
#include "Cdate.h"
using namespace std;
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO _Close_Cursor = { 1,FALSE };
CONSOLE_CURSOR_INFO _Open_Cursor = { 1,TRUE };
Cdate Date;
System SYS;
Manager MAN;
Locker Lock[21];
int main()
{
SetConsoleTitle(L"快件管理系統");
for (int i = 1; i < 21; i++) //初始化櫃檯編號
{
if (i < 10) Lock[i].SetLockerID(to_string(0) + to_string(i));
else Lock[i].SetLockerID(to_string(i));
}
system("mode con cols=60 lines=20");
system("md history");
SYS.ReadSurplusInfo();
SYS.Start();
while (1)
{
system("cls");
SYS.Start();
int mode = 1;
cin >> mode;
if (mode == 1) //管理員功能
{
int flag = 1; //登錄次數 3次超時
int choice = 10;
while (!SYS.SignIn() && flag<3)
{
flag++;
}
if (flag == 3)
{
SYS.Error(2);
continue;
}
while (choice != 0)
{
SYS.ManagerMeun();
cin >> choice;
switch (choice)
{
case 0: //退出登錄
SYS.SaveInfo();
SYS.SignOut();
break;
case 1: //錄入快件
SYS.Stock_In();
break;
case 2: //查詢快件
SYS.SearchPackage("Manager");
break;
case 3:
SYS.WayBillSearch(1);
break;
case 4:
SYS.WayBillSearch(3);
break;
case 5:
SYS.WayBillSearch(2);
break;
case 6:
SYS.CheckPackage(3);
break;
case 7:
SYS.CheckPackage(1);
break;
case 8:
SYS.CheckPackage(2);
break;
case 9:
SYS.SaveInfo();
SYS.StatisticsInfo();
break;
default:
SYS.Error(1);
break;
}
}
}
else if(mode ==2) //收件人功能
{
int choise = 1;
while (choise != 2)
{
SYS.RecipientMeun();
cin >> choise;
switch (choise)
{
case 1:
SYS.SearchPackage("Recipient");
break;
default:
break;
}
}
}
else if (mode == 3) //退出系統
{
SYS.SaveInfo();
SYS.Exit();
}
else //錯誤輸入
{
SYS.Error(1);
}
}
return 0;
}
六、 執行結果與分析
七、 心得與體會
附件:
資源下載
資料包括測試數據檔案,可執行程式,以及原始碼