我正在尝试使用C++中的类

I am trying to use classes in C++

本文关键字:C++      更新时间:2023-10-16

我正在处理一个项目,我认为需要使用类。我想建立一个银行系统,为此我需要创建一个由密码和名称组成的帐户。问题是,当我尝试创建一个新帐户时,以前的帐户会被删除,这样我一次只能有一个帐户。我在互联网上研究过,我认为解决方案是使用课堂。有人能帮我做一个广告或创意吗?我将在下面附上代码。

函数主

在文件Input.txt中,我添加了初始值1,然后随着每个创建的帐户增加变量cont。问题是文件Conturi.txt,因为我只有一个帐户,最新的一个,我不知道为什么,因为每次我使用void creare_cont时都会写。。。。

首先请格式化您的代码。并将其附加到您的问题中。

要编写银行系统,显然可以使用类。但这里的情况并非如此。问题不在于类,而在于应用程序的逻辑。很难准确地说出你的代码应该做什么,因为它是不完整的,而且我不熟悉罗马尼亚语,但我会尝试猜测。

当你试图写这样一个项目时,你必须首先问自己几个问题:

  • 银行系统是做什么的
  • 它应该具有哪些功能
  • 它存储什么样的数据
  • 这些数据将如何存储

我想我们都知道第一个问题的答案:它能让客户省钱。这很容易。根据发布的代码,我将尝试回答剩余的问题。

它应该具有哪些功能

我把你的菜单翻译成这样:

  1. 创建一个新的银行帐户
  2. 登录到现有帐户
  3. 显示现有帐户的余额

它存储什么样的数据

让我们保持简单,只存储用户名、密码和用户余额。为此,我们将创建自己的结构。我们可以使用类,但正如我所说:保持简单和简短。

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. 加载数据库
  2. 询问用户该做什么
  3. 执行用户要求的任何操作
  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语句。我翻译了你的菜单(所以如果有什么问题,请责怪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;
}

正如你所看到的,这并没有那么难。而且,当代码的格式正确时,它的可读性更强。

既然我已经完成了你大部分的家庭作业,祝你其余的都好运!

相关文章:
  • 没有找到相关文章