Copyright © 2009 Janusz Bonarowski
1
VB_4.1_Podprogram_Sub_prędkość
Pewien etap rajdu samochodowego składa się z 3 odcinków specjalnych. Znana jest długość
i czas przejazdu każdego odcinka. Napisać program obliczający prędkości samochodu na
każdym odcinku specjalnym. Obliczenia wykonać za pomocą tej samej procedury, wywołując
ją z różnymi parametrami. Zabezpieczyć program przed błędnie wprowadzonymi danymi.
Rys. 1. Propozycja formularza
Kod aplikacji WERSJA 1
Private
Sub
btnOblicz_Click(
ByVal
sender
As
System.Object, _
ByVal
e
As
System.EventArgs)
Handles
btnOblicz.Click
Dim
S1, S2, S3, T1, T2, T3, V1, V2, V3
As
Single
'Odcinek 1
S1 =
CSng
(txtS1.Text)
'(1)
T1 =
CSng
(txtT1.Text)
'(2)
Call
Obliczenia(S1, T1, V1)
'(3)
lblV1.Text =
CStr
(V1)
'(4)
' Blok instrukcji od (1)...(4) powtarzamy
' (kopiujemy, z minimalnymi zmanami)
' dla każdego odcinka specjalnego.
'Odcinek 2
S2 =
CSng
(txtS2.Text)
T2 =
CSng
(txtT2.Text)
Call
Obliczenia(S2, T2, V2)
lblV2.Text =
CStr
(V2)
'Odcinek 3
S3 =
CSng
(txtS3.Text)
T3 =
CSng
(txtT3.Text)
Call
Obliczenia(S3, T3, V3)
lblV3.Text =
CStr
(V3)
End
Sub
Private
Sub
Obliczenia(
ByVal
droga
As
Single
,
ByVal
czas
As
Single
, _
ByRef
predkosc
As
Single
)
predkosc = droga / czas
End
Sub
Copyright © 2009 Janusz Bonarowski
2
Podczas wywoływania procedury Obliczenia przekazywane są do niej dwie
wartości zmiennych droga i czas znajdujących się na miejscu pierwszym i drugim listy
argumentów, na trzcim miejscu znaduje się wynik działania procudry.
Podczas pisania własnej procedury - środowisko automatycznie dopisuje przed
nazwami argumentów słowa kluczowe ByVal określające tryb przekazywania argumentów.
Taki tryb oznacza przekazanie argumentu przez wartość. Konsekwencją trybu ByVal jest to,
ż
e żadna zmiana wartości argumentów wewnątrz procedury nie jest przekazywana na
zewnątrz, czyli wyliczenia wartości zmiennej predkosc nie zostanie przekazane do programu
wywołującego i w efekcie w etykietach wyświetlających prędkość pojawi się wartość 0.
Aby w programie nadrzędnym uzyskać wartość trzeciego argumentu należy określić tryb
przekazywania wartości tego argumentu na ByRef (przez referencje). Taką zmianę należy
wykonać samodzielnie.
Ponieważ w zadaniu wykonujemy kilkakrotnie konwersję z wartości tekstowej na liczbową i
ponownie z liczbowej na tekstową – można te operacje, a także sprawdzanie poprawności
danych umieścić we własnej procedurze, która teraz bardzo się rozbuduje.
Kod aplikacji wersja 2
Private
Sub
btnOblicz_Click(
ByVal
sender
As
System.Object, _
ByVal
e
As
System.EventArgs)
Handles
btnOblicz.Click
Call
Obliczenia(txtS1.Text, txtT1.Text, lblV1.Text)
Call
Obliczenia(txtS2.Text, txtT2.Text, lblV2.Text)
Call
Obliczenia(txtS3.Text, txtT3.Text, lblV3.Text)
End
Sub
Private
Sub
Obliczenia(
ByVal
strDroga
As
String
, _
ByVal
strCzas
As
String
,
ByRef
strPredkosc
As
String
)
Dim
Droga, Czas, Predkosc
As
Single
'____Czy wprowadzono wartości liczbowe?
If
IsNumeric(strDroga)
Then
Droga =
CSng
(strDroga)
Else
strPredkosc =
"Błąd danych"
Exit
Sub
End
If
If
IsNumeric(strCzas)
Then
Czas =
CSng
(strCzas)
Else
strPredkosc =
"Błąd danych"
Exit
Sub
End
If
'___Czy wprowadzono wartości > zera?
If
Droga <= 0
Then
strPredkosc =
"Błąd danych droga <= 0"
Exit
Sub
End
If
If
Czas <= 0
Then
strPredkosc =
"Błąd danych czas <= 0"
Exit
Sub
End
If
'___Obliczenia
Predkosc = Droga / Czas
strPredkosc =
CStr
(Predkosc)
End
Sub