#include // Para std::string #include // Para std::vector #include // Para std::function #include // Para std::sort #include // Para std::ifstream e std::getline #include // Para std::cout, std::endl #include // Para std::setw struct Pessoa { int id; std::string nome; std::string funcao; int ano_ingresso; }; enum class Ordena { por_id, por_nome, por_funcao, por_ingresso }; auto funcao_comparacao(Ordena ordem) { std::function f; switch (ordem) { case Ordena::por_id: f= [] (Pessoa const &a, Pessoa const &b) { return a.id < b.id; }; break; case Ordena::por_nome: f = [] (Pessoa const &a, Pessoa const &b) { return a.nome < b.nome; }; break; case Ordena::por_funcao: f = [] (Pessoa const &a, Pessoa const &b) { return a.funcao < b.funcao; }; break; case Ordena::por_ingresso: f = [] (Pessoa const &a, Pessoa const &b) { return a.ano_ingresso < b.ano_ingresso; }; break; } return f; } Pessoa le_pessoa(std::istream &is) { Pessoa quem; char virgula; is >> quem.id; is >> virgula; std::getline(is, quem.nome, ','); std::getline(is, quem.funcao, ','); is >> quem.ano_ingresso; return quem; } std::vector le_colaboradores(std::string nome_arquivo) { std::vector todos; std::ifstream dados(nome_arquivo); while (dados.good() && !dados.eof()) { auto nova = le_pessoa(dados); if (dados.good()) { todos.push_back(nova); } } return todos; } void mostra_colaboradores(std::vector pessoas, Ordena ordem) { std::sort(begin(pessoas), end(pessoas), funcao_comparacao(ordem)); for (auto pessoa: pessoas) { std::cout << std::setw(4) << pessoa.id << std::setw(30) << pessoa.nome << std::setw(20) << pessoa.funcao << std::setw(8) << pessoa.ano_ingresso << std::endl; } } int main(int, char *[]) { auto todos = le_colaboradores("funcionarios.dat"); std::cout << "Por id:\n"; mostra_colaboradores(todos, Ordena::por_id); std::cout << "Por nome:\n"; mostra_colaboradores(todos, Ordena::por_nome); std::cout << "Por funcao:\n"; mostra_colaboradores(todos, Ordena::por_funcao); std::cout << "Por ingresso:\n"; mostra_colaboradores(todos, Ordena::por_ingresso); }