Scania_13 Postado Outubro 1, 2022 Postado Outubro 1, 2022 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
Administradores Fernando Mercês Postado Outubro 2, 2022 Administradores Postado Outubro 2, 2022 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
fredericopissarra Postado Outubro 3, 2022 Postado Outubro 3, 2022 (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 por fredericopissarra 1 Citar
Devair Postado Janeiro 3, 2023 Postado Janeiro 3, 2023 @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
fredericopissarra Postado Janeiro 3, 2023 Postado Janeiro 3, 2023 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
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.