Exercício usando Struct | Questões Resolvidas em Linguagem C

Exercício usando Struct | Questões Resolvidas em Linguagem C

·

8 min read

Criação de um programa em linguagem C (ANSI) que efetua o cadastro de algo em uma loja de roupas

O programa deverá ter 6 opções:

  1. Inserir (guarda os dados em um vetor do tipo struct)

  2. Procurar (efetua procura e mostra o dado encontrado ou exibe a informação que não encontrou)

  3. Excluir (elimina um cadastro)

  4. Alterar (altera os dados de um cadastro e altera o vetor de struct que possui as informações do cadastro)

  5. Gravar em arquivo (guarda as informações do vetor de struct em um arquivo – como visto em aula)

  6. Ler de arquivo (Lê as informações de um arquivo e guarda em um vetor do tipo struct)

a) Os dados do cadastro deverão obrigatoriamente ser armazenados em variáveis do tipo “struct”

b) Para cada opção deverá ser criada um função com os parâmetros adequados.

c) Criar um cabeçalho antes da função (comentário) contendo as seguintes informações:

Objetivo da Função: Parâmetros: (Para cada parâmetro indicar seu conteúdo e porque ele esta sendo usado) Indicar e justificar o tipo de passagem do parâmetro Exemplo:

float divide(int N1, int N2)

Objetivo: divide dois números e retorna um número real, resultado da divisão do primeiro número (N1) pelo segundo (N2). N1/N2 Parâmetros: N1 -> parâmetro inteiro Possui o valor do numerador da divisão. Passagem por valor (pois essa variável não será alterada na função). N2 -> parâmetro inteiro Possui o valor do denominador da divisão. Passagem por valor (pois essa variável não será alterada na função).

d) Utilizar gravação e leitura de arquivo binário como visto em aula

e) NÃO USAR VARIÁVEIS GLOBAIS

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

#define MAX_SIZE 100

typedef struct {
    int codigo;
    char nome[50];
    float preco;
} Produto;

typedef struct {
    Produto dados[MAX_SIZE];
    int topo;
} Pilha;

void inicializar(Pilha *pilha) {
    pilha->topo = -1;
}

int estaCheia(Pilha *pilha) {
    return pilha->topo == MAX_SIZE - 1;
}

int estaVazia(Pilha *pilha) {
    return pilha->topo == -1;
}

void inserir(Pilha *pilha, int codigo, char *nome, float preco) {
    if (estaCheia(pilha)) {
        printf("A pilha está cheia. Não é possível inserir mais produtos.\n");
        return;
    }

    pilha->topo++;
    Produto novoProduto;
    novoProduto.codigo = codigo;
    strcpy(novoProduto.nome, nome);
    novoProduto.preco = preco;
    pilha->dados[pilha->topo] = novoProduto;

    printf("Produto inserido com sucesso.\n");
}

void procurar(Pilha *pilha, int codigo) {
    if (estaVazia(pilha)) {
        printf("A pilha está vazia. Não há produtos cadastrados.\n");
        return;
    }

    int encontrado = 0;
    for (int i = pilha->topo; i >= 0; i--) {
        if (pilha->dados[i].codigo == codigo) {
            printf("Produto encontrado:\n");
            printf("Código: %d\n", pilha->dados[i].codigo);
            printf("Nome: %s\n", pilha->dados[i].nome);
            printf("Preço: R$ %.2f\n", pilha->dados[i].preco);
            encontrado = 1;
            break;
        }
    }

    if (!encontrado) {
        printf("Produto com código %d não encontrado.\n", codigo);
    }
}

void excluir(Pilha *pilha, int codigo) {
    if (estaVazia(pilha)) {
        printf("A pilha está vazia. Não há produtos cadastrados.\n");
        return;
    }

    int posicao = -1;
    for (int i = pilha->topo; i >= 0; i--) {
        if (pilha->dados[i].codigo == codigo) {
            posicao = i;
            break;
        }
    }

    if (posicao == -1) {
        printf("Produto com código %d não encontrado.\n", codigo);
        return;
    }

    for (int i = posicao; i < pilha->topo; i++) {
        pilha->dados[i] = pilha->dados[i + 1];
    }

    pilha->topo--;
    printf("Produto excluído com sucesso.\n");
}

void alterar(Pilha *pilha, int codigo, float novoPreco) {
    if (estaVazia(pilha)) {
        printf("A pilha está vazia. Não há produtos cadastrados.\n");
        return;
    }

    int posicao = -1;
    for (int i = pilha->topo; i >= 0; i--) {
        if (pilha->dados[i].codigo == codigo) {
            posicao = i;
            break;
        }
    }

    if (posicao == -1) {
        printf("Produto com código %d não encontrado.\n", codigo);
        return;
    }

    pilha->dados[posicao].preco = novoPreco;
    printf("Preço do produto atualizado com sucesso.\n");
}

void gravarArquivo(Pilha *pilha) {
    FILE *arquivo;
    arquivo = fopen("produtos.bin", "wb");

    if (arquivo == NULL) {
        printf("Erro ao abrir o arquivo.\n");
        return;
    }

    fwrite(pilha->dados, sizeof(Produto), pilha->topo + 1, arquivo);
    fclose(arquivo);

    printf("Dados gravados no arquivo com sucesso.\n");
}

void lerArquivo(Pilha *pilha) {
    FILE *arquivo;
    arquivo = fopen("produtos.bin", "rb");

    if (arquivo == NULL) {
        printf("Erro ao abrir o arquivo.\n");
        return;
    }

    Produto produto;
    inicializar(pilha);

    while (fread(&produto, sizeof(Produto), 1, arquivo)) {
        inserir(pilha, produto.codigo, produto.nome, produto.preco);
    }

    fclose(arquivo);

    printf("Dados lidos do arquivo com sucesso.\n");
}

int main() {
    Pilha pilha;
    inicializar(&pilha);

    int opcao;

    do {
        printf("\n----- MENU -----\n");
        printf("1) Inserir\n");
        printf("2) Procurar\n");
        printf("3) Excluir\n");
        printf("4) Alterar\n");
        printf("5) Gravar em arquivo\n");
        printf("6) Ler de arquivo\n");
        printf("0) Sair\n");
        printf("Escolha uma opção: ");
        scanf("%d", &opcao);

        if (opcao == 1) {
            printf("\n--- INSERIR PRODUTO ---\n");
            int codigo;
            char nome[50];
            float preco;

            printf("Código: ");
            scanf("%d", &codigo);
            printf("Nome: ");
            scanf(" %[^\n]", nome);
            printf("Preço: R$ ");
            scanf("%f", &preco);

            inserir(&pilha, codigo, nome, preco);
        } else if (opcao == 2) {
            printf("\n--- PROCURAR PRODUTO ---\n");
            printf("Informe o código do produto: ");
            int codigo;
            scanf("%d", &codigo);

            procurar(&pilha, codigo);
        } else if (opcao == 3) {
            printf("\n--- EXCLUIR PRODUTO ---\n");
            printf("Informe o código do produto: ");
            int codigo;
            scanf("%d", &codigo);

            excluir(&pilha, codigo);
        } else if (opcao == 4) {
            printf("\n--- ALTERAR PREÇO ---\n");
            printf("Informe o código do produto: ");
            int codigo;
            scanf("%d", &codigo);

            float novoPreco;
            printf("Novo preço: R$ ");
            scanf("%f", &novoPreco);

            alterar(&pilha, codigo, novoPreco);
        } else if (opcao == 5) {
            printf("\n--- GRAVAR EM ARQUIVO ---\n");
            gravarArquivo(&pilha);
        } else if (opcao == 6) {
            printf("\n--- LER DE ARQUIVO ---\n");
            lerArquivo(&pilha);
        } else if (opcao == 0) {
            printf("Encerrando o programa...\n");
        } else {
            printf("Opção inválida. Tente novamente.\n");
        }
    } while (opcao != 0);

    return 0;
}

Exemplo encontrado no Github para cadastro de Pizza

https://github.com/wilder/C-Exercises/blob/master/Exerc%C3%ADcios%20de%20struct/Trabalho_Structs.c

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

typedef struct
{    char nome[50];
    int codigo;
    float preco;
    bool ativo;    
}Pizza;


/*
Objetivo: Cadastra pizza com os valores digitados pelo usuário no vetor de struct.
Parâmetros:
pizzas[] -> Parâmetro do tipo "Pizza". É onde os dados digitados pelo usuário serão armazenados. Passagem por referência (pois essa variável será alterada na função). 
quantidade -> Parâmetro inteiro. Possui o valor do tamanho do vetor, ou quantidade de "Pizzas" que serão cadastradas. Passagem por valor (pois essa variável não será alterada na função).
*/
void inserir(Pizza pizzas[], int quantidade)
{
    int i;
    for(i = 0; i < quantidade; ++i)
    {
        fflush(stdin);
        printf("Sabor da pizza: \n");
        fgets(pizzas[i].nome, sizeof pizzas[i].nome , stdin);
        fflush(stdin);
        printf("Valor da pizza: \n");
        scanf("%f",&pizzas[i].preco);
        fflush(stdin);
        pizzas[i].ativo = true;
        pizzas[i].codigo = i;
    }
}

/*
Objetivo: Procura pizza cadastrada por código e retorna um ponteiro da pizza encontrada.
Parâmetros:
pizzas[] -> Parâmetro do tipo "Pizza". É onde a "Pizza" será procurada. Passagem por referência (pois é um vetor). 
codigo ->  Parâmetro do tipo inteito. Código da "Pizza" a ser encontrada. Passagem por valor (pois essa variável não será alterada na função).
tamanho ->  Parâmetro do tipo inteito. Tamanho do vetor de "Pizzas". Passagem por valor (pois essa variável não será alterada na função).
*/
Pizza* procurar(Pizza pizzas[], int codigo, int tamanho)
{
    Pizza *pizzaProcurada;
    for (int i = 0; i < tamanho; ++i)
    {
        if(pizzas[i].ativo && pizzas[i].codigo==codigo){
            pizzaProcurada = &pizzas[i];
            printf("%s",pizzas[i].nome);
            return pizzaProcurada;
        }
    }
    printf("\nPizza não encontrada\n");
    return pizzaProcurada;
}

/*
Objetivo: Procura pizza por código e faz um delete lógico caso encontrado.
Parâmetros:
pizzas[] -> Parâmetro do tipo "Pizza". É onde a "Pizza" será procurada. Passagem por referência (pois a "Pizza" encontrada será alterada na função). 
codigo ->  Parâmetro do tipo inteito. Código da "Pizza" a ser encontrada. Passagem por valor (pois essa variável não será alterada na função).
tamanho ->  Parâmetro do tipo inteito. Tamanho do vetor de "Pizzas". Passagem por valor (pois essa variável não será alterada na função).
*/
void excluir(Pizza pizzas[], int codigo, int tamanho)
{
    Pizza *pizza_a_deletar = procurar(pizzas, codigo, tamanho);
    if(pizza_a_deletar){
        pizza_a_deletar->ativo = false;
        printf(" excluído!\n");
    }
}

/*
Objetivo: Procura pizza por código e faz um edita com novos valores digitados pelo usuário caso encontrado.
Parâmetros:
pizzas[] -> Parâmetro do tipo "Pizza". É onde a "Pizza" será procurada. Passagem por referência (pois a "Pizza" encontrada será alterada na função). 
codigo ->  Parâmetro do tipo inteito. Código da "Pizza" a ser encontrada. Passagem por valor (pois essa variável não será alterada na função).
tamanho ->  Parâmetro do tipo inteito. Tamanho do vetor de "Pizzas". Passagem por valor (pois essa variável não será alterada na função).
*/
void alterar(Pizza pizzas[], int codigo, int tamanho){
    Pizza *pizza_a_alterar = procurar(pizzas, codigo, tamanho);
    if(pizza_a_alterar != NULL && pizza_a_alterar->ativo){
        printf("\nSabor da pizza: \n");
        fflush(stdin);
        fgets(pizza_a_alterar->nome, sizeof pizza_a_alterar->nome , stdin);
        printf("Valor da pizza: \n");
        fflush(stdin);
        scanf("%f",&pizza_a_alterar->preco);
        fflush(stdin);
        printf("\nAlterado!\n");
    }
}

/*
Objetivo: Escrever em um arquivo os dados cadastados no vetor de "Pizzas"
Parâmetros:
pizzas[] -> Parâmetro do tipo "Pizza". É de onde os dados a serem salvos no arquivo serão "retirados". Passagem por referência (pois é um vetor). 
tamanho ->  Parâmetro do tipo inteito. Tamanho do vetor de "Pizzas". Passagem por valor (pois essa variável não será alterada na função).
*/
escreverArquivo(Pizza *pizzas, int tamanho){
    FILE *arq;
    int i;
    arq = fopen("/documents/programming/DataStructures/Structs/pizzas.bin" , "wa");

    if(!arq){
        printf("Erro ao abrir arquivo!");
        exit(0);
    }

    for(i = 0; i < tamanho ; ++i){
        fprintf(arq , "Codigo: %d" ,pizzas[i].codigo);
        fprintf(arq , "\nNome: %s" ,pizzas[i].nome);
        fprintf(arq , "\nPreco: %f" ,pizzas[i].preco);
    }

}

/*
Objetivo: Ler de um arquivo os dados escritos posteriormente, exibir e colocar em um vetor de "Pizzas"
Parâmetros:
pizzas[] -> Parâmetro do tipo "Pizza". É onde a os dados do arquivo serão guardados. Passagem por referência (pois será alterado na função). 
*/
lerArquivo(Pizza *pizzas){
    FILE *arq;
    arq = fopen("/documents/programming/DataStructures/Structs/pizzas.bin" , "r");

    int i=0; 

    while(fread(&pizzas[i],sizeof(pizzas[i]),i,arq)){
        printf("\nSabor: %s",pizzas[i].nome);
        printf("\nPreco: $%f",pizzas[i].preco);
        printf("\nCodigo: %i",pizzas[i].codigo);
    }

    fclose(arq);

}

int main(int argc, char const *argv[])
{
        int op = 1;        

        while(op>0 && op <=6)
        {
            //Valores fixos para teste
            Pizza pizzas[2];
            int tamanho = 2;
            int codigo = 0;
            printf("1) Inserir\t2) Procurar\t3) Excluir\n\n4) Alterar\t5) Gravar em arquivo\t6) Ler de arquivo\n\n\t\t0) Sair\n\n\nOpcao: ");
            scanf("%i",&op);
            switch (op)
            {
                case 1:                
                    inserir(pizzas,tamanho);
                    break;
                case 2:
                    printf("\nCódigo da pizza que deseja procurar: ");
                    scanf("%d",&codigo);                
                    procurar(pizzas,codigo,tamanho);
                    break;
                case 3:
                    printf("\nCódigo da pizza que deseja excluir: ");
                    scanf("%d",&codigo);    
                    excluir(pizzas,codigo,tamanho);
                    break;
                case 4:
                    printf("\nCódigo da pizza que deseja alterar: ");
                    scanf("%d",&codigo);    
                    alterar(pizzas,codigo,tamanho);
                    break;
                case 5:
                    escreverArquivo(pizzas,tamanho);
                    break;
                case 6:
                    lerArquivo(pizzas);
                    break;
                default:
                    printf("Saindo...\n");
            }
        }
        return 0;
}