Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Maicon Prais

C Programa para cadastro de loja

Recommended Posts

Alguém poderia me ajudar neste programa de cadastro de vinhos. eu não estou conseguindo fazer o cadastro e nem a opção de buscar os vinhos com o código. ele cadastra mais não está imprimindo os vinhos cadastrados.  o programa tem que ter ênfase em ponteiros e alocação dinâmica da memória. o programa está copilando sem erro.

 

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

struct VINHO {
  char         nome[30];
  char         vinicola[30];
  int          ano;
  char         pais[20];
  int          codigo;
  float        preco;
  struct VINHO *proximo;
  int opcao;
};

struct VINHO *lista= NULL;
FILE * pfile;


void cadastrar_vinho(){
char nome[30];
char vinicola[30];
int ano;
char pais[30];
int codigo;
float preco;
struct VINHO *ptr;
 
ptr = (struct VINHO* )malloc(sizeof(struct VINHO));
strcpy(ptr->nome, nome);
strcpy(ptr->vinicola, vinicola);
ptr->ano = ano;
strcpy(ptr->pais, pais);
ptr->codigo = codigo;
ptr->preco = preco;
ptr->proximo = NULL;
pfile = fopen("BD_vinhos.txt", "a"); // abre o arquivo depois       de colocar o conteudo dentro do ponteiro do struct
if (pfile != NULL) {
fprintf(pfile,"\n%s;%s;%d;%s;%d;%.2f", nome, vinicola, ano, pais, codigo, preco); //joga no arquivo
if (lista == NULL) //se a lista estiver vazia
lista = ptr;
else {

ptr->proximo = lista; // o proximo recebe a cabeca da lista
lista = ptr; // a lista vira o ponteiro
}
fclose(pfile); // fecha arquivo
}
else printf("Erro ao abrir o arquivo\n");

         
system("clear");          
printf("Digite o nome do vinho: \n");
scanf("%s", nome);
printf("Digite o nome da Vinicola: \n");
scanf("\n%s", vinicola);
printf("Digite o ano de producao do vinho: \n");
scanf("\n%d", &ano);
printf("Digite o pais de origem do vinho: \n");
scanf("\n%s",  pais);
printf("Digite o codigo do vinho: \n");
scanf("\n%d", &codigo);
printf("Digite o preco do vinho: \n");
scanf("\n%f", &preco);
}

void remover_vinho(int codigo) {
  struct VINHO *anterior, *ptr, *p,*el = NULL, *aux;
  int achou = 0;
 
  anterior = lista;
 
  if (codigo == lista->codigo) {
      el = lista;
      lista = lista->proximo;
      free(el);
      printf("Vinho removido!\n");
  }
  else {
      anterior = lista;
      ptr = lista->proximo;

      while (ptr != NULL && ptr->codigo != codigo) {
          anterior = ptr;
          ptr = ptr->proximo;
      }
      if (ptr != NULL) {
          el = ptr;
          anterior->proximo = ptr->proximo;

          free(el);
          printf("Vinho removido!\n");
      }

      else printf("Codigo invalido, vinho nao encontrado\n");

  }

}

void buscar_vinho(int codigo
){
 struct VINHO *busc, *salv;
 
  printf("Digite o codigo do vinho: ");
  scanf("%d",&codigo);

  busc = lista;
  while (busc != NULL) {
      if (codigo == busc->codigo) {
    salv = busc;
         
          busc = busc->proximo;
      }
      else busc = busc->proximo;
      }
      if (busc == NULL)
          printf("Vinho nao encontrado\n");
      else
      printf("Nome: %s\n",busc->nome);
      printf("Vinicola: %s\n",busc->nome);
      printf("Ano: %d\n",busc->ano);
      printf("Pais: %s\n",busc->pais);
      printf("Codigo: %d\n", busc->codigo);
      printf("Preco: %.2f\n", busc->preco);
      
}
void ordenar_vinho(){

int opcao;
do{
 
  system("clear");
  printf("\t===================================\n");
  printf("\t\t Opções de ordenação:\n");
  printf("\t===================================\n");
  printf("\t 0 - Ordenar por ano.\n\t 1 - Ordenar por preço.\n\t 2 - Ordenar por país de origem. \n\t 3 - Ordenar por código    identificador.\n\t 4 - Ordenar por nome e vinicola.\n\t s - Sair.\n");
  printf("\t===================================\n");
  printf("\tEscolha uma opcao:  ");
  scanf("%d", &opcao);

switch(opcao){

case 0:
  //ordenarano();
  printf("Ordenação por ano feita!");
break;
case 1:
 //ordenarpreco();
 printf("Ordenação por preço feita!");
break;
case 2:
 //ordenarpais();
 
break;
case 3:
 //ordenarcodigo();
 printf("Ordenação por codigo feita!");
break;
case 4:
 //ordenarnomvin();
break;
case 's':
system("clear");
      printf("\t\tFim da ordenação\n");
      break;
  default :
  system("clear");
      printf("OPCAO INVALIDA:\n");

  }   
  }while(opcao != 's');
                                       
}

void imprimir_vinho(){
char nome[30], vinicola[30], pais[30];
  int codigo, ano;
  float preco;
  struct VINHO *p;
  p = lista;
  while (p != NULL) {
printf("Nome: %s \n", p->nome);
printf("Vinicola: %s \n",p->vinicola);
printf("Ano de fabricação: %d \n ",p->ano);
printf("Pais de origem: %s \n ",p->pais);
printf("Codigo: %d \n",p->codigo);
printf("tPreco: %.2f\n", p->preco);

printf("=======================================\n");
p = p->proximo;
  }
 
}
 
int main (){
      {
 
  lista=0;
  char opcao, nome[30], vinicola[30], pais[30];
  int ano, codigo;
  float preco;
   struct VINHO *p;
  do{
     //system("clear");
  printf("\t===================================\n");
  printf("\t\tLISTA DE CADASTRO:\n");
  printf("\t===================================\n");
  printf("\t c - Cadastrar vinho.\n\t r - Remover vinho.\n\t b - Buscar vinho. \n\t o - Ordenar lista de vinhos. \n\t i - Imprimir lista de vinhos.\n\t s - Sair.\n");
  printf("\t===================================\n");
  printf("\tEscolha uma opcao:  ");
  scanf("%s", &opcao);
 
switch(opcao){
  case 'c':
      cadastrar_vinho();
     
      break;
  case 'r':
      printf("Digite o codigo do vinho: ");
              scanf(" %d", &codigo);
              remover_vinho(codigo);
      break;
  case 'b' :
      buscar_vinho(codigo);
      break;
  case 'o' :
       ordenar_vinho();
      break;
  case 'i' :
        system("clear");
        imprimir_vinho();
       
        break;
  case 's' :
      system("clear");
      printf("\t\tObrigado pela sua visita!\n");
      break;
  default :
      system("clear");
      printf("OPCAO INVALIDA:\n");
  }   
  }while(opcao != 's');
                                            
  return 0;

}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na função de cadastrar você colocou o código ao contrário, segue a ordem lógica:

0 - inicio da função - receba o ponteiro - cadastrar_vinho(struct VINHO *p)

1 - Declare as variáveis(nome, vinicola, cidade, etc)

2 - Recebe os dados - com scanf...

3 - Busque um indice no vetor a ser armazenado os dados.

4 - Armazene no arquivo - com fprintf

5 - fim da função

adicionado 2 minutos depois

Para buscar, você precisa receber o ponteiro da struct onde estão os dados:

 

método:

void buscar_vinho(struct VINHO *busc, int codigo)

 

chamada:

buscar_vinho(p, X);


 

Compartilhar este post


Link para o post
Compartilhar em outros sites

obrigado, vou modificar aqui.

adicionado 1 minuto depois

@TYSQUARE89 obrigado, vou modificar aqui. 

adicionado 29 minutos depois

@TYSQUARE89  Oi, pode me ajudar de novo como eu sou novo na programação eu não estou conseguindo fazer a parte 3 e 4 que você me passou pode me ajudar com o código ? e na chamada da erro com a declaração "buscar_vinho(p, X)" eu tenho que declarar na main o p e o x ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×