Jump to content
Sign in to follow this  
guilhoto

maquina de cafe

Recommended Posts

guilhoto

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 :D

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

Share this post


Link to post
Share on other sites
bubulindo

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 () {

}

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
guilhoto

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 *'

Share this post


Link to post
Share on other sites
guilhoto

ali no troco=0 faltava um * tens razao...mas continua a dar o erro "invalid type argument of `unary *' "

Share this post


Link to post
Share on other sites
pmg

"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!

Share this post


Link to post
Share on other sites
guilhoto

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...

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
guilhoto

entao o que devo fazer? aplique ou nao a indireçao da-me erro, mas erros diferentes...

Share this post


Link to post
Share on other sites
guilhoto

tou a fritar completamente...da-me erro faça o que fizer, nao ha maneira de resolver este exercicio?

Share this post


Link to post
Share on other sites
pmg

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 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!

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
pmg

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 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!

Share this post


Link to post
Share on other sites
guilhoto

ja nao da erro...mas quando testo diz, cafe.exe stoped working...

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
guilhoto

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...

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.