Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

M!Gu3L

[RESOLVIDO] Simulador de Maquina de Venda Automatica

Mensagens Recomendadas

M!Gu3L

Boas,

É o seguinte, à uns tempos atrás comecei a programar um simulador de maquina de vendas automaticas, mas agora estou com dificuldades a fazer com que a maquina "diga" quais as moedas que vao sair para o troco. Ja fiz este código (em baixo) mas ele nao funciona sempre e nao percebo porquê. Por exemplo se tivermos uma quantia a pagar de 0,75€ e pagarmos com 0,80€ a maquina diz que o troco e de 0,05€, no entanto se pagarmos com 0,81€ ele ja nao diz a moeda de 0,01€, mas se pagarmos com 0,82€ ele ja acrescenta a de 0,02€. Da a entender que so funciona com os numeros pares, mas o algoritmo nao esta a testar isso.

Se alguem me puder ajudar agradeço imenso.

Cumprimentos

Miguel Nobre

Dim Troco As Single
Dim M(8) As Single
        Dim Moedas(8) As Single
        Dim i As Integer

        Moedas(0) = 2.0
        Moedas(1) = 1.0
        Moedas(2) = 0.5
        Moedas(3) = 0.2
        Moedas(4) = 0.1
        Moedas(5) = 0.05
        Moedas(6) = 0.02
        Moedas(7) = 0.01
        Troco = TextBox1.Text - TextBox2.Text
        For i = 0 To 7
            If Troco >= Moedas(i) Then
                M(i) += 1
                Troco -= Moedas(i)
                i = 0
            End If
        Next
        MsgBox("2: " & M(0) & "| 1: " & M(1) & "| 0.5: " & M(2) & "| 0.20: " & M(3) & "| 0.10: " & M(4) & "| 0.05: " & M(5) & "| 0.02: " & M(6) & "| 0.01: " & M(7), MsgBoxStyle.Information, "Troco")

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Olá M!Gu3L e bem-vindo,

Estás a operar com números decimais relativamente pequenos e não precisas de usar o tipo de dados Single.

Precisas de trabalhar com exactidão números pequenos e como tal deves usar o datatype Decimal.

Experimenta trocar todos os teus Single por Decimal e diz qualquer coisa. :)

Não te esqueças de converter as textboxes para o datatype correcto, sempre!

Deviam usar sempre o Option Strict On para se irem habituando a tratar os datatypes por você e não por tu como o VB vos faz pensar que podem fazer.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M!Gu3L

Mutio obrigado Ribeiro, eu ja estava mesmo a dar em maluco poruqe não via nada de mal na logica do algoritmo. Eu tambem ja tinha pensado nisso , inicialmente tinha double, e ja tinha andado a procura de tipos de dados mais pequenos mas nao encontrei.

Mais uma vez muito Obrigado!  :cheesygrin:

Miguel Nobre

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Double ainda pior :)

Tinhas percebido o problema rapidamente se tivesses feito um step-debug (F11) a partir de um breakpoint (F9) ou mesmo com um step-run(F11).

O IDE mostra-te os valores das variáveis em "tempo real", mesmo sem watchers, basta passar o rato por cima do nome da variável.

Tinhas notado que o valor ganhava casas decimais que "não existiam".


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M!Gu3L

Pois, so que tenho um problema, tenho o W7 x64  instalado, e ele nao tem o OLEDB e o meu programa vai buscar valores á BD e sem isso, nao funciona, resultado, faço Build, e vou à minha maquina virtual correr-lo. xD

De qualquer modo tambem não conhecia essa tecnica.

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M!Gu3L

Boas, desta vez e o seguinte, tenho uma tabela base de dados em Access com os seguintes campos:

ex:

ID | Moedas2 | Moedas1 | Moedas0,5 | Moedas0,2 | Moedas0,1 | Moedas0,05 | Moedas0,02 | Moedas0,01

Os campos com MoedasX são preenchidos pela quantidade de cada uma. (ID Chave Primaria)

O que eu queria fazer era em vez de por.

LinhaTroco = Me.MaquinaAutoDataSet.CarregarTroco.FindByID("1")

LinhaTroco.Moedas2 += quant

Queria ter uma variavel que iria "ser" a coluna a ser afectada por exemplo: Clicava no botao para adicionar moedas de 2€ e a variavel seria  X = Moedas2

e depois quando chamasse a Sub estaria:

LinhaTroco = Me.MaquinaAutoDataSet.CarregarTroco.FindByID("1")

LinhaTroco.X += quant

Não sei se me fiz entender, mas qualquer duvida perguntem, porque isto iria facultar imenso o meu trabalho!

Obrigado

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.