Europejskie Informatyczne Studium Certyfikacyjne EITCA e-Learning
Informatyka Biznesowa (EITCA-B)
Kurs: „Podstawy programowania i
wykorzystanie technologii OpenSource”
Wykład 1: Wprowadzenie do programowania
obiektowego i kierowanego zdarzeniami (cz.1)
Materiał obejmuje zakres programowy
1 godziny lekcyjnej
Europejskie Informatyczne Studium Certyfikacyjne EITCA e-Learning
Studium prowadzone w ramach programu szkoleniowego Europejskiej Akademii Certyfikacji IT
EITCI European IT Certification Academy (EITCA)
Krajowy Przedstawiciel Konsorcjum Realizującego:
Centrum Szkoleniowe IT CompLearn, CompSecur IT Solutions:
ul. Piłsudskiego 74, 50-020 Wrocław, tel. +48 71 722 8038, fax. +48 71 722 8039
NIP: 897-173-92-49, REGON: 020713664, e-mail: info@complearn.pl; strona www: www.complearn.pl Niniejszy dokument stanowi część materiałów dydaktycznych opracowywanych przez krajowe konsorcjum naukowo-przemysłowe będące realizatorem Europejskiego Informatycznego Studium Certyfikacyjnego w ramach programu EITCA (Europejska Akademia Certyfikacji IT), a także przez inne jednostki naukowo-dydaktyczne działające na rzecz poprawy poziomu kształcenia informatycznego w Polsce (m.in. uczelnie wyższe: Politechnikę Wrocławską oraz konsorcjum uczelni wyższych: Uniwersytetu
Jagiellońskiego,
Uniwersytetu
Warszawskiego,
Politechniki
Warszawskiej,
Politechniki
Poznańskiej
udostępniających materiały dydaktyczne w ramach projektu „Opracowanie programów nauczania na odległość na kierunku studiów wyższych – Informatyka”, zakwalifikowanego przez Ministerstwo Edukacji Narodowej w ramach Sektorowego Programu Operacyjnego: Rozwój Zasobów Ludzkich 2006, finansowanego ze środków Unii Europejskiej).
1. Wprowadzenie
Programowanie komputerowe jest w uproszczeniu zespołem czynności związanych z pisaniem interpretowalnych przez system obliczeniowy instrukcji (programu), prowadzącym do osiągnięcia określonego celu, lub innymi słowy – rozwiązania założonego problemu.
Programowanie może być przeprowadzane przy użyciu różnych dostępnych języków1 i według różnych metodologii (paradygmatów).
Samo programowanie stanowi część znacznie szerszej dyscypliny jaką jest inżynieria oprogramowania, obejmująca wiele innych aspektów wytwarzania oprogramowania takich jak projektowanie, konserwacja czy kontrola jakości.
2. Zmienne i typy danych
Program składa się zasadniczo z szeregu instrukcji wykonujących określone operacje na danych2. Dane przechowywane są w pamięci komputera w postaci tzw. zmiennych tj.
przydzielonych obszarów pamięci posiadających przypisane identyfikatory, za pośrednictwem których program odwołuje się do ich zawartości. Z czysto logicznego punktu widzenia zmienna stanowi pewną nazwaną wielkość, która może się zmieniać w trakcie działania programu.
Z każdą zmienną jest ściśle powiązany typ danych, określający jakiego rodzaju wartości mogą w niej być przechowywane3 (np. czy zmienna przechowuje liczbę czy tekst; jeśli liczbę, to czy jest to liczba rzeczywista czy całkowita, jaki jest zakres przechowywanych danych itp.).
W powszechnie używanych językach programowania wyróżnić możemy następujące główne typy danych ( typy proste):
Typ danych
Nazwy typów w języku Pascal
Liczba całkowita
integer, longint
Typ zmiennych przechowujących liczby całkowite
(w zależności od zakresu)
np. 13; -10; 25738
Liczba rzeczywista
real, single, double
Typ zmiennych przechowujących liczby rzeczywiste
(w zależności od zakresu)
(zmiennoprzecinkowe)
np. 123,45; 1,43e-13; -3,141593
1 Język programowania stanowi zrozumiały dla człowieka (programisty) oraz systemu obliczeniowego (komputera) sposób opisu programu. Istnieje wiele języków programowania, z których różne nadają się lepiej bądź gorzej do rozwiązywania różnych problemów.
2 Stwierdzenie to niekoniecznie musi być prawdziwe dla niektórych paradygmatów programowania (w tym np.
czysto deklaratywnych), jednak w zakresie tematyki programowania objętej niniejszym szkoleniem jest ono całkowicie zasadne.
3 Niektóre języki programowania (np. C++) dopuszczają operowanie na zmiennych nieokreślonego typu (variant), którym w trakcie działania programu mogą być przypisywane wartości różnych typów 2
Wartość logiczna
boolean
Typ zmiennych przechowujących wartości logiczne
PRAWDA lub FAŁSZ
Znak
char
Typ zmiennych przechowujących wartości znakowe
np. ‘a’, ‘3’, ‘@’
Łańcuch znaków
string, string[n]
Typ zmiennych przechowujących dane tekstowe (ciągi
(w zależności od długości)
znaków), np. „Ala ma kota”
W większości języków programowania dostępne są też następujące typy złożone, będące większymi strukturami danych składającymi się z wielu typów prostych:
Tablica
array [a1..b1,..,aN..bN]
Struktura składająca się z wielu wartości określonego
of typ_podstawowy;
typu prostego. Tablica może mieć zadaną liczbę
wymiarów. Tablica jednowymiarowa odpowiada liście
wartości, zaś dwuwymiarowa macierzy.
Przykład:
[1,3,67,13,7,0,7]
array [1..7] of integer;
(jednowymiarowa tablica wartości typu całkowitego o
wymiarze 7)
|d 7 _|
array [1..3,1..2] of char;
|a z c |
(dwuwymiarowa tablica wartości typu znakowego o
wymiarze 3x2)
Rekord
record
Struktura przechowująca wiele wartości, z których każda
pole1:typ_pola1;
może być różnego typu
..
poleN:typ_polaN;
end;
Przykład:
osoba:
//nazwa rekordu
osoba=record
imię:typ_łańcuchowy
//pola rekordu
imie:string;
wiek:typ_całkowity
wiek:integer;
end;
3
3. Różne paradygmaty programowania
Paradygmat programowania to fundamentalny styl programowania charakteryzujący sposób formułowania rozwiązań problemów w językach programowania i stanowiący niejako widok ze strony programisty na sposób wykonywania programu. Przykładowo, w paradygmacie obiektowym programista postrzega program jako zbiór współoddziałujących ze sobą obiektów, zaś w paradygmacie proceduralnym – jako sekwencję wykonywanych kolejno po sobie poleceń, pomimo iż w obu przypadkach program może realizować dokładnie to samo zadanie z punktu widzenia użytkownika końcowego.
W ogólności nie istnieje prosta korespondencja pomiędzy paradygmatem a językiem programowania, ponieważ dany język programowania może zapewniać wsparcie dla wielu paradygmatów jednocześnie. Na przykład język C++ zawiera elementy programowania proceduralnego, strukturalnego, oraz zorientowanego obiektowo i kierowanego zdarzeniami, umożliwiając pisanie za jego pomocą programów czysto proceduralnych, czysto obiektowych, bądź też mieszających jednocześnie założenia kilku paradygmatów.
Poniżej przedstawiony został przegląd najistotniejszych z punktu widzenia niniejszego studium paradygmatów programowania
3.1. Programowanie imperatywne
Programowanie imperatywne stanowi bardzo szeroki paradygmat opisujący program komputerowy jako sekwencję następujących po sobie instrukcji operujących na danych i zmieniających stan programu.
Najbardziej prymitywna postać programowania imperatywnego, to wykonywany kolejno jedna po drugiej ciąg instrukcji realizujących określone operacje na wspólnym zestawie danych, z dopuszczeniem przeskoków w przód i wstecz o określoną liczbę instrukcji.
1: Instrukcja1;
2: Instrukcja2;
3: Instrukcja3;
4: Instrukcja4;
5: goto 2;
Przykładem języków implementujących tylko czystą postać imperatywnego paradygmatu programowania są najprostsze odmiany języków asemblerowych (służących do bezpośredniego programowania układów mikroprocesorowych) oraz pierwsze postacie języka Basic. Zasadniczą wadą takiej metodologii jest mała czytelność oraz efektywność kodu w przypadku dużych programów i obecnie stosowana jest ona jedynie do programowania prostych układów mikroprocesorowych w językach asemblerowych.
4
3.2. Programowanie proceduralne
Programowanie proceduralne jest podklasą programowania imperatywnego dopuszczającego wyizolowanie w ramach programu fragmentów kodu (podprogramów lub tzw. procedur) które mogą być użyte w programie kilka razy, bez potrzeby ich wielokrotnego przepisywania.
// definicja procedury
Ten sam program w paradygmacie
proc Procedura1:
nieproceduralnym:
Instrukcja11;
Instrukcja12;
Instrukcja1;
end
Instrukcja2;
Instrukcja11;
// program
Instrukcja12;
Instrukcja1;
Instrukcja3;
Instrukcja2;
Instrukcja4;
Procedura1;
Instrukcja11;
Instrukcja3;
Instrukcja12;
Instrukcja4;
Instrukcja5;
Procedura1;
..
Instrukcja5;
..
Powyższy program (napisany w pseudokodzie) zostanie wykonany sekwencyjnie instrukcja po instrukcji, przy czym w miejscach poleceń „Procedura1” wykonane zostaną wszystkie instrukcje wchodzące w skład zdefiniowanej wcześniej procedury.
Zasadniczą korzyścią programowania proceduralnego nie jest jednak jedynie fakt możliwości wykorzystania danego kodu wielokrotnie, lecz możliwość każdorazowego operowania tym kodem na innych zestawach danych. Odbywa się to poprzez możliwość przekazywania do procedury parametrów w trakcie jej wywołania, w wyniku czego instrukcje składowe procedury działają na tych właśnie parametrach, których wartości mogą być różne w zależności od konkretnego kontekstu wywołania. Przyjrzyjmy się poniższemu przykładowi (w tym wypadku zapisanemu już w konkretnym języku Pascal):
// definicja procedury przyjmującej 1 argument typu
całkowitego
procedure Kwadrat(liczba:integer);
begin
// wypisanie na ekranie iloczynu parametru liczba przez
siebie samego
write(liczba*liczba);
end;
Program bez użycia procedur:
// program główny
begin
begin
Kwadrat(2);
// wywołanie dla liczba=2
write(2*2);
Kwadrat(3);
// wywołanie dla liczba=3
write(3*3);
Kwadrat(8);
// wywołanie dla liczba=8
write(8*8);
end;
end;
W powyższym przykładzie użycie procedury pozwoliło nie tylko wykonać ten sam kod wiele razy, lecz dodatkowo za każdym razem na różnych zestawach danych (różne wartości 5
parametru liczba). W tym konkretnym przypadku ze względu na prostotę realizowanych przez procedurę zadań korzyści nie są może aż tak istotne, jednak w przypadku bardziej rozbudowanych zadań uwidaczniają się one w sposób dobitny.
Ogólna składnia deklaracji procedury w języku Pascal ma postać:
procedure Nazwa_procedury(param1:typ_param1,..,paramN:typ_paramN);
begin
Instrukcja1;
..
InstrukcjaN;
end;
Zwracanie wyniku przez podprogram (funkcje)
Uogólnieniem procedury jest funkcja, która oprócz przyjmowania argumentów wywołania, zwraca bezpośrednio pojedynczą wartość typu określonego w jej deklaracji. Zwracana przez funkcje wartość utożsamiana jest bezpośrednio z wywołaniem funkcji tzn. w programie samo wywołanie funkcji możemy traktować jako zwracany przez nią wynik. Najlepiej ilustruje to poniższy przykład (w języku Pascal):
function Kwadrat(liczba:integer):integer;
// deklaracja funkcji Kwadrat przyjmującej parametr liczba typu całkowitego (integer) i zwracającej jego kwadrat jako wartość typu całkowitego
begin
return liczba*liczba;
// program główny
end;
// program główny
var wynik:integer;
// deklaracja zmienniej pomocniczej typu całkowiego
begin
// wypisz na ekranie wynik wykonania funkcji Kwadrat dla parametru liczba=5
wynik:=Kwadrat(5);
write(wynik);
end;
Ogólna składnia deklaracji funkcji w języku Pascal ma postać:
function Nazwa_funkcji
(param1:typ_param1,..,paramN:typ_paramN):typ_wyniku;
begin
Instrukcja1;
..
InstrukcjaN;
return zwracana_wartość;
end;
Języki rodziny C natomiast nie rozróżniają procedur i funkcji. Procedurą jest w tym przypadku po prostu funkcja nie zwracająca żadnej wartości.
6