Ir para conteúdo
Fórum Script Brasil
  • 0

Programa simples em C (Struct)


ramonenghaw

Pergunta

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!!
Editado por ramonenghaw
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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?

Editado por ramonenghaw
Link para o comentário
Compartilhar em outros 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! 

Editado por Aristóteles
Link para o comentário
Compartilhar em outros 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");
   
}
 
 
 
Editado por ramonenghaw
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...