Neste projeto vamos utilizar o novo Visual Studio 2012.
Como era de se esperar vamos iniciar um projeto novo:
Agora adicionamos os seguintes elementos:
- um botão para calcular as moedas a dar de troco
- um botão para repor o número de moedas iniciais disponíveis
- uma textbox para introduzir o valor a pagar
- uma textbox para introduzir o valor entregue
- umas labels para informar o utilizador do que deve introduzir e outra para mostrar o troco
- por fim uma grelha para mostrar os valores das moedas e as quantidades disponíveis de cada uma.
A janela principal do programa fica assim:
Agora o código, primeiro o evento load do formulário, neste vamos definir os valores das moedas e as respetivas quantidades
Para guardar estes valores vamos necessitar de uma variável definida ao nível do formulário, logo abaixo da definição da class:
Public Class Form1
Public moedas(0 To 7, 0 To 2) As Double
Assim no load fica:
'valor das moedas
moedas(0, 0) = 0.01
moedas(1, 0) = 0.02
moedas(2, 0) = 0.05
moedas(3, 0) = 0.1
moedas(4, 0) = 0.2
moedas(5, 0) = 0.5
moedas(6, 0) = 1
moedas(7, 0) = 2
'número de moedas
moedas(0, 1) = 5
moedas(1, 1) = 5
moedas(2, 1) = 5
moedas(3, 1) = 5
moedas(4, 1) = 5
moedas(5, 1) = 5
moedas(6, 1) = 5
moedas(7, 1) = 5
'moedas dadas como troco
moedas(0, 2) = 0
moedas(1, 2) = 0
moedas(2, 2) = 0
moedas(3, 2) = 0
moedas(4, 2) = 0
moedas(5, 2) = 0
moedas(6, 2) = 0
moedas(7, 2) = 0
Como podemos verificar na matriz temos três colunas: a primeira para o valor facial das moedas, a segunda para a quantidade de moedas disponíveis e a terceira para a quantidade de moedas a dar de troco.
Precisamos, ainda, de uma função para atualizar a grelha:
Sub grelha()
Dim l, c As Integer
If Me.DataGridView1.Rows.Count < moedas.Length / 3 Then
For l = 0 To 7
Me.DataGridView1.Rows.Add()
For c = 0 To 2
Me.DataGridView1.Rows(l).Cells(c).Value = moedas(l, c)
Next
Next
Else
For l = 0 To 7
For c = 0 To 2
Me.DataGridView1.Rows(l).Cells(c).Value = moedas(l, c)
Next
Next
End If
End Sub
Esta função começa por verificar se a grelha está ou não preenchida, se sim atualiza os valores senão adiciona linhas e atualiza os valores.
A função deve ser chamada no evento load, mesmo no final.
O botão para repor é muito simples:
Sub repor()
'número de moedas
moedas(0, 1) = 5
moedas(1, 1) = 5
moedas(2, 1) = 5
moedas(3, 1) = 5
moedas(4, 1) = 5
moedas(5, 1) = 5
moedas(6, 1) = 5
moedas(7, 1) = 5
'moedas dadas como troco
moedas(0, 2) = 0
moedas(1, 2) = 0
moedas(2, 2) = 0
moedas(3, 2) = 0
moedas(4, 2) = 0
moedas(5, 2) = 0
moedas(6, 2) = 0
moedas(7, 2) = 0
grelha()
End Sub
Primeiro altera os valores disponíveis de cada tipo de moeda e por fim limpa os valores referentes às moedas retiradas como troco.
Agora o código do botão calcular:
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim v_pagar, v_entregue, v_troco, s_troco, m As Double
If IsNumeric(TextBox1.Text) = False Then Exit Sub
If IsNumeric(TextBox2.Text) = False Then Exit Sub
Double.TryParse(TextBox1.Text, v_pagar)
Double.TryParse(TextBox2.Text, v_entregue)
v_troco = v_entregue - v_pagar
v_troco = Math.Round(v_troco, 2)
Me.Label3.Text = v_troco
If Me.Label3.Text = "0" Then Exit Sub
s_troco = 0
m = 7
Do While s_troco < v_troco And m >= 0
If s_troco + moedas(m, 0) <= v_troco And moedas(m, 1) > 0 Then
s_troco = s_troco + moedas(m, 0)
moedas(m, 1) -= 1
moedas(m, 2) += 1
Else
m -= 1
End If
Loop
If s_troco < v_troco Then
MessageBox.Show("Não existem moedas suficientes para processar o troco!")
End If
grelha()
End Sub
Esta função começa por tentar retirar os valores das textboxes, depois calcula o valor do troco.
De seguida arredonda o troco só para duas casas decimais e se o troco foi diferente de 0 então vamos procurar moedas até atingir o valor do troco.
Para dar o troco começamos pelo fim da matriz à procura das moedas de maior valor até não termos mais moedas ou até satisfazermos o valor do troco.
E pronto, mais um projeto disponível aqui.
Sem comentários:
Enviar um comentário