Ir ao conteúdo

Posts recomendados

Postado

Boa tarde pessoal, estou com dificuldade em fazer a parada do while assim que for digitado um codigo igual a 0, segue o programa:

 

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

void lerString(char str[], int max)
{
    fgets(str, max, stdin);
    if (str[strlen(str)-1]=='\n')
        str[strlen(str)-1] = '\0';
    else
    {
        char lixo[10];
        do{
            fgets(lixo, 10, stdin);        
        }while (!feof(stdin) && lixo[strlen(lixo)-1]!='\n');
    }
}

typedef struct {

   int codigo;
   char nome[50];
   char categoria[30];
   float preco;
   int quantidade;
}Tbrinquedo;

void ler(Tbrinquedo *c){
    
    scanf("%i%*c\n", &(*c).codigo);  
    lerString((*c).nome,50);
    lerString((*c).categoria,30); 
    scanf("%f\n", &(*c).preco);
    scanf("%i\n", &(*c).quantidade);
}

void mostrar(Tbrinquedo c)
{
   printf("%-10s: %04i\n","Codigo", c.codigo);
    printf("%-10s: %s\n","Categoria", c.categoria);
   printf("%-10s: %s\n","Nome", c.nome);
   printf("%-10s: %.2f\n","Preço", c.preco);
   printf("%-10s: %i\n","Quantidade", c.quantidade);
   
}

/////////////////////////////////////////
//estoque
/////////////////////////////////////////
#define MAX 100
typedef struct
{
    Tbrinquedo vet[MAX];
    int      qtd; 
} Testoque;

void inicializar(Testoque *a)
{
    (*a).qtd=0;
}

void inserir(Testoque *a, Tbrinquedo c)
{
    
   (*a).vet[(*a).qtd] = c;
   (*a).qtd++;
}

void listar(Testoque a){
    int i;
     printf("%s- + -%-50s+ %-30s + %10s +%12s\n","---","-------------------------------------------------","------------------------------","------------","----------");
    printf("%s ! %-50s ! %-30s !   %10s !%12s\n","Cod.","Nome","Categoria","Preco","Quantidade");
     printf("%s- + -%-50s+ %-30s + %10s +%12s\n","---","-------------------------------------------------","------------------------------","------------","----------");
    for(i=0;i<a.qtd;i++){
    printf("%04i ! %-50s ! %-30s ! %12.2f !%12i\n", a.vet[i].codigo, a.vet[i].nome, a.vet[i].categoria, a.vet[i].preco, a.vet[i].quantidade);
    }
    printf("%s- + -%-50s+ %-30s + %10s +%12s\n","---","-------------------------------------------------","------------------------------","------------","----------");
}

int obterIndice(Testoque a, int codigo)
{
    int achou,i;
    achou=0;//falso
    i=0;//primeiro posicao
    while (!achou && i<a.qtd)
        if (a.vet[i].codigo == codigo)
            achou = 1;//verdadeiro
        else
            i++;//passa para o proximo
    return achou ? i : -1; 
}

int existe(Testoque a, int codigo)
{
    return obterIndice(a, codigo) > -1;
    /*if (obterIndice(a, codigo) > -1)
    return  1;//verdadeiro
    else
        return 0;//falso
    */
}

void filtrar(Testoque a, Tbrinquedo c, int codigo)
{
    int i;
        for(i=0;i<a.qtd;i++)
        if(codigo<0){
        printf("Erro na leitura - codigo [%i]!\n",codigo);
        }
            if(existe(a, codigo)==0){
            printf("Produto com codigo [%i] nao encontrado!\n",codigo);
            }
            if(a.vet[i].codigo==codigo){
                mostrar(c);
            }
                    

}

int main(){
    int acabou=0,i, qtd,vet[20];
     int codigo;
    Tbrinquedo c;
   Testoque a;
       inicializar(&a);
 
  
     do{
       ler(&c);
      inserir(&a,c);
  }while(c.codigo!=0);
      
    listar(a);
 
     return 0;
    
}
  


 

Postado

Coloque seu código dentro de um formulário <> code...

 

Algo assim:

 

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

void lerString(char str[], int max)
{
    fgets(str, max, stdin);
    if (str[strlen(str)-1]=='\n')
        str[strlen(str)-1] = '\0';
    else
    {
        char lixo[10];
        do{
            fgets(lixo, 10, stdin);        
        }while (!feof(stdin) && lixo[strlen(lixo)-1]!='\n');
    }
}

typedef struct {

   int codigo;
   char nome[50];
   char categoria[30];
   float preco;
   int quantidade;
}Tbrinquedo;

void ler(Tbrinquedo *c){
    
    scanf("%i%*c\n", &(*c).codigo);  
    lerString((*c).nome,50);
    lerString((*c).categoria,30); 
    scanf("%f\n", &(*c).preco);
    scanf("%i\n", &(*c).quantidade);
}

void mostrar(Tbrinquedo c)
{
   printf("%-10s: %04i\n","Codigo", c.codigo);
    printf("%-10s: %s\n","Categoria", c.categoria);
   printf("%-10s: %s\n","Nome", c.nome);
   printf("%-10s: %.2f\n","Preço", c.preco);
   printf("%-10s: %i\n","Quantidade", c.quantidade);
   
}

/////////////////////////////////////////
//estoque
/////////////////////////////////////////
#define MAX 100
typedef struct
{
    Tbrinquedo vet[MAX];
    int      qtd; 
} Testoque;

void inicializar(Testoque *a)
{
    (*a).qtd=0;
}

void inserir(Testoque *a, Tbrinquedo c)
{
    
   (*a).vet[(*a).qtd] = c;
   (*a).qtd++;
}

void listar(Testoque a){
    int i;
     printf("%s- + -%-50s+ %-30s + %10s +%12s\n","---","-------------------------------------------------","------------------------------","------------","----------");
    printf("%s ! %-50s ! %-30s !   %10s !%12s\n","Cod.","Nome","Categoria","Preco","Quantidade");
     printf("%s- + -%-50s+ %-30s + %10s +%12s\n","---","-------------------------------------------------","------------------------------","------------","----------");
    for(i=0;i<a.qtd;i++){
    printf("%04i ! %-50s ! %-30s ! %12.2f !%12i\n", a.vet[i].codigo, a.vet[i].nome, a.vet[i].categoria, a.vet[i].preco, a.vet[i].quantidade);
    }
    printf("%s- + -%-50s+ %-30s + %10s +%12s\n","---","-------------------------------------------------","------------------------------","------------","----------");
}

int obterIndice(Testoque a, int codigo)
{
    int achou,i;
    achou=0;//falso
    i=0;//primeiro posicao
    while (!achou && i<a.qtd)
        if (a.vet[i].codigo == codigo)
            achou = 1;//verdadeiro
        else
            i++;//passa para o proximo
    return achou ? i : -1; 
}

int existe(Testoque a, int codigo)
{
    return obterIndice(a, codigo) > -1;
    /*if (obterIndice(a, codigo) > -1)
    return  1;//verdadeiro
    else
        return 0;//falso
    */
}

void filtrar(Testoque a, Tbrinquedo c, int codigo)
{
    int i;
        for(i=0;i<a.qtd;i++)
        if(codigo<0){
        printf("Erro na leitura - codigo [%i]!\n",codigo);
        }
            if(existe(a, codigo)==0){
            printf("Produto com codigo [%i] nao encontrado!\n",codigo);
            }
            if(a.vet[i].codigo==codigo){
                mostrar(c);
            }
                    

}

int main(){
    int acabou=0,i, qtd,vet[20];
     int codigo;
    Tbrinquedo c;
   Testoque a;
       inicializar(&a);
 
  
     do{
       ler(&c);
      inserir(&a,c);
  }while(c.codigo!=0);
      
    listar(a);
 
     return 0;
    
}

 

Sobre seu programa:

  • main() deve ser a primeira função de seu programa. Se possível em um arquivo separado. É melhor para você e para quem lê seu programa
  • TESTE o retorno de scanf(). É ingênuo não testar.
  • ao invés de vários printf() de uma linha use UMA chamada de várias linhas. É muito mais eficiente.
  • prefira sempre
     
    void inicializar(Testoque* a)
    {
        a->qtd = 0;
    }

    ao invés de
     
    void inicializar(Testoque* a)
    {
        (*a).qtd = 0;
    }

     

Esse operador é mais claro. Foi criado para isso.

 

Ou prefira o clássico
 


Testoque* cria()
{
    Testoque* novo = (Testoque*)malloc(sizeof(Testoque));
    if (novo == NULL) return NULL;
    novo->qtd = 0;
    return novo;
}

Testoque* destroi(Testoque* e)
{
    if ( e != NULL ) free(e);
    return NULL;
}

 

Para usar assim

 

    Testoque* uma = cria();
    printf("Estoque com %d brinquedos\n", uma->qtd);
    uma = destroi(uma);

 

E ver
 

Estoque com 0 brinquedos

 

É mais legível e fácil de manter

 

Sobre essa parte, por exemplo:

 

void lerString(char str[], int max)
{
    fgets(str, max, stdin);
    if (str[strlen(str)-1]=='\n')
        str[strlen(str)-1] = '\0';
    else
    {
        char lixo[10];
        do{
            fgets(lixo, 10, stdin);        
        }while (!feof(stdin) && lixo[strlen(lixo)-1]!='\n');
    }
}

 

Não sei se entendi o que quer fazer aqui, mas parece errado. 

 

Entenda que '\0' é a mesma coisa que 0, o simples zero. Não há razão para não escrever apenas 0.

Em relação ao código, fgets() ao tentar ler max caracteres pode não ler nada e retornar NULL, o que você não testou. Mas se leu algo vai ter certamente 0 no final. E antes dele um newline '\n' mas apenas se couber. Se o usuário teclar apenas ENTER vai ter os dois em str. str[0] com 10 e str[1] com 0

E se leu o esperado você pode retornar apenas.

Provavelmente poderia retornar a própria string. Isso tornaria o programa mais legível...

E se o cara teclou mais que o esperado, aí sim precisaria desse loop para ler e descartar o resto.

 

  • Curtir 2

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!