Ir para o conteúdo
Flames

Troco minimo com notas e moedas

Mensagens Recomendadas

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á :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.