Strona główna - VISUAL BASIC-informacje - Wstęp - Śrowowisko Visual Basic 6.0 - Kontrolki - Elementy języka - Zmienne i stałe - Instrukcja przypisania - Wyrażenia arytmetyczne - Wyrażenia logiczne - Wyrażenia łańcuchowe - Operacje na datach - Podejmownie decyzji - Pętle - Tablice - Procedury - Funkcje - Zapisywanie do pliku -
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:

formularz zaprojektowany do rozwiązania rówania liniowego

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



formularz obliczeniowy wartości bezwzględnej



>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

Formularz do ćwiczenia 8



>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.

Formularz kwalifikacji oceny

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:

Formularz kwalifikacji oceny z przyciskami opcji

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 wczeœnie aby myœleć"
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