Scania_13 Postado Outubro 1, 2022 em 16:09 Compartilhar Postado Outubro 1, 2022 em 16:09 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; } 1 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Administradores Fernando Mercês Postado Outubro 2, 2022 em 01:47 Administradores Compartilhar Postado Outubro 2, 2022 em 01:47 Olá! Considere o seguinte: Inclua a <stdio.h>. Use uma função por linha. Fica melhor pra ler o código. Você não usa nenhuma função da <stdlib.h> nem da <string.h>. Pode remover esses includes. ? 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. 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. 1 Citar Link para o comentário Compartilhar em outros sites More sharing options...
fredericopissarra Postado Outubro 3, 2022 em 11:02 Compartilhar Postado Outubro 3, 2022 em 11:02 (editado) 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 Outubro 3, 2022 em 11:14 por fredericopissarra 1 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Devair Postado Janeiro 3, 2023 em 00:39 Compartilhar Postado Janeiro 3, 2023 em 00:39 @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 . Citar Link para o comentário Compartilhar em outros sites More sharing options...
fredericopissarra Postado Janeiro 3, 2023 em 14:18 Compartilhar Postado Janeiro 3, 2023 em 14:18 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. 1 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
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.