Exercicio. ajuda / explicaçao

Para não estar a fazer o teu trabalho de casa :-), em vez de escrever pseudo-codigo escrvi o programa (Perl):
Código:
#!/usr/bin/perl 
use strict;
use warnings;

# ------------------------------------------------------------------------------
# Pretende-se simular o funcionamento de uma maquina de venda de cafe. Admite-se
# que o custo do cafe e de 40 centimos. A maquina aceita moedas de qualquer
# valor (valido) mas so da troco em moedas de 10, 20 e 50 centimos.
# O troco deve ser calculado de forma a corresponder a menor
# quantidade possivel de moedas. Simule a maquina de cafe e indique quantas
# moedas de cada valor a maquina devera dar de troco.
# ------------------------------------------------------------------------------

my $preco_cafe = 40;
my @moedas_aceites = qw/1 2 5 10 20 50 100 200/;
my @moedas_trocos = qw/10 20 50/;
my $recebido = 0;
my $moedas_troco;
my $em_falta = $preco_cafe;

while ($recebido < $preco_cafe) {
    
    $em_falta = ($preco_cafe - $recebido);

    print "Introduza uma moeda (faltam " . $em_falta . " centimos): ";

    my $introduzido;
    chomp($introduzido = <>);

    # Se nao foi introduzida uma moeda, reiniciamos
    redo if !$introduzido;
    
    # So aceitamos inteiros
    $introduzido =~s/\D/0/gmx;

    # Por default nao aceitamos a moeda
    my $aceita_moeda = 0;

    # So aceitamos moedas validas
    if (grep {$_ eq $introduzido } @moedas_aceites) {$aceita_moeda = 1}

    # Se o valor recebido obrigar a troco, so aceitamos a moeda se o troco
    # for convertivel na moeda pre-definida de menor valor
    if ($introduzido > $preco_cafe && $aceita_moeda == 1) {

        # Por default voltamos a nao aceitar a moeda
        $aceita_moeda = 0; 
        
        foreach my $moeda (sort @moedas_trocos) {
            
            if ( ($em_falta / $moeda) =~/^\d+$/ ) {
                $aceita_moeda = 1;
                last;
            }
        }

    }

    if ($aceita_moeda == 1) {
        $recebido += $introduzido
    } else {
        print "Moeda nao aceite!\n";
    }

}

my $troco = ($recebido - $preco_cafe);

if ( $troco > 0 ) {

    # Variavel 'temporaria' para nao fazermos o reset ao valor do troco
    my $temp_troco = $troco;
    
    foreach my $moeda (sort {$b<=>$a} @moedas_trocos) {

        next if $moeda > $temp_troco;

        while ($temp_troco >= $moeda) {
            $moedas_troco->{$moeda}++;
            $temp_troco -= $moeda;
        }
    
    }
}

print "\n", "-" x 50, "\n";
print "Recebido: ", $recebido, " centimos\n";
print "A devolver: ", $troco, " centimos\n";
print "   $moedas_troco->{$_} moeda(s) de $_ centimos\n"
 foreach sort {$b<=>$a} keys %$moedas_troco;

Exemplo:
Código:
$ perl maquina_cafe.pl
Introduza uma moeda (faltam 40 centimos): 30
Moeda nao aceite!
Introduza uma moeda (faltam 40 centimos): 10
Introduza uma moeda (faltam 30 centimos): 2
Introduza uma moeda (faltam 28 centimos): 100
Moeda nao aceite!
Introduza uma moeda (faltam 28 centimos): 5
Introduza uma moeda (faltam 23 centimos): 2
Introduza uma moeda (faltam 21 centimos): 1
Introduza uma moeda (faltam 20 centimos): 200

--------------------------------------------------
Recebido: 220 centimos
A devolver: 180 centimos
   3 moeda(s) de 50 centimos
   1 moeda(s) de 20 centimos
   1 moeda(s) de 10 centimos

Depois disto, penso que fazes o trabalho em 5 minutos.
 
Última edição:
legion:
Sinceramente assim é um bocado estúpido...imagina que o pessoal que lá vai só "mete" moedas de 1 e 2€...o troco serão as moedas de 10,20 e 50 cents...até aqui tudo bem...e quando acabarem as moedas de 10, 20 e 50 cêntimos?

A máquina n dá troco?! Logo n se esqueçam de implementar esta função..a resolução depende do que vais utilizar para guardar as moedas que estão na máquina, para o troco..
A questão não é se isto faz sentido. Aliás, o que faria sentido seria a máquina poder dar troco com as moedas que recebe.

No caso actual, a máquina só deverá aceitar a moeda se o troco for possível com N moedas de valor mais baixo (neste exemplo, 10 centimos). Caso contrário, devolve a moeda introduzida. Não é pedido para verificar se a máquina tem essas N moedas disponíveis.
 
A questão não é se isto faz sentido. Aliás, o que faria sentido seria a máquina poder dar troco com as moedas que recebe.

No caso actual, a máquina só deverá aceitar a moeda se o troco for possível com N moedas de valor mais baixo (neste exemplo, 10 centimos). Caso contrário, devolve a moeda introduzida. Não é pedido para verificar se a máquina tem essas N moedas disponíveis.

Exacto..basicamente eu estava-me a referir a isso..

Mas por outras palavras...e foi tb um modo de lembrar ao user que criou esta thread para n se esquecer de implementar essa função...

cump's
 
Mas então como ficamos? como é suposto ficar o pseudo-código?
Agradecia mesmo se me ajudassem, não percebo mesmo nada disto e já tenho esta cena para entregar até segunda-feira... :(
 
olha o que eu vim a encontrar :P

eu sou do teu ano pá... e essa cena e para entregar segunda...

Ler (Valor)
Troco ← Valor – 40
Moeda50 ← Troco / 50
Moeda20 ← (Troco % 50) / 20
Moeda10 ← ((Troco % 50) % 20) / 10
ve lá se te orientas com isso... muda o nome das variaveis e coiso e tal...

inte...

Forrest 69
 
Back
Topo