• Nie Znaleziono Wyników

System Visual Basic dla aplikacji w algorytmice i wizualizacji

N/A
N/A
Protected

Academic year: 2021

Share "System Visual Basic dla aplikacji w algorytmice i wizualizacji"

Copied!
90
0
0

Pełen tekst

(1)

S

YSTEM

V

ISUAL

B

ASIC DLA

A

PLIKACJI

(2)
(3)

Andrzej Burewicz

Nikodem Miranowicz

S

YSTEM

V

ISUAL

B

ASIC DLA

A

PLIKACJI

(4)

Andrzej Burewicz, Nikodem Miranowicz

S

YSTEM

V

ISUAL

B

ASIC DLA

A

PLIKACJI W ALGORYTMICE I WIZUALIZACJI

Recenzent: prof.dr hab. Marek Krčglewski

Projekt okãadki: dr Nikodem Miranowicz

Opracowanie komputerowe: dr Nikodem Miranowicz

ISBN: 83-89723-17-4

Druk i oprawa: Sowa–Druk na İyczenie www.sowadruk.pl, tel. 022 431-81-40

Zakãad Dydaktyki Chemii Uniwersytet im. Adama Mickiewicza

(5)

Spis tre

Ğci

WstĊp... 1

I. Przygotowanie systemu Visual Basic dla Aplikacji ... 3

x Zadanie 1. Program wypisujący na ekranie pojedyncze zdanie... 5

x Zadanie 2. Program wypisujący na ekranie trzy kolejne zdania... 6

x Zadanie 3. Program wypisujący na ekranie siedem kolejnych zdaĔ odnoszących siĊ do kolejnych dni tygodnia z wydzieleniem pierwszej czĊĞci zdaĔ w postaci zmiennej tekstowej. ... 8

x Zadanie 3b. Program wypisujący na ekranie siedem kolejnych zdaĔ odnoszących siĊ do kolejnych dni tygodnia z wydzieleniem pierwszej czĊĞci zdaĔ w postaci zmiennej tekstowej, oraz alternatywną zmienną... 10

x Zadanie 4. Program wypisujący na ekranie po trzy zdania odnoszące siĊ do kolejnych dni tygodnia z wydzieleniem pierwszej czĊĞci zdaĔ w postaci zmiennej tekstowej oraz wydzieleniem czĊĞci kodu dotyczącego wypisywania w postaci procedury. ... 11

x Zadanie 5. Program wypisujący teksty przez procedurĊ tydzien() zgodnie z ogólnym opisem jak w zadaniu 4, lecz wypisujący w tej samej procedurze ocenĊ tylko jednego dnia. ... 13

x Zadanie 6. Program zgodny z ogólnym opisem jak w zadaniu 5 wypisujący teksty przez procedurĊ tydzien() przekazując do niej zmienną liczbową. ... 15

x Zadanie 7. Program wypisujący w pĊtli odpowiednie teksty odnoszące siĊ do kolejnych dni tygodnia. ... 17

x Zadanie 8. Program wypisujący w pĊtli odpowiednie teksty odnoszące siĊ do kolejnych dni tygodnia i warunkowo dodający dla kaĪdego inny komentarz. ... 19

x Zadanie 9. Program wykonujący podstawowe operacje matematyczne... 22

x Zadanie 10. Program wykonujący obliczenia matematyczne z funkcjami... 23

x Zadanie 11. Program obliczania silni z 10 w pĊtli "for" z kresem ze wzglĊdu na zmienną x... 24

x Zadanie 12. Program obliczania silni w pĊtli "while ... wend". ... 25

(6)

2

x Zadanie 20. Znajdowanie elementów w zbiorach uporządkowanych... 41

III. Algorytmy - porządkowanie elementów ... 43

x Zadanie 21. Porządkowanie zbiorów przez wybór ... 44

x Zadanie 22. Porządkowanie zbiorów "bąbelkowe" ... 47

x Zadanie 23. Porządkowanie zbiorów przez wstawienie ... 49

x Zadanie 24. Porządkowanie zbiorów "szybkie" ... 51

x Zadanie 25. Porządkowanie zbiorów przez zliczanie ... 54

x Zadanie 26. Porządkowanie zbiorów kubeákowe... 56

IV. Visual Basic dla Aplikacji w wizualizacji ... 59

x Zadanie 27. Wypeánianie komórek losowymi liczbami... 61

x Zadanie 28. Wyszukiwanie najwiĊkszej wartoĞci w dwuwymiarowej tablicy danych ... 63

x Zadanie 29. Zliczanie wartoĞci wystĊpujących w dwuwymiarowej tablicy danych... 64

x Zadanie 30. Mapa barwna funkcji ... 65

x Zadanie 31. Dynamiczny wykres funkcji dwuparametrowej ... 67

x Zadanie 32. Wizualizacja algorytmu porządkowania... 71

x Zadanie 33. Przeksztaácanie krzywej miareczkowania... 74

x Zadanie 34. Wizualizacja modelu PDB w PowerPoint... 77

x Zadanie 35. Budowa diagramu organizacyjnego na podstawie zapisu umownego w PowerPoint80 V. Materiaáy uzupeániające ... 83

(7)

Wst

Ċp

Jednym z istotnych elementów kursu Technologii Informacyjnej są zagadnienia związane z nauką podstaw algorytmiki. WyróĪnionym zadaniem jest teĪ „zapisywanie algorytmów w postaci procedur, które moĪe wykonaü komputer - podstawowe struktury jĊzyków opisu algorytmów”.

Rozpatrując ogólnie dostĊpne metody programowania, które moĪna wykorzystaü miĊdzy innymi w kursie algorytmiki zwrócono uwagĊ na obecnoĞü wielu z nich w systemach operacyjnych i popularnych aplikacjach. WyróĪniają siĊ wĞród nich AppleScript w systemach MacOS, Visual Basic dla Aplikacji w aplikacjach pakietu Microsoft Office (Windows i MacOS) oraz JavaScript implementowany w przeglądarkach internetowych.

W rezultacie opracowano materiaáy metodyczne dostĊpne takĪe w formie serwisu Internetowego (HTTP://ZDCH.AMU.EDU.PL/ALGORYTMY/) przeznaczone dla osób, które na praktycznych przykáadach chcą nauczyü siĊ implementacji podstawowych algorytmów oraz podstaw wizualizacji w systemie Visual Basic dla Aplikacji. Zasadniczym zaĞ zadaniem tych materiaáów jest przedstawienie reguá programowania na praktycznych przykáadach zadaĔ rozwaĪanych w kursie Technologii Informacyjnej.

(8)

2

kodu. Zagadnienia szczegóáowe dotyczące samego algorytmu opisane są w odpowiednio okrojonej wersji, ale niezbĊdnej dla poprawnego programowania.

Microsoft Visual Basic dla Aplikacji (VBA) jest jĊzykiem programowania stosowanym do rozbudowy i sterowania pakietowymi aplikacjami biurowymi Microsoft i ich integracji z dostĊpnymi danymi i systemami. VBA udostĊpnia szeroki zestaw narzĊdzi programistycznych opartych na aplikacji Microsoft Visual Basic. Istota stosowalnoĞci VBA opiera siĊ na zaáoĪeniu, Īe program ten umoĪliwia rozbudowĊ dostĊpnych aplikacji za jego pomocą i Īe daje on wiĊksze moĪliwoĞci tworzenia bardziej efektywnych aplikacji niĪ budowa narzĊdzi od podstaw.

W VBA zawarte są elementy zintegrowanego Ğrodowiska programistycznego (IDE – ang. Integrated Development Environment) wykorzystujące skáadniki analogiczne do tych z systemu Microsoft Visual Basic - Project Window, Properties Window, Debugging, jak równieĪ Microsoft Forms umoĪliwiające áatwe tworzenie interfejsu uĪytkownika. Zintegrowanie tych narzĊdzi w nadrzĊdnej aplikacji znacznie usprawnia i przyspiesza proces tworzenie programów sterujących aplikacjami.

KsiąĪka niniejsza przeznaczona jest do wspomagania zajĊü z Technologii Informacyjnej i Informatyki w szkolnictwie wyĪszym ze szczególnym wyróĪnieniem studiów chemicznych. Zawiera zbiór zadaĔ z podstawowym ich omówieniem. Zakáada siĊ, Īe prowadzący zajĊcia przedstawiaü bĊdzie uzupeániające materiaáy i informacje niezbĊdne do wáaĞciwego zrozumienia prezentowanych zagadnieĔ. Czytelnicy, którzy poznawaü bĊdą zadania z tej ksiąĪki samodzielnie powinni systematycznie uzupeániaü z innych Ĩródeá swą wiedzĊ teoretyczną dotyczącą zwáaszcza programowania strukturalnego i zorientowanego obiektowo, programowania w Visual Basic oraz zastosowaĔ Visual Basic dla Aplikacji. KsiąĪka ta stanowi praktyczny wstĊp do programowania w jednym z prostszych jĊzyków programowania i zastosowania go w podstawowej wizualizacji chemicznej.

(9)

I. Przygotowanie systemu

Visual Basic dla Aplikacji

PrzystĊpując do realizacji zadaĔ w niniejszym zbiorze tworzyü bĊdziemy projekty w programie Microsoft Word (lub Microsoft Excel). Moduá Macro tego programu umoĪliwi nam wprowadzenie kodu programu, zweryfikowanie jego poprawnoĞci, skompilowanie go i uruchomienie.

Zadania programistyczne opisane w skrypcie zostaáy przygotowane do realizacji na komputerach wyposaĪonych w program Microsoft Word, Microsoft Excel lub Microsoft PowerPoint (czyli komputerach PC (tzw. Wintel) z systemem Windows lub komputerach Macintosh z systemem Mac OS 9 lub Mac OS X). Wykonywanie üwiczeĔ wymaga zainstalowania moduáu VBA.

Przy uĪyciu instalacji standardowej pakietu Microsoft Office instalowany jest moduá „Visual Basic dla Aplikacji“ (Microsoft stosuje nazwĊ Visual Basic dla Aplikacji nawet w polskiej wersji swego pakietu i odpowiednich materiaáach informacyjnych, wielu autorów stosuje jednak spolszczoną nieznacznie wersjĊ tej nazwy Visual Basic dla Aplikacji i taką teĪ przyjĊliĞmy do stosowania w niniejszej ksiąĪce). Do grupy funkcji instalowanych domyĞlnie przy pierwszym uĪyciu z zakresu przydatnego w naszym kontekĞcie naleĪy „Pomoc dla jĊzyka Visual Basic dla Aplikacji“, jednak jest to pomoc wyáącznie w jĊzyku angielskim, stąd jej zastosowanie moĪe byü dla wielu czytelników ograniczone.

(10)

4

pozycjĊ Visual Basic dla Aplikacji, a nastĊpnie kliknąü ikonĊ obok pozycji Pomoc programu Visual Basic, aby wyĞwietliü opcje instalacyjne. Na koniec kliknąü naleĪy polecenie Uruchom z mojego komputera lub Uruchom z sieci, a nastĊponie kliknąü przycisk Aktualizuj.

Uruchommy program Microsoft Word. Po uruchomieniu program przedstawia na ekranie okno dokumentu. W tym dokumencie prezentowane bĊdą wyniki dziaáania programów lecz sam program wpisaü bĊdzie trzeba w oknie edytora Makro. NaleĪy wybraü opcjĊ NarzĊdzia/Makro/Makra... (Tools/Macro/Macros...) .

Przedstawione zostanie okno wyboru lub definicji pliku makroinstrukcji. Wpisaü naleĪy nazwĊ procedury (np. "Zadanie_1" - uwaga, nie naleĪy uĪywaü spacji w nazwie zamiast tego zaĞ kreskĊ dolną). Uwaga. WaĪne jest, aby tworzone w ramach tych üwiczeĔ makra nie zapisywaü w szablonie globalnym, który jest opcją domyĞlną, a

pliku dokumentu. Dlatego teĪ naleĪy wybraü opcjĊ Makra w: Dokument1 (dokument). Aby utworzyü makro z tymi cechami naleĪy wybraü przycisk [Utwórz] ([Create]).

Macro Editor wpisze tylko zasadnicze czĊĞci procedury:

Sub zadanie_1() '

' Zadanie_1 Makro

' Makro utworzone 2004-08-17 przez Nikodem Miranowicz '

(11)

Zadanie 1. Program wypisuj

ący na ekranie pojedyncze

zdanie.

Wypisywanie treĞci na ekranie jest kluczowym sposobem komunikacji komputera z uĪytkownikiem. Zanim nauczymy siĊ wykorzystywaü moc obliczeniową komputera naleĪy siĊ zapoznaü z podstawowymi metodami operowania tekstem.

Realizacja zadania 1

Moduá Visual Basic dla Aplikacji przeznaczony jest do realizowania zadaĔ na zawartoĞci dokumentów programu macierzystego -

w naszym przypadku programu Word. Polecenie ActiveDocument.Content ma na celu okreĞlenie zawartoĞci (Content) aktywnego dokumentu (ActiveDocument) i w rezultacie spowoduje, Īe aktualny dokument programu Word zostanie wymazany a w nim zostanie przedstawiona okreĞlona treĞü.

Uwaga. W przedstawionym przykáadzie zastosowano tzw. znak kontynuacji (skáadający siĊ ze znaku spacji i znaku podkreĞlenia), który pozwala dáugie polecenia pisaü w kilku wierszach.

Sub zadanie1()

ActiveDocument.Content = _

"Program napisany w Visual Basic " & _ "dla Aplikacji pozostawia tekst w dokumencie" End Sub

(12)

6

Zadanie 2. Program wypisujący na ekranie trzy kolejne

zdania.

Na program ten skáada siĊ kilka instrukcji wyprowadzania znaków. Instrukcje tych programów wykonywane są sekwencyjnie tzn. kaĪda instrukcja jest realizowana zgodnie z kolejnoĞcią wystĊpowania w programie (od strony lewej do prawej i z góry w dóá).

Realizacja zadania 2

Jak to juĪ wyĪej zaznaczono polecenie "ActiveDocument.Content =" okreĞla zawartoĞü caáego dokumentu zmazuje wiĊc przy tym wszystko, co w nim byáo dotychczas okreĞlone. Aby dodaü do dokumentu nowe treĞci, naleĪy wiĊc wybraü polecenie "ActiveDocument.Content.InsertAfter Text:=" umieszczające tekst (Text) przez wstawienie go na koĔcu (InsertAfter) aktualnej zawartoĞci (Content) aktywnego dokumentu (ActiveDocument). Dodatkowo zaĞ naleĪy zastosowaü specjalny okreĞlnik zakoĔczenia linii (LineFeed) - znacznik nowej linii w Visual Basic przyjmujący postaü vbLf.

Sub zadanie2()

ActiveDocument.Content = ""

ActiveDocument.Content.InsertAfter Text:= _ "Jest taki dzieĔ w tygodniu ... Poniedziaáek" & vbLf ActiveDocument.Content.InsertAfter Text:= _ "Jest taki dzieĔ w tygodniu ... Wtorek" & vbLf ActiveDocument.Content.InsertAfter Text:= _ "Jest taki dzieĔ w tygodniu ... ĝroda" & vbLf End Sub

(13)

W przykáadzie tym wyjaĞnienia wymaga stosowanie znaków równoĞci. W pierwszej linii kodu zastosowano znak równoĞci jako operator przypisania zawartoĞci aktywnego dokumentu przypisuje siĊ (lub podstawia siĊ pod niego) okreĞlony za znakiem równoĞci tekst umieszczony w cudzysáowie. W kolejnej linii wobec tego samego obiektu ActiveDocument.Content stosowana jest metoda InsertAfter stosująca siĊ do jednego wybranego argumentu – Text. Konstrukcja „Text:=“ jest tzw. nazywanym argumentem (ang. named argument) i uáatwia wybranie argumentu dla metody InsertAfter.

(14)

8

Zadanie 3. Program wypisujący na ekranie siedem

kolejnych zdaĔ odnoszących siĊ do kolejnych dni tygodnia

z wydzieleniem pierwszej cz

ĊĞci zdaĔ w postaci zmiennej

tekstowej.

Podstawowym sposobem optymalizacji programu jest wydzielanie z materiaáu opisywanego przez program wartoĞci staáych i zmiennych.

Zmienną jest nazwane miejsce magazynowania danych mogące zawieraü dane, które mogą byü modyfikowane podczas wykonywania programu. KaĪda zmienna ma nazwĊ, która jednoznacznie identyfikuje zmienną w jej zakresie. Staáą moĪna zdefiniowaü podobnie z tą jednak zasadniczą róĪnicą, Īe staáe, zgodnie zresztą z ich nazwą nie mogą byü modyfikowane podczas wykonywania programu.

W przykáadzie bĊdącym rozwiniĊciem zadaĔ poprzednich wydzielamy z wypisywanych tekstów powtarzający siĊ element i wáączamy go do poleceĔ wypisywania treĞci na ekranie w postaci symbolicznej. Symbolem tego fragmentu tekstu bĊdzie "s1", lecz nazewnictwo zmiennych pozwala nam na wiĊkszą kreatywnoĞü. Symbol – zmienną naleĪy wczeĞniej odpowiednio zadeklarowaü i przypisaü jej wartoĞü tekstową, potem zaĞ w odpowiedni sposób dodaü do wypisywania tekstów.

Przypisanie wartoĞci zmiennej dokonuje siĊ przez instrukcjĊ zawierającą nazwĊ zmiennej, znak równoĞci, wartoĞü zmiennej:

(15)

Realizacja zadania 3a

Sub zadanie3()

s1 = "Jest taki dzieĔ w tygodniu... " ActiveDocument.Content = ""

ActiveDocument.Content.InsertAfter Text:=s1 & "Poniedziaáek" & vbLf ActiveDocument.Content.InsertAfter Text:=s1 & "Wtorek" & vbLf ActiveDocument.Content.InsertAfter Text:=s1 & "ĝroda" & vbLf ActiveDocument.Content.InsertAfter Text:=s1 & "Czwartek" & vbLf ActiveDocument.Content.InsertAfter Text:=s1 & "Piątek" & vbLf ActiveDocument.Content.InsertAfter Text:=s1 & "Sobota" & vbLf ActiveDocument.Content.InsertAfter Text:=s1 & "Niedziela" & vbLf End Sub

(16)

10

Zadanie 3b. Program wypisujący na ekranie siedem

kolejnych zdaĔ odnoszących siĊ do kolejnych dni tygodnia

z wydzieleniem pierwszej czĊĞci zdaĔ w postaci zmiennej

tekstowej oraz alternatywn

ą zmienną.

Realizacja zadania 3b

Sub zadanie3()

s1 = "Jest taki dzieĔ w tygodniu... "

s2 = "Mój ulubiony dzieĔ w tygodniu to ... " ActiveDocument.Content = ""

ActiveDocument.Content.InsertAfter Text:=s1 & "Poniedziaáek" & vbLf ActiveDocument.Content.InsertAfter Text:=s1 & "Wtorek" & vbLf ActiveDocument.Content.InsertAfter Text:=s2 & "ĝroda" & vbLf ActiveDocument.Content.InsertAfter Text:=s1 & "Czwartek" & vbLf ActiveDocument.Content.InsertAfter Text:=s1 & "Piątek" & vbLf ActiveDocument.Content.InsertAfter Text:=s1 & "Sobota" & vbLf ActiveDocument.Content.InsertAfter Text:=s1 & "Niedziela" & vbLf End Sub

(17)

Zadanie 4. Program wypisujący na ekranie po trzy zdania

odnoszące siĊ do kolejnych dni tygodnia z wydzieleniem

pierwszej czĊĞci zdaĔ w postaci zmiennej tekstowej oraz

wydzieleniem cz

ĊĞci kodu dotyczącego wypisywania

w postaci procedury.

Fragment kodu, który miaáby siĊ powtarzaü wielokrotnie w ukáadzie sekwencyjnym, moĪna wydzieliü do osobnej grupy poleceĔ mającej postaü procedury lub funkcji i odwoáywaü siĊ do niej w wybranych momentach. Funkcja róĪni siĊ od procedury tym, Īe wyniki dziaáaĔ wykonanych przez funkcjĊ mogą byü zwracane do bloku je wywoáującego przez nazwĊ funkcji zaĞ w procedurze przez parametry procedury. W naszym przypadku nie potrzebujemy aby wyodrĊbniona w funkcji czy procedurze czĊĞü programu zwracaáa jakiekolwiek dane dlatego zastosujemy konstrukcjĊ procedury wywoáywanej poleceniem Call.

Realizacja zadania 4

Sub zadanie4()

ActiveDocument.Content = "" Call Tydzien ("Poniedziaáek") Call Tydzien ("Wtorek") Call Tydzien ("ĝroda") Call Tydzien ("Czwartek") Call Tydzien ("Piątek") Call Tydzien ("Sobota") Call Tydzien ("Niedziela")

(18)

12

Dodatkowym, nowym elementem w programie jest specyficzna konstrukcja ostatniej linii programu. Zadaniem tej linii jest wypisanie, oprócz tekstu opisu, pierwszej litery cytowanego sáowa. Sáowo to zawarte w zmiennej "s" jest traktowane przez program jako áaĔcuch znaków. Przy takim traktowaniu tekstów przez jĊzyk programowaniaáatwe jest wydzielanie fragmentów tekstu. Wyspecjalizowana funkcja Visual Basic Mid(t,x,y) pozwala z áaĔcucha t wydzieliü y znaków zaczynając od znaku x.

W tym miejscu warto wspomnieü o innych funkcjach tekstowych: Left(t,y) i Right(t,y), które podobnie jak Mid wydzielają okreĞloną liczbĊ znaków odpowiednio od lewej lub prawej strony danego áaĔcucha (w omawianym zadaniu proponowaną funkcjĊ Mid(s,1,1) moĪna z tym samym rezultatem zastąpiü funkcją Left(s,1)); Trim(t), LTrim(t) i RTrim(t) usuwających spacje wiodące odpowiednio z obu stron, lewej strony lub prawej strony áaĔcucha znaków; String(t,x) i Space(x) tworzące áaĔcuch skáadający siĊ ze wskazanej liczby okreĞlonych znaków lub spacji; UCase(t) i LCase(t) zmieniający áaĔcuch znaków w majuskuáĊ lub minuskuáĊ; InStr(x,t1,t2,v) wyszukujący okreĞlony áaĔcuch znaków w innym áaĔcuchu znaków; StrComp(t1,t2,v) porównujący dwa áaĔcuchy znaków; Len(t) podający dáugoĞü áaĔcucha znaków.

(19)

Zadanie 5. Program wypisujący teksty przez procedurĊ

tydzien() zgodnie z ogólnym opisem jak w zadaniu 4, lecz

wypisuj

ący w tej samej procedurze ocenĊ tylko jednego

dnia.

Istotnym elementem programów komputerowych jest warunkowoĞü okreĞlonych dziaáaĔ. WarunkowoĞü ta okreĞla, Īe pewne instrukcje wykonywane są tylko w odpowiednio przewidzianych sytuacjach. Potocznie warunek okreĞla sáowo "jeĞli", które przeniesione na instrukcje jĊzyków programowania przybiera formĊ "if".

Instrukcje warunkowe umoĪliwiają - zgodnie z nazwą - warunkowe wykonywanie instrukcji - w zaleĪnoĞci od skutecznoĞci wypeánienia zadanego warunku. Na przykáad warunkiem moĪe byü "JeĞli [omawiany dzieĔ] jest Ğrodą to..." . Warunek taki wyraĪony w programie brzmi: if s="ĝroda". Po instrukcji warunkowej umieszczona powinna byü instrukcja, która bĊdzie wykonywana w przypadku speánienia zadanego warunku.

(20)

14

Realizacja zadania 5

Sub zadanie5()

ActiveDocument.Content = "" Call Tydzien ("Poniedziaáek") Call Tydzien ("Wtorek") Call Tydzien ("ĝroda") Call Tydzien ("Czwartek") Call Tydzien ("Piątek") Call Tydzien ("Sobota") Call Tydzien ("Niedziela") End Sub

Sub Tydzien(s)

s1 = "Jest taki dzieĔ w tygodniu... " s2 = "To mój ulubiony dzieĔ w tygodniu "

s3 = "Pierwsza litera nazwy tego dnia tygodnia to: " ActiveDocument.Content.InsertAfter Text:=s1 ActiveDocument.Content.InsertAfter Text:=s & vbLf

ActiveDocument.Content.InsertAfter Text:=s3 & Mid(s, 1, 1) & vbLf If s = "ĝroda" Then

ActiveDocument.Content.InsertAfter Text:=s2 & vbLf End If

(21)

Zadanie 6. Program zgodny z ogólnym opisem jak

w zadaniu 5 wypisujący teksty przez procedurĊ tydzien()

przekazując do niej zmienną liczbową.

Kolejna modyfikacja programu uwzglĊdnia skrócenie poleceĔ przez przekazywanie przez procedurĊ nie nazwy dnia, lecz jego kolejnoĞci w tygodniu. MoĪliwe jest to przez zastosowanie tablicy zmiennych, w której kolejne wartoĞci zmiennej zapisane są w kolejnych pozycjach tablicy.

Definicja tablicy zmiennych jest rozwiniĊciem definicji zmiennej prostej. Sáowo kluczowe Dim okreĞla powstanie zmiennej tablicowej (konieczne jest okreĞlenie rozmiarów tablicy). Deklaracja tablicy zmiennych uzupeániona jest przez deklaracjĊ typu zmiennych stosowanych w tablicy. Sformuáowanie As String deklaruje stosowanie w tablicy zmiennych

Sub zadanie6() ActiveDocument.Content = "" Call Tydzien (1) Call Tydzien (2) Call Tydzien (3) Call Tydzien (4) Call Tydzien (5) Call Tydzien (6) Call Tydzien (7) End Sub Sub Tydzien(m) Dim st(7) As String st(1) = "Poniedziaáek" st(2) = "Wtorek" st(3) = "ĝroda" st(4) = "Czwartek" st(5) = "Piątek" st(6) = "Sobota" st(7) = "Niedziela"

s1 = "Jest taki dzieĔ w tygodniu..." s2 = "To mój ulubiony dzieĔ w tygodniu" s3 = "Pierwsza litera nazwy tego dnia tygodnia to:" ActiveDocument.Content.InsertAfter Text:= _ s1 ActiveDocument.Content.InsertAfter Text:= _ st(m) & vbLf

Realizacja zadania 6

(22)

16

(tak jak w zadaniach poprzednich) jako zmienna typu Variant, co nie zawsze jest korzystne.

Warto pamiĊtaü, Īe moĪliwe jest deklarowanie zmiennych liczbowych o róĪnym zakresie i dokáadnoĞci (Integer, Long Integer, Single, Double, Decimal, Byte) zmiennych tekstowych (Fixed String, Variable String) i innych zmiennych specyficznych (Currency, Date, Object, Variant).

Odwoáywanie siĊ do zmiennych zawartych w tablicy wymaga podania pozycji danej zmiennej w tablicy.

Odwoáywanie siĊ do procedury Tydzien() przez parametr liczbowy wymaga zmiany deklaracji procedury. W konsekwencji teĪ musi ulec zmianie ukáad instrukcji warunkowej.

(23)

Zadanie 7. Program wypisujący w pĊtli odpowiednie teksty

odnoszące siĊ do kolejnych dni tygodnia.

Zestaw poleceĔ z gáównej czĊĞci programu przekazujący do procedury Tydzien() kolejne wartoĞci liczbowe moĪe byü áatwo zoptymalizowany przez umieszczenie instrukcji wywoáywania procedury w pĊtli, gdzie zmieniana bĊdzie tylko wartoĞü liczbowa parametru procedury.

Struktura pĊtli umoĪliwia wykonywanie ciągu instrukcji, aĪ do momentu zajĞcia warunku zakoĔczenia pĊtli. W konstrukcji programistycznej przyjmuje ona formĊ For n = 1 To 7 ... Next, którą potocznie moĪna opisaü nastĊpująco: "dla wartoĞci n zmieniającej siĊ od jeden do siedem wykonaj ... nastĊpna wartoĞü n".

(24)

18

Realizacja zadania 7

Sub zadanie7() ActiveDocument.Content = "" For n = 1 To 7 Call Tydzien (n) Next End Sub Sub Tydzien(m) Dim st(7) As String st(1) = "Poniedziaáek" st(2) = "Wtorek" st(3) = "ĝroda" st(4) = "Czwartek" st(5) = "Piątek" st(6) = "Sobota" st(7) = "Niedziela"

s1 = "Jest taki dzieĔ w tygodniu..." s2 = "To mój ulubiony dzieĔ w tygodniu"

s3 = "Pierwsza litera nazwy tego dnia tygodnia to:" ActiveDocument.Content.InsertAfter Text:=s1

ActiveDocument.Content.InsertAfter Text:=st(m) & vbLf

ActiveDocument.Content.InsertAfter Text:=s3 & Mid(st(m), 1, 1) & vbLf If m = 3 Then

ActiveDocument.Content.InsertAfter Text:=s2 & vbLf End If

(25)

Zadanie 8. Program wypisuj

ący w pĊtli odpowiednie teksty

odnoszące siĊ do kolejnych dni tygodnia i warunkowo

dodający dla kaĪdego inny komentarz.

Inną formą potocznego okreĞlania warunku jest "zaleĪnie od przypadku...". Ta warunkowa konstrukcja o innej charakterystyce niĪ warunek "jeĞli", daje moĪliwoĞü uwzglĊdnienia wiĊkszej róĪnorodnoĞci sytuacji warunkowych w prostszej konstrukcji programistycznej.

Realizacja zadania 8

Instrukcja warunkowa zastosowana w tym zadaniu ma ogólną postaü „Select case (zmienna)”, po czym nastĊpuje "case wartoĞü pierwszego przypadku:”, dla którego - jeĞli speániony - instrukcje opisane są dalej, aĪ do wystąpienia kolejnej instrukcji "case", lub instrukcji "end select", koĔczącej instrukcjĊ warunkową dla danego przypadku. Dalej moĪe nastąpiü opisu kolejnego przypadku, na koĔcu zaĞ opisywania wszystkich przypadków podaü naleĪy instrukcjĊ "end select".

W zadaniu tym zastosowano równieĪ nową instrukcjĊ -ActiveDocument.Content.InsertParagraphAfter, która formą i funkcjonalnoĞcią przypomina stosowaną juĪ instrukcjĊ ActiveDocument.Content.InsertAfter i jak moĪna siĊ domyĞliü jest zastĊpnikiem instrukcji ActiveDocument.Content.InsertAfter Text:= vbLf.

(26)

20 Sub zadanie8() ActiveDocument.Content = "" For n = 1 To 7 Call Tydzien (n) Next End Sub Sub Tydzien(m) Dim st(7) As String st(1) = "Poniedziaáek" st(2) = "Wtorek" st(3) = "ĝroda" st(4) = "Czwartek" st(5) = "Piątek" st(6) = "Sobota" st(7) = "Niedziela"

s1 = "Jest taki dzieĔ w tygodniu..." s2 = "To mój ulubiony dzieĔ w tygodniu"

s3 = "Pierwsza litera nazwy tego dnia tygodnia to:" ActiveDocument.Content.InsertAfter Text:=s1

ActiveDocument.Content.InsertAfter Text:=st(m) & vbLf

ActiveDocument.Content.InsertAfter Text:=s3 & Mid(st(m), 1, 1) & vbLf If m = 3 Then

ActiveDocument.Content.InsertAfter Text:=s2 & vbLf End If

Select Case m Case 1:

ActiveDocument.Content.InsertAfter Text:= _ ("- Czy naprawdĊ nikt nie lubi Poniedziaáków?") Case 2:

ActiveDocument.Content.InsertAfter Text:=("- Wtorek jest wtórny do Poniedziaáku.") Case 3:

ActiveDocument.Content.InsertAfter Text:=("-ĝroda jest ĝrod...kiem tygodnia.") Case 4:

ActiveDocument.Content.InsertAfter Text:=("- Czwartek jest czwarty.") Case 5:

ActiveDocument.Content.InsertAfter Text:=("- No i oczywiĞcie Piątek piąty.") Case 6:

ActiveDocument.Content.InsertAfter Text:=("- W SobotĊ zaczyna siĊ swoboda.") Case 7:

ActiveDocument.Content.InsertAfter Text:= _ ("- Niedziela to zapowiedĨ nowego tygodnia.") End Select

ActiveDocument.Content.InsertParagraphAfter End Sub

(27)

Zadanie uzupeániające 8a:

Na podobieĔstwo zadania 8 napisz program przedstawiający za pomocą tekstów na ekranie kolejne planety ukáadu sáonecznego - ich nazwy, kolejnoĞü i wybrane cechy charakterystyczne. Informacje zbierz z Internetu, np.:

x HTTP://PORTALWIEDZY.ONET.PL/

x lub HTTP://ENCYKLOPEDIA.WP.PL/

Zadanie uzupe

ániające 8b:

Na podobieĔstwo zadania 8 napisz program przedstawiający na ekranie, za pomocą tekstów, kolejne miesiące roku - ich nazwy, kolejnoĞü i przysáowia na ich temat.

(28)

22

Zadanie 9. Program wykonujący podstawowe operacje

matematyczne.

To zadanie i zadania dalsze opisują zasady wykorzystanie operacji matematycznych.

Omawiane jĊzyki programowania potrafią realizowaü podstawowe dziaáania matematyczne, co przedstawiono w zadaniu 9.

Realizacja zadania 9

Obliczenia matematyczne wykonywane mogą byü bezpoĞrednio na liczbach, lecz takĪe i na zmiennych.

W powyĪszych przypadkach pod zdefiniowaną zmienną "y" podstawiana jest wartoĞü zmiennej "x" poddana dodatkowej operacji matematycznej: dodawania, odejmowania, mnoĪenia lub dzielenia.

Sub zadanie9() x = 3

s = "Wynik dziaáania (dla x=3): " ActiveDocument.Content = "" y = x + 2

ActiveDocument.Content.InsertAfter Text:=s & " y=x+2 to " & y & vbLf y = x - 2

ActiveDocument.Content.InsertAfter Text:=s & " y=x-2 to " & y & vbLf y = x * 2

ActiveDocument.Content.InsertAfter Text:=s & " y=x*2 to " & y & vbLf y = x / 2

ActiveDocument.Content.InsertAfter Text:=s & " y=x/2 to " & y & vbLf End Sub

(29)

Zadanie 10. Program wykonujący obliczenia matematyczne

z funkcjami.

Cenna jest teĪ moĪliwoĞü realizacji bardziej záoĪonych obliczeĔ matematycznych. Instrukcje potĊgowania, pierwiastkowania, funkcje trygonometryczne są dostĊpne w kaĪdym jĊzyku programowania.

Realizacja zadania 10

Wykorzystanie p

Ċtli programistycznej

Sub zadanie10()

x = 3

s = "Wynik dziaáania (dla x=3): " ActiveDocument.Content = "" y = x^2

ActiveDocument.Content.InsertAfter Text:=s & " y=x^2 to " & y & vbLf y = x^3

ActiveDocument.Content.InsertAfter Text:=s & " y=x^3 to " & y & vbLf y = Sqr(x)

ActiveDocument.Content.InsertAfter Text:=s & " y=Sqr(x) to " & y & vbLf y = x^0.5

ActiveDocument.Content.InsertAfter Text:=s & " y=x^0.5 to " & y & vbLf y = Sin(x)

ActiveDocument.Content.InsertAfter Text:=s & " y=Sin(x) to " & y & vbLf y = Cos(x)

ActiveDocument.Content.InsertAfter Text:=s & " y=Cos(x) to " & y & vbLf End Sub

(30)

24

Zadanie 11. Program obliczania silni z 10 w pĊtli "for"

z kresem ze wzglĊdu na zmienną x.

Zadanie obliczania silni jest dobrym przykáadem dla zastosowania pĊtli. Zmienna stosowana do sterowania pĊtlą moĪe stanowiü wartoĞü skáadową obliczeĔ.

Realizacja zadania 11

Program powyĪszy realizuje obliczenia zamkniĊte w pĊtli 10 razy. Sub zadanie11()

'obliczanie silni z liczb w pĊtli for y = 1

ActiveDocument.Content = "" For x = 1 To 10

y = y * x

ActiveDocument.Content.InsertAfter Text:="silnia z " & x & " = " & y & vbLf Next x

(31)

Zadanie 12. Program obliczania silni w pĊtli "while ...

wend".

Inna forma pĊtli to pĊtla "while... wend" realizująca warunek opisany w sposób potoczny nastĊpująco: "tak dáugo jak (speániany jest warunek) wykonuj".

Realizacja zadania 12

Sub zadanie12()

'obliczanie silni z liczb w pĊtli while x = 0 y = 1 While x < 10 x = x + 1 y = y * x Wend

ActiveDocument.Content = "Wynik obliczeĔ silni z " & x & " = " & y End Sub

(32)

26

Zadanie 13. Losowanie "rzut kostką"

Losowanie przez rzut kostką daje wynik pomiĊdzy 1 a 6. Realizacja takiego losowania powinna siĊ opieraü na „czynniku losowym”. Czynnik taki symuluje funkcja Rnd. Generuje ona wartoĞci rzeczywiste od 0 do 1 w sposób pseudolosowy (uruchomienie tej funkcji daje przypadkowe wartoĞci lecz porównanie ich z takimi samymi wartoĞciami losowymi na innym komputerze wykazuje „zadziwiające podobieĔstwo” – aby zerwaü ten „przypadkowy” związek naleĪy uruchomiü jednokrotnie funkcjĊ Randomize). Wygenerowane wartoĞci (od 0 do 1) naleĪy sprowadziü do oczekiwanych wartoĞci (od 1 to 6) poprzez przemnoĪenie wyniku przez 6 i zwiĊkszenie go o 1. W ten sposób wygenerowane bĊdą wartoĞci rzeczywiste od 1 do 6. Konieczne jest jeszcze sprowadzenie wygenerowanych wartoĞci rzeczywistych do wartoĞci caákowitych – dokonaü tego moĪna za pomocą funkcji INT ucinającej czĊĞü rzeczywistą i pozostawiającej wartoĞü caákowitą.

Realizacja zadania 13

Sub zadanie13() ' losowanie "rzut kostką" ActiveDocument.Content = "" Randomize

For x = 1 To 10 y = Int(Rnd * 6 + 1)

If y = 6 Then ActiveDocument.Content.InsertAfter Text:="Brawo! " ActiveDocument.Content.InsertAfter Text:=y & vbLf

Next x End Sub

(33)

Zadanie 14. Wypisywanie znaków z tablicy znaków

Zamiany wartoĞci liczbowych generowanych np. w pĊtli na znaki tekstu moĪna dokonywaü przez konstrukcje warunkowa If lub Case. Jednak w okreĞlonych sytuacjach moĪna skorzystaü z tablicy znaków, która uporządkowuje wszystkie znaki alfanumeryczne wáaĞnie w konstrukcjĊ tablicy znaków przyporządkowując im kolejne liczby. Przez funkcjĊ Chr moĪna przywoáaü odpowiedni znak podając jego pozycjĊ. Znaki alfabetu w minuskule znajdują siĊ na pozycjach od 97 do 122 a w majuskule od 65 do 90.

Realizacja zadania 14

Zadania powyĪsze, oczywiĞcie nie wyczerpują opisu moĪliwoĞci jĊzyka programowania Visual Basic, a stanowią tylko wprowadzenie do jego skáadni. EfektywnoĞü programów w najwyĪszej mierze zaleĪy od wáaĞciwego algorytmu dziaáaĔ stosowanego przez programistĊ. Stąd teĪ dalszym etapem poznawania wybranego jĊzyka programowania powinno byü poznanie podstaw algorytmiki

Sub zadanie14()

'wypisywanie znaków z tablicy ActiveDocument.Content="" For x = 97 To 122

ActiveDocument.Content.InsertAfter text:= Chr(x) Next x

(34)
(35)

II. Algorytmy - znajdowanie elementów

Znajdowanie w danym zbiorze elementów o okreĞlonych wáaĞciwoĞciach polega na lokalizowaniu miejsca danego elementu w zbiorze (czyli inaczej stwierdzeniu, w jakim miejscu zbioru znajduje siĊ okreĞlony element np. litera "A", liczba "12", najwiĊksza liczba w tym zbiorze itp). WáaĞciwoĞci poszukiwanych elementów dotyczą wartoĞci znaku traktowanej indywidualnie, jak i w odniesieniu do innych elementów (jak na przykáad w kontekĞcie "mniejszy", "wiĊkszy" itp.). Omawiane w tym dziale bĊdą iteracyjne i rekurencyjne algorytmy "wyszukiwania liniowego" lub inaczej "wyszukiwania sekwencyjnego".

O iteracji i rekurencji nie bĊdziemy tu wiele pisaü. Proponujemy odwoáaü siĊ do odpowiednich pozycji literaturowych1. Jedyne, co przypomnimy to odpowiednie definicje:

x "Iteracja, metoda matematyczna polegająca na wielokrotnym kolejnym zastosowaniu tego samego algorytmu postĊpowania, przy czym wynik i-tej operacji stanowi dane wejĞciowe dla kolejnej, (i+1)-szej operacji." (Sáownik jĊzyka polskiego PWN)

x "Rekurencja, rekursja (angielskie recursion), cecha algorytmu, polegająca na tym, Īe w którymĞ kroku algorytmu nastĊpuje odwoáanie do caáego algorytmu." (Sáownik jĊzyka polskiego PWN)

x Wyszukiwanie liniowe - "Prosty (...) algorytm wyszukiwania, operujący poprzez sekwencyjne badanie kaĪdego elementu w liĞcie, dopóki element docelowy nie zostanie znaleziony, lub ostatni element zostanie caákowicie przeanalizowany ." (Sáownik

(36)

30

Zadanie 15. Znajdowanie okreĞlonego znaku w áaĔcuchu

Jako pierwsze üwiczenie z tego dziaáu wybierzmy proste zadanie, które pozwoli nam w áatwy sposób przejĞü do zadaĔ dotyczących algorytmów. W zasadzie zadanie niniejsze wymaga uáoĪenia pewnego algorytmu, lecz jest to algorytm prosty, a w wiĊkszoĞci wspóáczesnych jĊzyków programowania znaleĨü moĪemy kilka innych, bardziej bezpoĞrednich rozwiązaĔ tego zadania. Oto zadanie: "Przygotowaü program w wybranym jĊzyku programowania realizujący w sposób algorytmiczny znajdowanie danego znaku w danym áaĔcuchu znaków". (PoniewaĪ w dalszej czĊĞci materiaáu üwiczenia bĊdą zawsze dotyczyáy "przygotowania odpowiedniego programu w wybranym jĊzyku programowania realizujących w sposób algorytmiczny okreĞlone zadania", skrócimy umownie treĞü zadania do postaci: "ZnaleĨü dany znak w danym áaĔcuchu znaków".)

Innymi sáowy nasze zadanie to znaleĨü literĊ w sáowie, bądĨ w zestawie sáów. Zadanie wydaje siĊ proste i takim jest rzeczywiĞcie, choü nie uchroni nas to od uáoĪenia odpowiedniego algorytmu dziaáaĔ. PoniewaĪ nie moĪna oczekiwaü, iĪ "dany áaĔcuch znaków" bĊdzie w okreĞlony sposób uporządkowany, dlatego realizacja zadania bĊdzie wymagaáa spojrzenia na kaĪdy kolejny znak w áaĔcuchu i porównania go ze wzorcem - "danym znakiem".

x Algorytm"1. algorytm m IV, D. -u, Ms. ~mie; lm M. –y 1. inform. - dokáadny przepis wykonania w okreĞlonym porządku skoĔczonej liczby operacji, pozwalający na rozwiązanie kaĪdego zadania danego typu 2. mat. reguáa przeksztaácania wyraĪeĔ matematycznych przez powtarzanie tych samych dziaáaĔ na kolejno otrzymywanych wynikach dziaáaĔ poprzednich (Sáownik JĊzyka Polskiego PWN); Ğrdwác. z ar.". sáowo "algorytm" wywodzi siĊ od nazwiska matematyka arabskiego z IX w., Al-Chuwarizmiego. x àaĔcuch, "struktura danych skáadająca siĊ z sekwencji znaków zwykle reprezentujących

czytelny dla czáowieka tekst." (Sáownik komputerowy, Microsoft Press, PLJ, Warszawa 2000)

(37)

Realizacja zadania 15

Po uruchomieniu moduáu Makro programu Word i utworzeniu odpowiedniego projektu zadania moĪna wpisywaü treĞü programu. Konieczne jest zachowanie linii definiujących procedurĊ i ją zamykających:

Sub zadanie15() End Sub

PomiĊdzy powyĪszymi oznaczeniami wprowadzimy zasadniczą czĊĞü kodu reprezentującego algorytm.

Zmienne "s1", "s2" (niezbĊdne w naszym programie bowiem reprezentujące odpowiednio dany znak do znalezienia dany áaĔcuch znaków, wĞród których bĊdziemy poszukiwaü) naleĪy odpowiednio w programie zdefiniowaü. Stąd na początku naszego kodu znaleĨü siĊ powinny dwie nastĊpujące linie:

s1="s"

s2="abecadáo z pieca spadáo"

Zasadnicza czĊĞü programu oparta jest na pĊtli. PĊtla ta jest niezbĊdna, aby móc wybieraü kolejne znaki z áaĔcucha i poddawaü je porównaniu. PĊtla ta powinna wiĊc obejmowaü pozycje áaĔcucha od pierwszej do ostatniej. Pierwsza pozycja áaĔcucha jest oznaczona wartoĞcią "1", ostatnia zaĞ moĪe byü okreĞlona przez polecenie "Len(s2)", które podaje dáugoĞü áaĔcucha znaków "s2". PĊtla tego programu powinna mieü wiĊc postaü: For x = 1 To Len(s2) ... Next x

Teraz, gdy potrafimy juĪ przejrzeü caáoĞü áaĔcucha znaków spróbujmy weryfikowaü zgodnoĞü znalezionego tam znaku ze znakiem poszukiwanym. Znak z danej pozycji "x" bĊdzie przedstawiany przez funkcjĊ: Mid(s2, x, 1), zaĞ porównanie, bĊdzie dokonane przez funkcjĊ: If Mid(s2, x, 1) = s1 Then.

(38)

32

Znaki "&" pozwalają áączyü teksty w cudzysáowach ze zmiennymi.

Oto caáoĞü programu:

Program po wpisaniu jest gotowy do uruchomienia. Projekt zostanie skompilowany i uruchomiony po wybraniu opcji Run/RunSub/UserForm lub jej odpowiednika w postaci odpowiedniej ikony. Wynik dziaáania programu widoczny bĊdzie w dokumencie programu Word. Aby go zobaczyü przeáącz siĊ do oglądu dokumentu Word.

Sub zadanie15()

s1 = "s" 'dany znak do znalezienia s2 = "abecadáo z pieca spadáo" 'dany áaĔcuch

For x = 1 To Len(s2)

If Mid(s2, x, 1) = s1 Then ActiveDocument.Content = _ " znak '" & s1 & "' znaleziono na pozycji " & x

Next x End Sub

(39)

Zadanie 16. Znajdowanie okreĞlonej liczby w tablicy liczb

Rozwiązanie tego zadanie jest rozwiniĊciem zadania poprzedniego.

Algorytm rozwiązania tego zadania jest pod kaĪdym wzglĊdem identyczny z algorytmem poprzednim. Pod wzglĊdem realizacji programistycznej widoczne jest natomiast kilka wyraĨnych róĪnic. Inaczej przeszukiwana jest tablica niĪ áaĔcuch. Inaczej porównywane są liczby niĪ znaki/áaĔcuchy znaków.

Realizacja zadania 16

Sub zadanie16()

Dim dane(100) 'definicja tablicy liczb s = 15 'dana liczba do znalezienia

'wyczyszczenie zawartoĞci dokumentu Word ActiveDocument.Content = ""

'losowanie stu liczb For i = 1 To 100 dane(i) = Int(Rnd * 20) Next i

'wypisanie wylosowanych liczb

ActiveDocument.Content.InsertAfter Text:= _ "Wylosowano sto nastĊpujących liczb:" & vbLf For i = 1 To 100

ActiveDocument.Content.InsertAfter Text:=dane(i) & ", " Next i

(40)

34

Oto kroki realizacji tego zadania:

1. W VBA konieczne jest zdefiniowanie tablicy zmiennych przez polecenie Dim() i podanie w nawiasie rozmiaru tablicy.

2. Konieczne jest takĪe wyczyszczenie zawartoĞci dokumentu Word (polecenie: ActiveDocument.Content = ""), tak aby kolejne próby dziaáania procedury nie dodawaáy wyników do prób poprzednich, lecz widoczne byáy samodzielne.

3. TablicĊ danych wypeániü moĪna automatycznie losując liczby za pomocą funkcji Rnd. PoniewaĪ Rnd losuje liczby rzeczywiste z przedziaáu [0, 1), jeĪeli potrzeba uzyskaü liczby z zakresu od 0 do 19 konieczne jest pomnoĪenie wylosowanych liczb przez 20 i poprzez funkcjĊ Int uzyskiwanie tylko ich czĊĞci caákowitych. 4. Umieszczenie procedury losowania w pĊtli pozwoli wylosowaü i zapisaü w tablicy

kolejne liczby.

5. Druga pĊtla powinna pozwoliü nam wypisaü wylosowane liczby (moĪemy losowanie i wypisywanie umieĞciü oczywiĞcie w jednej wspólnej pĊtli). Wypisywanie wartoĞci wylosowanych uzyskaü moĪna przez polecenie ActiveDocument.Content.InsertAfter Text:= , które dodaje do aktywnego dokumentu (zaraz za ostatnim jego znakiem) odpowiednie teksty.

6. Trzecia pĊtla przeznaczona jest do ponownego przeszukania tablicy i wskazania poáoĪenia szukanej liczby.

Uwaga. W tym zadaniu i zadaniach poniĪszych dane do zadaĔ są losowane za pomocą funkcji Rnd. MoĪliwe jest oczywiĞcie wpisanie nie losowanych a ustalonych danych do tablicy na początku programu. Niektórzy uĪytkownicy moĪe bĊdą chcieli zastosowaü trzecie rozwiązanie, w którym dane bĊdą podawane przez uĪytkownika w trakcie dziaáania programu. Do tego zadania moĪna wykorzystaü funkcjĊ InputBox, która prezentuje na ekranie okno wprowadzania danych, w którym moĪna okreĞliü tytuá okna i zwrot zachĊty w nim wystĊpujący, a takĪe poáoĪenia okna i wartoĞü domyĞlną. Oto opcjonalny fragment powyĪszego programu zastĊpujący losowanie danych wprowadzaniem ich przez uĪytkownika (choü wprowadzenie stu danych, jak to jest w tym przypadku, moĪe byü uciąĪliwe):

'wprowadzanie stu liczb For i = 1 To 100

dane(i) = InputBox("Podaj wartoĞü od 0 do 19", "wprowadzanie danych ") Next i

(41)

Zadanie 17. Znajdowanie najwiĊkszej liczby w tablicy liczb

To zadanie definiuje poszukiwane dane zupeánie inaczej niĪ zadania poprzednie. Nie bĊdziemy juĪ poszukiwaü konkretnej wartoĞci, lecz bĊdziemy musieli dokonaü weryfikacji kaĪdej z napotkanych liczb i wybraü tĊ o okreĞlonych parametrach cech. OtóĪ tym zadaniem jest "ZnaleĨü najwiĊkszą liczbĊ w danej tablicy liczb".

Sugerowany algorytm jest nastĊpujący: przeglądaü liczba po liczbie w tablicy liczb i uznawaü za najwiĊkszą te liczby, które są wiĊksze od najwiĊkszej, jaką dotychczas napotkaliĞmy. W ten sposób po dotarciu do ostatniej liczby w tablicy powinniĞmy mieü pewnoĞü, jaka liczba jest najwiĊksza spoĞród wszystkich napotkanych.

Realizacja zadania 17

Sub zadanie17()

Dim dane(10) 'definicja tablicy liczb 'wyczyszczenie zawartoĞci dokumentu Word ActiveDocument.Content = ""

'losowanie liczb For i = 1 To 10 dane(i) = Int(Rnd * 20) Next i

'wypisanie wylosowanych liczb

ActiveDocument.Content.InsertAfter Text:= _ "Wylosowano dziesiĊü nastĊpujących liczb:" & vbLf For i = 1 To 10

(42)

36

Spróbujmy przeanalizowaü program, aby lepiej zrozumieü algorytm poszukiwania najwiĊkszej liczby. Tablica "dane" zawiera 10 liczb. Przed przystąpieniem do przeglądania tych danych w pĊtli od pozycji "1" w tablicy do pozycji ostatniej (wyznaczonej przez wartoĞü "10") definiujemy zmienną "x", pod którą zapamiĊtywaü bĊdziemy wartoĞü najwiĊkszą. ZaáóĪmy, Īe wylosowano liczby 6, 12, 9, 17, itp. Początkowo "x" ma wartoĞü 0. W pierwszym kroku pĊtli porównujemy wartoĞü z tablicy danych w pozycji "1" (czyli wartoĞü "6") z wartoĞcią pamiĊtaną w zmiennej "x" (czyli wartoĞcią "0"), jeĞli ta pierwsza jest wiĊksza, to jest to równoznaczne z tym, Īe jest to najwiĊksza znaleziona jak dotąd w tablicy danych wartoĞü. W drugim kroku porównujemy "x=6" z wartoĞcią w pozycji 2 z tablicy (czyli "12"). Znowu okazuje siĊ, Īe napotkana wartoĞü jest "jak na razie najwiĊksza" - zapamiĊtujemy ją w zmiennej "x". W trzecim kroku wartoĞü "12" pozostaje najwiĊksza (bowiem wartoĞü z pozycji 3 to "9"). I tak dalej... Na koniec pod zmienną "x" pamiĊtaü bĊdziemy najwiĊkszą napotkaną w tablicy wartoĞü.

(43)

Zadanie 18. Znajdowanie najmniejszej liczby w tablicy liczb

WadĊ przedstawionego rozwiązania poprzedniego zadania widaü przy próbie analogicznego rozwiązania tego zadania.

Wadliwy w powyĪszym rozwiązaniu nie jest algorytm, lecz jego implementacja. JeĞli zastosujemy do tych samych danych, co powyĪej ten sam program (choü zmodyfikowany do poszukiwaĔ wartoĞci najmniejszej) uzyskamy dziwny (?) wynik - "Najmniejszą liczbą w danej tablicy jest 0", a przecieĪ w tablicy nie ma wartoĞci 0! Báąd wynika z wyzerowania zmiennej x w czwartej linii programu. Najlepiej jest zmiennej x nie zerowaü, lecz sprowadziü do "pierwszej z brzegu" liczby w danej tablicy. Idąc zaĞ dalej w optymalizacji programu nie musimy naszej pĊtli poszukiwaĔ rozpoczynaü od, uznanego juĪ za "chwilowo najwiĊkszy", elementu "dane[1]".

(44)

38

Realizacja zadania 18

Sub zadanie18()

Dim dane(10) 'definicja tablicy liczb s = 15 'dana liczba do znalezienia

'wyczyszczenie zawartoĞci dokumentu Word ActiveDocument.Content = ""

'losowanie liczb For i = 1 To 10

dane(i) = Int(Rnd * 20) Next i

'wypisanie wylosowanych liczb

ActiveDocument.Content.InsertAfter Text:= _ "Wylosowano dziesiĊü nastĊpujących liczb:" & vbLf For i = 1 To 10

ActiveDocument.Content.InsertAfter Text:=dane(i) & ", " Next i

x = dane(1)

'okreĞlenie liczby najmniejszej For i = 2 To 10

If dane(i) < x Then x = dane(i) Next i

ActiveDocument.Content.InsertAfter Text:= _ vbLf & "Najmniejszą liczbą w danej tablicy jest " & x End Sub

(45)

Zadanie 19. Znajdowanie w tablicy liczb liczby najwiĊkszej

i liczby najmniejszej

Zadanie "ZnaleĨü najmniejszą i najwiĊkszą liczbĊ w danej tablicy liczb" to tylko pozornie proste rozwiniĊcie zadaĔ poprzednich.

Rozwiązanie zadania znalezienia w tablicy liczb najwiĊkszej liczby i liczby najmniejszej faktycznie moĪe byü prostym poáączeniem algorytmu poszukiwania liczby najwiĊkszej i algorytmu poszukiwania liczby najmniejszej, lecz tylko wtedy, gdy nie przeszkadza nam niepotrzebnie dáugie szukanie tych liczb. OtóĪ, bowiem mając N liczb w tablicy musimy dokonaü N-1 porównaĔ dla znalezienia liczby najwiĊkszej i N-1 porównaĔ dla znalezienia liczby najmniejszej czyli razem (2N-2). I nie ma tu znaczenia, czy robiü to bĊdziemy osobno w dwóch pĊtlach, czy teĪ obok siebie w jednej pĊtli. Interesujące jest natomiast pytanie, jak moĪna znaleĨü w danej tablicy liczb najwiĊkszą liczbĊ i liczbĊ najmniejszą wykonując mniej kroków.

Proponowane rozwiązanie polega na rozdzielaniu liczb z kolejnych par do dwóch grup - grupy liczb w danych parach wiĊkszych i grupy liczb w danych parach mniejszych. Zysk, jaki w ten sposób otrzymamy, to zmniejszenie o prawie jedną trzecią liczbĊ porównaĔ, jakich musimy dokonaü. Algorytm ten prezentuje praktyczne zastosowanie zasady "dziel i zwyciĊĪaj".

(46)

40

'losowanie liczb For i = 1 To z

dane(i) = Int(Rnd * 20) Next i

'wypisanie wylosowanych liczb

ActiveDocument.Content.InsertAfter Text:= _ "Wylosowano sto nastĊpujących liczb:" & vbLf For i = 1 To z

ActiveDocument.Content.InsertAfter Text:=dane(i) & ", " Next i

'rozdzielanie liczb z par (liczba pierwsza i liczba ostatnia) While (x < z - x - 1)

' wstawinie pierwszej liczby z pary wstĊpnie do kaĪdej z grup dane2(x) = dane(x)

dane1(x) = dane(x)

' w zaleĪnoĞci od wielkoĞci drugiej liczby z pary If dane(z - x - 1) < dane(x) Then

'zastĊpowanie nią wstawionej juĪ liczby w grupie wiĊkszych ... dane1(x) = dane(z - x - 1)

Else

' ... lub w grupie mniejszych dane2(x) = dane(z - x - 1) End If

x = x + 1 Wend

' poszukiwanie najwiĊkszej liczby w grupie wiĊkszych y = dane2(1)

x = 2

While (x <= z / 2)

If dane2(x) > y Then y = dane2(x) x = x + 1

Wend

ActiveDocument.Content.InsertAfter Text:= _ vbLf & "NajwiĊkszą liczbą w danej tablicy jest " & y ' poszukiwanie najmniejszej liczby w grupie mniejszych y = dane1(1)

x = 2

While (x < z / 2)

If dane1(x) <= y Then y = dane1(x) x = x + 1

Wend

ActiveDocument.Content.InsertAfter Text:= _ vbLf & "Najmniejszą liczbą w danej tablicy jest " & y

(47)

Zadanie 20. Znajdowanie elementów w zbiorach

uporządkowanych

Znajdowanie elementu o danej wartoĞci w zbiorze uporządkowanym to definicja "wyszukiwania binarnego".

x Wyszukiwanie binarne - "Rodzaj algorytmu, który szuka obiektu o znanej nazwie wedáug uporządkowanej listy, porównując najpierw szukany element do obiektu znajdującego siĊ wĞrodku listy. NastĊpnie dzieli listĊ na dwie czĊĞci i stwierdza, w której z nich znajduje siĊ obiekt. Proces ten powtarzany jest aĪ do skutku" (Sáownik komputerowy, Microsoft Press, PLJ, Warszawa 2000)

Znajdowanie danych w zbiorze nieuporządkowanym wymaga przejrzenia kaĪdego elementu tego zbioru. Zupeánie inaczej wygląda sytuacja, gdy zbiór jest uporządkowany. W takich warunkach poszukiwanie danego elementu moĪna znacznie przyspieszyü korzystając z informacji, jakie uzyskuje siĊ przy kaĪdym odczytaniu wybranego elementu zbioru. JeĞli bowiem na przykáad poznamy element znajdujący siĊ dokáadnie w Ğrodku tablicy danych to, w zaleĪnoĞci od tego, czy jest on wiĊkszy czy mniejszy od oczekiwanego, dalsze poszukiwania prowadziü bĊdziemy w pierwszej lub drugiej poáowie tablicy.

(48)

42

Realizacja zadania 20

Sub zadanie20() Const z = 100

Dim dane(z) 'definicja tablicy liczb x = 126 'szukana liczba

p = 1 'początek przedziaáu szukania r = z 'koniec przedziaáu szukania s = Int((p + r) / 2) 'Ğrodek przedziaáu szukania

'wyczyszczenie zawartoĞci dokumentu Word ActiveDocument.Content = ""

'losowanie liczb i wypisanie wylosowanych liczb ActiveDocument.Content.InsertAfter Text:= _ "Przygotowano sto nastĊpujących liczb:" & vbLf For i = 1 To z

dane(i) = i * 3

ActiveDocument.Content.InsertAfter Text:=dane(i) & ", " Next i

ActiveDocument.Content.InsertAfter Text:= _ vbLf & "Szukano kolejno na pozycjach: " While dane(s) <> x

s = Int((p + r) / 2)

ActiveDocument.Content.InsertAfter Text:=s & ", " If dane(s) > x Then r = s - 1

If dane(s) < x Then p = s + 1 Wend

ActiveDocument.Content.InsertAfter Text:= _ vbLf & "Znaleziono szukaną wartoĞü na pozycji:" & s

(49)

III. Algorytmy - porz

ądkowanie elementów

PomiĊdzy zadaniami dotyczącymi znajdowania elementów o okreĞlonych wáaĞciwoĞciach, a zadaniami dotyczącymi znajdowania elementów w zbiorach uporządkowanych mamy oczywiĞcie operacjĊ porządkowania zbiorów, czyli uáoĪenia zawartych w nich danych w okreĞlonym porządku. NajczĊĞciej porządkuje siĊ zbiory wedáug wzrastających lub malejących wartoĞci zawartych w nich liczb.

Porządkowanie zbioru liczb to wielce interesujące zagadnienie algorytmiki, gdyĪ jak siĊ okazuje najprostsze algorytmy porządkowania nie są wcale najszybsze, i odwrotnie - algorytmy najszybsze wcale nie są takie proste.

Opisane bĊdą w tej czĊĞci najwaĪniejsze algorytmy porządkowania zbiorów (lub inaczej sortowania). BĊdą to kolejno:

x Zadanie 21 - Porządkowanie zbiorów przez wybór x Zadanie 22 - Porządkowanie zbiorów "bąbelkowe" x Zadanie 23 - Porządkowanie zbiorów przez wstawienie x Zadanie 24 - Porządkowanie zbiorów "szybkie"

x Zadanie 25 - Porządkowanie zbiorów przez zliczanie x Zadanie 26 - Porządkowanie zbiorów kubeákowe

(50)

44

Zadanie 21. Porządkowanie zbiorów przez wybór

Pierwszy algorytm porządkowania tablicy danych przychodzi nam na myĞl áatwo, gdyĪ jest on reprezentacją sposobu, który intuicyjnie stosuje na co dzieĔ wiĊkszoĞü z nas. Zwykle w zbiorze liczb wyszukujemy najmniejszą z nich, przepisujemy do nowej listy, skreĞlamy w liĞcie starej i spoĞród nie skreĞlonych liczb znowu wyszukujemy najmniejszą. Jest to algorytm prosty w realizacji na tym etapie üwiczeĔ, gdyĪ opiera siĊ w znacznej czĊĞci na wyszukiwaniu wartoĞci, co omówione zostaáo w zadaniu 18.

W algorytmie moĪna ten "potoczny" sposób nieco usprawniü i uniknąü tworzenia nowej listy liczb uporządkowanych. Wystarczy, Īe po znalezieniu pierwszej liczby najmniejszej zamienimy ją miejscami z pierwszą liczbą w zbiorze i kolejne szukanie rozpoczniemy od pozycji drugiej.

(51)

Realizacja zadania 21.

Oto odpowiedni program:

Mimo, iĪ dokonuje on opisanego uporządkowania to nie widzimy jego efektu. Potrzebne jest uzupeánienie programu o fragment wypisujący dane uporządkowane. BĊdzie to zwykáa pĊtla:

Przydatne bĊdzie równieĪ losowanie liczb do uporządkowania: Sub porzadkowanie21()

Const rozmiar = 20 Dim lista(rozmiar)

'porządkowanie przez wybór For i = 1 To rozmiar

x = i

For j = i + 1 To rozmiar If lista(j) < lista(x) Then x = j Next j y = lista(x) lista(x) = lista(i) lista(i) = y Next i End Sub

'wypisanie uporządkowanych liczb

ActiveDocument.Content.InsertAfter Text:=vbLf & _ "Uporządkowano wylosowane liczby:" & vbLf For i = 1 To rozmiar

ActiveDocument.Content.InsertAfter Text:=lista(i) & ", " Next i

(52)

46

Oto wiĊc caáy program:

Sub porzadkowanie21() Const rozmiar = 20 Dim lista(rozmiar)

ActiveDocument.Content = ""

'losowanie i wypisanie wylosowanych liczb

ActiveDocument.Content.InsertAfter Text:="Wylosowano nastĊpujące liczby:" _ & vbLf

For i = 1 To rozmiar lista(i) = Int(Rnd * 50)

ActiveDocument.Content.InsertAfter Text:=lista(i) & ", " Next i

'porzadkowanie przez wybór For i = 1 To rozmiar

x = i

For j = i + 1 To rozmiar If lista(j) < lista(x) Then x = j Next j

y = lista(x) lista(x) = lista(i) lista(i) = y Next i

'wypisanie uporządkowanych liczb

ActiveDocument.Content.InsertAfter Text:=vbLf & _ "Uporządkowano wylosowane liczby:" & vbLf For i = 1 To rozmiar

ActiveDocument.Content.InsertAfter Text:=lista(i) & ", " Next i

(53)

Zadanie 22. Porządkowanie zbiorów "bąbelkowe"

Inna metoda porządkowania liczb podobna jest do sposobu, w jaki grupa uczniów ustawia siĊ (lub raczej jest ustawiana przez nauczyciela) w kolejnoĞci wg. wzrostu. Dwóch sąsiadujących uczniów porównuje siĊ wzrostem i jeĞli nie są ustawieni we wáaĞciwej kolejnoĞci zamieniają siĊ miejscami, po czym porównywani są kolejni uczniowie. Ten sposób wymaga wielokrotnego przeglądania caáej grupy (choü zwykle wiele takich dziaáaĔ jest realizowane przez wiele par równoczeĞnie).

Algorytm ten najczĊĞciej nazywany jest algorytmem "sortowania bąbelkowego" - przez analogiĊ do bąbelków, z których wiĊksze, wynoszone są do góry i zamieniają siĊ miejscami z mniejszymi.

Realizacja zadania 22

Implementacja algorytmu skáada siĊ z dwóch zagnieĪdĪonych pĊtli. PĊtla wewnĊtrzna przegląda kolejne elementy tablicy, zaĞ pĊtla zewnĊtrza powoduje, Īe pĊtla wewnĊtrzna jest wykonywana wielokrotnie.

Po pierwszym przejĞciu gwarantowane jest, Īe najwiĊkszy element znajduje siĊ na koĔcu tablicy; po drugim przejĞciu drugi najwiĊkszy element jest na pozycji przedostatniej itd. Stąd dziaáanie wewnĊtrznej pĊtli moĪna ograniczaü za kaĪdym razem o jedną pozycjĊ wczeĞniej - nie musimy juĪ odwiedzaü ostatnich elementów tablicy: (rozmiar - i - 1). Cykl naleĪy powtarzaü aĪ do peánego posortowania tablicy.

(54)

48

Sub porzadkowanie22() Const rozmiar = 20 Dim lista(rozmiar)

ActiveDocument.Content = ""

'losowanie i wypisanie wylosowanych liczb ActiveDocument.Content.InsertAfter Text:= _ "Wylosowano nastĊpujące liczby:" & vbLf For i = 1 To rozmiar

lista(i) = Int(Rnd * 50)

ActiveDocument.Content.InsertAfter Text:=lista(i) & ", " Next i

'porządkowanie bąbelkowe For i = 1 To rozmiar - 1 For j = 1 To rozmiar - i - 1 If lista(j) > lista(j + 1) Then x = lista(j) lista(j) = lista(j + 1) lista(j + 1) = x End If Next j Next i

'wypisanie uporządkowanych liczb

ActiveDocument.Content.InsertAfter Text:= _ vbLf & "Uporządkowano wylosowane liczby:" & vbLf For i = 1 To rozmiar

ActiveDocument.Content.InsertAfter Text:=lista(i) & ", " Next i

(55)

Zadanie 23. Porz

ądkowanie zbiorów przez wstawienie

Inny algorytm zwykle stosujemy przygotowując siĊ do rozgrywki karcianej, gdy bierzemy do rĊki karty ze stoáu porządkując je równoczeĞnie. Jest to jeden z prostszych i bardziej znanych algorytmów porządkowania, a nazywany jest "porządkowaniem przez wstawienie".

Algorytm ten realizowany "w rĊku" jest prosty - kaĪda kolejna karta wstawiana jest pomiĊdzy dwie inne, jeĞli jest wiĊksza od pierwszej i mniejsza od drugiej, gdy zaĞ jest najmniejsza lub najwiĊksza z kart trzymanych w rĊku (lub jedyna, gdy w rĊku kart jeszcze nie ma), jest wstawiana odpowiednio na początek lub na koniec tego zestawu.

Gdy jednak mamy ten algorytm przetransponowaü na ogólną sytuacjĊ z liczbami (umieszczonymi w tablicy), musimy uwzglĊdniü przesuniĊcie liczb nastĊpujących po liczbie wstawianej o jedną pozycjĊ w prawo w tablicy. Analogia do kart musi ulec zmianie - karty, powiedzmy, ukáadamy na stole, od lewej, tuĪ obok siebie. Gdy wiĊc wstawiaü bĊdziemy kolejną kartĊ przesuniĊcie tych po prawej jest konieczne.

(56)

50

Realizacja zadania 23

Sub porzadkowanie23() Const rozmiar = 20 Dim lista(rozmiar) ActiveDocument.Content = ""

'losowanie i wypisanie wylosowanych liczb ActiveDocument.Content.InsertAfter Text:= _ "Wylosowano nastĊpujące liczby:" & vbLf For i = 1 To rozmiar

lista(i) = Int(Rnd * 50)

ActiveDocument.Content.InsertAfter Text:=lista(i) & ", " Next i

'porządkowanie przez wstawianie For i = 1 To rozmiar

j = i x = lista(i)

While (j > 1) And (lista(j - 1) > x) lista(j) = lista(j - 1)

j = j - 1 Wend lista(j) = x Next i

'wypisanie uporządkowanych liczb

ActiveDocument.Content.InsertAfter Text:= _ vbLf & "Uporządkowano wylosowane liczby:" & vbLf For i = 1 To rozmiar

ActiveDocument.Content.InsertAfter Text:=lista(i) & ", " Next i

(57)

Zadanie 24. Porządkowanie zbiorów "szybkie"

Porządkowanie "szybkie" jest szybkie nie tylko z nazwy. UwaĪa siĊ je powszechnie za jeden z najszybszych uniwersalnych algorytmów sortowania.

Faktem jest, Īe jest to algorytm najszybszy jednak wyáącznie dla danych czysto losowych, a szczególnie dla duĪych tablic danych. W innych sytuacjach (a sytuacje rzeczywiste odbiegają czĊsto od ideaáu losowoĞci) jego sprawnoĞü nie jest tak wyraĨna.

Algorytm zakáada podziaá tablicy danych odnoĞnie wybranego elementu osiowego (zazwyczaj jest to pierwszy element tablicy) na dwie czĊĞci - czĊĞü zawierającą elementy mniejsze i czĊĞü zawierającą elementy wiĊksze. W kolejnym kroku nastĊpuje podziaá uzyskanych czĊĞci wedáug tego samego schematu.

1. Krok pierwszy: wybieramy "punkt odniesienia" - dowolną wartoĞü z tablicy, wzglĊdem której (na prawo i na lewo) tablica bĊdzie porządkowana. Wybieramy ją doĞü przypadkowo, gdyĪ faktycznie na początku nie wiadomo, gdzie ona siĊ ostatecznie znajdzie (zwykle wybierana jest pierwsza wartoĞü i pozostaje ona pierwsza do kroku szóstego, gdy wiadomo juĪ ile wartoĞci w tablicy jest od niej rzeczywiĞcie mniejszych, a ile wiĊkszych).

2. Krok drugi: przeglądamy tablicĊ od strony lewej (zakáadając, Īe tam w koĔcu powinny siĊ znaleĨü tylko wartoĞci mniejsze od wartoĞci w "punkcie odniesienia") - w poszukiwaniu "czarnej owcy" - wartoĞci tu niepasującej, bowiem wiĊkszej od

(58)

52

4. Krok czwarty - zamieniamy dwie "czarne owce" miejscami, ustawiając je we wáaĞciwych czĊĞciach.

5. Krok piąty - to powtarzanie kroków od drugiego do czwartego, aĪ poszukiwania z lewej i z prawej siĊ spotkają.

6. Krok szósty - teraz, gdy wiemy juĪ w jakim miejscu powinna siĊ znaleĨü wartoĞü z "punktu odniesienia" (a jest to miejsce spotkania siĊ poszukiwaĔ z lewej i z prawej) zamieniamy tĊ wartoĞü z ostatnią wartoĞcią mniejszą do wartoĞci w "punkcie odniesienia".

Te wszystkie kroki naleĪy od teraz zastosowaü dla kaĪdej rozdzielonej czĊĞci tablicy jak i rozdzielonych ich podczĊĞci.

Porządkowanie "szybkie" opiera siĊ jak widaü na metodzie "dziel i zwyciĊĪaj". Jest teĪ oczywiste, Īe jest to algorytm rekurencyjny. Wywoáania rekurencyjne koĔczą siĊ, gdy któraĞ z kolejnych podtablic bĊdzie zawieraáa tylko jeden element.

Realizacja zadania 24

Oto odpowiednia implementacja w VBA:

Sub porzadkowanie24() Const rozmiar = 20 Dim lista(rozmiar)

ActiveDocument.Content = ""

'losowanie i wypisanie wylosowanych liczb ActiveDocument.Content.InsertAfter Text:= _ "Wylosowano nastĊpujące liczby:" & vbLf For i = 1 To rozmiar

lista(i) = Int(Rnd * 50)

ActiveDocument.Content.InsertAfter Text:=lista(i) & ", " Next i

'porzadkowanie "szybkie"

a = sortowanie(lista(), 1, rozmiar)

'wypisanie uporządkowanych liczb

ActiveDocument.Content.InsertAfter Text:= _ vbLf & "Uporządkowano wylosowane liczby:" & vbLf For i = 1 To rozmiar

ActiveDocument.Content.InsertAfter Text:=lista(i) & ", " Next i

(59)

' zasadnicza czĊĞü algorytmu Function sortowanie(lista(), x1, y2) x2 = x1 y1 = y2 If x2 >= y1 Then Exit Function Else If x2 = y1 - 1 Then

If lista(x2) > lista(y1) Then T = lista(x2) lista(x2) = lista(y1) lista(y1) = T End If Exit Function End If End If z = lista((x2 + y1) / 2) lista((x2 + y1) / 2) = lista(y1) lista(y1) = z

While x2 < y1

While (lista(x2) <= z) And (x2 < y1) x2 = x2 + 1

Wend

While (z <= lista(y1) And x2 < y1) y1 = y1 - 1 Wend If x2 < y1 Then T = lista(x2) lista(x2) = lista(y1) lista(y1) = T End If Wend lista(y2) = lista(y1) lista(y1) = z a = sortowanie(lista, x1, x2 - 1) a = sortowanie(lista, y1 + 1, y2)

(60)

54

Zadanie 25. Porządkowanie zbiorów przez zliczanie

Jedną z sytuacji, w której algorytm "QuickSort" nie okazuje siĊ najszybszym algorytmem porządkowania jest zadanie porządkowania tablicy danych, które mogą przybieraü tylko okreĞlone i znane wartoĞci, a najlepiej, gdy danych jest wiĊcej niĪ tych wartoĞci. Przykáady zastosowaĔ to porządkowanie kolejnych wyników rzutu kostką do gry, wartoĞci bajtów (od 0 do 255), dziennych temperatur z dokáadnoĞcią do dziesiątych czĊĞci stopnia itp. W tych przypadkach najlepiej sprawdza siĊ algorytm "porządkowania przez zliczanie".

Algorytm opiera siĊ na zliczaniu wystĊpowania kolejnych danych Ĩródáowych w wynikowej tablicy danych na miejscach odpowiadających tej wartoĞci. Na przykáad pojawienie siĊ kaĪdej wartoĞci 10 bĊdzie zliczane w komórce 10 wynikowej tablicy danych. Na zliczanie elementów naleĪy przeznaczyü tablicĊ o wielkoĞci równej rozpiĊtoĞci liczb z tablicy do uporządkowania. Dla rzutów kostką bĊdzie to tablica 6-cio elementowa, dla wartoĞci bajtów 256-6-cio elementowa.

(61)

Realizacja zadania 25

Sub porzadkowanie25() Const rozmiar = 100 Dim lista1(100) Dim lista2(6) ActiveDocument.Content = ""

'losowanie i wypisanie wylosowanych liczb

ActiveDocument.Content.InsertAfter Text:="Wylosowano nastĊpujące liczby:" _ & vbLf

For i = 1 To rozmiar lista1(i) = Int(Rnd * 6 + 1)

ActiveDocument.Content.InsertAfter Text:=lista1(i) & ", " Next i

'porzadkowanie przez zliczanie For X = 1 To rozmiar

lista2(lista1(X)) = lista2(lista1(X)) + 1 Next X

'wypisanie uporzadkowanych liczb

ActiveDocument.Content.InsertAfter Text:=vbLf & _ "Uporządkowano wylosowane liczby:" & vbLf For X = 1 To 6

For y = 1 To lista2(X)

ActiveDocument.Content.InsertAfter Text:=(X) & ", " Next y

Next X End Sub

(62)

56

Zadanie 26. Porządkowanie zbiorów kubeákowe

Algorytm rĊcznego rozdzielania poczty realizowany w urzĊdach pocztowych zakáada stosowanie "wstĊpnego" rozdzielania/sortowania listów wedáug okreĞlonego wskaĨnika (np. elementu kodu pocztowego, nazwy ulicy lub numerów domów - w zaleĪnoĞci od rozlegáoĞci danego obszaru dziaáania danego urzĊdu czy listonosza). Po takim wstĊpnym rozdziale nastĊpuje kolejna operacja - sortowania rozdzielonej poczty w ramach kaĪdej grupy. WystĊpujące na poczcie "przegródki" okreĞlane są w procedurze algorytmu "kubeákami", a caáy algorytm nazwany jest algorytmem kubeákowym (nazwa przeniesiona z ang. "bucket sort").

(63)

Realizacja zadania 26

Sub porzadkowanie26() Const rozmiar = 100 Dim lista(100) Dim wiadro(100, 100) ActiveDocument.Content = ""

'losowanie i wypisanie wylosowanych liczb ActiveDocument.Content.InsertAfter Text:= _ "Wylosowano nastĊpujące liczby:" & vbLf For i = 1 To rozmiar

lista(i) = Int(Rnd * 100) + 1

ActiveDocument.Content.InsertAfter Text:=lista(i) & ", " Next i 'porządkowanie kubeákowe ' zasadnicza czĊĞü algorytmu For x = 1 To rozmiar p = Int(lista(x) / 10) r = wiadro(p, 0) + 1 wiadro(p, 0) = r wiadro(p, r) = lista(x) Next x For z = 0 To 10 For x = 0 To wiadro(z, 0) For y = 1 To wiadro(z, 0) - x - 1

If (wiadro(z, y) > wiadro(z, y + 1)) Then s = wiadro(z, y) wiadro(z, y) = wiadro(z, y + 1) wiadro(z, y + 1) = s End If Next y Next x Next z

'wypisanie uporzadkowanych liczb

ActiveDocument.Content.InsertAfter Text:= _ vbLf & "Uporządkowano wylosowane liczby:" & vbLf For x = 1 To 10

(64)

Cytaty

Powiązane dokumenty

Program wypisuj ący na ekranie po trzy zdania odnosz ące siĊ do kolejnych dni tygodnia z wydzieleniem pierwszej cz ĊĞci zdaĔ w postaci zmiennej tekstowej oraz wydzieleniem cz

Ten duży obszar zieleni w samym centrum Pszczyny rozciąga się na północ od zespołu pałacowego na te­.. renie 84 hektarów i został

Zadbaj o to, aby właściwości poszczególnych obiektów znajdujących się na formularzu miały wartości dokładnie takie jak pokazano to

Na rysunku obok pokazano działanie programu w sytuacji, w której chcielibyśmy odpowiedzieć na pytanie: Ile razy należałoby złożyć kartkę papieru o grubości 0.08 mm aby

Zwracam uwagę, że opisane powyżej działanie programu oznacza, że przy każdorazowym uruchomieniu aplikacji, tablica będzie wypełniana innymi losowymi liczbami całkowitymi tak,

• Po każdym rzucie uczniowie z drużyny rozgrywającej muszą powiedzieć, o jakim dniu mowa, zgodnie z ustaloną na początku gry zasadą (np. wyrzucono „sobotę” na

&gt;rub mikrometryczn zmieniamy po o-enie ekranu i odczytujemy na b*bnie ruby te po o-enia w których.. czarna pionowa kreska na ekranie pokrywa si* ze rodkiem pr -ka 1-szego

Monday (mandej)–poniedziałek Tuesday (tjuzdej) - wtorek Wednesday (łenzdej) – środa Thursday (øerzdej)–czwartek Friday (frajdej)- piątek Saturday (satedej)– sobota