Programowanie strukturalne w Turbo Pascalu Materia opracowaa mgr
Programowanie strukturalne w Turbo Pascalu Materiał opracowała: mgr Elżbieta Głowacka
Programowanie strukturalne w Turbo Pascalu Zajęcia numer 1 - wprowadzenie do Pascala Zajęcia numer 2 - stałe, zmienne, typy danych Zajęcia numer 3 - moduł SYSTEM Zajęcia numer 4 - Instrukcja warunkowa IF Zajęcia numer 5 - instrukcja wyboru CASE Zajęcia numer 6 - rodzaje pętli Podprogramy – procedury i funkcje 2
Pascal – nowy język programowania Twórcą języka Pascal jest Nikolaus Writh, który w 1971 roku opublikował pierwszy raport będący szczegółowym, formalnym opisem Pascala. Pascal opisany w raporcie był abstrakcyjnym językiem algorytmicznym tj. systemem reguł, słów umożliwiających jasne, jednoznaczne formułowanie algorytmów. Od tego czasu powstało wiele konkretnych realizacji języka Pascal tzn. systemów umożliwiających redagowanie programów i wykonywanie ich przez komputer. Nowości polegają nie tylko na ulepszaniu środowiska redagowania i uruchamiania programów, które stają się bardziej przyjazne i coraz bogatsze, wzbogacaniu listy standardowych poleceń i funkcji języka np. o procedury programowania grafiki, których nie było we wzorcu Writha, ale także na wprowadzaniu do języka nowych idei jak np. programowanie obiektowe.
Ekran Turbo Pascala
Opis menu File- pozwala na zapisywania programów źródłowych na dyskietce bądź dysku twardym (Save) - F 2, wczytywanie ich do edytora (Load) - F 3, kończenie pracy z Turbo Pascalem (Quit) - ALT+X. Edit - umożliwia pisanie programu źródłowego. Run - zawiera kilka możliwości. Na etapie wstępnym interesuje nas przede wszystkim uruchamianie programu realizowane przy pomocy polecenia Run (CTRL+F 9). Kombinacja przycisków ALT+F 5 pozwala obejrzeć ekran roboczy programu. 5
Podstawowe informacje o Pascalu Program źródłowy jest tekstem, czyli określonym zbiorem słów, cyfr i pojedynczych znaków zapisanym według reguł jakie ustalili twórcy języka. 6
Podstawowe informacje o Pascalu Słowa kluczowe zastrzeżone tylko do wydawania poleceń składających się na program. Nie wolno używać ich w innym celu. W Pascalu znajduje się 51 słów kluczowych. 7
Słowa kluczowe AND ASM ARRAY BEGIN CASE CONST DESTRUCTOR DIV DO DOWNTO ELSE END EXPORTS FILE FOR FUNCTION GOTO IF IMPLEMENTATION INLINE INHERITED INTERFACE INTERRUPT LABEL LIBRARY MOD NIL NOT OBJECT OF OR PACKED PROCEDURE PROGRAM RECORD REPEAT SET SHL SHR STRING THEN TO TYPE UNIT UNTIL USES VAR WHILE WITH XOR 8
Podstawowe informacje o Pascalu Łańcuch znaków wszystkie inne zestawienia liter (poza słowami kluczowymi). Łańcuch znaków musi być zawsze ograniczony przy pomocy separatorów, którymi w Pascalu są apostrofy (`). 9
Podstawowe informacje o Pascalu Symbole specjalne operatory arytmetyczne + - * / (brak potęgowania) operatory relacji< , > , = , <= , >= nawiasy okrągłe, kwadratowe i klamrowe () [] {} operator przypisania : = pozostałe symbole. , ; : ` # $ @ ^ 10
Podstawowe informacje o Pascalu Spacje – mają znaczenie separatorów (ale nie przy łańcuchach znaków) i można je używać tam, gdzie dwa symbole mogłyby się połączyć w jeden, zmieniając znaczenie tekstu. Nie mogą natomiast dzielić słów kluczowych. Tam gdzie może wystąpić jedna spacja, może być również ich więcej. 11
Budowa programu Każdy algorytm, a zatem i program operuje danymi, posługuje się nimi, korzysta z informacji jakie one niosą, przetwarza je. Dane mają określoną budowę, którą nazywamy strukturą. W programie musimy podać jakie rodzaje (typy) danych program będzie obsługiwał. 12
Budowa programu NAGŁÓWEK CZĘŚĆ DEKLARACYJNA CZĘŚĆ GŁÓWNA PROGRAM moja_nazwa; CONST definicje stałych VAR deklaracje zmiennych. . . deklaracje procedur i funkcji BEGIN. . . . instrukcje; END. 13
Podstawowy zestaw instrukcji Wczytanie danych Read (lista_argumentów); Read. Ln (lista_argumentów); np: Read (a, b); Read. Ln (c); Instrukcję Read. Ln bez parametrów można wykorzystać (chociaż nie zawsze jest to skuteczne do zatrzymania programu do chwili naciśnięcia ENTER ) 14
Podstawowy zestaw instrukcji Wyprowadzenie wyników i komunikatów Write (lista_argumentów); Write. Ln (lista_argumentów); np: Write (`Podaj swoje imię`); 15
Podstawowy zestaw instrukcji Instrukcja skoku (określenie położenia kursora na ekranie) Go. To. XY (liczba_pozycja, l iczba_wiersz); np: Go. To. XY (20, 10); 16
Podstawowy zestaw instrukcji Instrukcja czyszczenia ekranu (wyczyszczenie ekranu roboczego) Clr. Scr; 17
Podstawowy zestaw instrukcji Instrukcja zwiększenia jaskrawości koloru wyświetlanych znaków Highvideo; Brak zwiększenia jaskrawości koloru wyświetlanych znaków (biały kolor znaków na czarnym tle) Normvideo; 18
Stałe kolorów Identyfikator Wartość Kolor Black 0 czarny Blue 1 niebieski Green 2 zielony Cyan 3 morski Red 4 czerwony Magenta 5 fioletowy Brown 6 brązowy Light. Gray 7 jasnoszary Drak. Gray 8 ciemnoszary Light. Blue 9 jasnoniebieski Light. Green 10 jasnozielony Light. Cyan 11 jasnomorski Light. Red 12 jasnoczerwony Light. Magenta 13 jasnofioletowy Yellow 14 żółty White 15 biały 19
Podstawowy zestaw instrukcji Kolor tła Textbackground (kolor); Kolor tekstu Textcolor (kolor); 20
Zasady redagowania programu Kolejne instrukcje programu oddzielamy średnikami. W jednej linii programu może być umieszczonych wiele instrukcji, ale muszą być oddzielone średnikami. Po nagłówku i instrukcji WRITELN należy użyć średników, natomiast po BEGIN i END można je opuścić. Średnik możemy również opuścić, gdy następnym słowem jest END (niekoniecznie z kropką). Kropka po ostatnim END oznacza koniec programu i należy ją postawić. Dla czytelności programu stosuje się tzw. wcięcia. 21
Uruchomienie programu CTRL+F 9 - następuje kompilacja i konsolidacja programu oraz uruchomienie programu. ALT+F 5 - możliwość obejrzenia ekranu roboczego programu. Wciśnięcie dowolnego klawisza spowoduje powrót do Pascala. Kompilacja - tłumaczenie programu źródłowego do postaci pośredniej. Konsolidacja - operacja powodująca powstanie programu wykonywalnego, którego nazwa ma rozszerzenie EXE. Turbo Pascal może wykonywać ją automatycznie bez twojej wiedzy. 22
Moduły programu Moduł CRT to zbiór zgrupowanych razem pewnych dodatkowych (niestandardowych) procedur i funkcji, ułatwiających komunikację z użytkownikiem za pomocą urządzeń wejścia/wyjścia tj. klawiatury i monitora. Moduł ten zawiera instrukcje np. Go. To i Clr. Scr. 23
Zajęcia 2 Początki programowania Definiowanie stałych Deklarowanie zmiennych Rodzaje typów Wyrażenia 24
Definiowanie stałych STAŁA to konkretna niezmienna wartość, którą posługujemy się używając jej symbolicznej nazwy (np. PI). Wartością stałej może być każda liczba zarówno całkowita jak i ułamkowa. Stałą może być również każdy znak albo napis pod warunkiem, że zostanie on ujęty w separatory. 25
Zasady tworzenia nazw stałych nazwa stałej może się składać z liter i cyfr, ale na początku musi być litera nazwa nie może zawierać spacji, niektórych innych znaków np. kropki długość nazwy może wynosić najwyżej 32 znaki nazwa nie może się powtarzać nazwa powinna określać zawartość 26
Przykłady definicji stałych Chęć skorzystania z wielkości stałej należy programowi zgłosić. Zgłoszenie programowi, że zostanie użyta stała nazywa się definicją. CONSTANS (skrót CONST) słowo kluczowe informujące, że występujące obiekty są stałymi Przykłady definicji stałych dolny_zakres=100; komunikat=‘Naciśnij dowolny klawisz’; Pi=3. 14; 27
Deklarowanie zmiennych ZMIENNA to twór, którym posługujemy się korzystając z jej nazwy, zaś jej wartość jest wielkością, która może się zmieniać. Zasady tworzenia nazw zmiennych są takie same jak stałych. 28
Deklarowanie zmiennych Chęć skorzystania z wielkości zmiennej należy programowi zgłosić. Zgłoszenie programowi, że zostanie użyta zmienna nazywa się deklaracją zmiennej. VAR słowo kluczowe poprzedzające deklarację zmiennych. n n n Podczas deklaracji nie nadajemy zmiennej żadnej wartości. Zmienna musi posiadać wartość w chwili użycia. Każda utworzona zmienna musi być określonego rodzaju (typu). Wartością zmiennej może być liczba, znak, łańcuch znaków. 29
Rodzaje typów Typy proste są podstawowymi typami języka i za ich pomocą powstają bardziej złożone struktury danych. Wszystkie typy proste składają się ze skończonego i uporządkowanego zbioru wartości. 30
Podział typów prostych Typy proste n Porządkowe w Całkowite w Logiczny w Znakowy n Rzeczywiste w REAL 31
Podział typów prostych Typy porządkowe n Całkowite w Short. Int (zawierający liczby całkowite od -128 do 127) w Byte (zawierający liczby całkowite od 0 do 255) w Integer (zawierający liczby całkowite od -32768 do 32767) w Word (zawierający liczby całkowite od 0 do 65535) w Long. Int (zawierający liczby całkowite od 2. 147. 483. 648 do 2. 147. 483. 647) 32
Podział typów prostych Typy porządkowe n Logiczny w Boolean (składa się z dwóch predefiniowanych stałych False, True) 33
Podział typów prostych Typy porządkowe n Znakowy w Char (składa się z elementów będących znakami kodu ASCII) 34
Podział typów prostych Typy porządkowe definiowane przez programistę n n Wyliczeniowe Okrojony 35
Rodzaje typów Typy złożone (strukturalne) w Typ w Typ łańcuchowy STRING tablicowy znakowy rekordowy plikowy Typy wskaźnikowe 36
Rodzaje typów TYPY PROSTE TYPY STRUKTURALNE Łańcuchowy PORZĄDKOWE RZECZYWISTE CAŁKOWITE Short. Int Byte REAL Tablicowy Znakowy Rekordowy Plikowy Integer Word Long. Int WYLICZENIOWE OKROJONE 37
Przykłady deklaracji zmiennych wszystkie zmienne deklarujemy po słowie: VAR czynnik 1, czynnik 2: BYTE; wynik: REAL; odp 1, odp 2: CHAR; a, b, pole: INTEGER; n n Przy deklarowaniu zmiennych tego samego typu można je wyliczyć w postaci listy, w której są one oddzielone przecinkami. Przy deklarowaniu zmiennej podajemy wymyśloną przez siebie nazwę, dwukropek i wreszcie jej TYP. 38
Przykładowy program Program przykład; VAR Ocena: Byte; Wcisniety. Klawisz: Char; Pole. Kola: Real; Wynagrodzenie: Integer; Liczba. Mieszkancow: Long. Int; Czy. Koniec: Boolean; Tytul. Ksiazki: String; Imie, Nazwisko: String; 39
Przykłady wyrażeń Większość programów wymaga różnego rodzaju obliczeń. Zwykle celem tych obliczeń jest znalezienie wartości jakiejś zmiennej. Wyrażenia – to obliczenia zawierające zmienne, stałe i łączące je operatory. n n n Poprawnie zbudowane wyrażenie to takie, w którym każdy z operatorów działa na składnikach odpowiedniego typu. Jeśli warunek ten nie jest spełniony w czasie kompilacji zostanie wykryty błąd „pomieszania typów”. Składniki wyrażenia są odpowiedniego typu a zatem i wyrażenie należy do jakiegoś typu. Typem wyrażenia jest typ wartości powstającej w wyniku obliczenia tego wyrażenia czyli typ wartości wynikowej. 40
Priorytety operatorów działania w nawiasach (*) mnożenie i dzielenie (/) DIV (dzielenie całkowite) i MOD (reszta z dzielenia całkowitego) (+) dodawanie i (-) odejmowanie w przypadku braku nawiasów i przy operatorach o takim samym priorytecie działania są wykonywane od lewej do prawej 41
Przykłady wyrażeń (x+y)/(x-y) 2*sin(x/2)+3*cos(x*y) 42
Instrukcja przypisania Służy do nadania wartości zmiennej. nazwa_zmiennej: =wyrażenie_albo_wartość n n Od tego momentu operujemy nazwą zmiennej, ale program posługuje się jej wartością. Jeśli zmienna posiadała jakąś wartość wcześniej zostanie ona niestety całkowicie utracona. Zmienna zachowuje tylko wartość aktualną. Jeśli potrzebna jest poprzednia wartość zmiennej należy ją zapamiętać np. przez utworzenie zmiennej pomocniczej i przekazanie jej do wartości. 43
Przykłady instrukcji przypisania liczba: =5. 1; wynik: =dzielna/dzielnik; znak: =’A’; tekst: =’Co się gapisz? ’; 44
Zajęcia 3 Moduł System 45
Moduł SYSTEM Zawiera procedury i funkcje obsługi zbiorów, operacji konwersji liczb, operacji łańcuchowych, porządkowych oraz służące do dynamicznego przydziału i zwalniania pamięci. Jako jedyny jest dostępny automatycznie. Funkcje arytmetyczne modułu System Abs Arc. Tan Cos Exp Frac Int Ln Pi Sin Sqrt obliczenie wartości bezwzględnej argumentu obliczenie wartości arcusa tangensa obliczenie wartości cosinusa argumentu obliczenie wartości stałej Eulera e obliczenie części ułamkowej argumentu obliczenie części całkowitej liczby obliczenie wartości logarytmu naturalnego obliczenie wartości stałej pi obliczenie wartości sinusa argumentu obliczenie wartości kwadratu argumentu obliczenie wartości pierwiastka kwadratowego 46
Moduł SYSTEM Zawiera procedury i funkcje obsługi zbiorów, operacji konwersji liczb, operacji łańcuchowych, porządkowych oraz służące do dynamicznego przydziału i zwalniania pamięci. Jako jedyny jest dostępny automatycznie. Procedury i funkcje łańcuchowe Concat konkatenacja łańcuchów Copy Delete Insert Lenght Pos Str Val Wyznaczanie podłańcucha z łańcucha Usunięcie części łańcucha wstawianie podłańcucha do łańcucha wyznaczenie długości łańcucha wyszukanie podciągu znaków zamiana wartości numerycznej na łańcuch zamiana łańcucha znaków na jego numeryczną reprezentację 47
Moduł SYSTEM COPY Moduł: Wywołanie: Argumenty: Typ wyniku: Rezultat: SYSTEM Copy(łańcuch, nr, n) łańcuch: String nr, n: Integer String Funkcja wycina z argumentu łańcuch ciąg znaków o długości n począwszy od znaku o numerze nr. 48
Moduł SYSTEM CONCAT Moduł: Wywołanie: Argumenty: Typ wyniku: Rezultat: SYSTEM Concat(S 1[S 2…Sn]) S 1[S 2…Sn]: String Połączenie łańcuchów będących argumentami funkcji w jeden łańcuch 49
Moduł SYSTEM Zawiera procedury i funkcje obsługi zbiorów, operacji konwersji liczb, operacji łańcuchowych, porządkowych oraz służące do dynamicznego przydziału i zwalniania pamięci. Jako jedyny jest dostępny automatycznie. Procedury i funkcje porządkowe Dec utworzenie wielokrotnego poprzednika parametru Inc wyznaczenie wielokrotnego następnika parametru Odd Pred Succ badanie nieparzystości argumentu wyznaczenie poprzednika argumentu wyznaczenie następnika argumentu Pozostałe procedury i funkcje Up. Case(znak) – zamiana litery na dużą 50
Moduł SYSTEM SUCC Moduł: Wywołanie: Argumenty: Typ wyniku: Rezultat: SYSTEM Succ(x) x: dowolny typ porządkowy jak typ argumentu Element występujący bezpośrednio za argumentem x w zadeklarowanym typie porządkowym 51
Moduł SYSTEM Up. Case Moduł: Wywołanie: Argumenty: Typ wyniku: Rezultat: SYSTEM Up. Case(znak) znak: CHAR Duża litera odpowiadająca argumentowi będącemu małą literą 52
Zajęcia 4 Instrukcja warunkowa. IF <warunek> THEN instrukcja_1 ELSE instrukcja_2 JEŚLI warunek jest spełniony WYKONAJ instrukcję_1 W INNYM PRZYPADKU wykonaj instrukcję_2 Poszczególne składniki wyrażenia muszą być wcześniej zdefiniowane (stałe) lub zadeklarowane (zmienne) i muszą posiadać konkretną wartość. „Instrukcja_1” oraz „instrukcja_2” to dowolne instrukcje języka Pascal, które chcemy wykonać w przypadku spełnienia bądź niespełnienia warunku. 53
Zajęcia 4 Instrukcja warunkowa. IF <warunek> THEN instrukcja_1 ELSE instrukcja_2 Występujący po słowie If warunek może być wyrażeniem relacyjnym: <, >, <=, >=, =, <> lub wywołaniem funkcji o wartościach logicznych, np. If If X>=-1 Then. . . 4*Dlugosc<>P+1 Then. . . X=Sqrt(Y) Then. . . Key. Pressed Then Znak: =Read. Key; 54
Operatory logiczne AND to tak zwany „iloczyn logiczny” określany spójnikiem „i”. W Pascalu do utworzenia tego warunku używamy operatora AND, np. (X>Y) AND (Y>0). Taki warunek jest spełniony wtedy i tylko wtedy, gdy spełnione są jego obydwa człony. OR to tak zwana „suma logiczna” określana spójnikiem „lub”. W Pascalu do utworzenia tego warunku używamy operatora OR np. (X>Y) OR (Y>0). Warunek jest spełniony, gdy którakolwiek z jego części będzie prawdziwa. NOT to po prostu zaprzeczenie, czyli negacja. Np. Jeśli X>Y, to warunek jest prawdziwy w sytuacji gdy X>Y. Jeśli potrzebna jest sytuacja odwrotna, można zamiast pisać Y>X użyć postaci NOT (X>Y). 55
Zajęcia 4 Instrukcja warunkowa. Warunek logiczny może być również wyrażeniem złożonym utworzonym z prostych wyrażeń logicznych powiązanych operatorami logicznymi języka np. : {Jeśli X należy do przedziału liczbowego <10, 100> } If (X>=10) And (X<100) Then Write. Ln('Dwie cyfry'); {Jeśli A jest nieparzyste i podzielne przez 5 } If ((A Mod 2)<>0) And ((A Mod 5)=0) Then. . . {Jeśli A nie należy do przedziału liczbowego <0, 1) } If (A<0) Or (A>=1) Then. . . If Not ((A>=0) And (A<1)) Then. . . W tym wypadku najczęściej konieczne jest ujmowanie wyrażeń prostych w nawiasy okrągłe. 56
Zajęcia 4 Instrukcja warunkowa. Po słowie Then może wystąpić tylko jedna instrukcja. Jeżeli chcemy w danym przypadku wykonać więcej poleceń, to należy utworzyć z nich blok - blok traktowany jest bowiem jak jedna instrukcja programu, np. Read. Ln(A); If A<0 Then Begin Write. Ln('Podano ujemną wartość zmiennej a!'); Read. Key; Halt; End; 57
Zajęcia 4 Instrukcja warunkowa. Instrukcja If może mieć postać rozbudowaną: If warunek Then instrukcja 1 Else instrukcja 2; Słowo Else oznacza "w przeciwnym wypadku". W tej postaci wykonanie instrukcji polega na wykonaniu instrukcji pierwszej lub drugiej, w zależności od wartości logicznej podanego warunku: jeśli warunek logiczny jest prawdziwy, wykonana zostanie instrukcja 1, jeśli fałszywy, program wykona instrukcję 2 Wykonanie instrukcji If A>=0 Then X: =Sqrt(A) Else X: =0; spowoduje przypisanie zmiennej X wartości pierwiastka z liczby A gdy jego oblicznie jest możliwe lub też liczby zero gdy A jest liczbą ujemną. Uwaga: Po słowie Else może wystąpić tylko jedna instrukcja lub blok. W przypadku rozbudowanej postaci ze słowem Else po instrukcji pierwszej nie umieszcza się średnika! 58
Instrukcja wyboru. Zajęcia 5 CASE - znaczy „przypadek” (w przypadku, w razie gdyby) CASE <wyrażenie> OF stała 1: instrukcja_1; stała 2: instrukcja_2; … stała_n: instrukcja_n; ELSE inna_instrukcja END. jeżeli <wyrażenie> przyjęło wartość ‘stała_1’, wykonaj ‘instrukcję_1’; jeżeli <wyrażenie> przyjęło wartość ‘stała_2’, wykonaj ‘instrukcję_2’ itd. W przypadku jeżeli <wyrażenie> przyjęło wartość nie wyszczególnioną (ELSE) - wykonaj inną instrukcję. 59
Zajęcia 5 Instrukcja wyboru. <wyrażenie> to zwykle zmienna zadeklarowana na początku programu i posiadająca określoną wartość w chwili wykonania instrukcji CASE. Można oczywiście zastosować wyrażenie złożone z wielu zmiennych, operatorów i funkcji, ale musi ono być typu porządkowego. 60
Zajęcia 5 Instrukcja wyboru. <stała> Stała_1, stała_2, stała_n są elementami listy wyboru. Każda z tych stałych musi być tego samego typu. Stała może być: liczbą, znakiem (występuje wówczas w apostrofach), listą liczb lub znaków, zakresem liczb lub znaków. Przykłady niektórych stałych: lista liczb: 1, 3, 5, 7: lista znaków: ‘A’, ‘a’: zakres liczb: 1. . 10: zakres znaków: ‘A’. . ’Z’: 61
Zajęcia 6 Instrukcje pętli Pętla FOR Pętla WHILE. . DO Pętla REPEAT. . UNTIL 62
Pętla For Pętla - oznacza, że jakaś grupa poleceń będzie wykonywana wielokrotnie (wielokrotnie powtarzana). FOR – jest nazywaną „pętlą liczoną”. Programiści stosują ją w zasadzie zawsze, gdy są w stanie określić ile razy trzeba powtórzyć jakąś czynność. Wobec tego pętla musi posiadać coś w rodzaju licznika określającego ilość powtórzeń. 63
Pętla For FOR licznik_pętli: =wyrażenie_1 TO wyrażenie_2 DO instrukcja; albo FOR licznik_pętli: =wyrażenie_1 DOWNTO wyrażenie_2 DO instrukcja Przetłumaczenie pętli DLA wartości licznika zmieniającej się od <wyrażwnia_1> DO <wyrażwnia_2> WYKONUJ instrukcję 64
Pętla For Wartość licznika obrotów zmienia się – może rosnąć, albo maleć. Ważne, że zmienna ta nazywana zmienną sterującą pętli, ma określoną wartość początkową <wyrażenie_1> i końcową <wyrażenie_2>. Zmiana wartości zmiennej sterującej odbywa się automatycznie: po każdym wykonaniu pętli wzrost o jedną pozycję (gdy w instrukcji występuje słowo TO), lub zmniejszenie o pozycję (gdy w instrukcji występuję DOWNTO). Zmienna sterująca może być tylko zmienną typu porządkowego. Dla każdej wartości tego typu istnieje bowiem wartość ją poprzedzająca i następna. 65
Pętla For Przykłady For i: =3 To 82 Do Write('*'); For i: =1 To 25 Do Write. Ln('Kwadrat liczby ', i, ' = ', i*i); {Kwadrat liczby 8 = 64} For licznik: =10000 To 99999 Do If (licznik Mod 793)=0 Then Write. Ln(licznik); 66
Pętla WHILE. . DO WHILE <warunek> DO instrukcja albo WHILE <warunek> DO Begin End; instrukcja_1; instrukcja_2; . . instrukcja_n; Instrukcję tę rozumiemy następująco: Jak długo warunek jest spełniony (jest prawdą) wykonuj instrukcję występującą po słowie DO. 67
Pętla WHILE. . DO Instrukcja wykonywana w pętli może być tylko jedna. Do wykonania większej liczby instrukcji należy użyć klamry BEGIN. . END. Pętla instrukcji WHILE może nie zostać wykonana ani raz, gdyż warunek jest sprawdzany na początku. Przykład WHILE (wybor<>’k’) AND (wybor<>’p’) AND (wybor<>’o’) DO Readln (wybor) Przedstawiona pętla będzie realizować instrukcję Readln dotąd, dopóki zawartość zmiennej wybor nie będzie równa jednej z wymienionych liter. Jej zastosowanie pozwala wyeliminować komunikat o błędnym wyborze. 68
Pętla REPEAT. . UNTIL REPEAT instrukcja_1; instrukcja_2; . . . {instrukcje, które mają być wykonywane} instrukcja_n; UNTIL <warunek> {warunek, którego spełnienie oznacza wyjście z pętli} Przetłumaczenie: Powtarzaj grupę instrukcji do momentu aż warunek zostanie spełniony (stanie się prawdą). Liczba instrukcji pomiędzy REPEAT a UNTIL nie jest ograniczona i nie trzeba tu używać instrukcji złożonej, jak w FOR. . . TO. 69
Pętla REPEAT. . UNTIL Instrukcja REPEAT. . . UNTIL charakteryzuje się tym, że występujący wewnątrz niej ciąg instrukcji musi być wykonany przynajmniej jeden raz, gdyż warunek jest sprawdzany dopiero po ich wykonaniu. Przykład REPEAT Readln (liczba); UNTIL liczba=0; Wykonując polecenie podane w powyższym przykładzie komputer będzie wczytywał kolejne liczby z klawiatury. Jeśli któraś z nich okaże się równa 0, to przejdzie do następnej po pętli instrukcji. 70
Pętla REPEAT. . UNTIL Instrukcję REPEAT wykorzystujemy do chwilowego zatrzymania programu w celu oczekiwania na naciśnięcie: dowolnego przycisku Repeat until keypressed określonej litery Tak_Nie: CHAR; REPEAT Instrukcja_1; Instrukcja_2; . . . Instrukcja_n; Writeln (‘Jeszcze raz? T(ak)’); Tak_Nie: =Up. Case(Read. Key); UNTIL NOT (Tak_Nie=’T’) {jeśli naciśnięto T wykonuj petlę - warunek wyjścia z pętli} 71
Pętla REPEAT. . UNTIL Instrukcję REPEAT wykorzystujemy do chwilowego zatrzymania programu w celu oczekiwania na naciśnięcie: Konkretnego klawisza odp: CHAR; REPEAT Instrukcja_1; Instrukcja_2; . . . Instrukcja_n; Writeln (‘Cz chcesz zakończyć pracę z programem? T/N’); UNTIL (odp=’T’) OR (odp=’t’) {jeśli nie naciśnięto T wykonuj pętlę - warunek wyjścia z pętli} 72
Podprogramy Rozwiązując złożony problem w języku strukturalnym programowania dzielimy go na podproblemy, co ułatwia rozwiązanie. W ten sposób unikamy powtórzeń. Czynność powtarzającą się wielokrotnie można opisać tylko raz, a później wystarczy wskazać, którą sekwencję poleceń należy wykonać. Sekwencje poleceń rozwiązujące poszczególne podproblemy nazywamy podprogramami. Podprogramy muszą mieć nazwy pozwalające je zidentyfikować. Powinno się je stosować zawsze w przypadku powtarzania się problemów, a nawet w przypadkach pojedynczego ich występowania, jeśli poprawia to czytelność programów. Stosując tę zasadę tworzymy prostsze algorytmy dla podprogramów. W języku Pascal istnieją dwa rodzaje podprogramów: procedury i funkcje. 73
Podprogramy PROCEDURA lub FUNKCJA - to wyróżniona część programu stanowiąca pewną dającą się wyodrębnić całość i zaopatrzona w jednoznaczną nazwę. FUNKCJA jest tworzona dla obliczenia pewnej wartości, którą powinna zwrócić (np. przekazać do zmiennej). PROCEDURA ma na celu wykonanie określonej czynności. W programie Pascalowskim po definicji stałych i deklaracji zmiennych musi nastąpić deklaracja procedur i funkcji, a dopiero po tym część główna programu. O ile deklaracja zmiennych wymagała słowa kluczowego VAR, o tyle sekcja deklaracji podprogramów nie potrzebuje żadnego wyróżnienia. 74
Procedury Procedurą nazywamy wyodrębnioną część programu, która posiada swoją nazwę, realizuje określone zadania i w ustalony sposób komunikuje się z pozostałymi częściami programu. Procedury stosuje się do wykonywania czynności wielokrotnie powtarzanych w programie lub takich, które mogą być wykorzystane w innych programach. 75
Definicja procedury Procedure nazwa_procedury[(lista_argumentów)]; [część opisowa procedury] blok zakończony średnikiem Lista argumentów ma charakter opcjonalny - procedurę bez argumentów nazywa się bezparametrową. Wszystkie argumenty procedury muszą mieć określone typy, przy czym mogą to być typy standardowe lub zdefiniowane przez programistę. Część opisowa procedury może zawierać takie same elementy jak część opisowa programu z wyjątkiem deklaracji modułów. Wszystkie zmienne zadeklarowane w części opisowej procedury mają zasięg lokalny - są dostępne tylko w definiowanej procedurze. 76
Przykłady procedur Procedure Stop; Begin Write. Ln; Write. Ln('Naciśnij klawisz ENTER. . . '); Read. Ln; End; Zdefiniowana procedura jest bezargumentowa i wywołuje się ją tak jak każdą inną bezargumentową procedurę języka (np. Clr. Scr) wpisując jako instrukcję jej nazwę: np. If (x Mod 24)=0 Then Stop; 77
Funkcje Funkcja stanowi rozszerzenie procedury o możliwość przekazywania jednej wartości ustalonego typu, zgodnego z typem zadeklarowanym w nagłówku funkcji. Może on należeć do typów prostych lub wskaźnikowych. Funkcje podobnie jak procedury definiuje się w części opisowej programu: FUNCTION nazwa_funkcji (lista_parametrów): typ_wyniku; {deklaracja stałych i zmiennych} BEGIN {treść funkcji} END; Wewnątrz bloku definiującego funkcję musi wystąpić instrukcja przypisania nadająca wartość definiowanej funkcji w postaci: nazwa_funkcji: =wartość nadawana funkcji musi być zgodna z zadeklarowanym typem wyniku funkcji. 78
Przykłady funkcji Definicja funkcji, wartością której będzie pierwiastek stopnia czwartego z liczby rzeczywistej mogłaby mieć postać: Function Sqrt 4(x : Real) : Real; Begin Sqrt 4: =Sqrt(x)); End; Tak zdefiniowanej funkcji używa się w taki sam sposób w jaki używamy funkcji standardowych - wywołanie funkcji polega na podaniu jej nazwy oraz argumentu typu rzeczywistego, np. Write. Ln('Suma pierwiastków stopnia czwartego = ', Sqrt 4(x)+Sqrt 4(x+1)); 79
Przykłady funkcji Funkcja Min, której wartością jest mniejsza z dwóch liczb a i b Function Min(a, b : Long. Int) : Long. Int; Begin If a<a Then Min: =a Else Min: =b; End; Funkcja Min 3, która będzie zwracać najmniejszą z trzech liczb. Function Min 3(a, b, c : Long. Int) : Long. Int; Begin Min 3: =Min(a, Min(b, c)); End; 80
Przykłady funkcji Obliczając często potęgi o całkowitych wykładnikach wygodnie jest zdefiniować sobie funkcję obliczającą taką potęgę: Function Pot(podst : Integer; wykl : Byte) : Long. Int; Var i : Byte; wynik : Long. Int; Begin wynik: =1; For i: =1 To wykl Do wynik: =wynik*podst; Pot: =wynik; End; 81
Uwagi do funkcji i procedur Używając w programach funkcji lub procedur należy pamiętać, że: Zdefiniowaną funkcję lub procedurę można wywoływać wielokrotnie. Funkcje lub procedury bezparametrowe wywołujemy wpisując wyłącznie ich nazwy, podobnie jak w przypadku procedury Clr. Scr lub funkcji Read. Key. Jeżeli funkcja lub procedura posiada argumenty, to w wywołaniu należy podać wartości wszystkich argumentów, przy czym muszą to być wartości takich typów, które będą zgodne z typami zadeklarowanymi w definicji funkcji lub procedury - jeżeli argumentem funkcji jest liczba typy Real, to w wywołaniu możemy podać np. zmienną typu Byte, ale nie na odwrót. Zmienne zadeklarowane w części opisowej funkcji lub procedury mają charakter lokalny - są "własnością" danej funkcji lub procedury i mogą być używane wyłącznie w definicji funkcji lub procedury. Definiowana funkcja lub procedura może korzystać ze wszystkich funkcji i procedur, które zostały zdefiniowane wcześniej. Funkcja lub procedura może odwoływać się do zmiennych globalnych programu pod warunkiem, że zmienne te zostaną zadeklarowane wcześniej (powyżej). Postępowanie takie jest dopuszczalne, aczkolwiek nie jest polecane - można w ten sposób popełnić trudne do wykrycia błędy. 82
Przekazywanie argumentów funkcji i procedur Sposób przekazania argumentu do funkcji lub procedurze zależy od sposobu w jaki zdefiniowana została funkcja lub procedura, mówiąc bardziej szczegółowo, od sposobu deklaracji jej argumentów. Istnieją dwie zasadnicze metody: przekazanie przez wartość oraz przekazanie przez zmienną. Procedure P(a : Integer); Begin a: =a*a+1; Write. Ln(a); End; Tak zdefiniowaną procedurę program móże wywołać z argumentem w postaci zmiennej P(x), P(dlugosc), w postaci stałej P(1), P(1024) oraz w postaci dowolnego wyrażenia P(Sqr(12)+x-12) - wszystkie chwyty są tu dozwolone - jedyny warunek jaki musi spełnić argument podany w wywołaniu nazywa się typ, który musi być zgodny z typem argumentu wskazanym w deklaracji procedury. Wewnątrz definicji procedury P dostępna jest zmienna a : Integer, występująca na liście argumentów. Zmienna ta jest zmienną lokalną, dostępną tylko wewnątrz bloku definiującego procedurę i nie można się do niej odwołać z żadnego innego miejsca programu, bo w żadnym innym miejscu, czy to w innej procedurze, czy też w bloku programu, zmiennej tej po prostu nie ma. Jak w znanym przeboju: "pojawia się", gdy program rozpoczyna wykonywanie procedury, "i znika", gdy sterowanie opuszcza procedurę. 83
Przekazywanie argumentów funkcji i procedur O przekazaniu argumentu procedurze przez zmienną mówimy wówczas, gdy na liście argumentów identyfikator zmiennej poprzedzono słowem kluczowym Var: Procedure Czytaj(Var a : Word); Begin Repeat Write('Podaj dodatnią liczbę naturalną A = '); Read. Ln(a); Until a>0; End; Wywołanie tak zadeklarowanej procedury jest możliwe tylko wówczas, gdy jako argument podana zostanie zmienna typu Word (nie może to być zmienna żadnego typu zgodnego). Przy przekazaniu argumentu przez zmienną na stosie (w pamięci) nie tworzy się żadnych zmiennych tymczasowych - procedura pracuje bezpośrednio na przekazanej jej zmienej. 84
Przekazywanie argumentów funkcji i procedur Jeśli tak zdefiniowaną procedurę wywołamy w programie ze zmienną ilosc: . . . Var ilosc : Word; Begin Czytaj(ilosc); Write. Ln('Wczytano liczbę = ', ilosc); End. to występująca w definicji zmienna a podczas wykonania procedury będzie tożsama ze zmienną globalną programu ilosc. 85
Przekazywanie argumentów funkcji i procedur Przez zmienną przekazuje się do funkcji i procedur takie argumenty, których zmiany wykonane przez procedurę powinny być trwałe, jak np. odczyt wartości z klawiatury. Również duże struktury danych jak tablice należy w miarę możliwości przekazywać przez zmienną, gdyż w przeciwnym wypadku na stosie tworzone są ich kopie i znaczne zagłębienie wykonywania procedur może doprowadzić do wyczerpania miejsca na stosie, a tym samym do błędu wykonania programu. 86
Definicja typu W Pascalu można definiować własne typy. Określenie typu polega na podaniu jego nazwy i opisu zbioru dopuszczalnych wartości. TYPE nazwa=opis_typu; Mając określony nowy zbiór wartości, możemy dalej deklarować zmienne tego typu. W wyniku tego postępowania otrzymamy: Typ wyliczeniowy Typ okrojony 87
Typ wyliczeniowy jest to zbiór wartości wyliczonych w definicji. Stosuje się go do zbioru o niewielkiej liczbie elementów, na których nie wykonuje się operacji arytmetycznych. TYPE Kolory=(trefl, karo, kier, pik); VAR Karta: Kolory; TYPE Tydzien=(pn, wt, sr, czw, pt, sob, nie); VAR Dzien: Tydzien; TYPE Figury=(kwadrat, prostokąt, trojkąt, kolo); VAR Figura: Figury; Nie można zdefiniować w programie różnych typów wyliczeniowych zawierających taką samą stałą. 88
Typ okrojony jest to zbiór wartości będących podzbiorem pewnego typu porządkowego. Służy on do ograniczenia zakresu wartości dla zmiennej tego typu. W tym sensie zdefiniowany typ BYTE powstaje przez okrojenie typu INTEGER. TYPE Totolotek=1. . 49; VAR Liczby: Totolotek; TYPE Literki=’a’. . ’k’; Wielokaty=kwadrat. . trojkąt; Dzien_roku=1. . 365; 89
Typ okrojony Okroić można tylko typy INTEGER, CHAR, BOOLEAN i WYLICZENIOWE. Typy okrojone wprowadzono dla zwiększenia możliwości kontroli programisty nad przebiegiem programu. Operacje na wartościach typu okrojonego nie mogą wykraczać poza ten typ. Funkcje standardowe SUCC, PRED, ORD nie mogą mieć zastosowania do tych typów. SUCC - wyznaczenie następnika argumentu PRED – wyznaczenie poprzednika argumentu ORD – wyznaczenie numeru porządkowego argumentu odpowiadającego znakowi z tabeli kodów ASCII 90
Typy strukturalne (złożone) Tablicowy Rekordowy Plikowy Znakowy Łańcuchowy 91
Typy strukturalne - tablice TABLICĄ nazywamy złożoną strukturę danych, która zawiera zbiór elementów tego samego typu. Wyróżniamy: Tablice jednowymiarowe, które odpowiadają matematycznemu pojęciu wektora, np. [2 3 4 5 6] - tablica jednowymiarowa zawierająca 5 elementów typu całkowitego. 2 3 1 2 4 3 5 4 6 5 Elementy tablicy Indeks elementu 92
Typy strukturalne - tablice Tablice wielowymiarowe, które odpowiadają matematycznemu pojęciu macierzy (matrycy), np. 1 a d g 2 z f k 1 2 3 Elementy tablicy Kolumny Wiersze W tablicy dwuwymiarowej pierwszy indeks odpowiada numerowi wiersza, a drugi numerowi kolumny. np. : B[2, 3] – oznacza w drugim wierszu trzeci element (w tym wypadku k) 93
Deklaracja tablic W deklaracji TABLIC używa się słowa kluczowego ARRAY, po którym w nawiasie kwadratowym określamy rozmiar tablicy (od. . do), a po kolejnym słowie kluczowym typ elementów: TYPE Nazwa=ARRAY [zakres_indeksów] OF typ_elementu; W przypadku gdy chcemy bezpośrednio skorzystać z deklaracji VAR, zapiszemy instrukcję w następujący sposób: VAR zmienna: ARRAY [zakres_indeksów] OF typ_elementu; 94
Deklaracja tablic - przykłady TYPE Wektor=ARRAY [1. . 5] OF Byte; Macierz=ARRAY [1. . 2, 1. . 3] OF Char; Pole=(puste, pion, goniec, skoczek, wieża, hetman, król); Szachownica: ARRAY [1. . 8, ‘a’. . ’h’] OF Pole; VAR Dzien: ARRAY [1. . 12, 1. . 31] OF Byte; El_wektora: Wektor; El_macierzy: Macierz; Ruch: Szachownica; Z tablicami współpracuje instrukcja FOR. Pozwala ona wprowadzać dane do tablicy, wybierać elementy tablicy, wyświetlać je na ekranie. 95
Koniec prezentacji 96
- Slides: 96