Odczytywanie danych z pliku - Znajdowanie błędów
Instrukcja If / Else | Uproszczona instrukcja If | Złożona instrukcja If | Instrukcja wyboru Select Case
Podejmowanie decyzji
Program napisany w Visual Basicu, podobnie jak w inncyh językach, wykonywany jest sekwencyjnie, tzn. instrukcje wykonywane są jedna po drugiej w kolejności zapisanej w programie. Czasami jednak istnieje konieczność zaburzenia tego porządku i wykonania jednej z dwóch lub więcej instrukcji w zależności od spełnienia określonego warunku wynikającego np. z wartości wprowadzonych danych. Podejmowanie decyzji, którą drogę wybrać umożliwiają instrukcje If oraz Select Case.
>Instrukcja If/Else
Jeśli dalsze działanie programu uzależnione jest od spełnienia pewnego warunku, (np. aby wykonać dzielenie bez zaskakującego wygenerowania błędu wykonania trzeba najpierw sprawdzić czy dzielnik jest różny od zera) wówczas należy wykorzystać instrukcję If.
Postać tej instrukcji jest następująca:
If warunek Then
Instrukcje gdy warunek jest spełniony
Else
Instrukcje gdy warunek nie jest spełniony
End If
Warunek może być dowolnym wyrażeniem logicznym lub wyrażeniem relacji, kórego wynik jest True lub False. Podczas wykonywania instrukcji If, najpierw obliczany jest warunek i jeśli jego wartość jest równa True (tzn. warunek jest spełniony), to wykonywana jest instrukcja lub instrukcje znajdujące się po słowie kluczowym Then (aż do słowa kluczowego Else), w przeciwnym razie, gdy wartość warunku jest równa False (tzn. warunek nie jest spełniony), to pomijane są instrukcje znajdujące się po słowie Then natomiast program przechodzi do wykonywania instrukcji następujących po słowie kluczowym Else, aż do słów kluczowych End If.
W obydwu przypadkach po wykonaniu odpowiedniej grupy instrukcji w zależności od spełnienia warunku, program przechodzi następnie do wykonania kolejnej instrukcji znajdującej się po słowie kluczowym End If
Warto zauważyć, że instrukcje wykonywane po Then lub Else mogą zawierać również kolejne instrukcje if/else.
Przykład 13
Przykład zastosowania instrukcji if/else do sprawdzenia poprawności wykonania operacji dzielenia.
Dim x, y, z As Single
.... 'treść programu, wprowadzenie zmiennych x i y
If y <> 0 Then
z = x / y
MsgBox "wynik dzielenia = " & Str(z)
Else
MsgBox "Pamiętaj ... nie dzielić przez zero"
End If
Ćwiczenie 6
Napisać program realizujący algorytm rozwiązania liniowego ax+b=0
Oprócz oczywistego rozwiązania, w przypadku gdy a jest różne od zera, x=-b/a, trzeba rozważyć również przypadki, gdy a=0 oraz b=0. Aby ustrzec się błędów wykorzystania przy wprowadzeniu za a wartości zero, program będzie to sprawdzał i wysyłał odpowiedni komunikat. Formularz do rozwiązania tego zadania powinien umożliwiać wprowadzenie dwóch danych liczbowych: a oraz b, wykonanie obliczen i wyświetlenie wyniku.
Do wprowadzenia danych użyjemy pól tekstowych: txt_a oraz txt_b, obliczenia będą wykonywane po naciśnięciu przycisku polecenia btn_oblicz, natomiast wyniki będą wyświetlane na formularzu w miejscu etykiety o nazwie lbl_x.
W przypadku potencjalnego błędu będzie wyświetlany odpowiedni komunikat. Będzie oczywiście rózwnież przycisk umożliwiający zakończenie programu, btn_koniec. Zaprojektowany formularz może wyglądać tak:
Treść procedur obsługujących poszczególne kontrolki mogą być następujące:
Private a, b As Single
Private Sub btn_koniec_Click()
Unload Me
End Sub
Private Sub btn_oblicz_Click()
Dim x As Single
If a <> 0 Then
'Jeśli a nie równa się zero
x = -b / a
lbl_x.Caption = "x = " & Str(x)
Else
'w przeciwnym wypadku, tzn. gdy a=0
If b <> 0 Then
'jeśli ponadto b nie równa się zero, czyli a=0 i b<>0
lbl_x.Caption = "równanie sprzeczne"
Else
'w przeciwnym razie, tzn. b=0 i a=0
lbl_x.Caption = "równanie tożsamościowe"
End If
End If
End Sub
Private Sub txt_a_Change()
'pobierz wartość z pola tekstowego przy każdej jego zmianie
a = Val(txt_a.Text)
End Sub
Private Sub txt_b_Change()
'pobierz wartość z pola tekstowego przy każdej jego zmianie
b = Val(txt_b.Text)
End Sub
>Uproszczona instrukcja If
Jeśli wykonanie pewnych instrukcji wymaga spełnienia określonego warunku, natomiast nie ma specjalnych instrukcji, które należy wykonać, gdy warunek ten nie jest spełniony, to można użyć uproszczonej instrukcji If, która ma postać:
If warunek Then
Instrukcje gdy warunek jest spełniony
End If
Jeśli warunek przyjmuje wartość True (tzn. jest spełniony) to wykonywane są instrukcje znajdujące się po słowie kluczowym Then, natomiast w przeciwnym razie instrukcje te są pomijane i program kontynuuje działanie od instrukcji stojącej po słowie kluczowym End If.
Jeśli po słowie Then do wykonania jest ytlko jedna instrukcja, to uproszczona instrukcja If może przyjąć jeszcze bardziej zwartą formę bez słowa kluczowego End If:
If warunek Then Instrukcja gdy warunek jest spełniony
Przykład 14
Obliczanie wartości bezwzględnej liczby x.
Dim x, modul As Single
modul = x 'początkowo modul przyjmuje wartość x
If x < 0 Then
modul = -x 'jeśli x jest ujemne to modul jest liczbą przeciwną do x
End If
Przykład 15
Sprawdzanie czy liczba jest parzysta
Dim k As Integer
If k mod 2 = 0 Then MsgBox "Liczba parzysta"
Ćwiczenie 7
Obliczyć wartość bezwzględną podanej liczby.
Formularz powinien umożliwiać wprowadzenie jednej liczby (pole tekstowe txt_a, uruchomienie procedury obliczania wartości bezwzględnej (przycisk polecenia btn_oblicz), przewidzieć miejsce na wynik (etykieta lbl_modul). Może zatem wyglądać jak poniżej. Natomiast pełna treść procedur obsługujących ten formularz może mieć postać:
Private a As Single
Private Sub btn_koniec_Click()
Unload Me
End Sub
Private Sub btn_oblicz_Click()
If a < 0 Then a = -a 'jeśli a jest ujemne to zmień mu znak
'Napisz w miejscu etykiety
lbl_modul.Caption = "|a| = " & Str(a)
End Sub
Private Sub txt_a_Change()
a = Val(txt_a.Text)
End Sub
>Złożona instrukcja If
Jeśli w wyniku sprawdzenia warunku możliwe są nie dwa, lecz więcej działań do wykonania, wówczas można posłużyć się złożoną instrukcją If. Ma ona następującą postać:
If warunek1 Then
Instrukcje1 gdy warunek1 jest spełniony
ElseIf warunek2 Then
Instrukcje2 gdy warunek2 jest spełniony
.....
ElseIf warunek_n Then
Instrukcje_n gdy warunek_n jest spełniony
Else
Instrukcje gdy nie spełniony jest żaden z powyższych warunków
End If
Działanie powyższych instrukcji jest następujące. Najpierw sprawdzany jest warunek1. Jeśli jest on spełniony, to wykonywane są instrukcje1 stojące po Then w tym porównaniu i następnie program przechodzi do instrukcji następującej po End If. Jeśli natomiast warunek1 nie jest spełniony, to sprawdzany jest warunek2 i sytuacja powtarza się (tzn. jesli jest on spełniony to wykonywane są instrukcje2 i następnie program przechodzi do instrukcji występującej po End If, w przeciwnym razie sprawdzany jest warunek3, itd.). Jeśli żaden z warunków nie jest spełniony, to wykonywane są instrukcje stojące po słowie kluczowym Else, a następnie porgram wykonuje instrukcje stojące po End If. Złożona instrukcja if jest przydatna w przypadkach, gdy sprawdzane warunki nakładają się i tworzą pewną logiczną sekwencję.
Przykład 16
Sprawdzanie w jakiej porze dnia się znandujemy.
Dim t As Date
t = Time 'Pobranie czasu systemowego komputera
If t < #7:00# Then
MsgBox "Jest zbyt wcześnie, żeby myśleć"
ElseIf t < #12:00# Then
MsgBox "Przedpołudniowa pora pracy"
ElseIf t < #18:00# Then
MsgBox "Pracujemy też po południu"
ElseIf t < #23:00# Then
MsgBox "Wieczór - czas na relaks"
Else
MsgBox "Czas na spanie. Noc"
End If
Należy zwrócić uwagę w powyższym przykładzie na kolejność wykonywania porównań w złożonej instrukcji If. Dzięki temu sprawdzanie warunku czwartego t<#23:00# wystarczy do stwierdzenia, że pora jest wieczorna (tzn. powiędzy godziną 18h00 a 23h00), a po niej pora nocna (tzn. po godzinie 23h00), bez konieczności sprawdzenia w tym samym warunku, czy t>#23:00#.
Ćwiczenie 8
Zaprojektować formularz, który będzie sprawdzał porę dnia.
Zaprojektujemy działanie formularza w taki sposób, aby po załadowaniu formularza do pamięci natychmiast były sprawdzane warunki i wyświetlany odpowiedni komunikat na formularzu. Aby tak się działo, będzie sprawdzenie wykonywane wewnątrz procedury Form_Load(), która jest pierwszą procedurą wykonywaną podczas uruchomienia programu. Przypominam, że aby przejść do pisania procedury Form_Load() należy dwukrotnie kliknąć obiekt Formularz.
Proponowany formularz pokazany jest poniżej. Zawiera on ramkę fr_godz, która otrzyma napis o aktualnej godzinie (zamiana właściwości Caption), natomiast wewnątrz ramki znajduje się pole etykiety lbl_koment, które wypełnione zostanie odpowiednim komentarzem (również poprzez zmiane właściwości Caption).
Kod programu obsługujący ten formularz może wyglądać tak:
Private Sub Form_Load()
Dim t As Date
t = Time 'Pobieranie czsu systemowego komputera
fr_godz.Caption = "Jest godz. " & CDate(t)
If t < #7:00:00 AM# Then
lbl_koment.Caption = "Jest zbyt wcześnie, żeby myśleć"
ElseIf t < #12:00:00 PM# Then
lbl_koment.Caption = "Przedpołudniowa pora pracy"
ElseIf t < #6:00:00 PM# Then
lbl_koment.Caption = "Pracujemy też po południu"
ElseIf t < #11:00:00 PM# Then
lbl_koment.Caption = "Wieczór - czas na relaks"
Else
lbl_koment.Caption = "Czas na spanie. Noc"
End If
End Sub
Private Sub btn_koniec_Click()
Unload Me
End Sub
>Instrukcja wyboru Select Case
Instrukcja wyboru Select Case jest bardzo podobna w działaniu do złożonej instrukcji If. Instrukcja ta pozwala wykonać określone grupy instrukcji w zależności od wartości testu sterującego instrukcją Select Case. Postać tej instrukcji jest następująca:
Select Case Test
Case Wartość1
Instrukcje_1
Case Wartość2
Instrukcje_2
Case Wartość3
Instrukcje_3
.....
Case Wartość_n
Instrukjce_n
Case Else
Instrukcje_po_else
End Select
Przy wykonywaniu instrukcji Select Case najpierw jest obliczana wartość wyrażenia stojącego w wierszu Select Case zaznaczonego wyżej jako Test, a następnie w zależności od jego wartości jest wykonywana ta grupa instrukcji, która znajduje się po Case odpowiadającym obliczonej wartości. Należy zwrócić uwagę, że po każdym Case może występować albo pojedyńcza wartość, albo pewien zakres wartości.
W każdym przypadku Visual Basic próbuje dopasować odpowiedni Case do aktualnej wartości wyrażenia testowego Test. Gdy żaden z Case nie może być dopasowany, wówczas wykonywane są instrukcje stojące po Case Else. Należy jednak zauwazyć, że stosowanie Case Else nie jest obowiązkowe. Po wykonaniu odpowiedniej grupy instrukcji z danego Case program przechodzi do instrukcji następującej po End Select.
Przykład 17
Podanie oceny słownej.
Dim ocena As Integer
'Wczytanie danej oceny
ocena = InputBox("Podaj ocenę")
Select Case ocena
Case 6
MsgBox "ocena celująca"
Case 5
MsgBox "ocena bardzo dobra"
Case 4
MsgBox "ocena dobra"
Case 3
MsgBox "ocena dostateczna"
Case 2
MgsBox "ocena dopuszczająca"
Case 1
MsgBox "ocena niedostateczna"
Case Else
MsgBox "To nie jest ocena"
End Select
W instrukcji Select Case w przypadkach, gdy chcemy sprawdzać, czy obliczona wartość jest mniejsza bądź większa od żądanej liczby, można używać operatorów relacji. Aby to zrobić w blokach Case trzeba użyć słowa kluczowego Is.
Przykład 18
Kwalifikacja oceny
Dim ocena As Integer
ocena = Val(InputBox("Podaj ocenę"))
Select Case ocena
Case 1
MsgBox "ocena negatywna"
Case Is <=6
MsgBox "ocena pozytywna"
Case Else
MsgBox "To nie jest ocena"
End Select
Innym sposobem kwalifikacji oceny z przykładu 18 jest określenie zakresu za pomocą słowa kluczowego to.
Przykład 19
Kwalifikacja oceny
Dim ocena As Integer
ocena = InputBox("Podaj ocenę")
Select Case ocena
Case 2 to 6
MsgBox "ocena pozytywna"
Case 1
MsgBox "ocena negatywna"
Case Else
MsgBox "To nie jest ocena"
End Select
Ćwiczenie 9
Zaprojektować formularz, który będzie kwalifikował wybraną ocenę.
Do wprowadzenia oceny na formularzu użyjemy pola tekstowego txt_ocena. Kwalifikacja oceny będzie następowała po byraniu przycisku polecenia btn_kwali, natomiast zakończenie programu po wybraniu przycisku btn_koniec. Po zakwalifikowaniu oceny odpowiedni tekst edzie pojawiał się na formularzu w miejscu etykiety lbl_slowna oraz lbl_kwalifikacja. Formularz rezalizujący to zadanie może mieć postać przedstawioną poniżej.
Natomiast kod wykonujący potrzebne zadanie ma postać:
Private ocena As Integer
Private Sub btn_koniec_Click()
Unload Me
End Sub
Private Sub btn_kwali_Click()
Select Case ocena
Case 6
lbl_slowna.Caption = "ocena słowna: celująco"
Case 5
lbl_slowna.Caption = "ocena słowna: bardzo dobrze"
Case 4
lbl_slowna.Caption = "ocena słowna: dobrze"
Case 3
lbl_slowna.Caption = "ocena słowna: dostatecznie"
Case 2
lbl_slowna.Caption = "ocena słowna: dopuszczająca"
Case 1
lbl_slowna.Caption = "ocena słowna: niedostateczna"
Case Else
lbl_slowna.Caption = "To nie jest ocena"
End Select
Select Case ocena
Case 2 To 6
lbl_kwalifikacja.Caption = "Ocena pozytywna"
Case 1
lbl_kwalifikacja.Caption = "Ocena negatywna"
Case Else
lbl_kwalifikacja.Caption = "To nie jest ocena"
End Select
End Sub
Private Sub txt_ocena_Change()
ocena = Val(txt_ocena.Text)
End Sub
Ćwiczenie 10
Zaprojektować formularz, który będzie kwalifikował wybraną ocenę (wersja z przyciskami opcji).
Innym sposobem rozwiązania zadania z ćwiczenia 9 może być wykorzystanie faktu, że Visual Basic jest językiem zdarzeniowym, tzn. reaguje na zdarzenia (kliknięcie, zmiana, wybranie myszką itp.), jakim podlegają poszczególne obiekty. Tym razem ocenę na formularzu będziemy wybierali za pomocą przycisków opcji. Po wybraniu odpowiedniej kwalifikacja będzie dokonywana natychmiast wskutek zapisania w procedurze wyboru przycisku właściwej dla tego wyboru reakcji i odpowiedni tekst będzie wpisywany w przewidzianym w tym celu polu etykiety. Zaprojektowany formularz w działaniu może wyglądać następująco:
Kod, który wykonuje zadanie zakwalifikowania wybranej przyciskiem oceny może mieć postać:
Private Sub btn_koniec_Click()
Unload Me
End Sub
Private Sub opt_1_Click()
lbl_slowna.Caption = "niedostatecznie"
lbl_kwalifikacja.Caption = "negatywna"
End Sub
Private Sub opt_2_Click()
lbl_slowna.Caption = "dopuszczjąco"
lbl_kwalifikacja.Caption = "pozytywna"
End Sub
Private Sub opt_3_Click()
lbl_slowna.Caption = "dostatecznie"
lbl_kwalifikacja.Caption = "pozytywna"
End Sub
Private Sub opt_4_Click()
lbl_slowna.Caption = "dobrze"
lbl_kwalifikacja.Caption = "pozytywna"
End Sub
Private Sub opt_5_Click()
lbl_slowna.Caption = "bardzo dobrze"
lbl_kwalifikacja.Caption = "pozytywna"
End Sub
Private Sub opt_6_Click()
lbl_slowna.Caption = "celująco"
lbl_kwalifikacja.Caption = "pozytywna"
End Sub
Jeszcze jedna bardzo ważna uwaga. W Visual Basic Test w instrukcji Select Case nie musi być liczbą całkowitą (jak to jest np. w Pascalu), lecz może być dowolnym poprawnym wyrażeniem numerycznym albo łańcuchowym.
Przykład 20
Sprawdzanie w jakiej znajdujemy się porze dnia. Zmienna sterująca instrukcją Select Case ma tym Date.
Dim t As Date
Select Case Time 'Pobranie czasu systemowego komputera
Case Id < #7:00#
MsgBox "Jest zbyt wczenie aby myleć"
Case #7:00# To #12:00#
MsgBox "Przedpołudniowa pora pracy"
Case #12:00# To #18:00#
MsgBox "Pracujemy też popołudniu"
Case #18:00# To #23:00#
MsgBox "Wieczór - czas na relaks"
Case Else
MsgBox "Czas na spanie. Noc"
End Select