Jump to content

Estou com um problema no meu código em C


Scania_13

Recommended Posts

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 to comment
Share on other sites

  • Administrators

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 to comment
Share on other 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).

Edited by fredericopissarra
  • Curtir 1
Link to comment
Share on other sites

  • 2 months later...

@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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...