Ir ao conteúdo

Posts recomendados

Postado

Estou com um problema num código e não consigo resolver. Quando vou imprimir a lista de produtos só aparece o último produto cadastrado e um lixo de memória. Alguém pode me ajudar? 

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

struct Produtos{
 char nome[60];
 float precoCompra;
 float precoVenda;
 float lucro;
};

float Lucro(float venda, float compra){
  float lucro;

  lucro = venda - compra;
  lucro = (lucro / venda) * 100;

  return lucro;
}

int main(){
  struct Produtos produto[4];
  int flag, aux = 0;
  int contlucro20 = 0, contlucro2030 = 0, contlucro30 = 0;
  int i;

  while (flag != 0){
    //Cadastrando produtos:
    aux++;
    for(i = 0; i < aux; i++){
      fflush(stdin);
      printf("\nProduto: "); fgets(produto[i].nome, 60, stdin);
      printf("\nPreco de Compra: "); scanf("%f", &produto[i].precoCompra);
      printf("\nPreco de Venda: "); scanf("%f", &produto[i].precoVenda);

      produto[i].lucro = Lucro(produto[i].precoVenda, produto[i].precoCompra);
      printf("\nLucro: %.2f%%", produto[i].lucro);

      if (produto[i].lucro < 20){contlucro20++;}
      else if (20 >= produto[i].lucro && produto[i].lucro <= 30){contlucro2030++;}
      else if(produto[i].lucro > 30){contlucro30++;}


      printf("\nDigite 0 para encerrar ou 1 para continuar: "); scanf("%d", &flag);

      if(flag == 0){break;}
    }

  }

  //Imprimindo lista de produtos:
  printf("\nLista de produtos: \n");

  for(i = 0; i < aux; i++){
    printf("\nProduto: %s", produto[i].nome);
    printf("\nPreco de Compra: %.2f", produto[i].precoCompra);
    printf("\nPreco de Venda: %.2f", produto[i].precoVenda);
    printf("\nLucro: %.2f%%\n", produto[i].lucro);
  }

  printf("\nNumero de produtos com lucro menor que 20%%: %d", contlucro20);
  printf("\nNumero de produtos com lucro entre  20%% e 30%%: %d", contlucro2030);
  printf("\nNumero de produtos com lucro maior que 30%%: %d", contlucro30);

  return 0;
}

 

Captura de tela 2022-10-01 130831.png

  • Obrigado 1
Postado
1 hora atrás, EliasReis disse:

Estou com um problema num código e não consigo resolver. Quando vou imprimir a lista de produtos só aparece o último produto cadastrado e um lixo de memória. Alguém pode me ajudar? 

O problema é porque você não está pegando a entrada (stdin) corretamente, o ideal seria você pegar a linha inteira e separar o que você quer e descartar o que não quer.

 

Eu mexi um pouco para receber a entrada corretamente, mas ainda há várias coisas para consertar.

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

#define T_ENTRADA 256

struct Produtos
{
    char nome[60];
    float precoCompra;
    float precoVenda;
    float lucro;
};

float Lucro(float venda, float compra)
{
    float lucro;

    lucro = venda - compra;
    lucro = (lucro / venda) * 100;

    return lucro;
}

int main()
{
    struct Produtos produto[4] = {0};   /* Inicia o vetor inteiro com 0's */
    int flag, aux = 0;
    int contlucro20 = 0, contlucro2030 = 0, contlucro30 = 0;
    int i;
    char entrada[T_ENTRADA] = {'\0'};   /* Inicia o vetor inteiro com 0's */

    while (flag != 0) {
        //Cadastrando produtos:
        aux++;
        for(i = 0; i < aux; i++){
            /* fflush(stdin); Ideia pessima! */
            printf("\nProduto: "); 
            fgets(entrada, T_ENTRADA, stdin);
            entrada[strlen(entrada)-1] = '\0';
            strcpy(produto[i].nome, entrada);
            
            printf("\nPreco de Compra: ");
            fgets(entrada, T_ENTRADA, stdin);
            sscanf(entrada, "%f", &produto[i].precoCompra);
            
            printf("\nPreco de Venda: ");
            fgets(entrada, T_ENTRADA, stdin);
            sscanf(entrada, "%f", &produto[i].precoVenda);
            produto[i].lucro = Lucro(produto[i].precoVenda, produto[i].precoCompra);
            printf("\nLucro: %.2f%%", produto[i].lucro);
            if (produto[i].lucro < 20)
            {
                contlucro20++;
            }
            else if (20 >= produto[i].lucro && produto[i].lucro <= 30)
            {
                contlucro2030++;
            }
            else if(produto[i].lucro > 30)
            {
                contlucro30++;
            }
            
            printf("\nDigite 0 para encerrar ou 1 para continuar: ");
            fgets(entrada, T_ENTRADA, stdin);
            sscanf(entrada, "%d", &flag);
            if(flag == 0)
            {
                break;
            }
        }
    }

    //Imprimindo lista de produtos:
    printf("\nLista de produtos: \n");

    for(i = 0; i < aux; i++) {
        printf("\nProduto: %s", produto[i].nome);
        printf("\nPreco de Compra: %.2f", produto[i].precoCompra);
        printf("\nPreco de Venda: %.2f", produto[i].precoVenda);
        printf("\nLucro: %.2f%%\n", produto[i].lucro);
    }

    printf("\nNumero de produtos com lucro menor que 20%%: %d", contlucro20);
    printf("\nNumero de produtos com lucro entre  20%% e 30%%: %d", contlucro2030);
    printf("\nNumero de produtos com lucro maior que 30%%: %d", contlucro30);

    return 0;
}

 

  • Curtir 2
  • Obrigado 1
Postado

Não existe "lixo de memória".  A memória está lá. Os endereços estão lá. Seu programa apenas está mostrando algo que não devia.

 

 O programa tem muitos problemas ainda e vai ter trabalho para terminar deste modo. Muitos dos problemas são muito comuns e parecem vir da maneira como ensinam (ou deixam de ensinar) essas coisas. Copiando de uma lista que eu tenho compilado aqui:

  • Nunca leia valores do teclado para alimentar seu programa antes dele estar rodando. Só vai te atrasar e não acrescenta absolutamente nada. Use constantes, use funções que retornam a estrutura preenchida. Ao terminar os  testes aí sim incorpore a leitura. Um programa interativo é chato para testar. Durante o desenvolvimento ninguém quer interagir com o programa.
  • scanf() foi escrita para ler entrada formatada. Não use para ler do teclado, que claramente não é entrada formatada. Só vai dar mais trabalho. Muito mais trabalho.

  • Ao usar scanf() ou alguma função da família, como fscanf() entenda que ela retorna um valor. E teste. É ingênuo deixar o programa seguir sem testar. TESTE sempre. Para 5 especificadores --- aquelas coisas com % na frente e que não tem um asterisco nem outro %, como "%d %d %f %f %d" scanf() pode ler de 0 a 5 itens ou dar erro e retornar -1. Então teste o retorno que vai estar entre -1 e 5...

  • não use fflush(): isso só está definido para fluxos de saída. Em alguns compiladores pode até funcionar, mas é um sinal de fez algo errado

  • Não existe "lixo de teclado": necessidades como de flush() na entrada indicam apenas que não entendeu bem o que está lendo e o que é a entrada via teclado, free form: o usuário pode digitar qualquer coisa e é o seu programa que tem que se virar O teclado tem ao menos 105 teclas de liberdade e o usuário pode digitar qualquer coisa em qualquer ordem

  • Não misture entrada de dados ou formatação com a apresentação dos dados ou a lógica do programa, Isso é um desastre para manutenção e desenvolvimento

  • Um printf() de 6 linhas é muito, mas muito melhor que 6 printf() de 1 linha. E se só vai mostrar o texto puts() é ainda melhor e dezenas de vezes mais rápido que uma série de printf().

  • Ao usar uma estrutura de dados como uma lista, uma pilha ou fila entenda que ela é um container e nada tem a ver com os dados. Não misture NUNCA os dados com a estrutura porque só via complicar tudo. Em especial vai ficar muito mais difícil aproveitar a estrutura em outros programas, e essa é tod a razão de escrever isso

  • Essa construção

 

  •     while (flag != 0)
        {
            // ...
                if (flag == 0) { break; }
        }

    tem um nome: trata-se do comando do {} while. Então use o simples. Não sou eu quem vai corrigir seu programa mas deve perder pontos por ter um loop que testa no início e no fim ao mesmo tempo.  E não precisa de chaves como essas no break que só deixam o código mais difícil de ler

 

 

 

  • Curtir 1
  • Obrigado 1

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!