Ir para conteúdo

Estou com um problema no meu código em C


Scania_13

Posts Recomendados

Quando imprimo a lista de produtos são impressos apenas o último item cadastrado e um lixo de memória.

#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;
}

68415686_Capturadetela2022-10-01130831.thumb.png.e544dda591d40909580ef623bb04e495.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá! Considere o seguinte:

  1. Inclua a <stdio.h>.
  2. Use uma função por linha. Fica melhor pra ler o código.
  3. Você não usa nenhuma função da <stdlib.h> nem da <string.h>. Pode remover esses includes. ?
  4. A variável flag é testada no while mas não é inicializada antes. Recomendo utilizar do/while, o que vai fazer com que sua condição fique no final. Alternativamente, você pode inicializar a variável flag com 1 na declaração.
  5. Você usou a variável aux para contar quantos produtos foram inseridos. O problema é que você a incrementa fora do for. Uma solução rápida é colocar i<4 na condição do for (já que tem um if com break no fim dele) e o incremento da aux logo após a leitura do produto, antes da chamada à printf().

Isso deve ser suficiente para corrigir o programa seguindo a sua lógica. Uma vez corrigido, se quiser saber mais, eu teria outras sugestões. Dá pra resolver a leitura com um loop só ao invés de dois e tem outras melhorias também.

Abraço.

 

  • Agradecer 1
Link para o comentário
Compartilhar em outros sites

O que acontece se o preço de venda for informado como 0 (zero)?
O que acontece se inserir mais que 4 "produtos"?
O que acontece se tiver um produto que custe R$ 16777217,00?
O que acontece se, ao invés do usuário informar um valor numérico, informar uma string inválida (tipo `abc' para venda)?
Por que você deixou o '\n' na string do nome do produto (fgets() deixa o '\n' final lá!)?
E se o nome do produto tiver mais que 60 chars?

PS: int main() não é C, mas C++. fflush(stdin) está errado (fflush() deve ser usado apenas em streams de saída).

Editado por fredericopissarra
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...

@FredeicoPissarra         você disse que fflush está errado .

fflush ( stdin ) ;    ///  estAh  errado , (fflush() deve ser usado apenas em streams de saIda).

mas o que pode acontecer se colocar esse fflush( stdin ) , na entrada de dados ,  antes do scanf e/ou fgets ? 

  vejo que em alguns casos ele evita algum bug desses comandos .

Link para o comentário
Compartilhar em outros sites

Qualquer coisa pode acontecer, inclusive um segmentation fault.

ISO 9899 7.21.5.2 § 2:
If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...