Jump to content
Flames

Troco minimo com notas e moedas

Recommended Posts

Flames

Pessoal existe alguma alternativa à seguinte forma de algoritmo que apliquei? (reduzindo linhas de código e eventualmente aumentando eficiencia)

#include <stdio.h>
#include <stdlib.h>
int main()

{

    int troco,n50,n20,n10,n5,n2,n1;
    /*inserir a quantia */

    printf("insira o troco");

    scanf("%d",&troco);

    /*calculo de 50 */

    n50=troco/50;
    troco=troco%50;

    /*calculo de 20 */

    n20=troco/20;
    troco=troco%20;

    /*calculo de 10 */

    n10=troco/10;
    troco=troco%10;

    /*calculo de 5 */

    n5=troco/5;
    troco=troco%5;

/*calculo de 2 */

    n2=troco/2;
    troco=troco%2;

/*calculo de 1 */

    n1=troco/1;
    troco=troco%1;

    printf("%d nota de 50\n%d nota(s) de 20\n%d nota(s) de 10\n%d nota(s) de 5\n%d moeda(s) de 2\n%d moeda de 1",n50,n20,n10,n5,n2,n1);

return 0;

}

Eu tentei pensar num for mas a sequencia 50,20,10,5,2,1 não é uma sequencia mt facil a primeira vista porque de 50 para 20 nao é metade mas ja 20 para 10 e 10 para 5 é metade não sei como aplicar aqui um for...

Desculpem a ignorância e obrigado desde já :)

Share this post


Link to post
Share on other sites
pmg

Em vez de tentares meter a sequencia num ciclo for, mete-a num array e o ciclo for a passear pelo array

int seqvalor[] = {50, 20, 10, 5, 2, 1};
numvalores = sizeof seqvalor / sizeof *seqvalor; /* 6 */
for (i = 0; i < numvalores; i++) {
    /* usa seqvalor[i] para cada moeda */
}


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
Flinger

Podes usar vectores:

int valores[]={50,20,10,5,2,1};

int troco[6]={0,0,0,0,0,0};

E depois usar um for para percorrer as várias posições, sendo que usas valores como divisor, e troco para guardar o resultado.

... pois :)

Share this post


Link to post
Share on other sites
veaoum

Bem só uma hipótese sem divisões, só para ser diferente mais nada  :cheesygrin:

#include <stdio.h>
#include <stdlib.h>
int main()

{

    int troco=n50=n20=n10=n5=n2=n1=0;
    /*inserir a quantia */

    printf("insira o troco");

    scanf("%d",&troco);

   while(troco>1){
            switch troco {
                    case >50: n50++;troco-=50;break;
                    case >20: n20++;troco-=20;break;
                    case >10: n10++;troco-=10;break;
                    case >5: n5++;troco-=5;break;
                    case >2: n2++;troco-=2;break;
                    default: n1++;troco-=1;
                  }
            }
    printf("%d nota de 50\n%d nota(s) de 20\n%d nota(s) de 10\n%d nota(s) de 5\n%d moeda(s) de 2\n%d moeda de 1",n50,n20,n10,n5,n2,n1);

return 0;

}

Agora se um troco for com centimos ja tens que alterar o teu scanf() e acrescentar case's. uma duvida não tenho a certeza que no case seja aceite coisas com >50 mas se não for basta trocar para if apenas ficava mais feio.

Share this post


Link to post
Share on other sites
pmg

Bem só uma hipótese sem divisões, só para ser diferente mais nada  :cheesygrin:

/* ... */
            switch troco {
                    case >50: n50++;troco-=50;break;
/* ... */

Isto não é válido em C, e, se funcionasse, tinha o erro da falta do 50 (seria case >= 50).

Se quiseres fazer isso com switch() case precisas de explicitar os cases todos

/* ... */
            switch troco {
                    /* etc */
                    case 62:
                    case 61:
                    case 60:
                    case 59:
                    case 58:
                    case 57:
                    case 56:
                    case 55:
                    case 54:
                    case 53:
                    case 52:
                    case 51:
                    case 50:
                            n50++; troco -= 50; break;
/* ... */


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

mas se colocar case >= 50 ele funciona?!

Não. O que metes a seguir ao case tem de ser uma constante de tipo int.

Se experimentaste e funcionou, então não experimentaste com um compilador de C.


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
veaoum

não, não exprimentei. dai a questão.... então teria que ser com if mas fica mais feio/grande.....

Share this post


Link to post
Share on other sites
taviroquai

Isso é um problema do tipo Knapsack.

http://en.wikipedia.org/wiki/Knapsack_problem

Podes ainda criar um ciclo while em que vai colocando as moedas, das maiores para as menores, dentro de um array (troco) enquanto o troco não estiver completo. Assim, podes ainda verificar se existem moedas para dar troco ou não e devolver um erro.

Share this post


Link to post
Share on other sites
leandro.costamachado@gmail
/*eu criei sem laços e com um pouco mais de trabalho mas acredito que seja mais ou menos isso so que com moedas*/

#include <stdio.h>
#include <math.h>

int main(){
    float q1, q2, q3, q4, q5, n1, n2, n3, n4, n5, total, vezes;
        
    printf("\n Digite a quantidade de moedas de 1.00: ");
        scanf("%f",& q1);
    printf("\n Digite a quantidade de moedas de 0.50: ");
        scanf("%f",& q2);
    printf("\n Digite a quantidade de moedas de 0.25: ");
        scanf("%f",& q3);
    printf("\n Digite a quantidade de moedas de 0.10: ");
        scanf("%f",& q4);
    printf("\n Digite a quantidade de moedas de 0.05: ");
        scanf("%f",& q5);
    //============================== valores =============================
    n1 = 1.00;
    n2 = 0.50;
    n3 = 0.25;
    n4 = 0.10;
    n5 = 0.05;
    
    q1 = n1 * q1;
    q2 = q2 * n2;
    q3 = q3 * n3;
    q4 = q4 * n4;
    q5 = q5 * n5;
    
    total = q1 + q2 + q3 + q4 + q5;
    
    printf("o total eh: %f", total);
    
    return 0;
}

 

Share this post


Link to post
Share on other sites
HappyHippyHippo
21 horas atrás, leandro.costamachado@gmail disse:

/*eu criei sem laços e com um pouco mais de trabalho mas acredito que seja mais ou menos isso so que com moedas*/

#include <stdio.h>
#include <math.h>

int main(){
    float q1, q2, q3, q4, q5, n1, n2, n3, n4, n5, total, vezes;
        
    printf("\n Digite a quantidade de moedas de 1.00: ");
        scanf("%f",& q1);
    printf("\n Digite a quantidade de moedas de 0.50: ");
        scanf("%f",& q2);
    printf("\n Digite a quantidade de moedas de 0.25: ");
        scanf("%f",& q3);
    printf("\n Digite a quantidade de moedas de 0.10: ");
        scanf("%f",& q4);
    printf("\n Digite a quantidade de moedas de 0.05: ");
        scanf("%f",& q5);
    //============================== valores =============================
    n1 = 1.00;
    n2 = 0.50;
    n3 = 0.25;
    n4 = 0.10;
    n5 = 0.05;
    
    q1 = n1 * q1;
    q2 = q2 * n2;
    q3 = q3 * n3;
    q4 = q4 * n4;
    q5 = q5 * n5;
    
    total = q1 + q2 + q3 + q4 + q5;
    
    printf("o total eh: %f", total);
    
    return 0;
}

 

pelo que percebi o objectivo é saber a quantidade de cada elemento que compõem o troco com menor elementos

e não o total com a lista de elementos  


IRC : sim, é algo que ainda existe >> #p@p

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.