Ir ao conteúdo
  • Cadastre-se

Leonards

Membro Júnior
  • Posts

    1
  • Cadastrado em

  • Última visita

Reputação

0
  1. Olá a todos! Gostaria de saber se há algum erro nesse algoritmo em c++ Este tem relação com esses dois exercícios abaixo(mas precisamente o exercício 13): Exercícios 12) Crie uma classe que representa um funcionário, registrando seu nome, salário e data de admissão. Em seguida, crie uma classe que represente um departamento de uma empresa, registrando o nome e os funcionários que nele trabalham. Por fim, crie uma classe que representa uma empresa, registrando seu nome, CNPJ e departamentos. Faça um programa que: • Crie uma empresa; • Adicione a esta empresa alguns departamentos (perguntar ao usuário a quantidade); • Adicione aos departamentos alguns funcionários (perguntar ao usuário a quantidade); • Dê aumento de 10% a todos os funcionários de um determinado departamento; • Transfira um funcionário de um departamento para outro. É esperado que seu código seja bem encapsulado. Por exemplo, para adicionar um departamento em uma empresa (ou um funcionário a um departamento), não se deve acessar o vetor (ou lista) de departamentos diretamente, mas sim ter um método na classe que representa a empresa para adicionar um departamento. Exercícios 13) Modifique o programa anterior para admitir novos tipos de funcionários, os quais serão definidos a partir de novas classes que herdarão da classe original que representa o funcionário. Serão definidas as subclasses para funcionários do tipo Gerente, Analista e Técnico, os quais deverão sobrecarregar os métodos para recuperação de atributos de forma que exibam qual o cargo do usuário consultado (ex. método que recupera nome deve exibir o cargo e depois o nome). O programa anterior deve ser alterado para: · Solicitar o cargo do funcionário adicionado; · Aumentar o salário dos gerentes em 15% · Exibir ao final do cadastro todos os funcionários e suas informações – utilize técnicas de polimorfismo (funções virtuais). #include <iostream> #include <string.h> using namespace std; // Classe Funcionário class Funcionario{ protected: static const int tamanho_nome = 200; char nome[tamanho_nome]; float salario; char data_admissao[11]; // formato: dd/mm/aaaa'\0' public: // Método construtor que inicializa os atributos (variáveis) da classe com valores vazios Funcionario(){ salario = 0.0; int j = 0; for(int i = 0; i < tamanho_nome; i++){ nome = '\0'; if(j < 11){ data_admissao[j] = '\0'; j++; } } } // Método construtor que inicializa os atributos (variáveis) da classe com valores recebidos como parâmetro Funcionario(char n[], float s, char d[]){ strncpy(nome, n, tamanho_nome); salario = s; strncpy(data_admissao, d, 11); } // Método que copia o atributo "nome" da classe paraa string recebida como parãmetro virtual void getNome(char n[]){ strncpy(n, nome, tamanho_nome); } // Método que retorna o valor do atributo "salario" da classe virtual float getSalario(){ return(salario); } // Método que copia o atributo "data_admissao" da classe para a string recebida como parãmetro virtual void getDataAdmissao(char d[]){ strncpy(d, data_admissao, 11); } // Método que grava o valor recebido como parâmetro no atributo "salario" da classe void setSalario(float s){ salario = s; } /*** Métodos que alteram os valores dos atributos internos da classe não são necessários para esse problema // Método que copia string para o atributo "nome" da classe void setNome(char n[]){ strncpy(nome, n, tamanho_nome); } // Método que copia string para o atributo "data_admissao" da classe void setDataAdmissao(char d[]){ strncpy(data_admissao, d, 11); } *** Fim dos métodos que alteram valores dos atributos internos da classe ***/ }; // Classe Gerente (subclasse de Funcionário) class Gerente : public Funcionario{ public: // OBS: construtor sem parâmeros da superclasse é chamado por padrão antes do construtor da subclasse // Método construtor que chama construtor da super classe para inicializar os atributos (variáveis) // da classe com valores recebidos como parâmetro. A expressão após ":", neste contexto, chama-se lista de // inicialização, onde é possível também inicializar os atributos da classe // Referência: http://www.learncpp.com/cpp-tutorial/114-constructors-and-initialization-of-derived-classes/ Gerente(char n[], float s, char d[]) : Funcionario(n, s, d){} // Método que copia o atributo "nome" da classe paraa string recebida como parãmetro virtual void getNome(char n[]){ strncpy(n, nome, tamanho_nome); cout << "Cargo: gerente, Nome: " << nome << endl; } // Método que retorna o valor do atributo "salario" da classe virtual float getSalario(){ cout << "Cargo: gerente, Salario: " << salario << endl; return(salario); } // Método que copia o atributo "data_admissao" da classe para a string recebida como parãmetro virtual void getDataAdmissao(char d[]){ strncpy(d, data_admissao, 11); cout << "Cargo: gerente, Admissao: " << data_admissao << endl; } }; // Classe Analista (subclasse de Funcionário) class Analista : public Funcionario{ public: // OBS: construtor sem parâmeros da superclasse é chamado por padrão antes do construtor da subclasse // Método construtor que chama construtor da super classe para inicializar os atributos (variáveis) // da classe com valores recebidos como parâmetro. A expressão após ":", neste contexto, chama-se lista de // inicialização, onde é possível também inicializar os atributos da classe // Referência: http://www.learncpp.com/cpp-tutorial/114-constructors-and-initialization-of-derived-classes/ Analista(char n[], float s, char d[]) : Funcionario(n, s, d){} // Método que copia o atributo "nome" da classe paraa string recebida como parãmetro virtual void getNome(char n[]){ strncpy(n, nome, tamanho_nome); cout << "Cargo: analista, Nome: " << nome << endl; } // Método que retorna o valor do atributo "salario" da classe virtual float getSalario(){ cout << "Cargo: analista, Salario: " << salario << endl; return(salario); } // Método que copia o atributo "data_admissao" da classe para a string recebida como parãmetro virtual void getDataAdmissao(char d[]){ strncpy(d, data_admissao, 11); cout << "Cargo: analista, Admissao: " << data_admissao << endl; } }; // Classe Tecnico (subclasse de Funcionário) class Tecnico : public Funcionario{ public: // OBS: construtor sem parâmeros da superclasse é chamado por padrão antes do construtor da subclasse // Método construtor que chama construtor da super classe para inicializar os atributos (variáveis) // da classe com valores recebidos como parâmetro. A expressão após ":", neste contexto, chama-se lista de // inicialização, onde é possível também inicializar os atributos da classe // Referência: http://www.learncpp.com/cpp-tutorial/114-constructors-and-initialization-of-derived-classes/ Tecnico(char n[], float s, char d[]) : Funcionario(n, s, d){} // Método que copia o atributo "nome" da classe paraa string recebida como parãmetro virtual void getNome(char n[]){ strncpy(n, nome, tamanho_nome); cout << "Cargo: tecnico, Nome: " << nome << endl; } // Método que retorna o valor do atributo "salario" da classe virtual float getSalario(){ cout << "Cargo: tecnico, Salario: " << salario << endl; return(salario); } // Método que copia o atributo "data_admissao" da classe para a string recebida como parãmetro virtual void getDataAdmissao(char d[]){ strncpy(d, data_admissao, 11); cout << "Cargo: tecnico, Admissao: " << data_admissao << endl; } }; // Classe Departamento class Departamento{ private: static const int tamanho_nome = 200; char nome[tamanho_nome]; int numeroFuncionarios; Funcionario **funcionarios; public: // Método construtor que inicializa os atributos (variáveis) da classe com valores vazios Departamento(){ for(int i = 0; i < tamanho_nome; i++){ nome = '\0'; } numeroFuncionarios = 0; } // Método construtor que inicializa os atributos (variáveis) da classe com valores recebidos como parâmetro Departamento(char nome[]){ strncpy(this->nome, nome, tamanho_nome); numeroFuncionarios = 0; } // Método que copia o atributo "nome" da classe par aa string recebida como parâmetro void getNome(char n[]){ strncpy(n, nome, tamanho_nome); } // Método que adiciona um funcionário ao departamento void adicionaFuncionario(Funcionario f){ numeroFuncionarios++; Funcionario **funcs; funcs = new Funcionario*[numeroFuncionarios]; for(int i = 0; i < (numeroFuncionarios-1); i++){ funcs = funcionarios; } funcs[numeroFuncionarios - 1] = &f; if(numeroFuncionarios > 1){ delete [] *funcionarios; } funcionarios = funcs; } // Método que remove um funcionário do departamento Funcionario removeFuncionario(char s1[]){ char s2[tamanho_nome]; Funcionario *f; for(int i = 0; i < numeroFuncionarios; i++){ funcionarios->getNome(s2); if(strcmp(s1, s2) == 0){ f = funcionarios; funcionarios = funcionarios[numeroFuncionarios - 1]; } } numeroFuncionarios--; return(*f); } // Método que imprime todos os dados da empresa: nome, cnpj e departamentos e funcionários void imprimeDepartamento(){ cout << endl <<"Nome do departamento: " << nome << endl; cout << "Funcionarios do departamento: " << endl; char s[tamanho_nome]; float f; for(int i = 0; i < numeroFuncionarios; i++){ funcionarios->getNome(s); cout << "Nome: " << s; funcionarios->getDataAdmissao(s); cout << ", Admissao: " << s; cout << ", Salario: " << funcionarios->getSalario() << endl; } } // Método que aumento os salários de todos os funcionários do departamento na porcentagem indicada no parâmetro void aumentaSalariosDepartamento(float porcentagem){ float s; for(int i = 0; i < numeroFuncionarios; i++){ s = funcionarios->getSalario(); funcionarios->setSalario(s * (1 + porcentagem / 100) ); } } }; // Classe Empresa class Empresa{ private: static const int tamanho_nome = 200; char nome[tamanho_nome]; char cnpj[19]; // formato: XX.XXX.XXX/YYYY-ZZ'\0' int numeroDepartamentos; Departamento *departamentos; public: // Método construtor que inicializa os atributos (variáveis) da classe com valores vazios Empresa(){ int j = 0; for(int i = 0; i < tamanho_nome; i++){ nome = '\0'; if(j < 19){ cnpj[j++] = '\0'; } } numeroDepartamentos = 0; } // Método construtor que inicializa os atributos (variáveis) da classe com valores recebidos como parâmetro Empresa(char n[], char c[]){ strncpy(nome, n, tamanho_nome); strncpy(cnpj, c, 19); numeroDepartamentos = 0; } // Método que copia o atributo "nome" da classe para a string recebida como parãmetro void getNome(char n[]){ strncpy(n, nome, tamanho_nome); } // Método que copia o atributo "cnpj" da classe para a string recebida como parãmetro void getCNPJ(char c[]){ strncpy(c, cnpj, 19); } // Método que adiciona um departamento à empresa void adicionaDepartamento(Departamento d){ numeroDepartamentos++; Departamento *deps = new Departamento[numeroDepartamentos]; for(int i = 0; i < (numeroDepartamentos-1); i++){ deps = departamentos; } deps[numeroDepartamentos - 1] = d; if(numeroDepartamentos > 1){ delete [] departamentos; } departamentos = deps; } // Método que imprime todos os dados da empresa: nome, cnpj e departamentos e funcionários void imprimeEmpresa(){ cout << endl << "Nome da empresa: " << nome << endl; cout << "CNPJ da empresa: " << cnpj << endl; cout << "Departamentos da empresa: " << endl << endl; char dep[tamanho_nome]; for(int i = 0; i < numeroDepartamentos; i++){ departamentos.imprimeDepartamento(); } } // Método que manda aumentar em 10% os salários de todos os funcionários de um departamento indicado pelo seu nome void aumentaSalariosDepartamento(char n[]){ char s[tamanho_nome]; for(int i = 0; i < numeroDepartamentos; i++){ departamentos.getNome(s); if(strcmp(s, n) == 0){ departamentos.aumentaSalariosDepartamento(10); } } } // Método que transfere um funcionário de um departamento para outro void transfereFuncionarioDepartamento(char func[], char depOrigem[], char depDestino[]){ char s[tamanho_nome]; Funcionario f; for(int i = 0; i < numeroDepartamentos; i++){ departamentos.getNome(s); if(strcmp(s, depOrigem) == 0){ f = departamentos.removeFuncionario(func); break; } } for(int i = 0; i < numeroDepartamentos; i++){ departamentos.getNome(s); if(strcmp(s, depDestino) == 0){ departamentos.adicionaFuncionario(f); break; } } } }; int main () { /*** Usado para verificar o funcionamento da classe Funcionário *** char funcionario[200]; char n[200]; float ordenado; char admissao[11]; char a[11]; cout << "Digite o nome do funcionario: "; cin >> funcionario; cout << "Nome digitado: " << funcionario << endl; cout << "Digite o salario do funcionario: "; cin >> ordenado; cout << "Salario digitado: " << ordenado << endl; cout << "Digite a data de admissao do funcionario: "; cin >> admissao; cout << "Data de admissao digitada: " << admissao << endl << endl; // Cria objeto da classe Funcionário passando os dados lidos como parâmetro Funcionario f(funcionario, ordenado, admissao); // Imprime valores gravados no objeto f.getNome(n); f.getDataAdmissao(a); cout << "Nome de funcionario gravado no objeto: " << n << endl; cout << "Salario gravado no objeto: " << f.getSalario() << endl; cout << "Data de admissao gravada no objeto: " << a << endl; *** Fim do código de depuração da classe Funcionário ***/ char empresa[200]; char cnpj[19]; char departamento[200]; char funcionario[200]; char admissao[11]; float ordenado; int num_deps = 0; int num_funcs = 0; int cargo; cout << "Digite o nome da empresa: "; cin >> empresa; cout << "Digite o CNPJ da empresa (formato: XX.XXX.XXX/YYYY-ZZ): "; cin >> cnpj; // Cria objeto da classe Empresa passando os dados lidos como parâmetro Empresa e(empresa, cnpj); cout << "Digite o numero de departamentos a serem inseridos na empresa: "; cin >> num_deps; for(int i = 0; i < num_deps; i++){ cout << "Digite o nome do " << i+1 << "º departamento: "; cin >> departamento; Departamento d(departamento); cout << "Digite o numero de funcionarios a serem inseridos nesse departamento: "; cin >> num_funcs; for(int j = 0; j < num_funcs; j++){ cout << "Digite o nome do " << j+1 << "º funcionario: "; cin >> funcionario; cout << "Digite o salario do funcionario: "; cin >> ordenado; cout << "Digite a data de admissao do funcionario: "; cin >> admissao; cout << "Digite o numero correspondente ao cargo do funcionario (1=gerente, 2=analista, 3=tecnico): "; cin >> cargo; switch(cargo){ case 1:{ Gerente g(funcionario, ordenado, admissao); d.adicionaFuncionario(g); break; } case 2:{ Analista a(funcionario, ordenado, admissao); d.adicionaFuncionario(a); break; } case 3:{ Tecnico t(funcionario, ordenado, admissao); d.adicionaFuncionario(t); break; } default:{ cout << endl << "Numero invalido. Terminando a aplicacao..." << endl; return(-1); } } /*** Alternativa *** Funcionario f; switch(cargo){ case 1:{ Gerente g(funcionario, ordenado, admissao); f = g; break; } case 2:{ Analista a(funcionario, ordenado, admissao); f = a; break; } case 3:{ Tecnico t(funcionario, ordenado, admissao); f = t; break; } default:{ cout << endl << "Numero invalido. Terminando a aplicacao..." << endl; return(-1); } d.adicionaFuncionario(f); } *** Fim do bloco alternativo ***/ } e.adicionaDepartamento(d); } e.imprimeEmpresa(); // aumenta em 15% o salário de todos os gerentes //e.aumentaSalariosGerentes(); //e.imprimeEmpresa(); return 0; }

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...