Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle. Sub Hasla1() Dim wzor_hasla As String Dim haslo As String Dim adres As String wzor_hasla = "XYXY ustalenie wzoru hasła adres = "Wydz. M-E, Wyb. Wyspiańskiego 27" haslo = InputBox("Podaj haslo:") If haslo = wzor_hasla Then MsgBox "Adres:" & adres Else MsgBox "Złe hasło!" End If End Sub
2) Program pyta o hasło i pozwala na trzykrotne zgadywanie: a) bez użycia opcji Exit Sub Hasla3() Dim wzor_hasla As String Dim haslo As String Dim adres As String wzor_hasla = "XYXY" adres = "Wydz. M-E, Wyb. Wyspiańskiego 27" licznik_prob = 0 Do Until (haslo = wzor_hasla) Or (licznik_prob>= 3) haslo = InputBox("Podaj haslo:") licznik_prob = licznik_prob + 1 If haslo <> wzor_hasla Then MsgBox "Złe hasło: do trzech razy sztuka!" End If Loop If haslo = wzor_hasla Then MsgBox adres Else MsgBox "Sorry, blokada!" End If End Sub
b) z użyciem opcji Exit Do Sub Hasla4() Dim wzor_hasla As String Dim haslo As String Dim adres As String wzor_hasla = "XYXY" adres = "Wydz. M-E, Wyb. Wyspiańskiego 27" licznik_prob = 0 Do Until licznik_prob >= 3 haslo = InputBox("Podaj haslo:") licznik_prob = licznik_prob + 1 If haslo = wzor_hasla Then Exit Do MsgBox "Złe hasło: do trzech razy sztuka!" Loop If haslo = wzor_hasla Then MsgBox adres Else MsgBox "Sorry, blokada!" End If End Sub tutaj następuje opuszczenie pętli
c) z wykorzystanie pętli For oraz opcji Exit For Sub Hasla5() Dim wzor_hasla As String Dim haslo As String Dim adres As String wzor_hasla = "XYXY" adres = "Wydz. M-E, Wyb. Wyspiańskiego 27" For licznik_prob = 1 To 3 haslo = InputBox("Podaj haslo:") If haslo = wzor_hasla Then Exit For MsgBox "Złe hasło: do trzech razy sztuka!" Next If haslo = wzor_hasla Then MsgBox adres Else MsgBox "Sorry, blokada!" End If End Sub
Przykłady algorytmów iteracyjnych i rekurencyjnych 1) Funkcja silnia a) definicja iteracyjna: Opis funkcji w VBA do tej definicji: Function Silnia_It(n) As Integer Dim Il As Integer Il = 1 For i = 2 To n Il = Il * i Next i Silnia_It = Il End Function
b) definicja rekurencyjna: Opis funkcji do definicji rekurencyjnej: Function Silnia_Rek(n) As Integer If n = 0 Then Silnia_Rek = 1 Else Silnia_Rek = Silnia_Rek(n - 1) * n End If End Function
2) Największy Wspólny Dzielnik według algorytmu Euklidesa: Przy założeniu, że a>b NWD(a,b)=NWD(b,a mod b) Powtarzać do momentu, gdy b=0. Wówczas NWD(a,b)=a a) iteracyjnie: Function NWD_It(ByVal a, ByVal b) As Integer Dim c As Integer Do Until b = 0 c = a Mod b a = b b = c Loop NWD_It = a End Function Uwaga! Zwróć uwagę na parametry funkcji!
b) NWD rekurencyjnie: Function NWD_Rek(ByVal a, ByVal b) As Integer If b = 0 Then NWD_Rek = a Else NWD_Rek = NWP_Rek(b, a Mod b) End If End Function
c) Dodatkowo obliczenie Najmniejszej Wspólnej Wielokrotności: Function NWW(a, b) As Integer NWW = a * b / NWD_It(a, b) End Function
Przekazywanie parametrów do procedury Przekazywanie argumentów przez referencję Przekazana jest sama zmienna jako argument procedury. Jeżeli wywołana procedura zmienia wartość argumentu, ta zmiana pozostanie, kiedy sterowanie powróci do procedury wywołującej. Aby określić, że argument będzie przekazywany przez referencję w nagłówku Sub wywoływanej procedury należy zadeklarować zmienną ze słowem ByRef. Ponieważ jest to domyślny sposób przekazywania parametrów, można słowo ByRef ominąć.
Przekazywanie parametrów do procedury Przekazywanie argumentów przez wartość Przekazana zostaje kopia zmiennej jako argument procedury. Jeżeli wywołana procedura zmienia argument, ta zmiana nie pozostanie, kiedy sterowanie powróci do procedury wywołującej. Aby określić, że argument ma być przekazany przez wartość w nagłówku Sub wywoływanej procedury, należy użyć słowa kluczowego ByVal, aby zadeklarować zmienną.
Kryteria zakończenia algorytmów obliczeniowych. Dokładność obliczeń. Przykład 1: Obliczanie wartości funkcji z rozwinięcia w szereg (wzory Taylora): Zauważmy, że n-ty wyraz tego szeregu można policzyć następująco:
Korzystając z tego, formułujemy algorytm: a) zadając z góry ilość kroków, tzn. ilość sumowanych wyrazów: Sub exponenta_for() x = InputBox("x=") n = InputBox("Ile wyrazów?") s = 0 w = 1 For i = 1 To n s = s + w w = w * x / i Next i MsgBox "e_do_" & x & "=" & s End Sub
b) żądając określonej dokładności: Sub exponenta_eps() Dim eps As Single x = InputBox("x=") eps = InputBox("Z jaką dokładnością?") i = 1 s = 0: w = 1 Do Until w < eps s = s + w w = w * x / i i = i + 1 Loop MsgBox "e_do_" & x & "=" & s MsgBox "ilość kroków=" & i End Sub dokładność
Przykład 2: Podobne obliczenia (ze wzorów Taylora) dla funkcji trygonometrycznych: a) sin(x) Sub mo_sin() x = InputBox("x=") n = InputBox("Ile wyrazów?") s = 0 w = x For i = 1 To n s = s + w w = -w * x ^ 2 / ((2 * i) * (2 * i + 1)) Next i MsgBox "sin_" & x & "=" & s End Sub
Przykład 2: Podobne obliczenia (ze wzorów Taylora) dla funkcji trygonometrycznych: b) cos(x): Sub mo_cos() x = InputBox("x=") n = InputBox("Ile wyrazów?") s = 0 w = 1 For i = 1 To n s = s + w w = -w * x ^ 2 / ((2 * i) * (2 * i - 1)) Next i MsgBox "cos_x=" & s End Sub
Metoda Newtona Przykład programu dla wielomianu 3-go stopnia. Porównanie z algorytmem w Excelu. Zadaniem metody jest znalezienie pierwiastka równania zadanej funkcji ciągłej f: w przedziale [a,b]. A zatem znalezienie takiego x, że
Metoda Newtona 1) W przedziale a, b znajduje się dokładnie jeden pierwiastek. 2) Funkcja ma różne znaki na krańcach przedziału, tj. f(a) f(b)<0 3) Pierwsza i druga pochodna funkcji mają stały znak w tym przedziale. W pierwszym kroku metody wybierany jest punkt startowy x 1 (zazwyczaj jest to wartość a, b, 0 lub 1), z którego następnie wyprowadzana jest styczna w f(x 1 ) Kolejne przybliżenia są dane rekurencyjnym wzorem: x k+1 = x k - f(x k) f (x k )
Algorytm, znajdujący miejsca zerowe wielomianu 3-stopnia metodą Newtona oraz potrzebne do tego opisy funkcji i pochodnej. Function wiel3(a, b, c, d, x) wiel3 = a * x ^ 3 + b * x ^ 2 + c * x + d End Function Function Poch(a, b, c, x) Poch = 3 * a * x ^ 2 + 2 * b * x + c End Function
Metoda Newtona - algorytm Sub MetodaNewtona() Dim eps As Single 'Wczytywanie współczynników wielomianu a = InputBox("a=") b = InputBox("b=") c = InputBox("c=") d = InputBox("d=") 'Określanie dokładności obliczeń eps = 0.000001
Metoda Newtona algorytm cd. x0 = -10 'Pierwsze przybliżenie f = wiel3(a, b, c, d, x0) f1 = Poch(a, b, c, x0) x1 = x0 - f / f1 'Proces iteracji Do Until Abs(f) < eps x0 = x1 f = wiel3(a, b, c, d, x0) f1 = Poch(a, b, c, x0) x1 = x0 - f / f1 Loop MsgBox "miejsce zerowe=" & x1 End Sub
Zagnieżdżanie pętli na przykładzie algorytmu sortowania. Przykład: Ustawianie rosnąco wyrazów ciągu: Public Sub SortLiczb() Dim a(100) As Integer 'Deklaracja zmiennej tablicowej jednowymiarowej Cells.Clear n = InputBox("Ile elementów ma ciąg? ") 'Generowanie losowe elementów ciągu, 'zapamiętywanie ich w zmiennej tablicowej oraz wyświetlanie For i = 1 To n a(i) = Int(Rnd * 100) Cells(1, i) = a(i) Next i
'Sortowanie For i = 1 To n For j = i To n If a(j) < a(i) Then 'Tu znowu zamiana zmiennych miejscami z = a(i) a(i) = a(j) a(j) = z End If Next j Next i 'Wyświetlenie ciągu uporządkowanego For i = 1 To n Cells(3, i) = a(i) Next i End Sub
Tablice - Arrays Tablica jest zbiorem zmiennych tego samego typu danych. Jest ona stosowana do zgrupowania razem zmiennych zależnych. Na przykład: można stworzyć tablicę 100 liczb całkowitych w celu przechowywania numerów identyfikacyjnych ID 100 urzędników jakiegoś przedsiębiorstwa, zamiast tworzenia 100 niezależnych zmiennych można stworzyć tablicę 10 stringów, aby przechować 10 różnych komunikatów, które mogą być wyświetlone za pomocą okienka dialogowego.
Tablice - Arrays Deklarowanie tablic Aby zadeklarować tablicę należy użyć słowa kluczowego Dim, Public, Private lub Static. Tablica jest deklarowana podobnie jak zwykła zmienna; pod nazwą zmiennej w deklaracji zmiennej podaje się rozmiar tablicy. Tablice statyczne mają z góry określony rozmiar, który należy podać podczas deklaracji. Tablice dynamiczne mają nieokreślony rozmiar, który może być wielokrotnie zmieniany w czasie wykonywania programu przy pomocy rozkazu ReDim.