Jump to content
  • 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

Recommended Posts

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")

Share this post


Link to post
Share on other 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"

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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"

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

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

×

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.