Ir ao conteúdo
  • Cadastre-se

Criar classes e encapsulamentos em c++?


Leonards

Posts recomendados

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;
}
 

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...