Programowanie w VBA Funkcje c d Strukturalno Algorytmy
Programowanie w VBA Funkcje c. d. Strukturalność. Algorytmy. Ćwiczenia przed kolokwium.
Funkcje zwracające tablice • • • REGLINP(lista_y; lista_x) (regresja liniowa, zwraca a i b równania) MACIERZ. ODW(macierz_kwadratowa) MACIERZ. ILOCZYN(macierz 1; macierz 2) Wstawianie funkcji tablicowej: 1. Wpisujemy formułę, zaznaczamy obszar z komórką z formułą w rogu, F 2, CTRL+SHIFT+ENTER 2. Zaznaczamy obszar potrzebny do działania funkcji, wpisujemy formułę (bez odznaczania zaznaczenia), CTRL+SHIFT+ENTER
Funkcje zwracające tablice • Funkcja musi być typu Variant i przypisywana jej wartość w kodzie musi być typu tablicy; • Tworzenie takiej funkcji: zaznaczenie zakresu, wpisanie nazwy funkcji, naciśnięcie razem: ctrl+shift+enter; Function Przyklad() As Variant Dim tablica(0 To 2, 0 To 2) As Integer Dim i As Byte Dim j As Byte For i = 0 To 2 For j = 0 To 2 tablica(i, j) = (i + j) Next j Next i Przyklad = tablica End Function
Zadania 1. Znaleźć najmniejszy element zbioru (podanych w wierszu); 2. Znaleźć największy element zbioru; 3. Sortujące od najmniejszego do największego elementy zbioru liczb (podanych w wierszu); Funkcja tablicowa – zaznaczamy obszar do poddania funkcji tablicowej, wpisujemy w róg obszaru funkcję, wciskamy ctrl+shift+enter;
Znalezienie najmniejszego elementu w zbiorze Algorytm: Weź pierwszy element jako minimum pętla: czy i_element jest mniejszy od minimum? -> tak? minimum to i_element -> nie? minimum sie nie zmienia koniec pętli minimum to najmniejszy element zbioru
Złożoność obliczeniowa • Przy problemie, który trzeba rozwiązać dla n elementów, ile operacji trzeba wykonać? • Wyszukiwanie najmniejszej liczby – złożoność n (między 1 n a 2 n : dla każdej porównanie, dla niektórych przypisanie) • a*n dla dużych n zawsze będzie mniejsze niż a*n^2 (Porównywanie wartości wszystkich ze wszystkimi), więc mówimy o złożoności n lub n^2 • Złożoność obliczeniowa może też być np. : n! n^a (a również ułamkowe) n^n^n n*log(n)
Złożoność obliczeniowa • Generalnie dąży się do zmniejszania złożoności obliczeniowej algorytmów. • Niekiedy dąży się do zwiększenia złożoności obliczeniowej niektórych algorytmów, np. zabezpieczanie poprzez szyfrowanie ma celowo stworzony system tak, aby rozszyfrowywanie było szybkie z pomocą klucza, natomiast rozszyfrowywanie na chybił-trafił miało jak największą złożoność obliczeniową, tak, żeby nawet dla krótkich haseł było to zbyt skomplikowane.
Sortowanie zbioru • Złożoność obliczeniowa nie mniejsza niż n (nie da się nie sprawdzić czy wszystkie elementy są w dobrej kolejności). • Podstawowe metody n^2 • Niektóre metody dla optymistycznych warunków mogą być szybsze niż n^2, na przykład rzędu n*log(n)
Sortowanie zbioru Algorytm: pętla zewnętrzna pętla wewnętrzna (przepychanie elementu) weź element(i) sprawdź czy jest większy od element(i+1) -> tak? Zamień je miejscami -> nie? Nic nie rób koniec pętli wewnętrznej koniec pętli zewnętrznej
Żeby posortować, trzeba stworzyć sobie przykładowy zbiór do posortowania – czyli przypadkowe liczby nie po kolei…
Przedeklarowanie zmiennej • Elementów tablicy będącej argumentem funkcji nie można zmieniać; • Trzeba zadeklarować zmienną tablicową, a następnie przepisać zawartość zmiennej-argumentu do niej (przepisanie w formie pętli przepisującej element po elemencie); • Aby zadeklarować zmienną tablicową, której wielkość będzie zależna od argumentu, trzeba wykonać następujące operacje: - zadeklarować zmienną tablicową (ale bez zakresów, puste nawiasy) typu takiego, jakiego mają być elementy tablicy; - PRZEDEKLAROWAĆ (komenda Re. Dim) zmienną tablicową bezwymiarową na zmienną tablicową zwymiarowaną zmiennymi (normalnie deklaracja musi mieć stałe wartości zakresów);
Sortowanie zbioru Function SORT(zakres_komorek As Range) As Variant Dim wynik() As Double Dim i As Integer Dim j As Integer Dim tmp As Double Dim element As Variant Re. Dim wynik(0 To zakres_komorek. Count - 1) i = 0 j = 0 <przepisanie tablicy zakres_komorek do tablicy wynik po elemencie> <podwójna pętla, w której wewnętrzna pętla będzie przepychała elementy po jednym> SORT = wynik End Function
Zadania Napisz funkcje: • Sprawdzająca ile jest liczb nieparzystych w zakresie podanym jako argument (z obsługą błędu wystąpienia nie-liczby); • Funkcję tablicową (bezargumentową), której wartością jest tabliczka mnożenia 10 x 10.
Strukturalność 1. 2. 3. 4. Względność opisu i szczegółowości operacji: Wyobraźmy sobie operacje parzenia herbaty: Nalej wodę do czajnika; Zagotuj wodę; Wrzuć herbatę do kubka; Zalej herbatę. Na przykład trzeci element w rzeczywistości składa się z operacji: 1. Otwórz szafkę; 2. Weź pudełko z szafki; 3. Otwórz pudełko; 4. Weź torebkę z pudełka; 5. Zamknij pudełko; 6. Odłóż pudełko do szafki; 7. Zamknij szafkę; 8. Włóż torebkę do kubka;
Strukturalność c. d. Także czynność otwarcia szafki oznacza w rzeczywistości podniesienie ręki, złapanie za uchwyt, itd. Podniesienie ręki również oznacza wysłanie sygnałów przez mózg do nerwów, mięśni, itd. Odpowiednikami sygnałów mózgu są sygnały procesor-pamięć-peryferia, oraz przerzucanie danych do rejestrów, pamięci, itd. (to nas nie interesuje jako programistów VBA), podniesienie ręki to podstawowe komendy, czynności to proste operacje jak instrukcje w pętlach czy instrukcje warunkowe, a wykonanie całych algorytmów (jak zrobienie herbaty) to odpowiednie dobranie kolejnych operacji które składają się na program realizujący dany algorytm.
Procedury • Sub, End Sub (makra); • Private Sub (makra niedostępne z poziomu Excela, tylko z poziomu VBA); • Wywoływanie podprocedur (normalne procedury, ale robiące tylko jakąś czynność mającą sens dopiero w większej całości (robi się to po to, żeby był czytelniejszy kod): • Call <nazwa procedury> (<ew. zmienne które mają być dane procedurze>) • Funkcji napisanych przez siebie w danym arkuszu (grupie modułów) można używać normalnie jak innych poleceń (naturalnie podając argumenty); Zwrócą one wartość takiego typu, jakiego typu jest funkcja;
Odwołania do procedur Sub przyklad 1() Dim dana As Variant Dim dana 2 As Variant dana = 1 Call podprogram 1(dana) Msg. Box ("Wszystko ok, wynik to " & dana & ". ") dana 2 = funkcja 1(dana) Msg. Box ("Wszystko ok, wynik to " & dana 2 & ". ") End Sub Private Sub podprogram 1(dana) dana = dana * 2 End Sub Function funkcja 1(dana) As Integer funkcja 1 = dana * 3 End Sub
Odwołania do procedur c. d. • Odwołanie standardowe, jeśli podprogram operuje na zmiennej, zmieni ją i dalszy ciąg programu głównego będzie już używał nowej wartości zmiennej; • Aby podprogram mógł operować na przydzielonej zmiennej, a żeby główny program nadal używał starej wartości w dalszym ciągu wykonywania, używa się opcji by. Val, wówczas na potrzeby podprocedury/funkcji tworzy się kopia zmiennej;
Odwołania do procedur c. d. Sub glowny() Dim x As Integer x = 5 Call podprogram(x) Msg. Box (x) End Sub podprogram(By. Val dana) dana = dana ^ 2 Msg. Box (dana) End Sub
Żeby zrozumieć rekurencję, trzeba najpierw zrozumieć rekurencję…
Trik – odwołanie funkcji do samej siebie Function siln(wartosc As Integer) wartosc = wartosc - 1 If wartosc = 0 Then siln = 1 Exit Function End If siln = (wartosc + 1) * siln(wartosc) End Function
- Slides: 21