我需要在导入的文件中获取薪水和扣减列的总和。
我需要在导入的文件中获取薪水和扣减列的总和。工资列是倒数第三列,例如。48000、47000、49000 等,扣除列是倒数第二列,例如。12000、12000、000 等
我需要有关输出类似于此的代码的帮助:
我目前使用 3 个文件,其中一个文件是 main.cpp 文件,一个 taxpayer.hpp 用于声明类的变量和函数,而 taxpayer.cpp 用于构造变量和函数。
这是存储文件的 github 的链接,包括上面的三个文件和 .txt 文件。https://github.com/Chuboi2442/taxpayerexample
您需要了解不同的事情。例如:
属于一起但具有不同类型的数据将存储在类或结构中。
许多相同类型的数据将存储在一个数组中,或者在本例中存储在一个数组中,std::vector
因为它可以动态增长。
因此,正如您已经做过的那样,您将把一行的数据,或者用数据库语言,将一条记录的数据放在一个结构中。
所以,你的方法是正确的,定义 TaxPayer 类。但是现在,因为要累积多个TaxPayers的一个数据字段的总和,所以需要将所有TaxPayers放在一个a中std::vector
,并将其封装在第二个类中。然后向该类添加其他函数,以计算std::vector
.
例子:
#include <string>
#include <vector>
struct TaxPayer {
std::string taxpayerId{};
std::string name{};
std::string address{};
std::string postcode{};
int salary{};
int deductions{};
double taxDue{};
};
struct TaxPayers {
std::vector<TaxPayer> taxPayers{};
};
我只是在这里显示数据成员。当然,您可以重用现有功能。
现在,我们只需要添加两个重要的功能:
第一个任务是拆分所谓的 CSV(逗号分隔值)数据。您将在 stackoverflow 上找到至少 1000 个有关如何执行此操作的示例。一种非常流行的方法是使用std::getline
并阅读部分文本,直到分隔符','。
为了更加节省,首先通过读取源文件的完整行std::getline
。然后,这将被放入 astringstream
并从那里完成进一步的数据提取。
所有这些都将嵌入一个覆盖的“提取”运算符>>
中,该运算符处理您的特定数据。
这种操作符的签名是:
friend std::istream& operator >> (std::istream& is, TaxPayer& tp)
实现该功能后,您可以简单地使用>>
运算符,一步读取完整的行并对其进行解析。
在您的 TaxPayers 类中,您还需要定义这样的运算符并使用上述定义中的提取器读取所有行。
通过这种方法,通过将一个大任务拆分为多个小任务,最终解决方案将变得非常简单。
最后但同样重要的是,我们需要在std::vector
. 这可以通过一个简单的循环来完成,或者更高级一点,使用std::accumulate
.
您可以使用以下示例作为重构现有代码的想法:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
struct TaxPayer {
// Data part
std::string taxpayerId{};
std::string name{};
std::string address{};
std::string postcode{};
int salary{};
int deductions{};
double taxDue{};
// Extractor
friend std::istream& operator >> (std::istream& is, TaxPayer& tp) {
// Read a complete line
std::string line{};
if (std::getline(is, line) and not line.empty()) {
// Put it into a stringstream for further extraction
std::istringstream iss{ line };
// Now, extract the data parts
std::getline(iss, tp.taxpayerId, ',');
std::getline(iss, tp.name, ',');
std::getline(iss, tp.address, ',');
std::getline(iss, tp.postcode, ',');
// Read and convert
std::getline(iss, line, ',');
tp.salary = std::stoi(line);
std::getline(iss, line, ',');
tp.deductions = std::stoi(line);
std::getline(iss, line, ',');
tp.taxDue = std::stod(line);
}
return is;
}
// Simple inserter
friend std::ostream& operator << (std::ostream& os, const TaxPayer& tp) {
return os << tp.taxpayerId << ' ' << tp.name << ' ' << tp.address << ' ' << tp.postcode
<< ' ' << tp.salary << ' ' << tp.deductions << ' ' << tp.taxDue << '\n';
}
};
struct TaxPayers {
// Data
std::vector<TaxPayer> taxPayers{};
// Sum functions
int sumSalary() {
int result{};
for (const TaxPayer& taxPayer : taxPayers)
result += taxPayer.salary;
return result;
}
int sumDeductions() {
int result{};
for (const TaxPayer& taxPayer : taxPayers)
result += taxPayer.deductions;
return result;
}
// Extractor
friend std::istream& operator >> (std::istream& is, TaxPayers& tp) {
// clar old data
tp.taxPayers.clear();
// Read all new existing data and store in vector
TaxPayer taxPayer{};
while (is >> taxPayer)
tp.taxPayers.push_back(taxPayer);
return is;
}
// Simple inserter
friend std::ostream& operator << (std::ostream& os, const TaxPayers& tp) {
for (const TaxPayer& taxPayer : tp.taxPayers)
os << taxPayer;
return os;
}
};
// Same as a file, I just use it here for better visibility
std::istringstream sourceFile{ R"(7101003,Mike,23 boinig road,2615,48000,12000,0
7201003,Jane Philips,29 boinig cresent,2616,47000,12000,0
7301003,Philip Jane,23 bong road,2615,49000,000,0
7401004,Peta,23 bong bong road,2615,148000,19000,0
7101205,Abdulla,23 Station st,2615,80000,21000,0)" };
int main() {
TaxPayers taxPayers{};
// Read and parse all tax payers
sourceFile >> taxPayers;
// Debug output: Show, what we just read
std::cout << taxPayers;
// Show sums
std::cout << "\n\n\nSummary\n\nSalary:\t\t" << taxPayers.sumSalary() << "\nDeductions:\t" << taxPayers.sumDeductions() << '\n';
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句