Ir ao conteúdo

Programa p/ caastro: não guarda as info na struct


Ir à solução Resolvido por ScreenBlack,

Posts recomendados

Postado

BOA NOITE !!

 

Fiz um programa na faculdade para cadastro de chapas ! Porém, pelo que vi o programa não está guardando as informações na struct.

Quando listo todos os itens ele sempre aparece o último e no busca os dados são sempre os mesmos (do último item que cadastrei).

Sou novo em programação, gostaria de uma ajuda !!

 

Obrigado!

 

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

using namespace std;
struct produto {
    int codificacao[50];
    int quantidade;
    float preco;
    float peso;
    char material[20];
    char fabricante[20];

};
void proc_menu() {
    printf("------------------------- PROGRAMA CADASTRO DE CHAPAS -------------------------\n\n\n");
    printf("  MENU:\n");
    printf("\n  OPCAO 1 - Cadastrar produto");
    printf("\n  OPCAO 2 - Remover produto");
    printf("\n  OPCAO 3 - Relatorio de CHAPAS");
    printf("\n  OPCAO 4 - Busca");
    printf("\n  OPCAO 0 - Sair");
    printf("\n\n  Digite sua opcao:  ");
}

void proc_menu_cad_prod() {
    printf("\n  OPCAO 0 - Voltar ao menu inicial");
    printf("\n  OPCAO 1 - Cadastrar produto");
    printf("\n\n  OPCAO:  ");
}

void proc_menu_excl_prod() {
    printf("\n  --Excluir produto!--\n\n\n");
    printf("\n  Opcao 0 - Voltar ao menu inicial");
    printf("\n  Opcao 1 - Excluir produto");
    printf("\n\n  Opcao:  ");
}

void proc_menu_lista_prod() {
    printf("\n  --A SUA LISTA DE PRODUTOS--\n\n\n");
    printf("\n  Opcao 0 - Voltar ao menu inicial");
    printf("\n  Opcao 1 - Listar todas as chapas");
    printf("\n\n  Opcao:  ");
}

int main() {
    int menu;
    int menu_cad_prod;
    int menu_excl_prod;
    struct produto p1[50];

    while (true) {
        system("cls");
        proc_menu();
        scanf_s("%d", &menu);

        if (menu == 0) {
            break;
        }
        if (menu == 1) {
            while (true) {
                system("cls");
                proc_menu_cad_prod();
                scanf_s("%d", &menu_cad_prod);
                if (menu_cad_prod == 0) {
                    break;
                }
                if (menu_cad_prod == 1) {
                    int i;
                    
                    
                        for (i = 0; i < 50; i++) {
                            
                            printf("\n  --Cadastro de produtos!--\n\n\n");
                            printf("\n  Codificacao :  ");
                            scanf_s("%i", &p1.codificacao);
                            printf("\n  Quantidade :  ");
                            scanf_s("%i", &p1.quantidade);
                            printf("\n  Preco unitario : ");
                            scanf_s("%f", &p1.preco);
                            printf("\n  Peso(KG) : ");
                            scanf_s("%f", &p1.peso);
                            printf("\n  Material :  ");
                            rewind(stdin);
                            fgets(p1.material, 50, stdin);
                            printf("\n  Fabricante :  ");
                            rewind(stdin);
                            fgets(p1.fabricante, 50, stdin);
                            break;                    
                    }
                }

        }    
            system("pause");
        }
        if (menu == 2)
        {
            while (true) {
                system("cls");
                proc_menu_excl_prod();
                scanf_s("%d", &menu_excl_prod);
                if (menu_excl_prod == 0) {
                    break;
                }
                int i;
                int excluir;
                if (menu_excl_prod == 1) {
                    printf("\n Informe o Codigo : ");
                    rewind(stdin);
                    scanf_s("%i", &excluir);
                    for (i = 0; i < 50; i++) {
                        if (*p1.codificacao = excluir) {
                            *p1.codificacao = -1;
                            *p1.fabricante = -1;
                            *p1.material = -1;
                            p1.peso = 0;
                            p1.preco = 0;
                            p1.quantidade = 0;

                        }

                        system("cls");
                        printf("DADOS APAGADOS COM SUCESSO");
                        break;
                    }
                }
            }
            system("pause");
        }
        if (menu == 3)
        {
            while (true) {
                system("cls");
                proc_menu_lista_prod();
                int menu_lista_prod;
                scanf_s("%d", &menu_lista_prod);
                if (menu_lista_prod == 0) {
                    break;
                }
                if (menu_lista_prod == 1) {
                    int i;
                    for (i = 0; i < 50; i++)
                    {
                        printf("\n \n \n ----LISTA DE CHAPAS---- \n \n \n");
                        printf("Cod: %i\n", *p1.codificacao);
                        printf("Preco: %f\n", p1.preco);
                        printf("Peso: %f\n", p1.peso);
                        printf("Qtde: %i\n", p1.quantidade);
                        printf("Fabricante: %s\n", p1.fabricante);
                        printf("Material: %s\n", p1.material);
                        break;
                        
                    }
                }
                system("pause");
            }
        }
            if (menu == 4)
            {
                system("cls");
                int pesquisacod;
                int i;
                printf("Digite o codificacao que deseja buscar: ");
                scanf_s("%i", &pesquisacod);
                for (i = 0; i < 50; i++)
                {
                    if (*p1.codificacao = pesquisacod) {
                        printf("\n \n \n ----SUA BUSCA---- \n \n \n");
                        printf("Cod: %i\n", *p1.codificacao);
                        printf("Preco: %f\n", p1.preco);
                        printf("Peso: %f\n", p1.peso);
                        printf("Qtde: %i\n", p1.quantidade);
                        printf("Fabricante: %s\n", p1.fabricante);
                        printf("Material: %s\n", p1.material);
                        break;

                    }

                }
                system("pause");
            }
        }
    }

Postado

Seu código possui alguns erros de lógica, porém nada graves. A lógica está correta.

 

1) Para trabalhar com lista estática, precisa sempre informar a posição da lista para poder trabalhar com os valores contidos nela.

 

Citação

lista[0].nome; /* Nome contido na primeira posição da lista */

lista[1].nome; /* Nome contido na segunda posição da lista */

lista[2].nome; /* Nome contido na terceira posição da lista */

 

2) Mesmo removendo um cadastro (alterando seus valores para zero), a posição não deixará de existir devido a lista ser estática, logo, precisa-se de um controle para identificar se a posição está livre ou não.

 

struct produto
{
    int codificacao;
    int quantidade;
    float preco;
    float peso;
    char material[20];
    char fabricante[20];
    int apagado; /* Controlador de posição livre */
};

 

3) Aconselha-se não trabalhar com a biblioteca "conio.h", pois ela é obsoleta e não é portável.

 

4) Uso do comando "break" diretamente dentro do comando "for", impedindo que fosse percorrida a lista até o final (exemplo na rotina de exclusão.

 

Fiz apenas alguns ajustes no seu código, para que as rotinas funcionassem corretamente.

 

Spoiler

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

struct produto
{
    int codificacao;
    int quantidade;
    float preco;
    float peso;
    char material[20];
    char fabricante[20];
    int apagado;
};
void proc_menu()
{
    printf("------------------------- PROGRAMA CADASTRO DE CHAPAS -------------------------\n\n\n");
    printf("  MENU:\n");
    printf("\n  OPCAO 1 - Cadastrar produto");
    printf("\n  OPCAO 2 - Remover produto");
    printf("\n  OPCAO 3 - Relatorio de CHAPAS");
    printf("\n  OPCAO 4 - Busca");
    printf("\n  OPCAO 0 - Sair");
    printf("\n\n  Digite sua opcao:  ");
}
void proc_menu_cad_prod()
{
    printf("\n  OPCAO 0 - Voltar ao menu inicial");
    printf("\n  OPCAO 1 - Cadastrar produto");
    printf("\n\n  OPCAO:  ");
}
void proc_menu_excl_prod()
{
    printf("\n  --Excluir produto!--\n\n\n");
    printf("\n  Opcao 0 - Voltar ao menu inicial");
    printf("\n  Opcao 1 - Excluir produto");
    printf("\n\n  Opcao:  ");
}
void proc_menu_lista_prod()
{
    printf("\n  --A SUA LISTA DE PRODUTOS--\n\n\n");
    printf("\n  Opcao 0 - Voltar ao menu inicial");
    printf("\n  Opcao 1 - Listar todas as chapas");
    printf("\n\n  Opcao:  ");
}

int main(void)
{
    int menu = 0;
    int menu_cad_prod = 0;
    int menu_excl_prod = 0;
    struct produto p1[50];
    int quantidadeProduto = 0;
    int excluir = 0;
    int menu_lista_prod = 0;
    int i = 0;
    int pesquisacod = 0;

    while (1)
    {
        system("cls");
        proc_menu();
        scanf(" %d", &menu);
        if (menu == 0)
        {
            break;
        }
        if (menu == 1)
        {
            while (1)
            {
                system("cls");
                proc_menu_cad_prod();
                scanf(" %d", &menu_cad_prod);

                if (menu_cad_prod == 0)
                {
                    break;
                }

                if (menu_cad_prod == 1)
                {
                    for ( i = 0; i < quantidadeProduto; i++ ) /* Procura e cadastra em posições antigas que foram apagadas */
                    {
                        if ( p1[i].apagado == 1 )
                        {
                            printf("\n  --Cadastro de produtos!--\n\n\n");
                            printf("\n  Codificacao :  ");
                            scanf(" %i", &p1[i].codificacao);
                            printf("\n  Quantidade :  ");
                            scanf(" %i", &p1[i].quantidade);
                            printf("\n  Preco unitario : ");
                            scanf(" %f", &p1[i].preco);
                            printf("\n  Peso(KG) : ");
                            scanf(" %f", &p1[i].peso);
                            printf("\n  Material :  ");
                            scanf(" %[^\n]s", p1[i].material); /* A máscara "%[^\n]s" permite leitura de espaço e o espaço contido na frente não armazena a tecla ENTER */
                            printf("\n  Fabricante :  ");
                            scanf(" %[^\n]s", p1[i].fabricante); /* A máscara "%[^\n]s" permite leitura de espaço e o espaço contido na frente não armazena a tecla ENTER */
                            p1[i].apagado = 0;
                            break;
                        }
                    }

                    if ( i == quantidadeProduto ) /* Insere cadastro em nova posicao apenas se a lista atual não possuir nenhum cadastro apagado */
                    {
                        printf("\n  --Cadastro de produtos!--\n\n\n");
                        printf("\n  Codificacao :  ");
                        scanf(" %i", &p1[i].codificacao);
                        printf("\n  Quantidade :  ");
                        scanf(" %i", &p1[i].quantidade);
                        printf("\n  Preco unitario : ");
                        scanf(" %f", &p1[i].preco);
                        printf("\n  Peso(KG) : ");
                        scanf(" %f", &p1[i].peso);
                        printf("\n  Material :  ");
                        scanf(" %[^\n]s", p1[i].material); /* A máscara "%[^\n]s" permite leitura de espaço e o espaço contido na frente não armazena a tecla ENTER */
                        printf("\n  Fabricante :  ");
                        scanf(" %[^\n]s", p1[i].fabricante); /* A máscara "%[^\n]s" permite leitura de espaço e o espaço contido na frente não armazena a tecla ENTER */
                        p1[i].apagado = 0;
                        quantidadeProduto++;
                    }
                }
            }
            system("pause");
        }
        if (menu == 2)
        {
            while (1)
            {
                system("cls");
                proc_menu_excl_prod();
                scanf(" %d", &menu_excl_prod);
                if (menu_excl_prod == 0)
                {
                    break;
                }

                if (menu_excl_prod == 1)
                {
                    printf("\n Informe o Codigo : ");
                    scanf(" %i", &excluir);

                    for (i = 0; i < quantidadeProduto; i++)
                    {
                        if ( p1[i].codificacao == excluir )
                        {
                            p1[i].apagado = 1;
                        }
                        system("cls");
                        printf("DADOS APAGADOS COM SUCESSO");
                    }
                }
            }
            system("pause");
        }
        if (menu == 3)
        {
            while (1)
            {
                system("cls");
                proc_menu_lista_prod();
                scanf(" %d", &menu_lista_prod);
                if (menu_lista_prod == 0)
                {
                    break;
                }
                if (menu_lista_prod == 1)
                {
                    for (i = 0; i < quantidadeProduto; i++)
                    {
                        if ( p1[i].apagado == 0 )
                        {
                            printf("\n \n \n ----LISTA DE CHAPAS---- \n \n \n");
                            printf("Cod: %i\n", p1[i].codificacao);
                            printf("Preco: %f\n", p1[i].preco);
                            printf("Peso: %f\n", p1[i].peso);
                            printf("Qtde: %i\n", p1[i].quantidade);
                            printf("Fabricante: %s\n", p1[i].fabricante);
                            printf("Material: %s\n", p1[i].material);
                            printf("DEBUG: apagado: %d\n", p1[i].apagado);
                        }
                    }
                }
                system("pause");
            }
        }
        if (menu == 4)
        {
            system("cls");
            printf("Digite o codificacao que deseja buscar: ");
            scanf(" %i", &pesquisacod);
            for (i = 0; i < quantidadeProduto; i++)
            {
                if ( ( p1[i].codificacao == pesquisacod ) && ( p1[i].apagado == 0 ) )
                {
                    printf("\n \n \n ----SUA BUSCA---- \n \n \n");
                    printf("Cod: %i\n", p1[i].codificacao);
                    printf("Preco: %f\n", p1[i].preco);
                    printf("Peso: %f\n", p1[i].peso);
                    printf("Qtde: %i\n", p1[i].quantidade);
                    printf("Fabricante: %s\n", p1[i].fabricante);
                    printf("Material: %s\n", p1[i].material);
                    break;
                }
            }
            system("pause");
        }
    }

    return 0;
}

 

 

Postado

Obrigado pelas dicas !!! Vi que você trocou o scanf_s , por scanf apenas, mas o meu compilador não permite o programa com scanf. Existe uma diferença grande entre os dois ? O meu professor nos recomendou o uso scanf_s ou fgets

  • Solução
Postado

A função "scanf_s()" veio a ser implementada apenas na biblioteca padrão C versão C11. Antes disso, ele fazia parte apenas da biblioteca Microsoft.

Devido a retrocompatibilidade, troquei por "scanf()".
Mas você pode utilizar a função "scanf_s()", sim. Ela é até melhor, porque trata buffer overflow.

 

A função "fgets()" eu não aconselho utilizar, porque fará a leitura da tecla "ENTER" no buffer, fazendo com que a leitura seguinte não ocorra.

  • 4 semanas depois...
Postado
Em 04/05/2016 às 17:47, ScreenBlack disse:

A função "scanf_s()" veio a ser implementada apenas na biblioteca padrão C versão C11. Antes disso, ele fazia parte apenas da biblioteca Microsoft.

Devido a retrocompatibilidade, troquei por "scanf()".
Mas você pode utilizar a função "scanf_s()", sim. Ela é até melhor, porque trata buffer overflow.

 

A função "fgets()" eu não aconselho utilizar, porque fará a leitura da tecla "ENTER" no buffer, fazendo com que a leitura seguinte não ocorra.

 

Não seria interessante o uso do fgets() por ter mais segurança na leitura, além de ler espaço?

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!