Jump to content
Fórum Script Brasil
  • 0

Programa simples em C (Struct)


ramonenghaw
 Share

Question

Amigos, estou batendo a cabeça com esse programa em C, o objetivo dele é:

1- Cadastrar produtos(Nome, Marca, Valor, Quantidade...)

2- Excluir um produto (escrevendo o nome dele).

3- Acusar a existência de um produto caso tente cadastrar um produto com o mesmo nome.

4- Exibir um produto (Ao digitar o nome do produto, exibir os dados sobre o mesmo (Valor, quantidade...) Caso digite o nome de um produto que não existe, ele deve exbir a lista com todos os produtos já cadastrados).

Qual tipo de estrutura seria utilizado? Pilha? Fila?

O programa já cadastra os produtos, e também consegue exibir os produtos cadastrados, mas não faço ideia de como criar uma regra para não permitir que seja cadastrado produto com o mesmo nome, e para excluir um produto da lista.

 

 

Até agora esse é o meu "progresso" e preciso de um norte:

 

 

 

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
 
 typedef struct produto
 {
  char nome[10];
  char marca[10];
  int qtd;
  float vlr; 
 }produto;
 
produto estoque[5]; 
 
 int i=0;
 
void incluir(){
 

 printf("\nDigite o nome do produto:");
 scanf ("%s", &estoque.nome);
 fflush(stdin);
 printf("\nDigite a marca do produto:");
 scanf ("%s", &estoque.marca);
 fflush(stdin);
 printf("\nDigite a quantidade:");
 scanf ("%d", &estoque.qtd);
 fflush(stdin);
 printf("\nDigite o valor:");
 scanf ("%f", &estoque.vlr);
 fflush(stdin);
 i++;
 
 printf("\nProduto incluido com sucesso!!!\n\n\n\n");
}
 
void exibir(){
 
 for (i=0 ; i <5; i++){
  
  printf ("\n Produto %d\n", i+1);
  printf ("\n Nome: %s\n", estoque.nome);
  printf ("\n Marca: %s\n", estoque.marca);
  printf ("\n Quantidade: %d\n", estoque.qtd);
  printf ("\n Valor: %f\n", estoque.vlr);
  
  
 }
 
}
 
 
 
 
 

int main (void) {
  
  printf ("||||CONTROLE DE ESTOQUE||||\n\n\n");
  
  
  
  
 int op;
 
 do
 {
  
  printf ("ESCOLHA UMA DAS ALTERNATIVAS ABAIXO:\n"); 
  
  printf ("\n1 - Incluir Produto\n");
  printf ("2 - Excluir Produto\n");
  printf ("3 - Exibir Produtos\n");
  printf ("4 - Sair\n\n");
  scanf("%d", &op);
  
  if (op==1)
  { 
   incluir();
  }
  else if (op==2)
  {
  
  }
  
  else if (op==3)
  {
   exibir();
  }
  else if (op==4)
  {
  printf ("Finalizando o programa...\n\n");
  }
  } while (op !=4);
  
  
 

system ("Pause");
return 0;
}
 
Valeu!!
Edited by ramonenghaw
Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0

Qual tipo de estrutura seria utilizado? Pilha? Fila?
Nem um nem o outro, o que você precisa é de uma lista, agora sobre sua pergunta não entendo uma coisa. É dinâmica ou tem um tamanho fixo? Se for fixo você bem pode usar um vetor de structs, si não talvez o que você precise é de Listas simplesmente encadeadas

Link to comment
Share on other sites

  • 0

Na função incluir () eu vejo uma pequena falha, você salva todos os cadastros na mesma variável, e não diz em qual referência do array de struct você salva os dados. (estoque[x].nome).

Para acusar produto com o mesmo nome você pode usar uma função da biblioteca <string.h> para comparar strings, que retorna 0 se forem iguais. A função é strcmp ():

if (strcmp (string1 , string2 ) == 0)
printf ( ‘‘ S t r i n g s i g u a i s \n ’’ ) ;
else
printf ( ‘‘ S t r i n g s d i f e r e n t e s \n ’’ ) ;

O mesmo pode ser feito para excluir um produto pelo nome, tem que criar uma função que compara strings com o nome do produto de cada local do vetor. Depois posto uns códigos. Abraços.

 

Link to comment
Share on other sites

  • 0

Então, eu já sabia dessa função strcmp, só que não estou sabendo como declarar a string que quero testar, com a strings q correspondem aos nomes dos produtos cadastrados. Também não tinha me atentado a essa falha da função inclui, não entendi como que faria pra saber essa referência, existe algum problema em salvar tudo na variável estoque?

Edited by ramonenghaw
Link to comment
Share on other sites

  • 0
 

Se você declara um array do tipo estrutura, você precisa usar a notaçao de colchetes para salvar informações nas variáveis.

Exemplo:

estoque[1].quantidade = 3;   (...)

De acordo com o seu algoritmo, fiz um programa bem simples, no qual consigo usar as funções de comparar as strings para informar se há produto com o mesmo nome cadastrado, para informar detalhes do produto pelo seu nome e para anular informações da variável struct (excluir produto) pelo seu nome.

 

Segue o código completo:

 

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

struct produto

{

char nome [20];
char marca [20];
int quantidade;
float valor;

};

int main()

{

int i, j, p;

char excluir [20], informa [20];

struct produto estoque [1];


printf ("\n ~~~~~ INCLUINDO PRODUTOS NO ESTOQUE ~~~~~");

    for (i = 0; i <= 1; i++)

    {

    printf ("\nestoque [%d]\n", i);
    printf ("Digite o nome do produto: \n");
    scanf ("%s", estoque[i].nome);

    //aqui o código que verifica strings iguais para informar produto repetido é iniciado:  
      
        if (i != 0)

        {


            for (p = 0; p < i; p++)

            {

                if (strcmp (estoque[i].nome, estoque [p].nome) == 0)

                printf ("\n!!!!!!!!Produto com o mesmo nome encontrado!!!!!!!!!\n");

            }

        }

    printf ("Digite a marca do produto: \n");
    scanf ("%s", estoque[i].marca);

    printf ("Digite a quantidade do produto: \n");
    scanf ("%d", &estoque[i].quantidade);

    printf ("Digite o valor do produto: \n");
    scanf ("%f", &estoque[i].valor);

    }

    for (i = 0; i <= 1; i++)

    {

    printf ("\n ~~~~~ EXIBINDO OS PRODUTOS DO ESTOQUE ~~~~~");

    printf ("\nestoque [%d]\n", i);
    printf ("Nome: %s\nMarca: %s\n", estoque[i].nome, estoque[i].marca);
    printf ("Quantidade: %d\n Valor: %f\n", estoque[i].quantidade, estoque[i].valor);

    }

    printf (" ------ Deseja excluir algum produto? Digite 1 para SIM e outro numero para NAO: ");
    scanf ("%d", &j);

    if (j == 1)

    {

    printf ("\n\nOs nomes existentes de produtos são:\n\n");

        for (i = 0; i <=1; i++)

        {

        printf ("%s\n", estoque[i].nome);

        }

    printf ("\nPara excluir (anular) um produto, digite o nome EXATO do mesmo: ");

    scanf ("%s", excluir);

 //aqui o código para excluir (anular) o produto pelo nome é iniciado:       
      
        for (i = 0; i <= 1; i++)

        {

            if (strcmp (estoque[i].nome, excluir) == 0)

            {

            strcpy (estoque[i].nome, "0");
            strcpy (estoque[i].marca, "0");
            estoque [i].quantidade = 0;
            estoque [i].valor = 0;

            printf ("\nProduto anulado!\n");

            }

        }

    }

    for (i = 0; i <= 1; i++)

    {

    printf ("\n ~~~~~ EXIBINDO OS PRODUTOS DO ESTOQUE ~~~~~");

    printf ("\nestoque [%d]\n", i);
    printf ("Nome: %s\nMarca: %s\n", estoque[i].nome, estoque[i].marca);
    printf ("Quantidade: %d\n Valor: %f\n", estoque[i].quantidade, estoque[i].valor);

    }

    printf ("\n ------ Deseja ver informacoes de um produto particular? Digite 2 para SIM e outro numero para NAO: \n");
    scanf ("%d", &j);

//aqui o código para mostrar informações de um produto em particular é iniciado:
  
    if (j == 2)

    {

    printf ("Digite o nome EXATO do produto para ver seus detalhes: ");
    scanf ("%s", informa);

        for (i = 0; i <= 1; i++)

        {

            if (strcmp (estoque[i].nome, informa) == 0)

            {

            printf ("\n ~~~~~ EXIBINDO O PRODUTO %s ~~~~~", estoque[i].nome);
            printf ("\nestoque [%d]\n", i);
            printf ("Nome: %s\nMarca: %s\n", estoque[i].nome, estoque[i].marca);
            printf ("Quantidade: %d\n Valor: %f\n", estoque[i].quantidade, estoque[i].valor);

            }

        }


    }


printf ("\nFIM DO PROGRAMA\n");

return EXIT_SUCCESS;

}

Nas operações de informar produto repetido, informar produto pelo nome e excluir produto pelo nome é utilizado o mesmo padrão de manipulação de strings.

Abraços! 

Edited by Aristóteles
Link to comment
Share on other sites

  • 0

refazendo o código, eu cheguei a esta lógica:

Só que não consegui excluir um produto da lista, nem fazer a busca escrevendo o nome do produto, e caso não escreva nada na busca do produto, ele deveria listar os produtos cadastrados, que está funcionando.

/*
 
AUTOR: RAMON FERREIRA
DATA: 01/03/2016
DESCRIÇÃO: CADASTRAR, EXCLUIR, E EXIBIR PRODUTOS USANDO ESTRUTURA
 
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define T 50
#define S 30
 
//ESTRUTURA TIPO PRODUTO
 typedef struct produto
  {
   char nome[10];
   char marca[10];
   int qtd;
   float vlr;
  }produto;
 

//------------------------------------------------------
 
//FUNÇÃO PARA INCLUIR PRODUTO
void inclui (produto *cad, int *ta){
 
     int i, q, tf;
   
  printf("Quantos produtos serao cadastrados ? ");
     scanf("%i",&q);
     fflush(stdin);
   
  tf = *ta + q;
   
  for (i=*ta; i<tf; i++){
         printf("\nDigite o nome do produto %i: ",i+1);
         scanf("%s",&cad.nome);
   fflush(stdin);
         printf("Digite a marca do produto: ");
         scanf("%s",&cad.marca);
         fflush(stdin);
         printf("Digite a quantidade do produto: ");
         scanf("%d",&cad.qtd);
         fflush(stdin);
         printf("Digite o valor do produto: R$");
         scanf("%f",&cad.vlr);
         fflush(stdin);
     }
   
  *ta = tf;
}
 
//----------------------------------------------------
 
//FUNÇÃO "JÁ EXISTE"?
void existe(produto *cad, int ta){
 int i, cont = 0;
 char consulta [10];
 
printf ("Digite o nome do produto a ser consultado:\n");
scanf ("%s", &consulta);
fflush(stdin);
 
 for(i=0; i<ta; i++){
  if(strcmp (cad.nome, consulta) == 0){
   cont++;
   printf("\n<<< Produto existente!! >>>:\n\a", cont);   
  }
  else
  {
  printf ("\n<<< Produto não existente >>>\n\a");
  }
 }
}
//-----------------------------------------------------
 
//FUNÇÃO PARA EXIBIÇÃO DOS PRODUTOS CADASTRADOS
void exibir(produto *cad, int ta){
 int i;
 
 if (i==0)
 
  printf("não produtos cadastrados!!");
 
 
 else {
 for (i=0 ; i <ta; i++){
  printf ("---------------------------------\n");
  printf ("\n Produto %d\n", i+1);
  printf ("\n Nome: %s\n", cad.nome);
  printf ("\n Marca: %s\n", cad.marca);
  printf ("\n Quantidade: %d\n", cad.qtd);
  printf ("\n Valor: R$%.2f\n\n", cad.vlr);
  }
 }
 
}
 
int main (){
 
 
    system("color F9");
    produto cf[T];
    int tf = 0;
    int op;
   
    printf ("\nEstrutura de dados\n");
   printf ("\nRamon Ferreira\n");
    printf ("\n\n||||CONTROLE DE ESTOQUE||||\n\n\n");
   
     
 
//MENU PRINCIPAL
 
 do
 {
  printf ("\n---------------------------------\n");
  printf ("ESCOLHA UMA DAS ALTERNATIVAS ABAIXO:\n"); 
  
  printf ("\n1 - Incluir Produto\n");
  printf ("2 - Excluir Produto - (Ainda não implementado)\n");
  printf ("3 - Consulta de Produto Existente\n");
  printf ("4 - Exibir Produtos - (não busca produto pelo nome, apenas exibe os produtos cadastrados)\n");
  printf ("5 - Sair\n\n");
  scanf("%d", &op);
  
  if (op==1)
  { 
   inclui(cf, &tf);
  }
  else if (op==2)
  {
  
  }
  
  else if (op==3)
  {
  existe(cf, tf);
  }
  else if (op==4)
  {
   exibir(cf, tf);
  }
  else if (op==5)
  {
  printf ("Finalizando o programa...\n\n");
  }
  } while (op !=5);
 
 system("pause");
   
}
 
 
 
Edited by ramonenghaw
Link to comment
Share on other sites

  • 0

Padrão de função para anular um produto pelo nome utilizando comparação de strings:

printf ("\nPara excluir (anular) um produto, digite o nome EXATO do mesmo: ");

    scanf ("%s", excluir);

        for (i = 0; i <= vetor; i++)

        {

            if (strcmp (estoque[i].nome, excluir) == 0)

            {

            strcpy (estoque[i].nome, "0");
            strcpy (estoque[i].marca, "0");
            estoque [i].quantidade = 0;
            estoque [i].valor = 0;

            printf ("\nProduto anulado!\n");

      (...)

Para consultar produto pelo nome:

printf ("Digite o nome EXATO do produto para ver seus detalhes: ");
    scanf ("%s", informa);

        for (i = 0; i <= vetor; i++)

        {

            if (strcmp (estoque[i].nome, informa) == 0)

            {

            printf ("\n ~~~~~ EXIBINDO O PRODUTO %s ~~~~~", estoque[i].nome);
            printf ("\nestoque [%d]\n", i);
            printf ("Nome: %s\nMarca: %s\n", estoque[i].nome, estoque[i].marca);
            printf ("Quantidade: %d\n Valor: %f\n", estoque[i].quantidade, estoque[i].valor);
(...)

 

Saiba que é possível simplificar muito o seu programa. E não use a biblioteca conio.h xD, abraços

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...