用c++写出538公交车刷卡系统(c++)没有其他特殊要求,只要用c++就好,最好附上代码的含义
你是作业?还是想平移至生产环境中?如果是作业需求还不算很明确,能否运用结构体?
我这里采取两个结构体存储乘客信息和乘车记录,且已经实现了正常的模拟刷卡情况:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <ctime>
struct Passenger {
std::string name;
int balance;
};
struct Record {
std::string name;
int amount;
std::string time;
};
void swipeCard(Passenger& passenger, int amount, std::vector<Record>& records) {
if (passenger.balance >= amount) {
passenger.balance -= amount;
Record record;
record.name = passenger.name;
record.amount = amount;
record.time = getCurrentTime();
records.push_back(record);
} else {
std::cout << "余额不足" << std::endl;
}
}
void showRecords(const std::vector<Record>& records) {
std::cout << "乘车记录:" << std::endl;
for (const auto& record : records) {
std::cout << record.name << " " << record.amount << " " << record.time << std::endl;
}
}
void showMenu(Passenger& passenger, std::vector<Record>& records) {
while (true) {
std::cout << "1. 查看余额\\n";
std::cout << "2. 充值\\n";
std::cout << "3. 刷卡\\n";
std::cout << "4. 查看乘车记录\\n";
std::cout << "5. 退出\\n";
int choice;
std::cin >> choice;
switch (choice) {
case 1: {
std::cout << "当前余额为 " << passenger.balance << std::endl;
break;
}
case 2: {
std::cout << "请输入充值金额:";
int amount;
std::cin >> amount;
passenger.balance += amount;
std::cout << "充值成功,当前余额为 " << passenger.balance << std::endl;
break;
}
case 3: {
std::cout << "请输入刷卡金额:";
int amount;
std::cin >> amount;
swipeCard(passenger, amount, records);
break;
}
case 4: {
showRecords(records);
break;
}
case 5: {
return;
}
default: {
std::cout << "无效的选项" << std::endl;
break;
}
}
}
}
void saveData(const Passenger& passenger, const std::vector<Record>& records) {
std::ofstream outfile("data.txt");
outfile << passenger.name << " " << passenger.balance << std::endl;
for (const auto& record : records) {
outfile << record.name << " " << record.amount << " " << record.time << std::endl;
}
outfile.close();
}
void loadData(Passenger& passenger, std::vector<Record>& records) {
std::ifstream infile("data.txt");
infile >> passenger.name >> passenger.balance;
while (!infile.eof()) {
Record record;
infile >> record.name >> record.amount >> record.time;
records.push_back(record);
}
infile.close();
}
std::string getCurrentTime() {
time_t now = time(nullptr);
char buf[80];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&now));
return buf;
}
int main() {
Passenger passenger;
std::vector<Record> records;
loadData(passenger, records);
showMenu(passenger, records);
saveData(passenger, records);
return 0;
}
在用字符数组存放字符串时,字符串的运算要用字符串函数,如strcat连接、strcmp比较、strcpy复制。而对于string类对象,可以不用这些函数,而直接用简单的运算符。
str1=str2;
作用同“strcpy(str1,str2);”
string str1="A";;
string str1="B";
string str;
str=str1+str2; //则str="AB"
引用ChatGPT部分内容参考:
以下代码实现了一个简单的刷卡系统,乘客可以通过刷卡机刷卡乘坐公交车,每次刷卡扣除2元,如果余额不足则提示充值。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 定义乘客类
class Passenger {
public:
Passenger(string name, int balance) {
this->name = name;
this->balance = balance;
}
string getName() {
return name;
}
int getBalance() {
return balance;
}
void setBalance(int balance) {
this->balance = balance;
}
private:
string name;
int balance;
};
// 定义刷卡机类
class CardReader {
public:
CardReader(vector<Passenger>& passengers) {
this->passengers = passengers;
}
void swipeCard(string name) {
for (int i = 0; i < passengers.size(); i++) {
if (passengers[i].getName() == name) {
int balance = passengers[i].getBalance();
if (balance >= 2) {
passengers[i].setBalance(balance - 2);
cout << name << " 刷卡成功,余额为 " << passengers[i].getBalance() << " 元" << endl;
} else {
cout << name << " 余额不足,请充值" << endl;
}
return;
}
}
cout << "未找到该乘客" << endl;
}
private:
vector<Passenger> passengers;
};
int main() {
// 初始化乘客信息
vector<Passenger> passengers;
passengers.push_back(Passenger("张三", 10));
passengers.push_back(Passenger("李四", 5));
passengers.push_back(Passenger("王五", 0));
// 初始化刷卡机
CardReader cardReader(passengers);
// 乘客刷卡
cardReader.swipeCard("张三");
cardReader.swipeCard("李四");
cardReader.swipeCard("王五");
cardReader.swipeCard("赵六");
return 0;
}