• Nie Znaleziono Wyników

VB_4.4_Podprogram_Sub_objetość_walca Dany jest promie

N/A
N/A
Protected

Academic year: 2021

Share "VB_4.4_Podprogram_Sub_objetość_walca Dany jest promie"

Copied!
5
0
0

Pełen tekst

(1)

VB_4.4_Podprogram_Sub_objetość_walca

Dany jest promień podstawy i wysokość walca. Obliczyć objętość walca. Obliczenia wykonać tworząc procedury PolePodstawy (obliczającą pole podstawy walca) i Objetosc (obliczającej objętość walca, korzystającej z procedury PolePodstawy). Zabezpieczyć program przed błędnie wprowadzonymi danymi.

Rysunek 1. Propozycja formularza

Kod – wersja podstawowa, bez obsługi błędów

Private Sub btnV_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles btnV.Click Dim R, H, V As Single

R = CSng(txtR.Text) H = CSng(txtH.Text) Call Objetosc(R, H, V) txtV.Text = V.ToString End Sub

Private Sub PolePodstawy(ByVal Promien As Single, ByRef Pole As Single) Pole = Math.PI * Promien ^ 2

End Sub

Private Sub Objetosc(ByVal Promien As Single, ByVal Wysokosc As Single, _ ByRef Wynik As Single)

Dim Pole As Single

Call PolePodstawy(Promien, Pole) Wynik = Pole * Wysokosc

End Sub

Opis kodu

• W programie głównym konwertujemy zawartości TextBoxów na liczby i liczby te podstawiamy pod zmienne R i H.

• Zmienne te sa argumentami wejściowymi procedury Objetosc.

• Procedura Objetosc wywołuje procedurę PolePodstawy uzyskując, w efekcie jej wykonania Pole okręgu podstawy, a następnie mając Pole podstawy mnoŜy je przez Wysokosc uzyskując objętość.

Rezultat mnoŜenia podstawia pod zmienną Wynik, która jest zwracana do programu głównego.

• Wartość zmiennej Wynik uzyskuje zmienna V.

• Wartość zmiennej V wyświetlana jest w TextBox’sie txtV.

(2)

Zabezpieczanie – przechwytywanie błędów

Zabezpieczenie moŜna przeprowadzić na kilka sposobów:

Sposób 1

Zanim dokonamy próby konwersji – sptawdzamy, czy do textBoxu wpisano liczbę. Jeśli nie – funkcja Isnumeric() zwraca False co powoduje pojawienie się komunikatu jak na rys. 2.

If IsNumeric(txtR.Text) = False Then

MsgBox("Wartość promienia R nie jest liczbą", _

MsgBoxStyle.Critical, "Błąd danych") Exit Sub

End If

R = CSng(txtR.Text)

Rysunek 2. Własny komunika o błędzie danych

Proszę zwrócić uwagę na to, Ŝe nie wystarczy wydrukować komunikat o błędzie. Po komunikacie musi pojawić się instrukcja : Exit Sub. Gdyby zabrakło tej instrukcji - program, po odczytaniu komunikatu przez

uŜytkownika i kliknięciu przycisku OK przeszedłby do następnej instrukcji (próby konwersji), która

spowodowałaby błąd i przerwanie działania programu. Musimy zatem po komunikacie zakończyć działanie procedury – wyjść z niej.

Sposób 2

Zastosowanie struktury Try...Catch, a wewnątrz niej wywołanie własnego błędu. Dla zwiększenia czytelności zamieszczono jedynie fragment kodu.

Try

If IsNumeric(txtR.Text) = False Then

Err.Raise(9000, "Promień", "To nie jest liczba") End If

R = CSng(txtR.Text) ... dalsze instrukcje ...

Catch ex As Exception

MsgBox(Err.Source & " - błąd danych" & vbCrLf & _

Err.Description, MsgBoxStyle.Critical, "Błąd nr " & _ Err.Number)

End Try

Podobnie jak w Sposobie 1 – zanim spróbujemy dokonać konwersji sprawdzamy, czy w TextBox’sie jest liczba. Jeśli nie - ustawiamy własny błąd, określając dla niego Err.Number 9000, Err.Source

"Promień" i Err.Descripton "To nie jest liczba".

(3)

Proszę zwrócić uwagę na to, Ŝe wewnątrz instrukcji warunkowej nie musimy juŜ dodawać instrukcji Exit Sub.

PoniewaŜ znajdujemy się wewnątrz struktury Try ... Catch – to ona sama w momencie pojawienia się błędu przerwie dalsze, sekwencyjne wykonywanie programu i przejdzie do fragmentu kodu wewnątrz gałęzi Catch, a tam czeka na wyświetlenie komunikat, wykorzystujący trzy określone przez nas informacje: Err.Number, Err.Source i Err.Descripton, rys. 3.

Rysunek 3

Sposób III

MoŜemy samodzielnie nie testować błędu konwersji i pozostawić sprawę komunikatu strukturze Try ... Catch.

Try

R = CSng(txtR.Text)

... dalsze instrukcje ...

Catch ex As Exception

MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Błąd nr " & _ Err.Number)

End Try

Efekt takiego zabezpieczenia przedstawia rys. 4.

Rysunek 4

(4)

Program mądrzejszy od programisty?

Pozostaje jeszcze jeden aspekt obsługi błędów. Jest to sytuacja, w której twórcy środowiska programistycznego próbują okazać się „mądrzejsi” niŜ programista. Ma to miejsce np. przy próbie obliczenia pierwiastka

kwadratowego z liczby ujemnej, czy wykonania operacji dającej w wyniku liczbę zbyt duŜą, aby zmieściła się w zmiennej określonego typu. Następuje wtedy wprawdzie błąd Przepełnienia, ale środowisko wyświetla komunikat +nieskończoność, rys. 5.

Rysunek 5

Taki komunikat oznacza dwie rzeczy (1) zbyt duŜa liczba ale teŜ (2) „program mądrzejszy od programisty”.

Na zajęciach będziemy taki komunikat interpretować na niekorzyść programisty.

MoŜna się jednak zabezpieczyć przed takim komunikatem. Błąd przepełnienia, to błąd numer 6. JeŜeli zatem pojawi się komunikat jak na rys. 5 – samodzielnie skasujmy komunikat, ustawmy błąd nr 6 i pozwólmy strukturze Try Catch go obsłuŜyć:

Try

... wcześniejsze instrukcje ...

txtV.Text = V.ToString

If txtV.Text = "+nieskończoność" Then Err.Raise(6)

End If

Catch ex As Exception txtV.Text = ""

MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Błąd nr " & _ Err.Number)

End Try

Rysunek 6

(5)

Pełny kod zadania

Private Sub btnV_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles btnV.Click Dim R, H, V As Single

Try

'If IsNumeric(txtR.Text) = False Then

' Err.Raise(9000, "Promień", "To nie jest liczba") 'End If

R = CSng(txtR.Text)

If IsNumeric(txtH.Text) = False Then

Err.Raise(9001, "Wysokość", "To nie jest liczba") End If

H = CSng(txtH.Text)

Call Objetosc(R, H, V)

txtV.Text = V.ToString

If txtV.Text = "+nieskończoność" Then Err.Raise(6)

End If

Catch ex As Exception txtV.Text = ""

If Err.Number < 1000 Then

MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Błąd nr " & _ Err.Number)

Else

MsgBox(Err.Source & " - błąd danych" & vbCrLf & _

Err.Description, MsgBoxStyle.Critical, "Błąd nr " & _ Err.Number)

End If End Try End Sub

Private Sub PolePodstawy(ByVal Promien As Single, ByRef Pole As Single) If Promien <= 0 Then

Err.Raise(9002, "Sub PolePodstawy", "Promień <= 0") End If

Pole = Math.PI * Promien ^ 2 End Sub

Private Sub Objetosc(ByVal Promien As Single, ByVal Wysokosc As Single, _ ByRef Wynik As Single) Dim Pole As Single

If Wysokosc <= 0 Then

Err.Raise(9003, "Sub Objetosc", "Wysokość <= 0") End If

Call PolePodstawy(Promien, Pole) Wynik = Pole * Wysokosc

End Sub

Cytaty

Powiązane dokumenty

Narysuj wektor natęŜenia pola elektrostatycznego w punkcie leŜącym na symetralnej odcinka łączącego ładunki +Q i –Q.. Oblicz

• Funkcja ObjetoscWalca wywołuje funkcję PoleKola, która zwraca pole okręgu podstawy, a następnie mnoży to pole przez Wysokosc uzyskując objętość.. Rezultat mnożenia

Wysokość w trójkącie równobocznym jest równa 12cm.. Oblicz pole

Oblicz pole koła opisanego na trójkącie prostokątnym o przyprostokątnych długości 6cm i

Wzorów na pole trójkąta jest kilka dziś przypomnimy poznany już w szkole podstawowej wzór na pole trójkata oraz poznamy nowy wzór pozwalający obliczać pole trójkata mając

Sprawdzić czy dane pole wektorowe

Wiadomą sprawą jest' ze biodegradacja czy biotransformacja tego typu ksenobiotyków jest ściśle zw|ązuna z dostępem odpowiedniej ilości tlenu i właściwego potencjatu

Jeśli dokonamy całkowania wartości natężenia pola względem drogi wyznaczonej przez krzywą C(S) wyznaczającą powierzchnię S, to związek pomiędzy wartością prądów