Copyright © 2009, Janusz Bonarowski 1
KolVB3
Wykonać aplikację Windows Forms Application przeliczającą temperaturę ze stopni Fahrenheita na stopnie Celsjusza i odwrotnie. Obliczenia wykonane zostaną zgodnie ze wzorami:
Zamiana stopni Celsjusza na stopnie Fahrenheita 32 5
9⋅ +
= C
F
Zamiana stopni Fahrenheita na stopnie Celsjusza
(
32)
9 5⋅ −
= F
C
Aplikacja powinna być zabezpieczona przed wprowadzeniem danych, które mogłyby spowodować awarię aplikacji.
Na wyższą ocenę
Rozpoznawać przyczyny błędnie wpisanych danych:
1) Zawartość okna tekstowego jest pusta – nie wpisano żadnych danych.
2) Ciąg tekstowy zamiast liczby – dane nie są liczbą
3) Wpisano liczbę, ale jako separator wykorzystano kropkę.
Rozwiązanie
Rys. 1. Propozycja formularza
Kod aplikacji
Private Sub btnNaF_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnNaF.Click '--- 'Zamiana stopni Fahrenheita na stopnie Celsjusza
'Zabezpieczenie przed awarią aplikacji konstrukcją Try Catch '--- Dim C, F As Single
Try
' Jeśli dane poprawne, można przeliczać C = Single.Parse(txtC.Text)
F = 9 * C / 5 + 32
'txtF.Text = Format(F, "#0.00") 'Ewent. formatowanie wydruku txtF.Text = F.ToString
Catch ex As Exception
MsgBox("Proszę wprowadzić poprawnie temperaturę" & vbCrLf & _ "w stopniach Celsjusza", MsgBoxStyle.Critical, _ "Błąd danych, err = " & Err.Number.ToString) txtF.Text = ""
End Try End Sub
Copyright © 2009, Janusz Bonarowski 2 Private Sub btnNaC_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnNaC.Click '---
'Zamiana stopni Celsjusza na stopnie Fahrenheita 'Rozbudowane sprawdzanie poprawności danych w txtF '--- Dim C, F As Single
' Sprawdzenie, czy txtF jest pusty If txtF.Text = "" Then
MsgBox("Proszę wprowadzić temperaturę" & vbCrLf & _ "w stopniach Fahrenheita", _
MsgBoxStyle.Critical, "Brak danych") txtC.Text = ""
Exit Sub End If
' Sprawdzenie czy nie wprowadzono tekstu lub czy jako separator ' dziesiętny nie wprowadzono kropki
If Not IsNumeric(txtF.Text) Then
' Sprawdzenie czy błąd nie wynika z kropki jako separatora.
' Posłużono się funkcją InStr.
If InStr(1, txtC.Text, ".") <> 0 Then MsgBox("Jako separator dziesiętny " & _
"proszę wprowadzić przecinek", MsgBoxStyle.Critical, _
"Błąd danych - wprowadzono kropkę") txtC.Text = ""
Exit Sub Else
MsgBox("Temperatura musi być liczbą", MsgBoxStyle.Critical, _ "Błąd danych")
txtC.Text = ""
Exit Sub End If
End If
'Dane poprawne, można przeliczać
F = Single.Parse(txtF.Text) C = (F - 32) * 5 / 9
'txtC.Text = Format(C, "#0.00") txtC.Text = C.ToString
End Sub
Komentarz
W procedurze Sub btnNaF_Click(...) zastosowano strukturę programową
Try Catch End Try pozwalającą w prosty sposób zabezpieczyć aplikację przed awarią.
Tak zabezpieczona aplikacja nigdy nie przestanie działać, bez względu na to jak bardzo bezsensowne dany wpiszemy. Jednak bez dodatkowych wierszy kodu nie możemy użytkownikowi podpowiedzieć jaka jest przyczyna braku uzyskania poprawnego wyniku.
W procedurze Sub btnNaC_Click(...) zastosowano kilka instrukcji warunkowych rozpoznających różne możliwe przyczyny błędnych danych.
Pierwsza instrukcja warunkowa używa funkcji IsNumeric(txtF.Text)aby sprawdzić czy łańcuch tekstowy może być konwertowany na liczbę. Jeśli zawartość okna tekstowego txtF.Text może być konwertowana na liczbę - funkcja ta zwraca wartość True i działanie programu przekazywane jest do ostatnie części kodu wykonywanego gdy dane są poprawne.
Copyright © 2009, Janusz Bonarowski 3 Jeśli jednak dane w oknie tekstowym txtF.Text nie są poprawne - program zagłębia się w nową instrukcję warunkową sprawdzającą, czy w ciągu znaków okna tekstowego
txtF.Text jest znak kropki – jeśli jest - drukuje odpowiedni komunikat, jeśli nie ma kropki – komunikat mówi tylko o błędzie danych.
Istnienie kropki w łańcuchu znaków rozpoznano za pomocą funkcji InStr. Funkacja ta ma postać:
InStr(NrZnakuPoczątkowego, ŁańcuchPrzeszukiwany, ŁańcuchSzukany)
Funkcja ta sprawdza, czy w ciągu znaków ŁańcuchPrzeszukiwany znajduje się ciąg znaków ŁańcuchSzukany. Przeszukiwanie rozpoczynane jest od znaki o numerze kolejnym podanym w NrZnakuPoczątkowego.
Funkcja zwraca numer znaku, od którego ŁańcuchSzukany mieści się w ŁańcuchuPrzeszukiwanym.
Jeśli
ŁańcuchuPrzeszukiwanym = 123.45 ŁańcuchSzukany = "."
NrZnakuPoczątkowego = 1
funkcja InString zwróci wartość 4, bo kropka występuje na czwartej pozycji w ciągu znaków 123.45.
Jeśli podciąg ŁańcuchSzukany nie występuje w ŁańcuchuPrzeszukiwanym funkcja zwraca 0.