Jump to content
Flames

problema na funcao...

Recommended Posts

Flames

Eu estava a fazer uma vending machine quando na parte de devolver troco comecei a desenvolver e criei uma funcao com varios if's (sim eu sei que isso não é programar é meter código ao monte mas é como o meu cerebro processa as coisas xS) deparei-me com um problema na funcao TROCO os if's funcionam bem até testar a moeda de 50 centimos mas dai para baixo nao funciona e nao faz qualquer sentido :S... Alguém me conseguiria explicar isso? segue-se o código:

Desculpem o incómodo...

#include <stdio.h>
#include <stdlib.h>
#define L1 3
#define L2 4
#define L3 4
int num1[L1];
float num2[L2];
double num3[]={2,1,0.50,0.20};
int num4[]={0,0,0,0};
float restotroco;
void moedasmaquina(void){
   int i;
    for (i=0;i<=L1;i++){
            scanf("%d",&num1[i]);}
}
void bolsomoedas(void){
  int x;
    for (x=0;x<=L2;x++){
            scanf("%f",&num2[x]);}
}
void mostrarbolsomoedas(void){
int i;
for(i = 0; i <=L2; i++){
    printf("%.0f ",num2[i]);
}

}
void somamoedas(void){

    int x;
    int z=0;
    float soma=0;
    for (x=1;x<=L2;x++){
soma+=num2[x]*num3[x-1];
    }
    if (soma<num2[0]){
            printf("troco: ");
            mostrarbolsomoedas();
            printf("valor insuficiente!");
            exit(0);
     }
     else{
     for (x=1;x<=L2;x++){ /*actualiza o dinheiro na máquina para soma= ou superior ao troco!*/
        num1[z]+=num2[x];
        z++;
}
/*int i;
    for(i = 0; i<=L1; i++){
        printf("%d ",num1[i]);testar a leitura do valor ACTUALIZADO a ver se está certa...*/
    }
     if (soma==num2[0]){
     printf("Esta pago!!!!");
     exit(0);

     }
     if (soma>num2[0]){
     restotroco=soma-num2[0];
     printf("%.2f\n",restotroco);
     troco();
     }
     }
void troco(){
    int x=0,z=0,w=0,y=0;
while(restotroco!=0){

      printf("estas dentro do while\n");
      if ((num3[0]<=restotroco) && num1[0]>0){
          printf("estas dentro do primeiro if\n");
        x++;
        num1[0]-=1;
        num4[0]=x;
        restotroco-=num3[0];
        }
        else if((num3[1]<=restotroco) && num1[1]>0){
          printf("estas dentro do segundo if\n");
        z++;
        num1[1]-=1;
        num4[1]=z;
        restotroco-=num3[1];
        }
       else if((num3[2]<=restotroco) && num1[2]>0){
          printf("estas dentro do terceiro if\n");
        w++;
        num1[2]-=1;
        num4[2]=w;
        restotroco-=num3[2];
        }
        else if((num3[3]<=restotroco) && num1[3]>0){
          printf("estas dentro do quarto if\n");
        w++;
        num1[3]-=1;
        num4[3]=w;
        restotroco-=num3[3];
        }
        else{
        int i;
        for (i=0;i<=L2;i++){
        num2[x+1]+=num4[x]; }
        printf("Troco : ");
        for (x=0;x<=L2;x++){
            printf("%.2f ",num2[x]);}
            printf(" troco indisponivel!!!!");
            exit(0);
        }

    }
printf("Troco: ");
for (x=0;x<L3;x++){
printf("%d ",num4[x]);
    }
printf("saiste do while \n");

}
int main()
{
printf("Insira a quantidade de moedas existentes na máquina\n");
printf("|2|1|0.5|0.1|0.05|0.02|0.01|\n");
moedasmaquina();
printf ("bolso\n");
bolsomoedas();
somamoedas();


return 0;
}

Share this post


Link to post
Share on other sites
brunoais

Esse código é difícil de interpretar.

Inventa melhores nomes para as variáveis.

Por exemplo: Uma variável com o nome num1 não tem significado a não ser q leia o código todo e não me esqueça do q estive a ler.

Para ciclos for usa sempre a conversão de usar o alfabeto de i a z para a(s) variáveis de controlo (há sítios q n tens dessa maneira).

Exemplo:

for (i=1;i<=that;i++){
   for (j=1;j<=othat;j++){
      for (k=1;k<=oothat;k++){
      }
   }
}

Tens a variáveis:

int x=0,z=0,w=0,y=0;

Q usas para controlo. No código n percebo exactamente q controlo é esse


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
bubulindo

Saber documentar o código é também algo importante a aprender que muitas vezes é descurado. :P

Eu nem sequer conseguir perceber onde testas a moeda de 50 centimos. :S

E trocar a variável num3 por moedas_disponiveis? Ou moedas? Dá muito mais informação.

Depois fazer um define do género:

#define    EURO2      0

#define    EURO1      1

#define    EURO0_5  2

#define    EURO0_2  3

Depois no código veríamos algo como:

     else if((moedas[EURO0_5]<=restotroco) && num1[2]>0){   

É mais simples, ou nem por isso? Isto é tão válido para nós que estamos a ver o código pela primeira vez hoje, como para ti se não olhares para isto durante uns dias.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Flames

desculpem estava e continuo tao aflito que nem pensei como alguem leria:

#include <stdio.h>
#include <stdlib.h>
#define L1 2
#define L2 3
#define L3 3
int listamoedasmaquina[L1];
float listamoedasbolso[L2];
float listavalormoedas[]={2,1,0.50,0.20};
int listatroco[]={0,0,0,0};
float restotroco;
void moedasmaquina(void){
   int i;
    for (i=0;i<=L1;i++){
            scanf("%d",&listamoedasmaquina[i]);}
}
void bolsomoedas(void){
  int x;
    for (x=0;x<=L2;x++){
            scanf("%f",&listamoedasbolso[x]);}
}
void mostrarbolsomoedas(void){
int i;
for(i = 0; i <=L2; i++){
    printf("%.0f ",listamoedasbolso[i]);
}

}
void somamoedas(void){

    int x;
    int z=0;
    float soma=0;
    for (x=1;x<=L2;x++){
soma+=listamoedasbolso[x]*listavalormoedas[x-1];
    }
    if (soma<listamoedasbolso[0]){
            printf("troco: ");
            mostrarbolsomoedas();
            printf("valor insuficiente!");
            exit(0);
     }
     else{
     for (x=1;x<=L2;x++){ /*actualiza o dinheiro na máquina para soma= ou superior ao troco!*/
        listamoedasmaquina[z]+=listamoedasbolso[x];
        z++;
}
/*int i;
    for(i = 0; i<=L1; i++){
        printf("%d ",num1[i]);testar a leitura do valor ACTUALIZADO a ver se está certa...*/
    }
     if (soma==listamoedasbolso[0]){
     printf("Esta pago!!!!");
     exit(0);

     }
     if (soma>listamoedasbolso[0]){
     restotroco=soma-listamoedasbolso[0];
     printf("%.2f\n",restotroco);
     troco();
     }
     }
void troco(){
    int x=0,z=0,w=0,y=0;
while(restotroco!=0){

      printf("estas dentro do while\n");
      if ((listavalormoedas[0]<=restotroco) && listamoedasmaquina[0]>0){
          printf("estas dentro do primeiro if\n");
        x++;
        listamoedasmaquina[0]-=1;
        listatroco[0]=x;
        restotroco-=2;
        }
        else if((listavalormoedas[1]<=restotroco) && listamoedasmaquina[1]>0){
          printf("estas dentro do segundo if\n");
        z++;
        listamoedasmaquina[1]-=1;
        listatroco[1]=z;
        restotroco-=1;
        }
       else if((listavalormoedas[2]<=restotroco) && listamoedasmaquina[2]>0){
          printf("estas dentro do terceiro if\n");
        w++;
        listamoedasmaquina[2]-=1;
        listatroco[2]=w;
        restotroco-=0.5;
        }
        else{
        int i;
        for (i=0;i<=L2;i++){
        listamoedasbolso[x+1]+=listatroco[x]; }
        printf("Troco : ");
        for (x=0;x<=L2;x++){
            printf("%.2f ",listamoedasbolso[x]);}
            printf(" troco indisponivel!!!!");
            exit(0);
        }

    }
printf("Troco: ");
for (x=0;x<L3;x++){
printf("%d ",listatroco[x]);
    }
printf("saiste do while \n");

}
int main()
{
printf("Insira a quantidade de moedas existentes na máquina\n");
printf("|2|1|0.5|0.1|0.05|0.02|0.01|\n");
moedasmaquina();
printf ("bolso\n");
bolsomoedas();
somamoedas();


return 0;
}

Eu tenho basicamente 4 listas a primeira listamoedasmaquina é a quantidade de moedas de cada tipo que o utilizador insere na maquina, a listamoedasbolso é o valor do produto a pagar e quantas moedas de cada tipo ele insere (4.5 2 1 0 0)----> nesse caso do código que esta ai impresso ele quer pagar 4 euros e meio e meteu duas moedas de 2 euros e 1 de 1 euro...

Depois tenho uma lista com o valor das moedas para na soma multiplicar com a quantidade e saber ao total o valor de moedas do ulizador no bolso...

Por fim a listatroco só é usada se houver troco e é feita pelos if's da seguinte forma:

SE a moeda da listavalormoedas for inferior ou igual E se houver moedas desse tipo na listamoedasmaquina ele entre nesse IF senao passa para o proximo:

(listavalormoedas[0]<=restotroco) && listamoedasmaquina[0]>0

ou seja este primeiro if é se 2 euros(por causa do indice) é menor que o restotroco E se existe na posicao da listamoedasmaquina que corresponde a 2 euros alguma moeda senao passa para o proximo IF

só que faz bem o if de 2 euros de 1 euro e de 50 centimos agora de 20 centimos para baixo NEM FAZ!!!! o programa que está ai só vai até 20 centimos para poderem ver que algo está a bater mal :S

Desculpem mais uma vez o incómod....

Share this post


Link to post
Share on other sites
PanKBoy

tambem estou com um problema:

na minha função, funciona bem, mas quando chega ás moedas de 0.05centimos, nao me da certo.

ele faz 0.05/0.05 e nao me dá 1. passa à frente e depois 0.05/0.02 dá-me duas moedas de 0.02.

alguém sabe porque de isto acontecer?

já tentei com variaveis do tipo float e double mas nenhum da! :s

Share this post


Link to post
Share on other sites
bubulindo

ele faz 0.05/0.05 e nao me dá 1. passa à frente e depois 0.05/0.02 dá-me duas moedas de 0.02.

Quanto é que dá então?

Poderá ter a ver com a precisão das variáveis?


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
PanKBoy

Quanto é que dá então?

Poderá ter a ver com a precisão das variáveis?

pois eu penso que sim. dá: 1.00001. como posso resolver isto?

Share this post


Link to post
Share on other sites
pinkyy

Flames...  Actualiza os teus arrays com estes valores... Estavas a definir apenas até aos 20cent.

int listamoedasmaquina[8];

float listamoedasbolso[9];

float listavalormoedas[]={2,1,0.50,0.20,0.10,0.05,0.02,0.01}

Share this post


Link to post
Share on other sites
Flames

Flames...  Actualiza os teus arrays com estes valores... Estavas a definir apenas até aos 20cent.

int listamoedasmaquina[8];

float listamoedasbolso[9];

float listavalormoedas[]={2,1,0.50,0.20,0.10,0.05,0.02,0.01}

Eu sei mas era apenas um teste... é que nem Até aos 20 centimos se faz alguma coisa

fica la dentro do while sem sair ...

Share this post


Link to post
Share on other sites
bubulindo

pois eu penso que sim. dá: 1.00001. como posso resolver isto?

multiplica por 100 e trunca o resultado. Nunca irás abaixo dos cêntimos de qualquer das formas. É uma ideia e nem sequer pensei muito, mas deve funcionar.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
daj

multiplica por 100 e trunca o resultado. Nunca irás abaixo dos cêntimos de qualquer das formas. É uma ideia e nem sequer pensei muito, mas deve funcionar.

Eu diria que é mais simples usar ints que representam cêntimos.

Share this post


Link to post
Share on other sites
bubulindo

Eu diria que é mais simples usar ints que representam cêntimos.

Ao multiplicar por 100 e truncar era a isso que me referia.

Estava a pensar se isto tivesse sido implementado num microcontrolador de 8 bits, certamente que não havia floats nem doubles para ninguém... e por consequência não havia esta dor de cabeça com as comparações infinitesimais.


include <ai se te avio>

Mãe () {

}

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

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