Dyskusja
Transkrypt
Dyskusja
(C)2005 RoG@j 2005-04-07 Zagadnienie Dyskusja Program a-strukturalny Zmienne globalne Procedury z argumentami Podsumowanie (1) Program tasiemiec (antstrukturalny) ! ! Gdy rozwiązujemy małe problemy (zadania) nie ma z tym problemów Problemy rosną (liniowo, kwadratowo?) wraz ze wzrostem złożoności zadania ! ! Trudno jest znaleźć błąd Musimy pamiętać o wszystkich szczegółach typu, co oznaczają poszczególne zmienne Podział strukturalny ale zmienne globalne ! ! ! Jest to sposób „w połowie drogi” Dzielimy program na części odpowiadające wykonywanym zadaniom Komunikacja między poszczególnymi częściami odbywa się poprzez korzystanie ze zmiennych globalnych ! VBA 27 Jest to podejście mało uniwersalne, dany fragment kodu liczy najmniejszy element tylko w wektorze a!!! ! Wczytaj z klawiatury liczbę n. Przeczytaj z kolumny arkusza dane (n liczb) i przepisz je do wektora a. Wyznacz minimalny wyraz w tym wektorze i wyprowadź wynik na ekran. ! W tej wstępnej fazie „umawiamy” się, że czytamy dane z kolumny pierwszej począwszy od pierwszego wiersza Kod VBA Sub Wektor1() Dim a() As Double Dim n As Long Dim i As Long Dim Min As Double n = InputBox("n") ReDim a(1 To n) For i = 1 To n a(i) = Cells(i, 1) Next i Min = a(1) For i = 2 To n If a(i) < Min Then Min = a(i) Next i MsgBox Min End Sub Kod VBA Option Explicit Dim a() As Double Dim n As Long Dim Min As Double Sub Wektor2() n = InputBox("n") ReDim a(1 To n) Czytaj Minimum MsgBox Min End Sub Sub Minimum() Dim i As Long Min = a(1) For i = 2 To n If a(i)<Min Then Min=a(i) Next i End Sub Sub Czytaj() Dim i As Long For i = 1 To n a(i) = Cells(i, 1) Next i End Sub 1 (C)2005 RoG@j Procedury z parametrami ! Widać ewidentnie, że podejście ze zmiennymi globalnymi strukturyzuje rozwiązanie, ale jest ono mało uniwersalne ! ! ! Czytamy dane z wektora a – czytanie z innego wektora wymaga nowej procedury Obliczamy minimum w wektorze a Przekazywanie danych w postaci listy argumentów w pełni rozwiązuje ten problem Dalsze pomysły (uogólnienia) ! Czytaliśmy n komórek „kolumnowo” począwszy od A1 ! ! ! Czytanie n komórek począwszy od dowolnej komórki arkusza Czytanie m wierszy, n kolumn począwszy od komórki A1 Czytanie m wierszy i n kolumn począwszy od dowolnej komórki startowej Podział na bloki ! ! Czytanie danych Transpozycja macierzy ! ! Wypisanie wyniku Wypisanie wyniku Sub Czytaj(ByVal m&, ByRef b#()) Dim i As Long For i = 1 To m b(i) = Cells(i, 1) Next i End Sub Function Min(ByVal m&, ByRef b#()) As Double Dim i As Long Min = b(1) For i = 2 To m If b(i) < Min Then Min = b(i) Next i End Function Przykład prawie klasyczny ! ! Zadaniem świetnie nadającym się do podziału na procedury jest symetryzacja macierzy. Przeczytaj z komórek arkusza macierz a. Rozłóż ja na macierz symetryczną i antysymetryczną. Sprawdź poprawność rozkładu As=0.5(A+AT), Aa=0.5(A-AT), A=As+Aa Wymóg uniwersalności ! Warto pokusić się o napisanie uniwersalnej procedury czytania i wypisywania wyników ! ! Parametrami będą lewy górny narożnik i wymiary macierzy UWAGA ! Wypisanie wyniku Sprawdzenie ! VBA 27 Sub Wektor3() Dim n&, a#() n = InputBox("n") ReDim a(1 To n) Call Czytaj(n, a) MsgBox Min(n, a) End Sub Wypisanie wyniku Macierz antysymetryczna ! ! Kod VBA Macierz symetryczna ! ! 2005-04-07 ! Parametry tablicowe muszą być przekazywane ByRef – nie można ich przekazać ByVal Programista musi sam pilnować, by nie zniszczyć tablicy z danymi 2