中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++如何實現停車場管理系統

發布時間:2023-04-15 16:22:46 來源:億速云 閱讀:106 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“C++如何實現停車場管理系統”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C++如何實現停車場管理系統”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    一、案例需求描述

    停車場管理系統就是模擬停車場進行車輛管理的系統,該系統分為汽車信息模塊,用戶使用模塊和管理員用戶模塊,各模塊功能如下所示:

    1.1、汽車信息模塊

    添加汽車信息:添加汽車屬性。

    刪除汽車信息:輸入停車場中存在的車牌號,刪除汽車信息。

    查找汽車信息:輸入停車場存在的車牌號,顯示汽車詳細信息。

    修改汽車信息:輸入停車場內存在的車牌號,修改汽車屬性信息。

    停車時長統計:顯示汽車在停車場中停留的時間和車輛總數。

    停車場信息顯示:顯示停車場所有汽車的屬性信息。

    汽車信息保存:將汽車信息保存到本地文件中。

    1.2、普通用戶模塊

    可以查詢、顯示所有汽車信息及停車費信息,另外還包含停車時長統計與退出普通用戶登錄功能。由于是多次操作,因此需要有循環判斷功能,這種情況多使用while嵌套switch case語句實現。

    1.3、管理員用戶模塊

    此模塊具有普通用戶模塊的所有功能,此外還應有增、刪、改的功能。

    二、案例分析

    通過案例描述我們得到了非常清晰的模塊信息,因此在設計類時應該包含普通用戶類、管理員用戶類、汽車信息類。

    大致思路:

    在汽車信息類中實現基本功能并封裝起來,以便后續調用。

    在普通用戶類中定義菜單功能,通過鍵入不同數字實現不同功能。

    在管理員用戶類中定義菜單功能,通過鍵入不同數字實現不同功能。

    三、案例代碼實現

    這里我采用分文件編寫的方式,建立user.h、admin.h、car.h及對應的三個.cpp文件和main.cpp文件,在main里面循環調用user和admin的方法就能實現停車場管理系統。

    3.1、汽車信息類及方法實現

    car.h

    #pragma once // 防止頭文件被重復調用
    #include<string>
    #include<ctime>
    using namespace std;
    
    class Car {
    private:
    	string carNum; // 汽車編號
    	string carType; // 汽車型號
    	string color; // 汽車顏色
    	time_t inTime; // 汽車停車時間點
    public:
    	void addCar();  // 下面四行對應增刪改查
    	void delCar();
    	void modCar();
    	void findCar();
    	void timeAmount(); // 計算停車時長并統計汽車總數
    	void showInfor(); // 顯示車輛信息(讀文件)
    	void saveInfor(); // 保存車輛信息(寫文件)		
    };

    car.cpp

    #include"car.h"
    #include<fstream> // 讀寫操作
    #include<iostream>
    #include<iomanip> // IO流控制頭文件,類似C里的格式化輸出
    using namespace std;
    
    void Car::addCar() {
    	time_t _time; // 定義時間變量,秒數,調用time()獲取
    	while (1) {
    	AA:		cout << "請輸入車牌號:";
    		cin >> carNum;
    		// 判斷文件中是否已存在相同車牌號
    		ifstream ifs("carData.txt", ios::in); // 讀文件
    		if (ifs) {
    			char buf[1024];
    			string strs[20];
    			int index = 0; // 標識數組索引
    			while (!ifs.eof()) { // 讀取文件直到末尾
    				ifs.getline(buf, 100); // 每次讀取一行數據,放入buf數組 注:第二個參數為字符數,緩沖區盡量大,否則循環會異常結束
    				strs[index++] = buf[0]; // buf[0]為車牌號,存入strs數組,索引自增
    			}
    			// 遍歷strs數組,auto 自動推導數據類型,這里等價于 string
    			for (auto& num : strs) {
    				// 判斷輸入車牌號是否與文件里重復
    				if (num == carNum) {
    					cout << "車牌號重復!" << endl;
    					goto AA; // 重復后重新輸入車牌號
    				}
    			}
    		}
    		// 車牌號不重復繼續加下來的輸入
    		cout << "請輸入車的種類:";
    		cin >> carType;
    		cout << "請出入車的顏色:";
    		cin >> color;
    		inTime = time(&_time); // 記錄停車時間
    		// 保存新增車輛信息
    		saveInfor();
    		char ch; 
    		cout << "\t是否繼續?(y/n)"; // 判斷是否繼續輸入,\t 制表符,通常八個空格
    		cin >> ch;
    		if (ch == 'n' || ch == 'N') {
    			break;
    		}
    	}
    }
    void Car::delCar() {
    	// 讀文件
    	ifstream carData("carData.txt", ios::in); 
    	// 創建文件寫入流,緩沖文件
    	ofstream outData("tempCarData.txt", ios::out);
    	if (!outData || !carData) {
    		cout << "文件打開失敗!" << endl;
    		return;
    	}
    	string carId, name, str;
    	bool flag = true;
    	cout << "請輸入要刪除的車牌號:";
    	cin >> carId;
    	// 讀取文件第一個字段(車牌號) >> 遇空格結束讀取
    	while (carData >> name) {
    		getline(carData,str); // 將該行數據讀取到 str
    		// 如果相同,輸出要刪除的車輛信息:顏色,型號,停車時間
    		if (name == carId) {
    			cout << "要刪除的車輛信息:" << endl << str << endl;
    			flag = false;
    			break;
    		}
    		// 如果不相同,將車輛信息寫入到temp,否則舍棄該行
    		outData << name << " " << str << endl;
    	}
    	if (flag) cout << "該車牌號不存在" << endl;
    	else {
    		while (getline(carData, str)) { // 繼續按行讀取,此時第一行
    			outData << str << endl; // 寫入到temp
    		}
    		carData.close();
    		outData.close();
    		// 讀取 temp,寫入 carData
    		ifstream in("tempCarData.txt", ios::in);
    		ofstream out("carData.txt", ios::out);
    		if (!in || !out) {
    			cout << "文件讀取失敗!" << endl;
    			return;
    		}
    		else {
    			while (getline(in, str)) { // 按行讀取,寫入
    				out << str << endl;
    			}
    		}
    		in.close();
    		out.close();
    	}
    }
    void Car::modCar() {
    	string chepai1, chepai2, str;
    	time_t  time1;
    	int i = 1;
    	cout << "請輸入你要修改的車輛的車牌號" << endl;
    	cin >> chepai1;
    	ifstream indata("carData.txt", ios::in);
    	ofstream outdata("tempCarData.txt", ios::out);
    	if (!indata || !outdata)
    	{
    		cerr << "文件打開錯誤" << endl;
    		exit(1);
    	}
    	while (indata >> chepai2)
    	{
    		indata >> carType >> color >> inTime; // 讀取該行剩余元素
    		if (chepai1 == chepai2)
    		{
    			i = 0;
    			cout << "已找到所要修改的車輛" << endl;
    			cout << "修改后的車牌號" << endl;
    			cin >> carNum;
    			cout << "修改后的車輛型號" << endl;
    			cin >> carType;
    			cout << "修改后的車輛顏色" << endl;
    			cin >> color;
    			inTime = time(&time1);
    			// 寫入carData.txt
    			outdata << carNum << " " << carType << "  " << color << "  " << inTime << endl;
    			break;
    		}
    		// 車牌號不同,將車輛信息存到temp
    		outdata << chepai2 << " " << carType << "  " << color << "  " << inTime << endl;
    	}
    	if (i) { 
    		cout << "停車場中沒有找到要修改的車輛" << endl; 
    	}
    	outdata.close();
    	indata.close();
    	ifstream in("tempCarData.txt", ios::in);
    	ofstream out("carData.txt", ios::out);
    	if (!in || !out)
    	{
    		cout << "文件打開錯誤" << endl;
    		exit(1);
    	}
    	while (getline(in, str))
    	{
    		out << str << endl;
    	}
    	in.close();
    	out.close();
    }
    void Car::findCar() {
    	ifstream carData("carData.txt", ios::in);
    	if (!carData)
    	{
    		cout << "文件打開失敗" << endl;
    		return;
    	}
    	else {
    		string carId;
    		time_t _time, t1;
    		bool flag = true;
    		cout << "請輸入要查找的車牌號" << endl;
    		cin >> carId;
    		while (carData >> carNum) // 讀取車牌號
    		{
    			carData >> carType >> color >> inTime;
    			t1 = time(&_time); // 獲取系統當前時間
    			if (carId == carNum)
    			{
    				flag = false;
    				break;
    			}
    		}
    		if (flag) {
    			cout << "未找到該車輛信息!" << endl;
    		}
    		else {
    			cout << "車牌號" << carNum <<" "<<"車的型號:" << carType <<" " <<
    			" 車的顏色:" << color << " "<<"停車時長:" << (t1 - inTime) << "秒" 
    				<<" "<< "停車費 " << (t1 - inTime) * 0.05 << "元" << endl;
    		}
    		carData.close();
    	}
    }
    void Car::timeAmount() {
    	time_t it, time1;
    	int c1 = 0, c2 = 0;
    	ifstream indata("carData.txt", ios::in);
    	if (!indata)
    	{
    		cerr << "文件打開失敗" << endl;
    		exit(1);
    	}
    	while (indata >> carNum)
    	{
    		indata >> carType >> color >> inTime;
    		it = time(&time1);
    		if ((it - inTime) / (60 * 60 * 24) >= 24)
    		{
    			c1++;
    		}
    		else c2++;
    	}
    	cout << "車輛總數是:" << c1 + c2 << endl;
    	cout << "其中停放超過24小時的有" << c1 << "輛" << endl;
    	cout << "其中停放不超過24小時的有" << c2 << "輛" << endl;
    	indata.close();
    }
    void Car::showInfor() {
    	int i = 1;
    	string chepai;
    	time_t it, time1;
    	ifstream indata("carData.txt", ios::in);
    	if (!indata)
    	{
    		cerr << "文件打開錯誤" << endl;
    		exit(1);
    	}
    	cout << "停車場中所有汽車信息如下所示:" << endl;
    	cout << "-----------------------------" << endl;
    	while (indata >> chepai)
    	{
    		indata >> carType >> color >> inTime;
    		it = time(&time1);
    		cout << "第" << i << "輛車信息如下" << endl;
    		cout << "車牌號" << chepai << "  車的型號:" << carType << "  車的顏色:" << color 
    			<< "  停車時間" << (it - inTime) << "秒" << 
    			"  停車費 " << (it - inTime) * 0.05 << "元" << endl;
    		i++;
    	}
    	indata.close();
    }
    void Car::saveInfor() {
    	ofstream outData("carData.txt", ios::app); // app 追加方式寫文件,即在文件末尾添加
    	if (!outData) {
    		cout << "文件打開失敗!" << endl;
    		return;
    	}
    	else {
    		// 將新增車輛信息寫入carData
    		outData << carNum << " " << carType << " " << color << " " << inTime << endl;
    	}
    	outData.close();
    }

    3.2、普通用戶類及方法實現

    user.h

    #pragma once
    #include<string>
    using namespace std;
    
    // 普通用戶類,只能查看、統計、顯示車輛,無法實現增刪改
    class User {
    public:
    	void checkCar(); // 普通用戶登錄菜單
    };

    user.cpp

    #include<iostream>
    #include<Windows.h>
    #include"user.h"
    #include"car.h"
    using namespace std;
    void User::checkCar() {
    	Car car;
    	while (1) {
    		system("cls"); // 清空屏幕
    		cout << "1.顯示車輛狀況" << endl;
    		cout << "2.查詢車輛信息" << endl;
    		cout << "3.統計車輛" << endl;
    		cout << "4.退出普通用戶" << endl;
    		
    		int c;
    		cout << "輸入要執行的操作:";
    		cin >> c;
    		switch (c) {
    			case 1: car.showInfor(); break;
    			case 2: car.findCar(); break;
    			case 3: car.timeAmount(); break;
    			case 4: return;
    			default: cout << "請輸入正確的操作" << endl;
    		}
    		system("pause");
    	}
    }

    3.3、管理員用戶類及方法實現

    admin.h

    #pragma once // 避免同一個頭文件被包含多次
    #include<string>
    #include"user.h"
    using namespace std;
    
    // 管理員類,公有繼承普通用戶類,可以添加,修改,刪除
    
    class Admin:public User {
    public:
    	void Manager(); // 顯示管理員登錄的菜單
    };

    admin.cpp

    #include"admin.h"
    #include"car.h"
    #include<iostream>
    #include<fstream>
    #include<string>
    using namespace std;
    
    void Admin::Manager() {
    	Car car;
    	while (1) {
    		system("cls"); // 清空屏幕
    		cout << "1.增加車輛" << endl;
    		cout << "2.顯示所有車輛信息" << endl;
    		cout << "3.查詢" << endl;
    		cout << "4.修改" << endl;
    		cout << "5.刪除" << endl;
    		cout << "6.統計" << endl;
    		cout << "7.退出管理用戶" << endl;
    		int choice;
    		cout << "請輸入要執行的操作:";
    		cin >> choice;
    		switch (choice) {
    			case 1: car.addCar(); break;
    			case 2: car.showInfor(); break;
    			case 3: car.findCar(); break;
    			case 4: car.modCar(); break;
    			case 5: car.delCar(); break;
    			case 6: car.timeAmount(); break;
    			case 7: return;
    			default: cout << "輸入錯誤!" << endl; 
    		}
    		system("pause");
    	}
    }

    3.4、主函數調用情況

    #include"user.h"
    #include"admin.h"
    #include<iostream>
    using namespace std;
    int main() {
    	User user; // 普通用戶對象
    	Admin admin; // 管理員對象
    	int choice;
    	while (1) {
    		system("cls");
    		cout << "1.普通用戶登錄" << endl;
    		cout << "2.管理員登錄" << endl;
    		cout << "3.退出系統" << endl;
    		cout << "請輸入要執行的操作:" << endl;
    		cin >> choice;
    		switch (choice) {
    			case 1: user.checkCar(); break;
    			case 2: admin.Manager(); break;
    			case 3: exit(0); // 退出系統
    			default: cout << "請輸入正確的操作" << endl;
    		}
    		system("pause");
    	}
    	return 0;
    }

    四、運行界面截圖

    C++如何實現停車場管理系統

    C++如何實現停車場管理系統

    C++如何實現停車場管理系統

    C++如何實現停車場管理系統

    讀到這里,這篇“C++如何實現停車場管理系統”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    c++
    AI

    伊通| 吉水县| 上栗县| 巫溪县| 棋牌| 东丽区| 平利县| 寻乌县| 虹口区| 定西市| 阿拉善右旗| 呼伦贝尔市| 囊谦县| 闻喜县| 民县| 佛教| 抚顺市| 平乐县| 布尔津县| 屏东市| 巴彦县| 恩施市| 旬邑县| 清苑县| 平定县| 通州区| 富蕴县| 黄龙县| 玛沁县| 新兴县| 公安县| 辽阳县| 屏东县| 获嘉县| 饶河县| 教育| 乐平市| 青铜峡市| 高要市| 酒泉市| 满洲里市|