Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Enum dentro de uma Struct

Eu tenho uma struct em meu código representado logo abaixo:

typedef struct
{
    char nome[30];
    int funcao;
    int idade;
    float salario;
} funcionario_struct;

E eu faço duas operações com essa struct, a primeira é adicionar um novo funcionário ao array de funcionario_struct, para isso eu pego informações digitadas pelo funcionario, peço, nome, função, idade e salário.

A funcao, é do tipo inteiro, que pode variar de 1 a 4, representado as funções desse funcionario: pode ser engenheiro = 1, arquiteto = 2, mestre de obra = 3 e pedreiro = 4, como no exemplo do código abaixo:

void adicionar_funcionaro(funcionario_struct funcionarios[])
{
    if (MAX_FUNCIONARIOS <= qtd_funcionarios_adicionados)
    {
        mensagem_error_geral("Quantidade máxima de funcionarios cadastrados.");
    }
    else
    {
        printf("Digite o nome do novo funcionario: ");
        while (getchar() != '\n')
            ;
        scanf("%50[0-9a-zA-Z ]", funcionarios[qtd_funcionarios_adicionados].nome);
        while (getchar() != '\n')
            ;
        printf("Digite a idade do novo funcionario: ");
        scanf("%d", &funcionarios[qtd_funcionarios_adicionados].idade);
        printf("Digite o salário do novo funcionario: ");
        scanf("%f", &funcionarios[qtd_funcionarios_adicionados].salario);

        int funcao = -1;
        while(funcao != 1 && funcao !=2 && funcao !=3){
            system("clear");
            verde();
            printf("/*/\n\n");
            printf("/*  Digite o número correto para cadastrar a função do funcionario   */\n\n");
            printf("  1.Engenheiro\n  2.Arquiteto\n  3.Mestre de Obra\n  4.Pedreiro.\n\n");
            printf("/*/\n\n");
            reset();
            printf("Digite a função do novo funcionario: ");
            scanf("%d", &funcao);    
        }

        funcionarios[qtd_funcionarios_adicionados].funcao = funcao; 
        system("clear");
        printf("\nO funcionario foi adicionado com sucesso.\n");
        qtd_funcionarios_adicionados++;
    }
}

A outra operação dar um aumento de salario para um tipo de função. Exemplo, o usuário digita um inteiro de 1 a 4, e eu faço uma busca no meu array de funcionario, se por acaso eu achar um funcionario que tenha a mesma função que a digitada pelo usuário, eu coloco uma porcentagem de aumento ao salário, como mostra no código abaixo:

void dar_aumento_funcionario(funcionario_struct funcionarios[]) {
    if(qtd_funcionarios_adicionados < 0) {
        mensagem_error_geral("Nenhum funcionário adicionado no momento...");    
    }else{
        verde();
        printf("/*********************************************************************/\n\n");
        printf("/*    Digite o número da função dos funcionários a ganhar aumento    */\n\n");
        printf("  1.Engenheiro\n  2.Arquiteto\n  3.Mestre de Obra\n  4.Pedreiro.\n\n");
        printf("/*********************************************************************/\n\n");
        reset();
        printf("Digite a função do novo funcionario: ");
        int funcao;
        scanf("%d", &funcao);

        float porcentagem_aumento;
        printf("Porcentagem de aumento ");
        vermelho();
        printf(" (Não digite o símbolo %%) ");
        reset();
        printf(": "); 
        scanf("%f", &porcentagem_aumento);
        system("clear");
        for(int i = 0; i < qtd_funcionarios_adicionados; i++){
            if(funcionarios[i].funcao == funcao){
                amarelo();
                printf("O salario antigo de %s é: %.2f ", funcionarios[i].nome, funcionarios[i].salario); 
                funcionarios[i].salario = funcionarios[i].salario * ( 1 + ( porcentagem_aumento / 100.00 ));
                printf("O salario atual é: %.2f\n", funcionarios[i].salario);
                reset();
            }
        }        
    }
}

As dúvida são:

  1. Como definir um tipo enum para fazer essa listagem;
  2. Como adicionar esse enum dentro da struct substituindo o int funcao;
  3. Como ficaria a adição de um novo funcionario ao meu array funcionarios;
  4. Como eu faria essa verificaçao na função de aumento.
1 resposta
solução!

Olá, acredito que posso dar o caminho das pedras com o trecho do código que você passou, mas você vai ter que implementar :

1 . Como definir um tipo enum para fazer essa listagem;

    typedef enum  {
        Engenheiro, Arquiteto, Mestre_de_Obra, Pedreiro
    } especializao;
  1. Como adicionar esse enum dentro da struct substituindo o int funcao;

    typedef struct funcionario_struct
     char nome[30];
     especializao funcao;
     int idade;
     float salario;
    } funcionario_struct;
  2. Como ficaria a adição de um novo funcionario ao meu array funcionarios;

  3. Como eu faria essa verificaçao na função de aumento.

Abaixo um trecho simples usando essas indicações:

#include <stdio.h>
#include <stdlib.h>

typedef enum {
        Engenheiro, Arquiteto, Mestre_de_Obra, Pedreiro
    } especializao;

typedef struct funcionario_struct
{
    char nome[30];
    especializao funcao;
    int idade;
    float salario;
} funcionario_struct;

int main()
{
    printf("INICIO\n");

    funcionario_struct funcionarios[] = {
        {"Nome do funcionario 1", Engenheiro, 22, 100.0},
        {"Nome do funcionario 2", Arquiteto, 22, 100.0},
        {"Nome do funcionario 3", Mestre_de_Obra, 22, 100.0},
    };

    switch (funcionarios[1].funcao)
    {
    case Engenheiro:
        printf("Engenheiro\n");
        break;
    case Arquiteto:
        printf("Arquiteto");
        break;
    case Mestre_de_Obra:
        printf("Mestre_de_Obra");
        break;
    case Pedreiro:
        printf("Pedreiro");
        break;
    default:
        printf("funcao nao encontrada");
    }
}