Jump to content
RMarinheir0

Divisão de notas e moedas. (Decomposição de números)

Recommended Posts

RMarinheir0

Olá a todos, chegou a minha vez de pedir-vos uma ajudinha, estou atualmente a desenvolver um programa que serve de exercício pertencente ao meu curso e não estou a "dar com o gato". O objetivo é o utilizador inserir um montante e automaticamente saber a divisão correta de moedas e notas do mesmo numero como no exemplo:

Valor inserido: 56€ logo:

Notas de 20€: 2

Notas de 10€: 1

Notas de 5€: 1

Moedas de 1€: 1

Queria apenas saber se é possível apenas usando coisas bastante simples como "If, Else e Elseif" pois não devo adiantar-me muito no módulo. O código atual que não funciona corretamente é:

Dim prodprice As Integer
Dim not20 As Integer
Dim not10 As Integer
Dim not5 As Integer
Dim coin1 As Integer
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
 prodprice = Val(TextBox7.Text)
 If prodprice >= 20 Then
	 not20 = not20 + 1
	 prodprice = prodprice - 20
 End If
 If prodprice >= 10 Then
	 not10 = not10 + 1
	 prodprice = prodprice - 10
 End If
 If prodprice >= 5 Then
	 not5 = not5 + 1
	 prodprice = prodprice - 5
 End If
 If prodprice >= 1 Then
	 coin1 = coin1 + 1
	 prodprice = prodprice - 20
 End If
 Label18.Text = not20
 Label19.Text = not10
 Label20.Text = not5
 Label21.Text = coin1

O código que consegui com ajuda na internet que realmente funciona é o seguinte:

Dim prodprice As Integer
Dim not20 As Integer
Dim not10 As Integer
Dim not5 As Integer
Dim coin1 As Integer
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
 prodprice = Val(TextBox7.Text)
 Do While prodprice >= 1
	 Select Case prodprice
		 Case Is >= 20
			 not20 = not20 + 1
			 prodprice = prodprice - 20
		 Case Is >= 10
			 not10 = not10 + 1
			 prodprice = prodprice - 10
		 Case Is >= 5
			 not5 = not5 + 1
			 prodprice = prodprice - 5
		 Case Is >= 1
			 coin1 = coin1 + 1
			 prodprice = prodprice - 20
	 End Select
	 Label18.Text = not20
	 Label19.Text = not10
	 Label20.Text = not5
	 Label21.Text = coin1
 Loop

A minha duvida é, posso seguir a ideia acima? Mas o que está mal? Vá, espero que me consigam ajudar, abraço!

Share this post


Link to post
Share on other sites
vikcch

Olá, criaste o tópico na secção errada, esta secção é para VB6 ou versões anteriores..

O código que consegui com ajuda na internet que realmente funciona é o seguinte:

.
.
.

A minha duvida é, posso seguir a ideia acima? Mas o que está mal?

O que está mal? acabaste de dizer que o código funciona....

Só com "If's" até devia dar mais iria ficar um codigo super longo... se já sabes usar ciclos (For, While, For Each, etc..) acho que os deves usar... se já sabes usar arrays também acho que deves fazer uso deles..

fica aqui um exemplo que não mostra exactamente o resultado como queres mas é outra abordagem à coisa....

	    Dim valor As Integer

    Label2.Text = String.Empty
    Label1.Text = String.Empty

    Dim separador As String = " - "

    'Tenta converter o input recebido no TextBox para a variavel "valor"
    If Integer.TryParse(TextBox1.Text, valor) Then

	    If valor > 0 Then
		    'Array de notas e moedas disponiveis ordenadas da maior para a mais pequena
		    Dim notasMoedasDisponiveis() As Integer = {20, 10, 5, 1}
		    'Array que ira guardar o dinheiro "trocado" (opcional)
		    Dim notasMoedas() As Integer = {}

		    While valor > 0
			    'Varre o Array "notasMoedasDisponiveis"
			    For Each nmd As Integer In notasMoedasDisponiveis
				    If valor >= nmd Then
					    'opcional, acrescenta um elemento ao array e guarda a nota ou moeda respectiva
					    ReDim Preserve notasMoedas(notasMoedas.Length)
					    notasMoedas(notasMoedas.Length - 1) = nmd

					    'adiciona a nova nota ou moeda e o separador
					    Label2.Text &= nmd & separador

					    'subtrai o valor da nota ou moeda ao valor
					    valor -= nmd

					    'sai do ciclo porque ainda pode precisar usar a mesma nota ou moeda
					    Exit For
				    End If
			    Next
		    End While

		    'opcional, junta o array numa string e mostra o resultado
		    Label1.Text = String.Join(separador, notasMoedas)

		    'remove o ultimo separador
		    Label2.Text = Label2.Text.Remove(Label2.Text.Length - separador.Length)

	    Else
		    MessageBox.Show("Introduza um numero maior que zero!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
	    End If
    Else
	    MessageBox.Show("Input Invalido", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End If

Share this post


Link to post
Share on other sites
RMarinheir0

Antes de mais peço desculpa por não colocar isto no local certo, mas o problema é que não sei usar ciclos, ainda estou num patamar muito básico, o objetivo seria mesmo fazer apenas com ifs, mas obrigado à mesma.

Share this post


Link to post
Share on other sites
vikcch

Se já aprendeste os operadores \ e Mod podes fazer assim:

	    Dim valor As Integer

    If Integer.TryParse(TextBox1.Text, valor) Then

	    If valor > 0 Then

		    ' o "\" retorna a parte inteira da divisão, ex: 50 \ 20 = 2
		    Label1.Text = "Notas de €20: " & valor \ 20
		    ' o "Mod" retorna o resto da divisão, ex: 50 Mod 20 = 10
		    valor = valor Mod 20

		    Label2.Text = "Notas de €10: " & valor \ 10
		    valor = valor Mod 10

		    Label3.Text = "Notas de €5: " & valor \ 5
		    valor = valor Mod 5

		    Label4.Text = "Moedas de €1: " & valor \ 1

	    Else
		    MessageBox.Show("Introduza um numero maior que zero!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
	    End If

    Else
	    MessageBox.Show("Input Invalido", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End If

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

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.