guilhoto Posted May 6, 2012 at 12:03 PM Report #453382 Posted May 6, 2012 at 12:03 PM tenho que fazer um prograga que permite simular o funcionamento de uma máquina de café. O Custo de cada café é de 0.35€. A máquina aceita moedas de 0.05€, 0.10€, 0.20€, 0.50€, 1€ e 2€. A máquina deve calcular o troco minimizando a quantidade de moedas a devolver ao cliente. esta me a dar este erro:27 cannot convert `float' to `float*' for argument `1' to `void moedas(float*, float, float*)' alguem me sabe dizer o que é e o que tenho que fazer para ficar bem?? agradecia qualquer ajuda, obrigado 😄 #include <stdio.h> #include <stdlib.h> void moedas(float *dinheiro, float moedas, float *troco){ troco = 0; while (*dinheiro >= moedas){ *dinheiro = *dinheiro - moedas; *troco = *troco + 1; } } main(){ float dinheiro, moeda, troco100, troco50, troco20, troco10, troco5; printf("********BEM-VINDO A MAQUINA DE CAFE*********"); printf("Cada cafe custa 0.35€, quanto dinheiro vai introduzir:\n"); scanf(" %f", &dinheiro); if(dinheiro<0.35){ printf("Tem que meter mais dinheiro!\n"); } else { dinheiro = (dinheiro*100)-35; moedas(&dinheiro, 100, &troco100); moedas(&dinheiro, 50, &troco50); moedas(&dinheiro, 20, &troco20); moedas(&dinheiro, 10, &troco10); moedas(&dinheiro, 5, &troco5); printf("o troco sera de %d moedas de 1, %d moedas de 0.5, %d moedas de 0.2, %d moedas de 0.1, %d moedas de 0.05 \n",moedas(*dinheiro,100,*troco100), moedas(dinheiro,50,troco50), moedas(dinheiro,20,troco20), moedas(dinheiro,10,troco10), moedas(dinheiro,5,troco5)); } system("pause"); }
bubulindo Posted May 6, 2012 at 12:14 PM Report #453384 Posted May 6, 2012 at 12:14 PM printf("o troco sera de %d moedas de 1, %d moedas de 0.5, %d moedas de 0.2, %d moedas de 0.1, %d moedas de 0.05 \n", moedas(*dinheiro,100,*troco100), moedas(dinheiro,50,troco50), moedas(dinheiro,20,troco20), moedas(dinheiro,10,troco10), moedas(dinheiro,5,troco5)); Porque é que nas 4 últimas chamadas à função moedas, usas a variável em vez do endereço da mesma? include <ai se te avio> Mãe () { }
pmg Posted May 6, 2012 at 12:17 PM Report #453385 Posted May 6, 2012 at 12:17 PM Alḿ do que disse o bubulindo, dentro da função não te esqueças de meter o asterisco antes do troco! What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted May 6, 2012 at 12:23 PM Author Report #453386 Posted May 6, 2012 at 12:23 PM na funçao o asterisco esta antes do troco...tenho 1 antes do troco e um antes do dinheiro... sim ja fiz isso bubulina mas agora da me tambem este erro invalid type argument of `unary *'
guilhoto Posted May 6, 2012 at 12:25 PM Author Report #453387 Posted May 6, 2012 at 12:25 PM ali no troco=0 faltava um * tens razao...mas continua a dar o erro "invalid type argument of `unary *' "
pmg Posted May 6, 2012 at 12:32 PM Report #453388 Posted May 6, 2012 at 12:32 PM "unary *" é o operador de indirecção; não o podes aplicar a coisas que não sejam ponteiros. float preco; printf("%d", *preco); Coisas erradas no código acima: 1) *preco :: preco não é um ponteiro 2) imprimir um float com "%d" What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted May 6, 2012 at 02:27 PM Author Report #453396 Posted May 6, 2012 at 02:27 PM imprimir um float com %d ja corrigi...mas o do preço nao percebi...nao tenho nenhuma variavel chamada preço...estas a falar da variavel dinheiro, ou troco? sao as unicas que aplico a indireçao...
pmg Posted May 6, 2012 at 02:49 PM Report #453400 Posted May 6, 2012 at 02:49 PM Hmmm ... eu não estava com atenção. Mas o ponto levantado é válido tanto para a variável dinheiro como para troco. Repara: Tens a variável declarada normalmente float dinheiro; e depois aplicas-lhe o operador de indirecção printf("%f", *dinheiro); /* dinheiro não é um ponteiro */ Mas esse operador só pode ser aplicado a ponteiros! What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted May 6, 2012 at 03:22 PM Author Report #453403 Posted May 6, 2012 at 03:22 PM entao o que devo fazer? aplique ou nao a indireçao da-me erro, mas erros diferentes...
guilhoto Posted May 6, 2012 at 04:21 PM Author Report #453407 Posted May 6, 2012 at 04:21 PM tou a fritar completamente...da-me erro faça o que fizer, nao ha maneira de resolver este exercicio?
pmg Posted May 6, 2012 at 05:29 PM Report #453418 Posted May 6, 2012 at 05:29 PM (edited) Isto e o teu codigo original. Le os comentarios no meio do codigo #include <stdio.h> #include <stdlib.h> void moedas(float *dinheiro, float moedas, float *troco){ moedas ou e a funcao ou um parametro. Nao pode ser as duas coisas. troco = 0; troco, de acordo com os parametros, e um ponteiro. Mete-lo a 0 e o mesmo que fazer "troco = NULL;" while (*dinheiro >= moedas){ *dinheiro = *dinheiro - moedas; *troco = *troco + 1; } } main(){ float dinheiro, moeda, troco100, troco50, troco20, troco10, troco5; Sem uma boa razao para usar float, prefere usar double. Neste caso nao vejo nenhuma boa razao para usar float. printf("********BEM-VINDO A MAQUINA DE CAFE*********"); printf("Cada cafe custa 0.35€, quanto dinheiro vai introduzir:\n"); scanf(" %f", &dinheiro); if(dinheiro<0.35){ printf("Tem que meter mais dinheiro!\n"); } else { dinheiro = (dinheiro*100)-35; moedas(&dinheiro, 100, &troco100); Repara que aqui ja mudaste o dinheiro (o endereco foi passado para a funcao) e o troco100. moedas(&dinheiro, 50, &troco50); Repara que aqui mudaste o dinheiro outra vez e o troco50. moedas(&dinheiro, 20, &troco20); moedas(&dinheiro, 10, &troco10); moedas(&dinheiro, 5, &troco5); printf("o troco sera de %d moedas de 1, %d moedas de 0.5, %d moedas de 0.2, %d moedas de 0.1, %d moedas de 0.05 \n",moedas(*dinheiro,100,*troco100), moedas(dinheiro,50,troco50), moedas(dinheiro,20,troco20), moedas(dinheiro,10,troco10), moedas(dinheiro,5,troco5)); Que print tao grande! Sugestao: divide a linha enorme em varias linhas mais pequenas. Nesta altura da execucao do programa, o "dinheiro" ja foi alterada varias vezes nas funcoes anteriores, assim como os diversos "troco*". Nao precisas de chamar a funcao outra vez. } system("pause"); } Edited May 14, 2012 at 09:43 AM by pmg GeSHi update What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted May 6, 2012 at 05:44 PM Author Report #453424 Posted May 6, 2012 at 05:44 PM mas pmg...nao sei como corrigir isso :S...
pmg Posted May 6, 2012 at 05:55 PM Report #453428 Posted May 6, 2012 at 05:55 PM Imediatamente antes do printf enorme, supondo que o utilizador introduziu 1 euro, qual e o valor das variaveis "dinheiro", "troco100", "troco50", ...? Nota que calculas o troco duas vezes: uma vez bem antes do printf, e outra vez mal dentro do printf. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted May 6, 2012 at 06:15 PM Author Report #453434 Posted May 6, 2012 at 06:15 PM pmg, nao podes ler e responder a mensagem que te mandei?
pmg Posted May 6, 2012 at 06:22 PM Report #453436 Posted May 6, 2012 at 06:22 PM (edited) Experimenta nao chamar a funcao dentro do printf ... Ja a chamaste antes do printf ... usa os valores calculadas com a chamada anterior. printf("o troco sera de %d moedas de 1, %d moedas de 0.5, %d moedas de 0.2, %d moedas de 0.1, %d moedas de 0.05 \n", (int)troco100, (int)troco50, (int)troco20, (int)troco10, (int)troco5); Nota as conversoes de float para int dentro do printf. Edited May 14, 2012 at 09:43 AM by pmg GeSHi update What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted May 6, 2012 at 06:32 PM Author Report #453438 Posted May 6, 2012 at 06:32 PM ja nao da erro...mas quando testo diz, cafe.exe stoped working...
pmg Posted May 6, 2012 at 09:06 PM Report #453463 Posted May 6, 2012 at 09:06 PM ja nao da erro...mas quando testo diz, cafe.exe stoped working... Altura de usares o debugger :-) Executa o programa linha a linha e descobre em que linha e que ele deixa de trabalhar. Depois fazes um trabalho de detective ate descobrir porque essa linha nao faz o que era suposto. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted May 7, 2012 at 05:54 PM Author Report #453615 Posted May 7, 2012 at 05:54 PM desisto...nao consigo fazer isto...
pmg Posted May 7, 2012 at 09:17 PM Report #453647 Posted May 7, 2012 at 09:17 PM Eu ja devia ter tido isto. Configura o teu compilador para dar o maximo de warnings possivel. Depois altera o teu programa ate ele compilar sem warnings. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted May 8, 2012 at 06:31 PM Author Report #453926 Posted May 8, 2012 at 06:31 PM pmg obrigado a serio 😉 e desculpa ter-te massado com isto...mas nao da mesmo...nao consigo fazer este programa e desisto...mais tarde quando dominar o c tento de novo mas por agora tenho q arranjar alguma maneira do stor perceber que nao consigo...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now