Jump to content
Flames

Vending machine actualizado

Recommended Posts

Flames

É assim pessoal com ajuda ai de um rapaz consegui reduzir EM GRANDE quantidade o meu código mas persiste num problema apartir de 10 centimos inclusive dá asneira conta de uma maneira estranha :S segue-se o código: FUNCAO TROCO onde reside o mistério :O

#include <stdio.h>
#include <stdlib.h>
#define L1 8
#define L2 9
#define L3 8
int listamoedasmaquina[L1];
float listamoedasbolso[L2];
float listavalormoedas[]={2,1,0.50,0.20,0.10,0.05,0.02,0.01};
int listatroco[]={0,0,0,0,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 i;
    for(i=0;i<8;i++){
        printf("%d",i);
        while((restotroco>=listavalormoedas[i]) && (listamoedasmaquina[i]>0)){
            restotroco-=listavalormoedas[i];
            listatroco[i]+=1;
            printf("%f\n",restotroco);
        }
        printf("saiste do while \n");
    }
printf("Troco: ");
int x;
for (x=0;x<L3;x++){
printf("%d ",listatroco[x]);
    }

}
int main()
{
printf("Insira a quantidade de moedas existentes na máquina\n");
moedasmaquina();
printf("Insira a quantidade de moedas existentes no bolso\n");
bolsomoedas();
somamoedas();
return 0;
}


Share this post


Link to post
Share on other sites
Localhost

A tua função troco pode ser simplificada visto que a lista de moedas está ordenada por ordem decrescente.

Vou deixar aqui um exemplo:

// list: vector com moedas
// return_coins: vector que contém o valor das moedas que vão ser dadas no troco
// size: tamanho do vector das moedas
// change: valor do troco

void give_change (int *list, int *return_coins, int size, int change)
{
    int k = 0;

    while (change > 0)
    {
         for (k = 0; k < size; k++)
            if (list[k] <= change)
            {
                 return_coins[k]++;
                 change -= list[k];
                 break; 
            }
    }
}


here since 2009

Share this post


Link to post
Share on other sites
daj

// list: vector com moedas
void give_change (int *list, int *return_coins, int change)
{
}

// sizeof (list) / sizeof (int): pequeno truque para termos o tamanho do vector das moedas

Olha que o sizeof de um array é diferente do sizeof de um apontador. Estás a pedir muito ao compilador para que ele adivinhe o que vem atrás do int *list.

Share this post


Link to post
Share on other sites
brunoais

A tua função troco pode ser simplificada visto que a lista de moedas está ordenada por ordem decrescente.

Vou deixar aqui um exemplo:

// list: vector com moedas
// return_coins: vector que contém o valor das moedas que vão ser dadas no troco
// change: valor do troco

void give_change (int *list, int *return_coins, int change)
{
    int k = 0, j = 0;

    while (change > 0)
    {
         for (k = 0; k < sizeof (list) / sizeof (int); k++)
            if (list[k] <= change)
            {
                 return_coins[j++] = list[k];
                 change -= list[k];
                 break; 
            }
    }
}

// sizeof (list) / sizeof (int): pequeno truque para termos o tamanho do vector das moedas

No final, no vector return_coins vais ter as moedas utilizadas para dar o troco.

Não sei se esse código está bem pensado. Mas para ficar correctamente programado:

// list: vector com moedas
// return_coins: vector que contém o valor das moedas que vão ser dadas no troco
// change: valor do troco

void give_change (int *list, long listSize, int *return_coins, int change)
{
    int k = 0, j = 0;
    while (change > 0)
    {
         for (k = 0; k < listSize; k++)
            if (list[k] <= change)
            {
                 return_coins[j++] = list[k];
                 change -= list[k];
                 break; 
            }
    }
}

// sizeof (list) / sizeof (int): pequeno truque para termos o tamanho do vector das moedas


"[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
Localhost

Têm razão. Atenção que o código não foi testado por isso nem pensei nesse pormenor.

Quanto a estar bem pensado ou não, acho que esta é a melhor maneira de resolver este problema.


here since 2009

Share this post


Link to post
Share on other sites
daj

Por falar em bem programado, estou a pensar mal ou deverias ter o tipo de k igual ao tipo de listSize? É que não vale de muito receberes um long para tamanho quando só consegues indexar até ao valor máximo positivo de um int. E já agora, ambos deveriam ser size_t.

return_coins dá uma lista das moedas utilizadas? E se o troco tiver duas moedas do mesmo valor, são dois itens dessa lista? Então parece-me que isso torna muito complicado para o chamador da função saber o tamanho do array a passar em return_coins. Quanto muito, a posição return_coins[ i ] deveria ter o número de moedas de valor list[ i ] utilizadas no troco, não?

Share this post


Link to post
Share on other sites
daj

Acrescento só a nota, para referência futura, de que a função assume que a máquina tem infinitas moedas de cada valor. Não sendo esse o caso pretendido, é necessário verificar:

- se foi atingido um estado em que as moedas disponíveis não são válidas para o troco a dar

- decrementar uma unidade no contador de moedas de um valor sempre que se escolhe essa moeda para troco

- repor as moedas caso seja atingido um estado em que não é possível dar troco

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.