Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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");
                         }                
                }

 

Editado por Simon Viegas
Inserir tag CODE
  • 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.

Editado por AnsiC
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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++. (!?)

Editado por giu_d
Correção no código
  • 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

@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

Editado por giu_d
corrigir comentário
  • 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

@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

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"

Editado por giu_d

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

@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 

Editado por giu_d
corrigir comentário

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

 

Editado por Simon Viegas
Inserir tag CODE
  • 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

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

 

  • 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.

Editado por AnsiC

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






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

×