1. Zaczynamy programować w
VB
Obliczamy pole i objętość kuli.
Analiza:
Pole wynosi: p = 4π r2, objętość wynosi: v =
4/3 πr3.
Projekt:
- wprowadzamy dane, czyli wartość promienia r,
- obliczamy pole p i objętość v,
- wyprowadzamy wyniki.
Programowanie:
Uruchamiamy MS ACCESS wybieramy Moduły, a następnie
przycisk Nowy (otwierając tym samym środowisko VBA).
Zobaczymy następujący zapis:
Option Compare Database
i może jeszcze (zależy od
wersji MS ACCESS i ustawień domyślnych Opcji):
Option Explicit
Są to deklaracje opcji. Pierwsza oznacza
sposób sortowania danych w bazie (nieistotna w naszym kodzie), druga natomiast
wymusza deklaracje zmiennych. Użycie zmiennej nie zadeklarowanej wcześniej
powoduje powstanie błędu kompilacji. Na pierwszy „rzut oka”
- deklaracja zbędna, ale po
głębszej analizie warta stosowania. Unikamy wtedy znacznie trudniejszych w
lokalizacji błędów wykonania programu. Kompilator sam „pilnuje” abyśmy używali
tylko zadeklarowanych zmiennych.
Wpisujemy nagłówek procedury:
Sub Pole_kuli()
Po wciśnięciu ENTER edytor sam dopisze zakończenie
procedury:
End Sub
Każda procedura zaczyna się od słowa
kluczowego Sub,
po którym występuje nasza nazwa procedury np. Pole_kuli (jedno słowo) i para nawiasów
(), między którymi mogą być
zawarte parametry procedury. Stosujemy je nawet w przypadku braku parametrów.
Po nagłówku procedury zadeklarujemy stałe i
zmienne, które użyjemy w procedurze.
Słowo kluczowe Const rozpoczyna deklarację stałych:
Const PI = 3.1415926
Zmienne i stałe powinny być literami alfabetu łacińskiego,
łańcuchami tych liter i ewentualnych cyfr (muszą zaczynać się od liter).
Polskie znaki (np. ą) dozwolone są w nazwach stałych i zmiennych, w niektórych
aplikacjach MS OFFICE, np. w MS ACCESS. Nie warto ich jednak stosować ze
względu na późniejszy brak możliwości przeniesienia kodu do innej aplikacji.
W deklaracji stałej występuje przypisanie
wartości po znaku ”=”. Wartości rzeczywiste wpisujemy używając kropki jako
separatora dziesiętnego: 3.1415926.
Przecinek
będzie używany przez użytkownika, wpisującego dane w okna dialogowe, bądź
obserwującego wyniki.
Słowem kluczowym Dim rozpoczynamy deklaracje
zmiennych:
Dim
r As Single, pole As Single, obj As Single
Po nim występuje identyfikator i przypisanie typu. Typ zmiennej
jest informacją dla kompilatora o sposobie zapisu zmiennej do pamięci i ilości
bajtów zajmowanych przez nią. Single
to zmienna rzeczywista zajmująca 4 bajty w pamięci operacyjnej. Kolejne
deklaracje rozdzielamy przecinkami lub powtarzamy słowo Dim w następnych wierszach.
Wartość
promienia r możemy wprowadzić stosując
instrukcję podstawienia, np.:
r = 5
Ogranicza to jednak nasz program do jednej
kuli o promieniu równym 5, a więc kod nie jest uniwersalny i przy każdej zmianie
promienia musielibyśmy ingerować w kod źródłowy.
Bardziej użyteczne jest następujące przypisanie:
r = InputBox("Podaj
promień:", "Dane", "0")
Oznacza ono pobranie wartości z okna
wejściowego podczas działania programu. Pierwszy parametr, to polecenie ukazujące
się w oknie, drugi – tytuł okna, a trzeci – wartość domyślna, brana pod uwagę,
gdy użytkownik nie poda innej. Drugi i trzeci parametr nie są obowiązkowe i
można je opuścić.
Obliczenie pola i objętości realizowane jest
w poniższych wyrażeniach:
pole = 4 * PI * r * r
obj = 4/3 * PI * r * r * r
Aby zobaczyć wyniki, musimy wyprowadzić je do odpowiedniego
obiektu. Można tu zastosować okno komunikatu MsgBox, okno analizy programu Debug lub raport (jeżeli jest
użyjemy go w naszym programie).
Użycie okien komunikatu może wyglądać następująco:
MsgBox pole, 64, "Pole kuli
wynosi:"
MsgBox obj, 64,
"Objętość kuli wynosi:"
Pierwszy parametr jest wyprowadzaną wartością, drugi – ikoną
przypisaną do okna, a trzeci – tytułem okna. Jest to wyjaśnienie pobieżne.
Dokładny opis parametrów można znaleźć we wbudowanej Pomocy (kursor
umieszczamy na interesującym nas haśle i wciskamy F1). Oprócz powyższej
postaci, będziemy w przyszłości używać postaci funkcyjnej MsgBox zapewniającej większe
możliwości.
Innym
sposobem wyprowadzenia wyników jest okno analizy programu Debug:
Debug.Print "Pole =", pole
Debug.Print "Objętość =", obj
W środowisku MS ACCESS 2000 okno to nazwane
zostało Immediate- natychmiastowe.
Można je otworzyć poleceniem View/ImmediateWindow.
W nim można również uruchamiać nasze procedury pisząc po prostu
ich nazwę i naciskając Enter. Wygodniejszym sposobem
uruchamiania jest przycisk Run Sub.
Wypróbujmy nasz program!
Wyprowadzamy
wyniki z zadaną dokładnością - trzy cyfry po przecinku.
Wyprowadzanie sformatowanych wyników można realizować przy
pomocy funkcji Format. Zastosujmy ją dla wydruku w
oknie Immediate:
Debug.Print „Pole =”, Format(pole, „##0.000”)
Drugi parametr funkcji Format
jest łańcuchem formatującym. W naszym przypadku oznacza on, że wartość
wyprowadzana będzie zawierać 3 cyfry przed przecinkiem dziesiętnym i 3 cyfry po
przecinku. # oznacza, że cyfra jest nieobowiązkowa (w
przypadku, gdy liczba ma mniej niż 3 cyfry przed przecinkiem). 0 oznacza pozycję obowiązkową.
Funkcja Format ma bogate możliwości formatowania wyprowadzanych wartości
numerycznych, łańcuchów, dat i czasu. Dokładny jej opis można znaleźć w Pomocy
(F1).
Zadanie
Napisać procedury obliczające pola i objętości
innych brył: walca, stożka, prostopadłościanu (wystarczy jeden przykład).
Pierwiastki rzeczywiste trójmianu kwadratowego.
Sprawdzamy,
czy istnieją pierwiastki rzeczywiste trójmianu kwadratowego o zadanych
współczynnikach a, b, c. Obliczamy w tym celu wyróżnik trójmianu kwadratowego.
Po jego analizie wyliczamy ewentualne pierwiastki.
-
wprowadzamy wartości współczynników a, b, c
-
obliczamy wyróżnik Δ = b2- 4ac
-
jeżeli Δ < 0 =>
wyprowadzimy komunikat: „brak pierwiastków”
-
w przeciwnym wypadku: jeżeli Δ = 0 =>
komunikat: „jest jeden pierwiastek”; obliczamy go x=-b/(2a)
i drukujemy
-
w przeciwnym wypadku: komunikat: „są dwa pierwiastki”; obliczymy je x1
= (-b – sqr(Δ)/(2a)) i x2 = (-b + sqr(Δ)/(2a)), a następnie wydrukujemy.
3. Powtarzanie nie musi być uciążliwe – „pętle”
Drukujemy tablicę wartości funkcji
trygonometrycznych.
Czasami spotykamy
problemy wymagające wielokrotnego powtarzania sekwencji instrukcji. Z pomocą
przychodzą nam instrukcje powtarzania (tzw. pętle). Bez nich programowanie
byłoby mozolne. Język VBA proponuje całą gamę instrukcji powtarzania. Jedną z
najczęściej stosowanych jest tzw. „pętla odliczana”:
for zmienna = wartość_
początkowa to wartość_końcowa step wart_kroku
Fraza step nie jest obowiązkowa. W
przypadku jej braku krok domyślny wynosi 1.
Analiza:
Wydrukujmy w pierwszej
kolumnie wartość argumentu x zmieniającego się co 1 w
zakresie od 0 do 90 stopni, a następnie w kolejnych kolumnach wartości funkcji
trygonometrycznych: sinus, cosinus, tangens i cotangens.
Możemy
skorzystać z wbudowanych funkcji standardowych sin(x),
cos(x), tan(x). Funkcję cotangens zdefiniujemy
sami: cos(x)/sin(x). Argumenty funkcji należy podać w radianach, a nie w stopniach. Wobec
tego musimy znaleźć zależność między tymi jednostkami. Następująca proporcja,
wynikająca z definicji jednostek, posłuży nam jako wzór wyjściowy: x/r = 360/2π.
Po
przekształceniu: r = π/180*x
Projekt:
-
deklarujemy stałą PI i zmienne x, r,
-
korzystając z instrukcji powtarzania „for” przeliczamy jednostki ze
stopni – x, na radiany – r , dla każdego x,
zmieniającego się od 0 do 90, według wyżej podanej zależności,
-
drukujemy, dla każdego x, w kolejnych
kolumnach x i sin(r),
-
później dodamy kolejne funkcje
trygonometryczne.
Programowanie:
Sub f_trygonometryczne()
Const PI = 3.1415926
Dim x As Integer, r As
Single
For x = 0 To 90
r = PI / 180 * x
Debug.Print x; Spc(3);
Format(Sin(r), „0.000000“)
Next x
End Sub
Zmienna typu Integer
przechowuje wartości całkowite z zakresu od
-32768 do 32767.
Spc(3)
– 3 spacje rozdzielające x od sin(r).
Funkcję Format omówiliśmy wcześniej.
W instrukcji Print
średnikiem rozdzielamy kolejne parametry, gdy chcemy, aby były drukowane
kolejno po sobie, przecinkiem – aby drukować od
następnego „tabulatora”.
Dodajmy kolumnę z cos(r). Ponieważ wiersz drukujący będzie teraz długi, możemy go rozdzielić na dwa:
Debug.Print x; Spc(3); Format(Sin(r), „0.000000“); _
Spc(3);
Format(Cos(r), “0.000000”)
W języku VBA długie polecenia możemy
“łamać” na dwa lub więcej wierszy. Na końcu danego wiersza musi jednak wystąpić
znak kontynuacji w następnym („ _” – spacja i podkreślenie).
Program działa prawidłowo, więc
kontynuujmy dalej:
Debug.Print x; Spc(3); Format(Sin(r), „0.000000“); _
Spc(3); Format(Cos(r),
“0.000000”); _
Spc(3);
Format(Tan(r), „0.000000”)
Po tej poprawce, program nasz
niestety nie działa już prawidłowo (chociaż nie
zgłasza błędu). Funkcja tangens nie jest określona dla 90 stopni (dąży do
nieskończoności). Przybliżenie, jakie tu otrzymaliśmy - jest nie do przyjęcia.
Zadaniem programisty jest właściwa ingerencja. Zastosujmy instrukcję warunkową,
która w przypadku, gdy x = 90 wydrukuje napis „brak”, zamiast niewłaściwej
wartości.
Przepiszmy
instrukcję Print, bez drukowania tangensa:
Debug.Print x; Spc(3); Format(Sin(r), „0.000000“); _
Spc(3); Format(Cos(r), “0.000000”);
Średnik na końcu instrukcji Print
zapewnia kontynuację wydruku w tym samym wierszu przez kolejną instrukcję Print.
Następująca konstrukcja spowoduje
warunkowy wydruk wartości:
If x = 90 then
Debug.Print
Spc(3);
„brak ”
Else
Debug.Print Spc(3);
Format(Tan(r), “0.000000”)
End If
Bezwarunkowy wydruk cotangensa:
Debug.Print Spc(3); Format(Cos(r) / Sin(r),
“0.000000”)
spowoduje błąd kompilacji dla x =
0 ( błąd dzielenia przez zero):
Zastosujmy
ponownie instrukcję If:
If x = 0 then
Debug.Print Spc(3); „brak ”
Else
Debug.Print Spc(3);
Format(Cos(r)/Sin(r), "0.000000")
End If
Nie
zapomnijmy uzupełnić średnikami poprzednich instrukcji drukowania.
Wydrukować tablicę
wartości x, x2, x3, sqr(x) w
zakresie od 0 do 100.
Obliczamy największy wspólny dzielnik dwóch liczb naturalnych.
Nie zawsze możemy określić, ile razy należy powtórzyć daną
sekwencję instrukcji. Może to zależeć od danych wprowadzanych przez użytkownika
w trakcie działania programu. Z pomocą przychodzą nam „pętle” uzależniające
powtarzanie od spełnienia, bądź niespełnienia określonego warunku. Jedną z
takich instrukcji jest:
While warunek
Instrukcje wykonywane, gdy warunek jest
spełniony
Wend
Cechą
takich instrukcji jest ustawianie wartości początkowych zmiennych,
występujących w warunku przed „wejściem do pętli”, a także sterowanie
tymi zmiennymi „wewnątrz pętli”, np.:
a =
5
While a > 0
…
…
a = a – 1
Wend
Zastosujemy algorytm
Euklidesa z odejmowaniem.
-
sprawdzamy, czy podane dwie liczby naturalne są różne,
-
w przypadku pozytywnym: od większej odejmujemy mniejszą i różnicę podstawiamy
pod zmienną większą,
-
czynności powyższe powtarzamy, dopóki zmienne są różne,
-
po zrównaniu się zmiennych, drukujemy jedną z nich jako wynik.
Sub nwd()
Dim x As Long, y As
Long
x = InputBox("Podaj
licznik:", "Dane", 1)
y = InputBox("Podaj mianownik:",
"Dane", 1)
While x <> y
If x > y Then
x = x - y
Else
y = y - x
End If
Wend
Debug.Print
"NWD ="; x
End Sub
Zamiast zmiennej typu Integer czasami użyjemy zmiennej Long. Zmienna tego typu zajmuje
w pamięci operacyjnej 4 bajty i przechowuje liczby całkowite z zakresu od
-2.147.483.648 do 2.147.483.647.
Ponownie wydrukować tablicę wartości x, x2,
x3, sqr(x) w zakresie od 0 do 10 , z krokiem 0,1. Zamiast instrukcji powtarzania for..., zastosować instrukcję while... .