Ir ao conteúdo

Posts recomendados

Postado

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;

}

}

Postado

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);


 

Postado

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 ?

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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

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!