Ir ao conteúdo

Posts recomendados

Postado

Abaixo a tentantiva de fazer umas das questões da Uri Judge, porém está executando parcialmente e dando erro, após muito tentar resolver resolvi solicitar um help, se alguém puder me ajudar!

 

<

#include <iostream>

using namespace std;

 

int main(){

    float valor, n100=0, n50=0, n20=0, n10=0, n5=0, n2=0, m1=0, m50=0, m25=0, m10=0, m05=0, m01=0;

 

    cin>>valor; 

 

    while(valor==0){

        if(valor>=100){

            n100++;

            valor=valor-100;

        }

        if(valor==50){

            n50++;

            valor=valor-50;

        }

        if(valor==20){

            n20++;

            valor=valor-20;

        }

        if(valor==10){

            n10++;

            valor=valor-10;

        }

        if(valor==5){

            n5++;

            valor=valor-5;

        }

        if(valor==2){

            n2++;

            valor=valor-2;

        }

        // a baixo moedas

   

        if(valor==1){

            m1++;

            valor=valor-1;

        }

        if(valor==0.50){

            m50++;

            valor=valor-0.50;

        }

        if(valor==0.25){

            m25++;

            valor=valor-0.25;

        }

        if(valor==0.10){

            m10++;

            valor=valor-0.10;

        }

        if(valor==0.05){

            m05++;

            valor=valor-0.05;

        }

        if(valor==0.01){

            m1++;

            valor=valor-0.01;

        }

 

    }

    cout<<n100<<" nota(s) de R$ 100.00"<<endl;

    cout<<n50<<" nota(s) de R$ 50.00"<<endl;

    cout<<n20<<" nota(s) de R$ 20.00"<<endl;

    cout<<n10<<" nota(s) de R$ 10.00"<<endl;

    cout<<n5<<" nota(s) de R$ 5.00"<<endl;

    cout<<n2<<" nota(s) de R$ 2.00"<<endl;

   

    cout<<m1<<" moeda(s) de R$ 1.00"<<endl;

    cout<<m50<<" moeda(s) de R$ 0.50"<<endl;

    cout<<m25<<" moeda(s) de R$ 0.25"<<endl;

    cout<<m10<<" moeda(s) de R$ 0.10"<<endl;

    cout<<m05<<" moeda(s) de R$ 0.05"<<endl;

    cout<<m01<<" moeda(s) de R$ 0.01"<<endl;

 

    return 0;

}

>

  • Curtir 1
Postado
#include <iostream>

using namespace std;

 

int main(){

    float valor, n100=0, n50=0, n20=0, n10=0, n5=0, n2=0, m1=0, m50=0, m25=0, m10=0, m05=0, m01=0;

 

    cin>>valor; 

 

    while(valor>=0.01){

        if(valor>=100){

            n100++;

            valor=valor-100;

        }   if(valor>=50){

            n50++;

            valor=valor-50;

        } if(valor>=20){

            n20++;

            valor=valor-20;

        }  if(valor>=10){

            n10++;

            valor=valor-10;

        } if(valor>=5) {

            n5++;

            valor=valor-5;

        }  if(valor>=2){

            n2++;

            valor=valor-2;

        } 

        // a baixo moedas
        if(valor>=1.0){

            m1++;

            valor=valor-1.0;

        } 

        if(valor>=0.50){

            m50++;

            valor=valor-0.50;

        } 

        if(valor>=0.25){

            m25++;

            valor=valor-0.25;

        } 

        if(valor>=0.10){

            m10++;

            valor=valor-0.10;

        } 

        if(valor>=0.05){

            m05++;

            valor=valor-0.05;

        } 

        if(valor>=0.01){

            m1++;

            valor=valor-0.01;

        }

       

    }

    cout<<n100<<" nota(s) de R$ 100.00"<<endl;

    cout<<n50<<" nota(s) de R$ 50.00"<<endl;

    cout<<n20<<" nota(s) de R$ 20.00"<<endl;

    cout<<n10<<" nota(s) de R$ 10.00"<<endl;

    cout<<n5<<" nota(s) de R$ 5.00"<<endl;

    cout<<n2<<" nota(s) de R$ 2.00"<<endl;

   

    cout<<m1<<" moeda(s) de R$ 1.00"<<endl;

    cout<<m50<<" moeda(s) de R$ 0.50"<<endl;

    cout<<m25<<" moeda(s) de R$ 0.25"<<endl;

    cout<<m10<<" moeda(s) de R$ 0.10"<<endl;

    cout<<m05<<" moeda(s) de R$ 0.05"<<endl;

    cout<<m01<<" moeda(s) de R$ 0.01"<<endl;

 

    return 0;

}

 

  • Curtir 1
Postado

@Bernardo K Use o botão code, como explicado no primeiro post do forum

 

Não compare o saldo exatamente com 0. porque se trata de float. Imagine se o cara entrou com 100.0005 só para ver se você pensou nisso. E não pensou. E se for um lance de arredondamento e ficar lá 0.0000005? Nunca vai ser 0.0. Está errado

 

O que importa para acabar é que o saldo seja menor que a menor moeda, já que não pode dividi-la...

 

16 horas atrás, Bernardo K disse:

if(valor>=100){

            n100++;

            valor=valor-100;

        }

        if(valor==50){

            n50++;

            valor=valor-50;

        }

        if(valor==20){

 

Se usou >= na primeira comparação porque usou == em todas as outras? Está também errado

 

Testou o que acontece para um simples valor de 200? Não acha que devia usar duas notas de 100? Está errado.

 

Use else nos if ou continue. Ou melhor ainda use um loop para cada nota

 

Todos os valores inteiros que usou implicam em conversões. Evite isso e use um ponto em cada valor float ou double. Evite conversões implícitas.

 

@Flávio Pedroza Nenhuma palavra sobre o que mudou no programa? 

 

Testou isso? É preciso ir usando as notas de maior valor antes de seguir... Teste com 40.20 por exemplo ;) 

 

Porque espaço duplo no código todo?

 

 

  • Obrigado 1
Postado

Veja esse exemplo:

 

É muito chato rodar o programa e depois ficar esperando uma tela preta ou um prompt para digitar a única coisa que o programa pede, então o exemplo abaixo espera que se digite o valor direto na linha de comando, como abaixo. Claro que p é o nome do programa...

 


CH> ./p 388.56
Valor original: 388.56
1  nota (s) de R$    200 saldo ate aqui      200
1  nota (s) de R$    100 saldo ate aqui      300
1  nota (s) de R$     50 saldo ate aqui      350
1  nota (s) de R$     20 saldo ate aqui      370
1  nota (s) de R$     10 saldo ate aqui      380
1  nota (s) de R$      5 saldo ate aqui      385
1  nota (s) de R$      2 saldo ate aqui      387
1 moeda (s) de R$      1 saldo ate aqui      388
1 moeda (s) de R$    0.5 saldo ate aqui    388.5
1 moeda (s) de R$   0.05 saldo ate aqui   388.55
1 moeda (s) de R$   0.01 saldo ate aqui   388.56

CH> ./p 900
Valor original: 900
4  nota (s) de R$    200 saldo ate aqui      800
1  nota (s) de R$    100 saldo ate aqui      900

CH> ./p .03
Valor original: 0.03
3 moeda (s) de R$   0.01 saldo ate aqui     0.03
CH>

 

Para submeter isso a serviços de programação competitiva como o Online Judge --- que não é mais da URI --- é preciso se ater ao EXATO formato que o programa espera.

 

Não gosto desse tipo de serviço então nem tentei procurar.

 

O exemplo abaixo mostra uma maneira comum de fazer isso em C++ --- não no modo C como nos exemplos acima --- e pode servir de guia

 

O código de exemplo completo, em C++

 

#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char** argv)
{
    vector<pair<double, int>> valor
    {
        // a nota e quantas usou...
        {200., 0}, // com a inclusao do lobo guara :) 
        {100., 0},        {50.,  0},
        {20.,  0},        {10.,  0},
        {5.,   0},        {2.,   0},
        {1.,   0},        {.5,   0},
        {.25,  0},        {.1,   0},
        {.05,  0},        {.01,  0}
    };

    if (argc < 2)
    {
        cout << "Faltou o valor...\n";
        return -1;
    }

    double saldo = strtod(argv[1], nullptr);
    if (saldo < 0) saldo = -saldo;  // sem sacanagem!
    double original = saldo;
    cout << "Valor original: " << original << "\n";
    saldo += .005;  // soma meio centavo por segurança
    // conta o troco
    for (auto&& n : valor)
        while (saldo >= n.first)
        {   // da pra usar essa nota
            n.second += 1; // entao conta
            saldo -= n.first; // e desconta
        };
    const char* tipo[]  = {" moeda (s) de R$ ", "  nota (s) de R$ "};
    auto      parcial = 0.;
    // mostra o resultado
    for (auto&& n : valor)
    {
        if (n.second == 0) continue;  // não usou essa nota/moeda
        parcial += n.second * n.first;
        cout << n.second << tipo[n.first > 1.] << setw(6) << n.first
             << " saldo ate aqui " << setw(8) << parcial << "\n";
    }
    return 0;
}

 

Note que nem era preciso o segundo loop e já podia ir listando as  notas e então pode usar um loop só assim

 

EXEMPLO 2

 

o resultado claro é o mesmo só que o programa é menor. O anterior é mais fácil de ler.

 

#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char** argv)
{
    vector<pair<double, int>> valor
    {
        // a nota e quantas usou...
        {200., 0}, // com a inclusao do lobo guara :) 
        {100., 0},        {50.,  0},
        {20.,  0},        {10.,  0},
        {5.,   0},        {2.,   0},
        {1.,   0},        {.5,   0},
        {.25,  0},        {.1,   0},
        {.05,  0},        {.01,  0}
    };

    if (argc < 2)
    {
        cout << "Faltou o valor...\n";
        return -1;
    }

    double saldo = strtod(argv[1], nullptr);
    if (saldo < 0) saldo = -saldo;  // sem sacanagem!
    double original = saldo;
    cout << "Valor original: " << original << "\n";
    saldo += .005;  // soma meio centavo por segurança
    const char* tipo[]  = {" moeda (s) de R$ ", "  nota (s) de R$ "};
    auto        parcial = 0.;
    // conta o troco e mostra as notas e moedas usadas
    for (auto&& n : valor)
    {
        while (saldo >= n.first)
        {   // se da pra usar essa nota...
            n.second += 1; // conta essa
            saldo -= n.first; // arruma o saldo
        };
        if (n.second == 0) continue;  // não usou essa nota/moeda
        parcial += n.second * n.first;
        cout << n.second << tipo[n.first > 1.] << setw(6) << n.first
             << " saldo ate aqui " << setw(8) << parcial << "\n";
    }
    return 0;
}

 

  • Obrigado 1
Postado

Em relação aos exemplos que deixei, uma coisa a mais devia ser tratada:

 

há muito poucas notas para muitos possíveis valores a entregar. A maior nota vale apenas 200 então os valores podem incluir um grande número dessas notas. Sendo assim não é esperto usar no loop a subtração das notas maiores de uma em uma. 

 

Como vai ser feito apenas uma fez, nesse caso é mais eficiente contar diretamente quantas notas do maior valor serão usadas e simplesmente deduzir do saldo antes de entrar no loop.

 

Isso porque a divisão é muito mais lenta que a subtração e são poucas unidades de cada nota / moeda exceto a primeira.

 

Em resumo

 

    int N = (int) saldo / (int) valor[0].first; // quantas notas do maior valor?
    valor[0].second = N; // claro, usou essas
    saldo -= (double)(N * valor[0].first); // atualiza o saldo

 

basta isso.

 

O EXEMPLO 3

 

#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char** argv)
{
    vector<pair<double, int>> valor{
        // a nota e quantas usou...
        {200., 0},  // com a inclusao do lobo guara :)
        {100., 0}, {50., 0}, {20., 0}, {10., 0}, {5., 0},  {2., 0},
        {1., 0},   {.5, 0},  {.25, 0}, {.1, 0},  {.05, 0}, {.01, 0}};

    if (argc < 2)
    {
        cout << "Faltou o valor...\n";
        return -1;
    }

    double saldo = strtod(argv[1], nullptr);
    if (saldo < 0) saldo = -saldo;  // sem sacanagem!
    double original = saldo;
    cout << "Valor original: " << original << "\n";
    saldo += .005;  // soma meio centavo por segurança
    const char* tipo[]  = {" moeda (s) de R$ ", "  nota (s) de R$ "};
    auto        parcial = 0.;
    // sao poucas notas e muitos possiveis valores:
    // antes de tudo desconta do valor maior o
    // saldo em notas do maior valor...
    int N = (int) saldo / (int) valor[0].first; // quantas notas do maior valor?
    valor[0].second = N; // claro, usou essas
    saldo -= (double)(N * valor[0].first); // atualiza o saldo
    // conta o troco e mostra as notas e moedas usadas
    for (auto&& n : valor)
    {
        while (saldo >= n.first)
        {
            n.second += 1;
            saldo -= n.first;
        };
        if (n.second == 0) continue;  // não usou essa nota/moeda
        parcial += n.second * n.first;
        cout << setw(6) << n.second << tipo[n.first > 1.] << setw(6) << n.first
             << " saldo ate aqui " << setw(8) << parcial << "\n";
    }
    return 0;
}

 

A saída claro é a mesma.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!