Ir ao conteúdo
  • Cadastre-se
matheusfelix

C fazer esse programa o if(BO==2){ mostrar(&inicio)

Recommended Posts

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

struct produto{

    float valor;
    produto *prox;
    produto *ant;
};
produto *cadastrar(produto *i,float *val);
void mostrar(produto *i);
   int main(){
       produto *inicio=NULL;
    int BO;
    float val;      
       do{
           printf("\t1 - Cadastro\n");
           printf("\t2 - Mostrar\n");
           printf("\t3 - Sair\n");
           printf("Digite a Sua opção :");
           scanf("%i",&BO);
           if(BO==1){
               printf("Insira o valor: ");
               scanf("%f", &val);
               inicio = cadastrar(inicio,val);
               printf("\nInserido com sucesso!");
           }
           if(BO==2){
               mostrar(&inicio);
           }
       }while(BO!=2);
   }
   produto *cadastrar(produto *i,float *val){
                    
                    produto *novo;
                    novo = new(produto);
                    novo->valor,val;
                    novo -> prox = i;
                    novo -> ant = NULL;
                    
                          if(i!=NULL){
                              i -> ant = novo;
                          }
                          
                    i = novo;
                    return i;
                }
                    
                void mostrar(produto **i){
                    produto *aux;
                    aux = i;
                    
                         if(aux==NULL)
                             printf("\nLista Vazia!");
                         else{
                             while(aux!=NULL){
                                 printf("\nValor: %f",aux->valor);
                                 aux = aux -> prox;
                             }
                           system("pause");
                         }                
                }

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual o problema?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
23 minutos atrás, AnsiC disse:

Qual o problema?

no segundo if que era pra ele mostrar se ele esta guardando o que estamos cadastrando, porém esse "inicio" nao esta funcionando

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
void mostrar( produto **i ){
    produto *aux;                    /* Reservi da memória ponteiro de produto*/
    aux= *i;                                           /* Atribui o valor em i*/

    if(  aux == NULL )          /* Se ponteiro tem NULL então escreva mensagem*/
        printf( "\nLista Vazia!" );
    else{                                                  /* Se não ... então*/
        while ( aux != NULL ){    /* Enquando ponteiro diferente de NULL fazer*/
            printf( "\nValor: %f",aux->valor );       /* imprimi o campo valor*/
            aux = aux->prox;                     /* atribui o próximo ponteiro*/
        }
    }
    system( "pause" );                                  /* Adicione uma parada*/
    return;                                               /* Finalize o método*/
}              

Único errinho aqui foi no i. Testa essa método.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@matheusfelix Olá. Dei um 'tapinha' no seu código e ficou assim:

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

struct produto {
    float valor;
    struct produto *prox;
    struct produto *ant;
};

typedef struct produto Produto;

Produto *cadastrar(Produto *i, float val);
void mostrar(Produto *i);
void liberar(Produto *i);
int vazia(Produto *i);
void limpa_linha();

int main() {

    setlocale(LC_CTYPE, "Portuguese");

    Produto *inicio = NULL;
    int BO;
    float val;

    do {
        printf("\t1 - Cadastro\n");
        printf("\t2 - Mostrar\n");
        printf("\t3 - Sair\n");
        printf("Digite a sua opção: ");
        scanf("%i", &BO);
        limpa_linha();

        switch (BO) {
        case 1:
            printf("\nInsira o valor: ");
            scanf("%f", &val);
            limpa_linha();
            inicio = cadastrar(inicio, val);
            printf("\nInserido com sucesso!\n\n");
            break;
        case 2:
            mostrar(inicio);
            break;
        case 3:
            // sair
            break;
        default:
            printf("\nOpção inválida!\n\n");
            break;
        }
    } while(BO != 3);

    liberar(inicio);

    return 0;
}

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

int vazia(Produto *i) {
    return (i == NULL);
}

void liberar(Produto *i) {
    if (!vazia(i)) {
        liberar(i->prox);
        free(i);
    }
}

Produto *cadastrar(Produto *i, float val) {

    Produto *novo = malloc(sizeof(Produto));
    novo->valor = val;
    novo->prox = i;
    novo->ant = NULL;

    if(i != NULL) {
        i->ant = novo;
    }

    return novo;
}

void mostrar(Produto *i) {

    Produto *aux = i;

    if (vazia(i))
        printf("\nLista Vazia!\n");
    else {
        while (aux != NULL) {
            printf("\nValor: %.2f\n", aux->valor);
            aux = aux->prox;
        }
        printf("\n");

        system("pause");
    }

    printf("\n");
}

Coloquei uma função para liberar a memória q foi alocada

Só não entendi esse new que tem no seu código. Isso é do C++. (!?)

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
37 minutos atrás, giu_d disse:

Não entendi esse new que tem no seu código. Isso é do C++. (!?)

Parabéns, eu não vi! Será que é um dos seus métodos que estão mais abaixo do código e não foi copiado.

Ps.: Como você consegui se acostumar a não escrever return no final das função, mesmo sendo void não consigo! 

 

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@AnsiC

11 horas atrás, AnsiC disse:

Será que é um dos seus métodos que estão mais abaixo do código e não foi copiado.

Esse é um operador usado em linguagens orientadas a objetos, tal como o C++ e Java, para criar um novo objeto

Esse new no código tem o mesmo efeito do malloc. Ou seja: Quando eu uso o new no C++ para criar um novo objeto esse objeto é armazenado na memória, mas especificamente na região da memória chamada de Heap. No C++, após criar um novo objeto com o operador new,  também é preciso liberar esse objeto da memória com o uso do comando delete, que equivale ao conhecido free. No C++ não tem um "garbage collection" como no Java, que remove esses objetos da memória. No C++ é responsabilidade do programador fazer isso. Liberar a memória q foi alocada com o operador new

Perceba também a maneira como ele criou a struct no código. Do modo como está em C não vai compilar

Acredito q o código do @matheusfelix  está com a extensão .cpp e por isso compilou normalmente

Faça o teste: Coloque o código dele em um arquivo .cpp e vai ver q compila, com os devidos ajustes, claro :thumbsup:

Pra ver como o C está bem próximo do C++, e vice-versa

11 horas atrás, AnsiC disse:

Ps.: Como você consegui se acostumar a não escrever return no final das função, mesmo sendo void não consigo!

Na verdade aprendi assim já. E aí o q eu precisaria é me acostumar a usar o return hehe

 

Mas perceba o seguinte qto ao return: Digamos q eu tenha uma função no meu código do tipo void. Se no main eu chamo essa função, todo o bloco da mesma é executado e o fluxo do programa volta para o main. Logo, não vejo necessidade do return no final dessa função, a não ser que eu queira forçar, dependendo da situação, q o fluxo do programa, em alguma parte da função,  saia da mesma e volte p o main. Algo como um break em um loop

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu só não consigo porque percebo o código mais feio.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@AnsiC

2 minutos atrás, AnsiC disse:

Eu só não consigo porque percebo o código mais feio.

Nesse caso entra a questão do gosto e do caráter d cada um 

O que eu não gosto de ver em um código é algo como uma má identação em um for, por ex. Tipo: for (i=0; i<10;i++) assim, tudo emendado, sem os espaços adequados. Isso me incomoda e até mais do q deveria

  • Haha 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 minutos atrás, giu_d disse:

@AnsiC

Nesse caso entra a questão do gosto e do caráter d cada um 

O que eu não gosto de ver em um código é algo como uma má identação em um for, por ex. Tipo: for (i=0; i<10;i++) assim, tudo emendado, sem os espaços adequados. Isso me incomoda e até mais do q deveria

pior que o for desse jeito que esta na sua citação, foi o jeito que aprendemos na facu.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

O meu instrutor de C e C++ também faz dessa forma, mas em casos assim devo confessar q entra muito do meu perfeccionismo. Isso muitas vezes atrapalha. Por isso usei o termo "incomoda"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse é o exercício que estou tentando resolver, se alguem souber me explicar como chamo mais de um tipo de variável em um mostrar, ou eu tenho que criar, mais de um mostrar?!

2018-06-24 (6).png

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@matheusfelix E é importante frisar q esse meu instrutor tem uma vasta experiência na área de programação

adicionado 8 minutos depois

@matheusfelix

11 minutos atrás, matheusfelix disse:

Esse é o exercício que estou tentando resolver, se alguem souber me explicar como chamo mais de um tipo de variável em um mostrar, ou eu tenho que criar, mais de um mostrar?!

Creio q o passo mais interessante, para começar, é abrir um novo tópico referente a esse execício ou, postar o código q você criou, do modo como conseguiu fazer o exercício em questão. Assim fica possível responder a dúvidas q você possa ter, dar sugestões e corrigir eventuais erros 

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 horas atrás, giu_d disse:

@matheusfelix E é importante frisar q esse meu instrutor tem uma vasta experiência na área de programação

adicionado 8 minutos depois

@matheusfelix

Creio q o passo mais interessante, para começar, é abrir um novo tópico referente a esse execício ou, postar o código q você criou, do modo como conseguiu fazer o exercício em questão. Assim fica possível responder a dúvidas q você possa ter, dar sugestões e corrigir eventuais erros 

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

struct produto{
    int codigo;
    char descricao[30];
    float valor;
    produto *prox;
    produto *ant;
};
     produto *cadastrar(produto *inicio,produto prod1);
      void mostrar(produto *inicio);
   
   int main(){
    int BO, cod;
    float val;
    char d[30];  
    
    produto *inicio=NULL;
    produto prod1; 
        
       do{
           printf("\t\n1 - Cadastro"); 
           printf("\t\n2 - Mostar");
           printf("\t\n3 - Sair\n Qual sua opcao? ");
           scanf("%i",&BO);
           if(BO==1){
               printf("\nInsira o codigo do produto: ");
               scanf("%i", &prod1.codigo);
               fflush(stdin);
               
               printf("\nInsira a descricao do produto: ");
               gets(prod1.descricao);
               fflush(stdin);
               
               printf("Insira o valor: R$");
               scanf("%f", &prod1.valor);
               fflush(stdin);
               
               inicio = cadastrar(inicio, prod1);
           }
           if(BO==2){
               mostrar(inicio);
           }
       }while(BO!=3);
   }
   produto *cadastrar(produto *inicio,produto prod1){
                    
                    produto *novo;
                    novo = new(produto);
                    novo->codigo=prod1.codigo;
                    strcpy(novo->descricao,prod1.descricao);
                    novo -> valor=prod1.valor;
                    novo -> prox = inicio;
                    novo -> ant = NULL;
                          
                    inicio = novo;
                    return inicio;
                }
                
        void mostrar(produto *inicio){
                    produto *aux;
                     aux = inicio;
                    
                         if(aux==NULL){
                             printf("\nLista Vazia!");
                         }else{
                             while(aux!=NULL){
                                 printf("\nCodigo do produto: %i", aux->codigo);
                                 printf("\nDescricao do produto: %s", aux->descricao);
                                 printf("\nValor:R$ %.2f\n", aux->valor );
                                 aux = aux -> prox;
                             }
                           system("pause");
                         }            
                }    

        

FIZEMOS ATE AQUI

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está dividido e em 5 partes, cadê a primeira parte já fez?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Ata, pensei que fosse uma nova questão.
1 hora atrás, matheusfelix disse:

isso que estamos tentando, o que conseguimos foi o codigo acima, que é a inserção de valores

 

 

Cara!

Eu prefiro dividir o problema em suas partes mínimas fundamentas e estuda cada parte. 

É dessa maneira que eu aprendo C e é justamente dessa maneira que se encontra o exercício.

---------------------------------------------

A Primeiro parte do problema diz:

1- Cadastrar as informações do produto atendendo as seguintes restrições:

  • Não pode haver repetição de código ...
  • A quantidade em estoque deverá ser igual ou superior a 1
  • O valor unitário deve ser maior que 0

Caso seja informado algum valor incorreto, mostre mensagem de erro e solicite-o novamente.

 

 

Então meu caro! Antes de iniciar a implementação do procedimento/função cadastro é necessário implementar as suas restrições. Que na verdade julgo serem subprogramas essenciais para cadastramento. 

Spoiler

produto *cadastrar(produto *inicio,produto prod1){

  produto *novo;
  novo = new(produto);
  novo->codigo=prod1.codigo;
  strcpy(novo->descricao,prod1.descricao);
  novo -> valor=prod1.valor;
  novo -> prox = inicio;
  novo -> ant = NULL;

  inicio = novo;
  return inicio;
}

 

Nesta parte o que lhe falta é as restrições. Em qual parte daqui você atolou? quando respondermos isso passamos para o resto.

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





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

×