首先请格式化您的代码。并将其附加到您的问题中。
要编写银行系统,您显然可以使用类。但这里不是这样。
您的问题不在于类,而在于应用程序的逻辑。很难准确说出您的代码应该做什么,因为它不完整,而且我不熟悉罗马尼亚语,但我会尝试猜测。
当你尝试编写这样一个项目时,你首先要问自己几个问题:
- 银行系统是做什么的?
- 它应该具备哪些功能?
- 它存储什么样的数据?
- 这些数据将如何存储?
我想我们都知道第一个问题的答案:它可以让客户赚钱。那很简单。
根据公布的代码,我会尝试回答剩下的问题。
它应该具备哪些功能?
我将您的菜单翻译成这样:
- 创建一个新的银行帐户。
- 登录现有帐户。
- 显示现有帐户的余额。
它存储什么样的数据?
让我们保持简单,只存储用户名、密码和用户余额。为此,我们将创建自己的structure。我们可以使用类,但正如我所说:保持简单和简短。
struct BankAccount
{
std::string username;
std::string password;
int balance;
};
这些数据将如何存储?
为了存储一些数据,我们通常使用某种数据库。我会像你一样使用一个简单的文件。但首先我们必须决定如何在我们的数据库中存储帐户?我再次建议保持简单并制定一些规则:
- 用户名和密码不能包含任何空格
- 密码将以纯文本形式存储
- 余额必须适合
int
- 所有内容都将用空格隔开
我会再添加一条规则(以使其在调试时更具可读性):每个用户都将被保留在不同的行中。所以我们的数据库可能是这样的:
adam pass 123
eva qwerty 666
henry qaz123 -100
... and so on ...
回答完所有问题后,我们可以开始思考我们的系统应该如何工作?
它应该如何工作?
我会将我们的逻辑分为 4 个步骤:
- 加载数据库。
- 询问用户该怎么做。
- 做任何用户要求的事情。
- 保存数据库。
当然,这不是最好或最快的方法。但正如我所说:保持简单。我们还将假设数据库没有损坏,因此我们不必在加载时对其进行验证。
现在让我们将每个步骤分成原子。
1。加载数据库。
为此,我们需要一个包含数据的文件和某种结构来加载数据。我们将使用std::vector,因为它可以自动扩展,我们不必担心它。现在,我们需要做什么?我们确切地知道我们的文件的结构,我们可以假设数据库没有损坏。所以我们需要做的就是读取字符,直到遇到空格。幸运的是,我们可以在不编写任何复杂函数的情况下做到这一点。标准库会为我们做这件事:
#include <vector>
#include <string>
#include <fstream>
std::vector<BankAccount> LoadDatabase(const std::string &dbFile)
{
std::vector<BankAccount> accounts;
std::ifstream file(dbFile);
if (!file)
{
std::cerr << "Cannot open database file!" << std::endl;
return accounts;
}
BankAccount account;
while (file >> account.username >> account.password >> account.balance)
accounts.push_back(account);
return accounts;
}
因为我们数据库中的每个字段都由空格分隔,所以我们可以轻松读取整个文件。我将把SaveDatabase(const std::string &dbFile, const std::vector<BankAccount> &accounts) 的实现留给你。它应该和我们的加载函数非常相似。
2。询问用户该怎么做。
我也不会写这段代码。你已经这样做了。我能做的是建议您将其移至单独的函数中并返回结果(请求的操作)。您应该不断询问用户的输入,直到它有效为止(即它是一个整数并且对应于菜单中的任何元素)。
3。做任何用户要求的事情。
现在我们应该根据用户在上一步中选择的内容调用适当的函数。我们将使用switch statement。我翻译了(如果有任何问题都怪 Ggoogle)你的菜单,以了解我们必须实现什么样的功能,我以这三个结束:
- 创建一个新的银行帐户。
- 登录现有帐户。
- 显示现有帐户的余额。
创建一个新帐户应该很容易。我们已经在std::vector 中加载了我们的数据库,并且我们知道在关闭应用程序时它将被保存回文件中。我们所要做的就是请求新的用户数据(用户名和密码),构建一个新对象并将其添加到std::vector。它可能看起来像这样:
void CreateAccount(std::vector<BankAccount> &accounts)
{
BankAccount account;
std::cout << "Provide username and password (separated by space):" << std::endl;
std::cin >> account.username >> account.password.
account.balance = 0;
accounts.push_back(account);
}
我不知道登录到现有帐户应该做什么(也许显示一个新菜单?),所以我会留给你写。但是显示所有帐户的余额应该很容易:
void DisplayAllAccounts(const std::vector<BankAccount> &accounts)
{
std::cout << "All accounts in database:\n";
for (size_t i = 0; i < accounts.size(); ++i)
std::cout << "\t" << accounts[i].username << " has $" << accounts[i].balance << "\n";
}
4。保存数据库。
正如我所说,我将把它留给你。根据你现在的情况,应该不会那么难写。
哦,我会忘记的。您的 main 函数与 switch 语句:
int main()
{
const std::string dbFile = "Conturi.txt";
// Load the database
std::vector<BankAccount> accounts = LoadDatabase(dbFile);
// SelectAction shows the menu, gathers user's input and return 1, 2 or 3 depending on action he choosed
switch(SelectAction())
{
case 1:
CreateNewAccount(accounts);
break;
case 2:
LogIntoAccount(accounts);
break;
case 3:
DisplayAllBalances(accounts);
break;
default:
// This should never happend because SelectAction should handle incorrect input
std::cerr << "Incorrect input!" << std::endl;
return 1;
}
// Save the database
SaveDatabase(dbFile, accounts);
return 0;
}
如您所见,这并不难。如果格式正确,代码可读性更高。
现在我已经完成了你的大部分作业,祝你好运!