Você está visualizando atualmente Registro, funções e procedimentos em C

Registro, funções e procedimentos em C

A abstração é uma habilidade muito importante para quem lida com projeto e desenvolvimento de software em geral. É a capacidade de pensar soluções para resolver um problema.

Durante este processo de “pensar soluções” para resolver um problema, uma das principais técnicas é “quebrar” o problema em problemas menores que, consequentemente, são mais fáceis de serem resolvidos.

Este “quebrar ou dividir o problema em partes menores” pode ser feito por meio de funções e procedimentos, pequenos trechos de código que resolvem um pequeno problema.

Com a finalidade de exercitar um pouco a elaboração de registros, funções e procedimentos, vamos desenvolver um pequeno programa para gerencia parcialmente o estoque de uma loja de eletrônicos, imprimindo na tela os produtos em estoque, efetuando uma venda e atualizando o estoque.

Criando nosso tipo de dado em C

Para iniciar, vamos criar o nosso tipo de dado. Um eletrônico pode possuir vários atributos como: código; nome; marca; valor; dentro outros. Gerenciar todas estas informações apenas com os tipos primitivos (int, float, char) pode ser bem trabalhoso. Assim, podemos criar o nosso tipo Eletrônico como apresentado abaixo:

/* Nosso registro para armazenar um tipo chamado Eletronico*/
typedef struct {
      int codigo;
      char nome[50];
      char efEnergia;
      char marca[50];
      float valor;
      int quantidade;
} Eletronico;

Variáveis globais

Para facilitar o acesso aos dados, podemos criar variáveis globais, diminuindo assim a quantidade de dados que teremos de passar como parâmetro para nossas funções e procedimentos.

Nosso estoque será representado por um vetor do tipo Eletrônico. Também teremos uma variável global do tipo inteiro para guardar o tamanho do nosso vetor. Assim, qualquer função ou procedimento terá acesso ao vetor (nosso estoque de produtos) e ao tamanho do vetor.

// vetor global do tipo Eletrônico
Eletrônico vet[3];

// tamanho global do vetor
int tam = 3;

Função para ler do teclado as informações de um eletrônico

A função a seguir pede ao usuário as informações de um eletrônico, salva cada informação no seu devido lugar e retorna a variável preenchida para quem chamou a função.

Preste bastante atenção em como os dados textuais estão sendo lidos. A tecla Enter pode ficar armazenada no buffer do teclado atrapalhando a leitura correta das informações.

/* função que lê um eletrônico do teclado e retorna para quem chamou*/
Eletronico ler() {
      Eletronico el;
      printf("\nDigite o codigo: ");
      scanf("%d", &el.codigo);
      scanf("%*c");// comente esta linha e teste para ver o que muda
      printf("Qual o nome? ");
      fgets(el.nome, 49, stdin);
      printf("Eficiencia energetica: ");
      scanf("%c", &el.efEnergia);
      scanf("%*c");
      printf("Marca: ");
      fgets(el.marca, 49, stdin);
      printf("Valor: ");
      scanf("%f", &el.valor);
      printf("Quantidade: ");
      scanf("%d", &el.quantidade);
      return el;// retorno do Eletrônico preenchido para quem chamou
}

Procedimento para imprimir na tela as informações de um tipo eletrônico

Agora, vamos criar um procedimento (tipo void) para imprimir na tela as informações de um tipo eletrônico. Observe que não é necessário retornar nada, uma vez que apenas iremos imprimir texto na tela.

/* procedimento para imprimir um Eletrônico na tela */
void exibir(Eletronico elt) {
      printf("\n\tCodigo: %d\n", elt.codigo);
      printf("\tNome: %s", elt.nome);
      printf("\tEf. energetica: %c\n", elt.efEnergia);
      printf("\tMarca: %s", elt.marca);
      printf("\tValor R$%.2f\n", elt.valor);
      printf("\tQuantidade: %d\n\n", elt.quantidade);
}

Procedimento para imprimir na tela apenas código e nome de um eletrônico

Tanto para vender quanto para atualizar o estoque, precisaremos mostrar os códigos para que o usuário saiba qual é o código de cada produto. Assim, este procedimento irá imprimir na tela apenas o código e o nome de cada produto.

void imprimiCodigoNome() {
int i;
for(i = 0; i < tam; i++)
        printf("\nCodigo: %d\tNome: %s", estoque[i].codigo, estoque[i].nome);
}

Função para efetuar a venda de um eletrônico

Agora, vamos criar uma função para simular a venda de um eletrônico. Para efetuar a venda, vamos pedir ao usuário para digitar o código do produto que será vendido. Em seguida, devemos procurar se este código existe em nosso vetor de eletrônicos. A venda apenas pode ser efetuada se a quantidade disponível for maior que zero, subtraindo assim 1 unidade.

A função retorna o valor 1 se conseguir efetuar a venda (o código informado é o código de um produto existente e sua quantidade é maior que zero) e retorna 0 caso não consiga efetuar a venda (quantidade igual a zero ou código inexistente).

// função que tenta realizar uma venda
// retorna 1 se conseguiu vender (se há estoque disponível)
// retorna 0 se não conseguir vender (quantidade igual a zero)
// a venda subtrai 1 da quantidade disponível
int vender() {
        int cod, i;
        imprimiCodigoNome();// imprime na tela código e nome de todos os eletrônicos
        printf("Qual o codigo do produto? ");
        scanf("%d", &cod);
        for(i = 0; i < tam; i++) {// procura o item a ser vendido pelo código
                if(cod == estoque[i].codigo) {
                         if(estoque[i].quantidade > 0) {// verifica se está disponível no estoque
                                estoque[i].quantidade--;
                                return 1;// venda efetuada com sucesso
                        }
                }
        }
        return 0;// não foi possível efetuar a venda
}

Função para atualizar o estoque de um determinado produto

Para atualizar, também imprimimos na tela o código e o nome de cada produto. Pedimos ao usuário o código do produto que ele deseja atualizar e qual a quantidade a ser inserida. Por fim, procuramos o código no vetor e, caso ele seja encontrado, adicionamos então a quantidade informada.

Esta função também retorna 1 se conseguir atualizar o estoque corretamente e 0 caso contrário.

int atualizarEstoque() {
        int cod, i, qt;
        imprimiCodigoNome();// imprime na tela código e nome de todos os eletrônicos
        printf("Qual o codigo do produto? ");
        scanf("%d", &cod);
        for(i = 0; i < tam; i++) {// procura o item a ser atualizado pelo código
                if(cod == estoque[i].codigo) {
                            printf("nQual a quantidade? ");// pede ao usuário a quantidade a ser adicionada
                            scanf("%d", &qt);
                            estoque[i].quantidade += qt;// atualiza a quantidade em estoque
                            return 1;// atualização efetuada com sucesso
                }
            }
            return 0;// não foi possível efetuar a atualização
}

Função principal (main)

Tendo elaborado as funções e procedimentos apresentados acima, agora podemos utilizar cada uma em nossa função main().

Em primeiro lugar, usaremos um for para preencher nosso vetor de eletrônicos, pedindo ao usuário as informações.

Em seguida, apresentaremos ao usuário um menu de opções e utilizaremos um switch para verificar qual opção o usuário escolheu.

Por fim, o switch ficará dentro de um while, para que várias vendas, impressões e atualizações possam ser feitas no estoque.

void main() {
int i, op;
// preenche o vetor (estoque) pedindos os dados ao usuário
for(i = 0; i < tam; i++)
        estoque[i] = ler();
    // imprime na tela o menu de opções
    printf("\nEscolha a tarefa\n\t1 - Imprimir estoque\n\t2 - Vender\n\t3 - Atualizar estoque\n\t0 - Sair\n");
    scanf("%d", &op);
    while(op != 0) {
        switch(op) {
        case 1: // imprimir todos os eletrônicos
            for(i = 0; i < tam; i++) {
                printf("\nEletronico indice %d\n", i);
                imprirEletronico(estoque[i]);
            }
            break;
        case 2: // vender um eletrônico
            if(vender())
                printf("\n----- Venda realizada com sucesso!!! -----\n");
            else
                printf("\n***** Nao foi possivel realizar a venda. Verifique seu estoque. *****\n");
            break;
        case 3: // atualizar estoque de um eletrônico
            if(atualizarEstoque())
                printf("\nEstoque atualidado!!!\n");
            else
                printf("\nErro ao atualizar o estoque!\n");
            break;
        default:
            printf("\nOpcao invalida!!!\n");
        }
        // imprime na tela o menu de opções
        printf("\nEscolha a tarefa\n\t1 - Imprimir estoque\n\t2 - Vender\n\t3 - Atualizar estoque\n\t0 - Sair\n");
        scanf("%d", &op);
    }
}

Apresentação em vídeo

Este post tem um comentário

  1. Rita de Cássia de Jesus Silva

    Excelentes Explicações Professor Wagner Gaspar! . Como posso entrar em contato para dúvida particular?

Deixe um comentário

15 + 14 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.