Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Leonards

Criar classes e encapsulamentos em c++?

Recommended Posts

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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×