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