Added 'C_C++/cpp_zh/source/Company.hpp'
This commit is contained in:
parent
1d0f64aaa4
commit
243d3220cc
132
C_C++/cpp_zh/source/Company.hpp
Normal file
132
C_C++/cpp_zh/source/Company.hpp
Normal file
@ -0,0 +1,132 @@
|
||||
#ifndef COMPANY_H
|
||||
#define COMPANY_H
|
||||
|
||||
#include "Employee.hpp"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <vector>
|
||||
#include <numeric>
|
||||
#include <fstream>
|
||||
|
||||
/* Container class a dolgozók számára
|
||||
*/
|
||||
class Company {
|
||||
/* "a cég bejegyzett neve"
|
||||
*/
|
||||
std::string name_m;
|
||||
/* "bevétel amit a Manager-ek osztalékának megállapítására használunk"
|
||||
*/
|
||||
signed long long revenue_m = 1000000;
|
||||
|
||||
/* "segéd függvény a cég kiadásainak kiszámítására;"
|
||||
*/
|
||||
signed long long spendings() {
|
||||
/* "tetetjük, hogy az egyetlen kiadás az összes dolgozó fizetésének összege lenne"
|
||||
*/
|
||||
return std::accumulate(std::begin(employees), std::end(employees), 0, [this](int sum, Employee * e) {
|
||||
return sum + e->get_cost();
|
||||
});
|
||||
}
|
||||
|
||||
/* a Manager letárolja melyik cégnél dolgozik és olvas belőlle
|
||||
* bár a `friend` haszánálata itt nem kifejezetten indokolt,
|
||||
* a sokszínűség kedvéért ez is egy megoldás
|
||||
*/
|
||||
friend class Manager;
|
||||
|
||||
public:
|
||||
std::vector<Employee*> employees;
|
||||
|
||||
Company(const char * const name) : name_m(name) { }
|
||||
|
||||
~Company() {
|
||||
for (auto e : employees) {
|
||||
delete e;
|
||||
}
|
||||
}
|
||||
|
||||
signed long long profit() {
|
||||
return revenue_m - spendings();
|
||||
}
|
||||
|
||||
// ### Employee keresés ###
|
||||
Employee * by_id(const std::string &id) {
|
||||
for (const auto &i : employees) {
|
||||
if (std::to_string(i->id_m) == id) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::vector<Employee*> by_name(const char * const query) {
|
||||
std::vector<Employee*> r;
|
||||
for (const auto &i : employees) {
|
||||
/* case érzékeny substring keresés
|
||||
*/
|
||||
if (i->name_m.find(query) != std::string::npos) {
|
||||
r.push_back(i);
|
||||
}
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
// ### Tárolás ###
|
||||
|
||||
/* A tárolás CSV fáljba történik;
|
||||
* praktikai okoból a dolgozókat tároljuk
|
||||
*/
|
||||
|
||||
/* "BAcK up" függvény
|
||||
*/
|
||||
int bak(const char * const file) {
|
||||
std::ofstream ofile(file);
|
||||
if (not ofile.is_open()) {
|
||||
fputs("Failed to write Company to disk.\n", stderr);
|
||||
return 1;
|
||||
}
|
||||
for (const auto &e : employees) {
|
||||
ofile << e->serialize() << std::endl;
|
||||
}
|
||||
ofile.close();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int load(const char * const file);
|
||||
|
||||
// ### Megjelenítésre használt függvények ###
|
||||
void details() {
|
||||
printf("-- %s\n"
|
||||
"\tNumber of employees: %ld\n"
|
||||
"\tRevenue: %lld\n"
|
||||
"\tProfit: %lld\n",
|
||||
name_m.c_str(),
|
||||
employees.size(),
|
||||
revenue_m,
|
||||
profit()
|
||||
);
|
||||
}
|
||||
|
||||
void list_employees() {
|
||||
for (auto e : employees) {
|
||||
printf("#%-3s : %-10s %7d\n",
|
||||
std::to_string(e->id_m).c_str(),
|
||||
e->name_m.c_str(),
|
||||
e->get_pay()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void print() {
|
||||
details();
|
||||
puts("");
|
||||
list_employees();
|
||||
puts("\n");
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user