skrypt wykładów z podstaw programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf ·...

100
Wykłady z Podstaw Programowania Język Turbo Pascal 7.0 Politechnika Białostocka Wydział Informatyki Jarosław S. Walijewski

Upload: others

Post on 15-Jan-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Wykłady z PodstawProgramowania

Język Turbo Pascal 7.0

Politechnika Białostocka Wydział Informatyki

Jarosław S. Walijewski

Page 2: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 2 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Wykłady Podstaw Programowania

1Literatura:2Historia

2.1Języki Programowania. 3Podstawowe pojęcia

3.1Budowa programu3.2Słowa kluczowe3.3Podstawowe typy danych

3.3.1Typy całkowite3.3.2Typy rzeczywiste3.3.3Znaki i łańcuchy znaków3.3.4Deklaracja stałych i zmiennych typów znakowych

3.4Elementy programu3.4.1Struktura programu 3.4.2Komentarze3.4.3Instrukcja przypisania

4Wyrażenia4.1Wyrażenia arytmetyczne

5Operatory5.0.2Operatory arytmetyczne5.0.3Priorytet operatorów5.0.4Przykłady

5.1Wyrażenia logiczne 5.2Operatory relacji5.3Operatory logiczne

5.3.1Priorytet operatorów6 Instrukcje

6.1Instrukcje wejścia /wyjścia (Input/ Output )

6.1.1Wyjście - procedury Write , Writeln 6.1.2Wejście - procedury Read , ReadLn

6.2 Instrukcje strukturalne6.2.1 Instrukcje złożone6.2.2Instrukcja warunkowa 6.2.3Instrukcja wyboru CASE

6.3Instrukcje iteracyjne6.3.1Instrukcja FOR

Page 3: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 3 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

6.3.4Instrukcja WHILE6.3.5Instrukcja Repeat

6.4Inne instrukcje6.4.1Instrukcja kodu6.4.2Instrukcja asemblerowa6.4.3Instrukcja skoku6.4.4Instrukcje Break i Continue

7Typy danych c.d.7.1Typy wprowadzone wcześciej7.2Typ wyliczeniowy7.3Typ okrojony7.4Typ zbiorowy 7.5Typ tablicowy

7.5.1String7.5.2Tablice wielowymiarowe

8Podprogramy8.1Istota programowania proceduralnego

8.1.1Pojęcie procedury 8.1.2Pojecie funkcji8.1.3Deklaracje, definicja i wywołanie podprogramów8.1.4Parametry podprogramów8.1.5Inne przykładowe funkcje8.1.6Zalety programowanie z wykorzystaniem podprogramów8.1.7Rekurencja

9Rekordy i tablice rekordów9.1Istota typu rekordowego9.2Rekordy z częścią stałą

9.2.1Instrukcja wiążąca WITH9.2.2Rekord z wariantami

10Operacje wejścia – wyjścia10.1Podstawowe operacje na plikach10.2Pliki tekstowe

10.2.1Plik tekstowy a plik file of char10.3Pliki elementowe 10.4Pliki amorficzne10.5Funkcje i procedury operujące na plikach

11Biblioteki Turbo Pascala11.1Moduł Crt

Page 4: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 4 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

11.1.1 STALE11.1.2 ZMIENNE 11.1.3 FUNKCJE I PROCEDURY

11.2Moduł System 11.3Moduł Dos11.4Moduł tworzone przez użytkownika

12Dynamiczne struktury danych12.0.1Pojęcie wskaźnika

12.1Tablica wskazników12.2Stos

12.2.1Struktura stosu12.2.3Na stos12.2.4Ze stosu12.2.5Zastosowanie stosu

12.3Listy 1 i 2 kierunkowe12.3.1Struktura listy 1 kierunkowej12.3.2Podstawowe operacje na liście12.3.3Struktura listy 2 kierunkowej12.3.4Dodawanie do listy12.3.5Zastosowanie list

12.4Drzewa binarne12.4.1Strukrura danych12.4.2Tworzenie Drzewa 12.4.3Szukanie elementu 12.4.4Usuniecie liścia i węzła12.4.5Równoważenie Drzewa

13Grafika w Turbo Pascalu13.1Programowanie w trybie graficznym

13.1.1Wprowadzenie do pracy w trybie graficznym13.2Narzędzia graficzne w Turbo Pascalu

13.2.1Moduł Graph

Page 5: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 5 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

1 Literatura:1. N. Wirth „Algorytmy + struktury danych = Programy”, WNT2. A. Marciniak „Turbo Pascal 7.0” WNT3. W. Porębski „Pascal-Wprowadzenie do programowania”, Help4. Sam Abolrous „Pascal Podstawy programowania”, Mikom5. B. Jankowski „Programowanie w praktyce”, Mikom6. B Kernighan, P. Plauger „Narzędzia programistyczne w Pascalu”,

WNT

7. Borland TP7 “User’s Guide”8. Borland TP7 “Language Guide”9. Borland TP7 “Programmer’s Reference”

10. Skrypt wykładów http://aragorn.pb.bialystok.pl/~walijewski

Page 6: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 6 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

2 Historia 1971 Niklaus Wirth, profesor informatyki Politechniki w

Zurychu, opublikował pierwszy artykuł o Pascalu "The programminglanguage Pascal"o W zamierzeniu Wirth’a Pascal miał służyć przede wszystkim

do nauki programowania strukturalnego, tj. programowaniadużych systemów tzw. "z góry - na dół", czyli określaniadużych elementów poprzez elementy niższego rzędu, aż dokońcowych elementów programowych realizujących określonefunkcje.

1973 Kathlen Jensen "Pascal, User Manual and Report" - pierwszypodręcznik języka

1983 Turbo Pascal 1.0 amerykańskiej firmy Borland International(obecnie Inprise)

Turbo Pascal 3.0 – zapoczątkowała sukces TP Turbo Pascal 4.0 – nowe zintegrowane środowisko,

implementacja modułów. 1988 Turbo Pascal 5.0 1989 Turbo Pascal 5.5 - Pierwsza implementacje

Programowania obiektowego w TP Turbo Pascal 6.0 – Zawierała nową bibliotekę Turbo Vision 1992 Borland Pascal 7.0 i Turbo Pascal 7.0

Pakiety te zawierają m.in. zintegrowane, interakcyjne systemyprogramowania, które składają się z kompilatorów języka,złączonych z nimi ekranowych, wielookienkowych edytorów tekstówi wbudowanych w systemy programów lokalizacji i usuwania usterek(ang. debugger) oraz przeglądania powiązanych elementówprogramów (ang. browser).

Page 7: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 7 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

2.1 Języki Programowania. W pamięci program jest zapisany jako Kod Maszynowy, czyli instrukcjedla konkretnego procesora. Są one pamiętane jako liczby w systemiebinarnym (zerojedynkowym).

Powstał więc Asembler - język pierwszej generacji. Jego rozkazyodpowiadają bezpośrednio instrukcjom procesora, jednak zapisywane są wbardziej zrozumiałej formie.

Druga generacja to języki nie mające już tak bliskiego związku zprocesorem, ale nadal podobnie jak asembler stanowiące jeden ciąginstrukcji. Są to tak zwane języki interpretowane. Przykładem takiegojęzyka może być ogólnie znany Basic. Jedna instrukcja języka drugiejgeneracji, może być tłumaczona na kilka, kilkadziesiąt a czasem więcejinstrukcji procesora.

Języki kolejnej generacji, np. Pascal, rozwijają koncepcję programowaniao możliwość podzielenia programu na moduły wykonujące różne operacjewchodzące w jego skład. Każda taka część stanowi pod pewnymwzględem zamkniętą całość i jej "wnętrze" nie jest dostępne.Wykorzystanie jej polega na przekazaniu parametrów (i ewentualnymodebraniu wyniku). Typowymi modułami są funkcje i procedury.

Kolejny to języki Zorientowane Obiektowo (OO). Przykład to C++,Delphi. Chociaż w Pascalu też można pisać programy OO.

Powstały również języki czwartej generacji. Są to języki umożliwiającepisanie programów tzw. bardzo wysokiego poziomu, niezależne odsprzętu, a nawet systemu operacyjnego. Przykład to języki dostępu do bazdanych.

Page 8: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 8 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

3 Podstawowe pojęcia3.1 Budowa programuProgram pascalowy buduje się z elementarnych jednostek języka zwanychsymbolami. Symbol składa się ze znaku lub ciągu znaków alfabetu .Alfabet zawiera : duże i małe litery alfabetu łacińskiego i znak _ cyfry od 0 do 9 symbole specjalne ( jednoznakowe) + - * / = < > { }[ ] ( ) . : ; ^ Ze znaków tworzy się symbole specjalne ( wieloznakowe) <> <= >= := .. spacja i słowa kluczowe ( zastrzeżone)W taki sam sposób tworzymy identyfikatory stałych, zmiennych, typów,podprogramów etc. Symbole specjalne, podobnie jak znak spacji sąseparatorami jednostek leksykalnych.

3.2 Słowa kluczoweSłowa kluczowe są to spójne ciągi liter tworzące zarezerwowane słowaangielskie o ustalonym znaczeniu. Używa się ich w z góry określonysposób. Są zastrzeżone, tzn. nie mogą być zmieniane przez programistę.Ich nazw nie można w programie użyć jako identyfikatora do jakiegośelementu. Poniżej ich lista:

And Array Asm Begin CaseConst Constructor Destructor Div Do

Downto Else End File ForFunction Goto If Implementation InInherited Inline Interface Label Mod

Nil Not Object Of OrPacked Procedure Program Record Repeat

Set Shl Shr String ThenTo Type Unit Until UsesVar While With Xor

Oprócz słów kluczowych w Turbo Pascalu występują Dyrektywy języka.W odróżnieniu od słów kluczowych, nie są one zastrzeżone - podane

Page 9: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 9 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

wyrazy mogą więc być identyfikatorami zdefiniowanymi przezprogramistę, co jednak nie jest zalecane. Pewnym wyjątkiem są dyrektywyprivate i public, które w obiektach, ale tylko w nich, są słowamizastrzeżonymi. Dyrektywą jest każdy z następujących wyrazów :

Absolute Far Near PublicAssembler Forward Private VirtualExternal Interrupt

Przykłady identyfikatorówAla ala DoOla1_1 Ola-1Koniec PoczątekLiczba Integer StringPascal Far Typ danych_For Private 23cia3.3 Podstawowe typy danychJęzyk Pascal pozwala na abstrahowanie od reprezentacji danych w pamięcikomputera.Osiągnięto to poprzez wprowadzenie pojęcia typu. Przyjęto założenie, żekażda zmienna, wyrażenie lub funkcja jest pewnego typu.Typ ten określa

zbiór wartości stałej, zmiennej etc. zbiór operacji jakie można wykonać na obiektach

3.3.1 Typy całkowiteTYPY CAŁKOWITE - są to wartości liczbowe, które mieszczą się wpodanych zakresach, im większy zakres to automatycznie zwiększa sięzapotrzebowanie liczby na pamięć:

SHORTINT (-128..127) 1 bajtINTEGER (-32768..32767) 2 bajtyLONGINT (-2147483648..2147483647) 4 bajtyBYTE (0..255) 1 bajtWORD (0..65535) 2 bajty

3.3.2 Typy rzeczywisteNazwa Zakres Długość Dokładność (cyfr)

real 2.9e-39 ÷ 1.7e38 6 bajtów 11 ÷ 12single 1.5e-45 ÷ 4.0e38 4 bajty 7÷ 8

Page 10: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 10 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

double 5.0e-324 ÷ 1.7e308 8 bajtów 15 ÷ 16extended 3.4e-4932 ÷ 1.1e4932 10 bajtów 19 ÷ 20

comp -9.2e18÷ 9.2e18 8 bajtów 19 ÷ 20

Użycie typów Comp lub Extended wymaga deklaracji wykorzystywaniaw przez program koprocesora( "Must be in 8087 mode to compile this."{$N+} ) W menu OPTIONS/COMPILER w dziale Numeric processingnależy wybrać opcję 8087/80287Opcja {$E+} umożliwia uruchomienie programową emulację koprocesora,w przypadku braku jednostki sprzętowej.3.3.3 Znaki i łańcuchy znaków Zbiór znaków (typ char) został zdefiniowany przez tablicę kodów ASCII.3.3.3.1 Znaki sterujące ( kontrolne ) Znaki o kodach 0 - 31 , 127 noszą nazwę znaków sterujących . Ichgraficzna reprezentacja nie zawsze będzie wyświetlana . Są to znakiużyteczne przy sterowaniu komputerem .Npprogram bell;begin write(#7); write(char(7));end.Wykonanie programu powoduje wydanie dźwięku dzwonka (ang. Bell ).3.3.3.2 Znaki podstawowego i rozszerzonego kodu ASCII Są to znaki odpowiadające kodom 32 ( spacja) - 126 ( ~). Mieszczą się tuznaki alfabetu Pascala ( małe i wielkie litery łacińskie , liczby ,znakioperatorów itp. ).Znaki o kodach 128- 225 są to znaki tzw. rozszerzonego kodu ASCII .Znaki te mogą być zmieniane , w celu uzyskania symboli specyficznychdla danego języka np. Ą Standardowo znajdują się tam znaki do kreślenia ramek , kilka znakówużywanych w transkrypcji i inne .Dostęp do tych znaków może być zrealizowany na trzy sposoby1. #Nr_Znaku np. #65 2. wykorzystanie funkcji charchar ( Nr_Znaku ) ; np. char (65)

3. wypisanie symbolu znaku w apostrofach np. 'A'

Page 11: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 11 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

3.3.3.3 Typ łańcuchowy -String Umieszczenie pomiędzy apostrofami ciągu znaków (łańcucha) jestrównież dopuszczalne np. Program string1;begin write('PASCAL);end . Ciąg znaków jest związany z typem string; Oczywiste jest , że typ charjest w nim zawarty jako ciągi długości 1.Program string_char;beginwrite('P','A','S','C','A','L');end .Inny specjalny napis to tzw. string pusty '' (apostrof apostrof)3.3.4 Deklaracja stałych i zmiennych typów

znakowychStałe const Litera = 'A'; const Imie = ' Anna';Zmienne var c : char; var S : String; var s10: String[10];Zmienne z wartością początkową

(dotyczy TURBO PASCAL i BORLAND PASCAL ) const c : char = 'A' ; {1} s1 : String[1] = 'Q'; {2} S : String= 'A'; {3} s10 : String[10]= 'Kot'; {4}

St : String = 'To jest napis !'; {5}Jakie są podobieństwa i różnice pomiędzy deklaracjami {1},{2}i{3}?

3.4 Elementy programu3.4.1 Struktura programu

Program Nazwa; {nagłówek programu}Uses ...; {deklaracje użycia modułów}

Page 12: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 12 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Const ... {deklaracje stałych globalnych} Type ... {deklaracje typów}

Var ... {deklaracje zmiennych globalnych}

Procedure Nazwa(paramerty); {nagłówek podprogramu - procedury}

Var ... {deklaracja zmiennych lokalnych} Begin

... {instrukcje podprogramu} End;Function Nazwa(paramerty):Typ_wyniku;

{nagłówek funkcji}Var ... {deklaracja zmiennych lokalnych } Begin

... {instrukcje podprogramu} End;BEGIN ... {instrukcje bloku głównego programu} END. { zakończenie bloku głównego kropką}Najkrótszy poprawny program w TP to:Program Nazwa;Begin End.

Page 13: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 13 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

3.4.2 Komentarze Każdy program po pewnym czasie może stać się nawet trudy dozrozumienia nawet dla autora . Można jednak ten proces osłabić poprzezodpowiednie pisanie programów.W tym celu należy opisywać wszystkie bardziej złożone fragmentyprogramów, a także używać identyfikatorów, których nazwy przybliżająich zastosowanie.

Przykład 1:(* komentarz *)var n,m,k : integer;begin n:=2; m:=6; k:=n*m; writeln(iloczyn { komentarz } ); { to także jest komentarz }end. Wprawdzie to nie jest komentarz, ale kompilatorpotraktuje ten takst jako komentarz.

Przykład 2 :Program iloczyn;var czynnik1,czynnik2, { czynniki } iloczyn : (*wynik mnożenia *) integer; { typ zniennych }BEGINczynnik1:=2 ; {przypisanie wartości do}czynnik2:=2 ; { czynników }iloczyn:=czynnik1 * czynnik1;

{wyliczenie wyniku mnożenia}writeln('Wynik mnożenia ' , czynnik1,' przez',czynnik2,' wynosi : ',iloczyn ) ; END.

Page 14: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 14 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

3.4.3 Instrukcja przypisania Nadawanie wartości następuje bardzo często za pośrednictwem instrukcjiprzypisania, która ma ogólną postać :

zmienna := wyrażenie ;

Operator „ := ” nazywa się operatorem przypisania , symbol zmiennaoznacza tu identyfikator; wyrażenie musi być typu konwertowanego dotypu zmiennej. W wersji najprostszej:zmienna := stała ;

liczba := 10 ;czytamy : zmiennej liczba przypisz wartość 10 ; Program Instr_przypisania_1 ;var liczba :integer ; BEGINliczba :=1;writeln(liczba);liczba :=100;writeln(liczba);liczba := -237;writeln(liczba);END.{wynik wykonania programu 1100-237 }Istnieje również inny schemat instrukcji przypisania mianowicie

zmienna1 := zmienna2 ;

Jednakże ta postać dopuszczalna jest gdy zajdzie jedno z: typy zmiennych są zgodne zmienna zmienna2 jest typu konwertowanego typu zmiennejzmienna1 o typ real (zmienna1) i typ Integer (zmienna1)

Page 15: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 15 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Przykładvar a,b :integer;begin a:=1; b:=a; writeln(c); writeln(b);end .Zmienne były tego samego typu .Przykład

var s : string ;const c : char = 'Z';bagin s := c ; writeln(c); writeln(s);end .zmienne miały różne typy

Program Instr_przypisania_2 ;var liczba : integer , litera : char;

BEGINliczba := 33; {wynik wykonaniaprogramu }litera := char (liczba) { ! }writeln(litera);END.

Page 16: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 16 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Program const_var;const c : char='A'; s1 : string[1]='Q'; s : string='A'; s10: string[10]='kot'; st : string='To jest napis';begin writeln('******************'); writeln('s1 :',s1); writeln('c :',c); s1:='kkk'; writeln('s1 :',s1); c:='u'; writeln('s10 :',s10); s10:=st; writeln('s10 :',s10); writeln('c :',c)end.

3.4.3.1 Różnice pomiędzy identyfikatorami stałych i zmiennych

1. wartości stałych są określone przed rozpoczęciem programu natomiastzmienne otrzymują wartość w trakcie wykonywania programu ;

2. ( TP ) tylko zmienne deklarowane w sekcji CONST mają nadanąwartość przed rozpoczęciem programu ;

3. wartość identyfikatora stałej nie może ulec zmianie podczaswykonywania programu , podczas gdy zmienna może przyjmowaćróżne wartości

W instrukcji przypisania zmienna := stała ;wartość stałej musi być tego samego typu , co typ zmiennej . Jedynymwyjątkiem jest instrukcja przypisania zmiennej typu rzeczywistego stałejtypu całkowitego np.

Page 17: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 17 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

program Real_int;var r :real;beginr := 100 ;end. Które z definicji są poprawnymi definicjami stałych :(a) CONST Licza = 250 ;(b) CONST Liczba = 1,2 ;(c) CONST Znak = 'A' ;(d) CONST Max = 250 ;min= -150.7;(e) CONST zakres = 250 ..500;(f) CONST L : integer = 250 ;(g) CONST L : real = 250 ;(h) CONST L : string = 250 ;(i) CONST L : char = 250 ;

Które ze zmiennych są zadeklarowane poprawnie :(a) VAR 1a,2a,3a : Real;(b) VAR a1,a2,a3 : Real;

b1 : char; a3 : Integer

(c) VAR a :Char ; b Integer ; c : real; (d) VAR a1;a2;a3 : Real , c : char ;

Zadanie Napiszmy program , który wydrukuje tekst : S = 1+2 + 3+4+5 , a wnastępnym wierszu wartość zmiennej S . Program Komentarz_1;var S : Integer; ST : String;begin

St := ' S = 1+2+3+4+5 ' ;S := 1+2+3+4+5 ;writeln(st);writeln(s);

end.

Page 18: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 18 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

4 Wyrażenia4.1 Wyrażenia arytmetyczneWyrażenia arytmetyczne składają się z elementów typów całkowitych lubrzeczywistych. Proste wyrażenia arytmetyczne określają operację arytmetyczną np. 25 + 130, gdzie „ 25 ” i „130” to argumenty wyrażenia, a znak „+”operatorem wyrażenia. Po wykonaniu operacji określonej przez operatorotrzymujemy wynik wyrażenia; W naszym przykładzie „155 ”.Wartość tego wyniku możemy wydrukować: np. writeln(25+130) ;Wynik ten możemy zapisać do pewnej(odpowiedniej) zmiennej:np. var I :Integer;.... I := 25+130 ; Ta własność prowadzi nas do następnego schematu instrukcji przypisania:zmienna := wyrażenie ;

!!!Wartość wyrażenia musi być typu konwertowanego do danej zmiennej!

Niepoprawna będzie więc instrukcja Var s : string; I : Byte;...s := 10+11;I := 3.5;...I := 257; Byte 0..255

257 = 256+1

Page 19: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 19 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

5 Operatory5.0.15.0.2 Operatory arytmetyczneOperatory są to symbole wiążące argumenty wyrażenia. Jeśli wyrażenie

zawiera różne operatory to wyliczanie wartości przebiegazgodnie z kolejnością priorytetów.

5.0.2.1 Operatory jednoargumentowe + (znak dodatni argumentu) - (znak ujemny argumentu)

5.0.2.2 Operatory dwuargumentowe

Op Znaczenie Typ argumentów Typ wyniku+ Dodawanie- Odejmowanie* Mnożenie/ Dzielenie

Integer lub Real

Integer jeśli każdyargument jest typu

Integer , wpp RealReal

MOD Reszta z dzieleniaDIV Część całkowita z

dzieleniaInteger Integer

5.0.3 Priorytet operatorówOperatory + - mają niski priorytet , pozostałe wysoki .Wyrażenie wykonywane jest od prawej do lewej strony najpierwwykonywane są operacje o wysokim priorytecie , a następnie o niskim .5.0.4 PrzykładyObliczyć wartość i określić typ wyrażenia :

38 + 39 div 6 * 6 - 66 mod 8 =38 + 6 * 6 - 66 mod 8 =38 + 36 - 66 mod 8 =38 + 36 - 2 = 74 - 2 = 72Wszystkie argumenty były typu Integer, więc wynik też będzie typu

Integer

Page 20: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 20 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

W sytuacji gdy nie wystarczy poprzestanie na kolejności operacjiwynikające z priorytetów działań można kolejność wymusić stosującnawiasy. 3.5 *(16 div 5 ) + 4.5 = 15.0 ( Real )

Argumentami wyrażenia mogą być także zmienne npvar a,b :integer ;

a* 19+ b / 3 ( Real) 5.1 Wyrażenia logiczne Wyrażeniem logicznym nazywamy wyrażenie dające w wyniku wartośćtypu BOOLEAN , czyli jedną z dwóch stałych : True , False

W wyrażeniach logicznych mogą występować operatory relacji ioperatory logiczne

5.2 Operatory relacjiOperator

Znaczenie

= Równość< Mniejszość> Większość

<> Różność<= mniejszość lub równość>= większość lub równośćin przynależność do zbioru

NPWyrażenie Wartość65.6 > 65 True65.6 < 65 False10 <> 11 True6 in [0..9] TrueUwaga: Argumenty operacji relacji muszą być tego samego typu bądź typówkonwertowanych .

5.3 Operatory logiczneArgumenty muszą być typu BOOLEAN

Page 21: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 21 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Operator Znaczenie Ilość argumentówNOT negacja 1AND koniunkcja 2OR alternatywa 2

XOR róznica symetyczna 2

Wyniki operacji logicznych

A1 A2 not x not y and y x or y x xory

True True False False True True False True False False True False True True False True True False False True True False False True True False False False

5.3.1 Priorytet operatorówPriorytet Operatory

0 (najwyższy ) wyrażenia w nawiasach 1 NOT2 * / DIV MOD AND 3 + - OR XOR4 < <= >= = <>

Page 22: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 22 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

6 Instrukcje Instrukcja pusta.Instrukcja przypisania .zmienna := wyrażenie ;Instrukcja procedury .Nazwa; lub Nazwa(parametry);6.1 Instrukcje wejścia /wyjścia

(Input/ Output )

6.1.1 Wyjście - procedury Write , Writeln Instrukcja procedury write (writeln ) ma ogólną postać : write (f , p1 , p2 ,..,pn); writeln (f , p1 , p2 ,..,pn);gdzie f -oznacza plik dyskowy ( parametr ten może być pominięty wtedydane wypisywane są na konsolę , czyli ekran monitora) natomiast każdy z pi może występować w postaci p p:m p:m:np jest typu prostego lub string ;m określa szerokość pola w jakim dane będą wypisywane ;n określa ilość miejsc po przecinku (tylko typy rzeczywiste) n, m - wyrażenia całkowite

Program Wypisz ;var l : Byte; i : Integer; r : Real;begin i:=2; l:=7; r:= l / i ; write (1:4 ); write (l : 4 ); write(r:5:2);end.Jaki będzie wynik wykonania programu ?Co się stanie gdy zmienimy instrukcję na :

Page 23: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 23 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

write(r:1:2); write(r:4:1);Procedury write i writeln mogą być wywoływane ze zmienną ilościąparametrów . Ponadto parametry mogą mieć różne typy .6.1.2 Wejście - procedury Read , ReadLn Instrukcja procedury read (readln ) ma ogólną postać : read (f , p1 , p2 ,..,pn); readln (f , p1 , p2 ,..,pn);gdzie f mają takie same znaczenie jak w przypadku procedury Write ,natomiast każde pi jest typu całkowitego , rzeczywistego , char lub string ;Przykład 1:Program Czytaj_1;var i : Integer;begin Read (i); writeln; writeln(i);end.Efektem wykonania powyższego programu będzie 1. wczytanie z konsoli ( klawiatura ) liczby całkowitej 2. następnie liczba ta zostanie ponownie wyświetlona - wypisana będzie wartość zmiennej „ i ”Przykład 2:Program Czytaj_2;var s1,s2 :string;

begin

Readln(s1); writeln; writeln(s1); Readln(s2); writeln; writeln(s1,s2);end.

Program Czytaj_2_b;var s1,s2 :string;

begin

Read(s1); writeln; writeln(s1); Read(s2); writeln; writeln(s1,s2);end.

Jako ćwiczenie na laboratorium pozostawiam sprawdzenie czy istniejąróżnice w wykonaniu tych dwóch wersji programów . Jeśli tak , to co możetłumaczyć takie różnice .

Page 24: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 24 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Procedura Readln może rówineż zawierać większą ilość parametrów -może też ich wogóle nie być. Taki przypadek będzie bardzo użyteczny wcelu zatrzymania wykonywania programu .Program Stoped; begin ... readln;end.

6.2 Instrukcje strukturalnePoznane jak dotąd instrukcje były instrukcjami prostymi - nie zawieraływ swej składni innych instrukcji . Natomiast instrukcje strukturalne sąkonstrukcjami językowymi zbudowanymi z ciągów instrukcji na podstawieokreślonych schematów strukturyzacji . 6.2.1 Instrukcje złożoneInstrukcja złożona ma następującą budowę :

BEGIN I1; I2 ; ...InENDgdzie I1; I2 ; ...In są instrukcjami a słowa kluczowe BEGIN iEND reprezentują tzw. nawiasy instrukcyjne .Instrukcja złożona zastępuję więc ciąg instrukcji , a właściwie to zamieniaciąg instrukcji w jedną instrukcję .Takie podejście jest bardzo użyteczne ,gdy musimy użyć wielu instrukcji natomiast składnia dopuszcza tylkojedną .Separatorem instrukcji jest średnik „ ; ” . występuje on pomiędzykażdymi dwoma instrukcjami . Możemy go również postawić po ostatniejinstrukcji , wtedy oddzieli on tą instrukcję od następnej - tym przypadkubędzie to instrukcja pusta .

6.2.2 Instrukcja warunkowa Instrukcja wyboru warunkowego :

IF warunek THEN instrukcja_1 ELSE instrukcja_2

Page 25: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 25 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

TestInstrukcja 1 Instrukcja 2

Instrukcja 3

Tak Nie

Instrukcja ta jest równoważna schematowi . W schemacie może byćopuszczona instrukcja 2 , a w składni możebyć opuszczona fraza ELSE .

IF warunek THEN instrukcja_1

Warunek musi być wyrażeniem logicznym(Boolean), czyli dającym wwyniku wartość boolowską: True lub FALSE.

Natomiast Instrukcja1 i Instrukcja2 muszą być pojedynczymi instrukcjami.

Przykłady :(a) IF X<>0 THEN y := 1/x ELSE write('Dzilenieprzez 0 ');

(b) IF (X>0) AND(X=1) THEN ELSE y:= 1/x;(c) IF B < 0 THEN y:= B - 3 ELSE ;

ELSE w przykładzie (c) może być pominięte , w przykładzie (b) można gopominąć zmieniając warunek na przeciwny czyli

(b`) IF NOT( (X>0) AND(X=1) ) THEN y:= 1/x;

Page 26: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 26 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

(d) IF delta > 0 then begin

x1:= (-b - Sqrt(delta))/(2*a);x2:= (-b - Sqrt(delta))/(2*a);

endELSE

begin x1:= -b /(2*a);

x2:=x1;end;

Ponieważ w składni instrukcji warunkowej występują pojedynczeinstrukcje , a my musieliśmy użyć ich ciągi zastosowaliśmy instrukcjezłożone , które zamieniło nam ciągi instrukcji w pojedyncze instrukcje .

Instrukcja występująca po THEN czy też po ELSE może być równieżinstrukcją warunkową IF NpIF test1 THEN IF test2 THEN IF test3 THEN

Instrukcja1 ELSE ELSE ELSE co uwidacznia następujący schemat blokowy

Test 2 Test 3 Instrukcja 1Test 1

True TrueTrue

False FalseFalse

Page 27: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 27 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

(e)IF delta > 0 then begin

x1:= (-b - Sqrt(delta))/(2*a);x2:= (-b - Sqrt(delta))/(2*a);

endELSE IF delta = 0

begin x1:= -b /(2*a);

x2:=x1;end

ELSE Write('Nie ma pierwiastków rzeczywistych');

Przykład:program oceny;var ocena:real; wynik:integer;Beginwynik:=90;IF wynik >=30 then IF wynik >=35 then IF wynik >=40 then IF wynik >=50 then IF wynik >=60 then IF wynik >=70 then IF wynik >=80 then IF wynik >=90 then Ocena:=5.0 ELSE Ocena:=4.5 ELSE Ocena:=4.0 ELSE Ocena:=3.5 ELSE Ocena:=3.0 ELSE Ocena:=2.5 ELSE Ocena:=2.0 ELSE Ocena:=1.5 ELSE Ocena:=1.0; writeln(ocena:4:1);End.

Program tenprzyporządkujewynikowi z zakresu 1 - 100punktówodpowiedniąocenę. Punktyokreślają procentodpowiedzipoprawnych.UkładkonstrukcjiIF...THEN ...ELSE pokazuje nam ,że program tenskłada się zwieluzagnieżdżonychinstrukcji warun-kowych.

Page 28: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 28 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

program ifelse;var test,test2:boolean; l1,l2:integer;Begin test:=25*26<27*24; IF test then IF l2<>0 then writeln(l1/l2) ELSE writeln('TestFalse');End.

Poddajmy dogłębnej analizieprzytoczony przykład programu.Wyrażenie widzimy tu dwieinstrukcje warunkowe . Jednakodnajdujemy tylko jedno słowoELSE , co oznacza , ze jednainstrukcja jest postaci IF...THEN...ELSEnatomiast drugaIF...THEN...Należy postawić sobie pytanie , doktórego IF odnosi się to ELSE ?

Myślę , że bardzo pomocne byłoby tu stworzenie schematu blokowego

Test l2<>0 True True

False

L1/L2

Test False

False

Na jego podstawie widzimy wyraźnie , sposób wykonywania naszejinstrukcji warunkowej .

6.2.3 Instrukcja wyboru CASE

Składnia instrukcji CASE jest następująca

CASE selektor OF pierwsza lista stałych wyboru : I1; druga lista stałych wyboru : I2;

n-ta lista stałych wyboru : In ELSE Ie;END ;

Page 29: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 29 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

gdzie I1..In,Ie są instrukcjami prostymi lub złożonymi , selektor jestwyrażeniem typu porządkowego ( Integer,Char,Boolean ale NIEReal ).Listy stałych są albo wymienionymi wartościami

np 1,2,57albo przedziałami np 1..9albo połączeniem np 0..9,11,12,17..35

Przykład 1:Case wynik DIV 10 of

10,9 : Ocena:=5.08 : Ocena:=4.57 : Ocena:=4.06 : Ocena:=3.55 : Ocena:=3.04 : Ocena:=2.53 : Ocena:=2.00,1,2 : Ocena:=1.0

End;

Przykład 2program Wybor;var droga : char; czas : real;beginRead(Droga); Case droga of ''A','a' :czas:=3.0;

'B','b' : czas :=4.0;''C','c' : czas :=4.5;ELSE czas :=0;

end;end.

Instrukcja CASE w wielu przypadkach jest bardziej czytelna niż połączeniewielu zagnieżdzonych instrukcji IF .Dobrym przykładem może tu byćwyliczanie ocen .Zarówno w każdej z instrukcji IF jak i w instrukcji CASE mogą byćopuszczone fragmentu zawierające instrukcje wykonywane w przypadkuniespełnienia warunku (w CASE żadnego z warunków).W instrukcji CASE ELSE może nie występować w niektórychimplementacjach Pascala , standard Pascala jej nie zawiera - jest to jednakpoprawna konstrukcja Turbo PascalaProgram realCase;var x:real; a:integer;s:string;beginread(a);

Page 30: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 30 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

x:=sqrt(a)/a;CASE x OF 1: s:='Liczba dodatnia'; -1: s:='Liczba ujemna'; 0: s:='Liczba 0'end;writeln(s);end. Czy ten program jest poprawnie zbudowany . Widzimy tu błędne użycieinstrukcji CASE . Nie jest dozwolone , aby selektor był wyrażeniem(zmienna czy też stałą ) rzeczywistym .Należy w instrukcji CASE wyrażenie x zastąpić Trunc(x). Wynikiem tejfunkcji jest część całkowita z liczby x .Program nie będzie działał poprawnie , gdy podamy liczbę 0.

6.3 Instrukcje iteracyjne

Iteracje ( pętle) pozwalają na opisani w prosty sposób czynności które sąwykonywane wielokrotnie . W języku Pascal istnieją dwa rodzaje pętli

Czy spełnione są

warunki wyjścia ?

Nie

Treść pętli Czy spełnione są

warunki wejścia ?

Nie

Treść pętli

Tak Tak

Page 31: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 31 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

6.3.1 Instrukcja FOR

Składnia instrukcji :

FOR zm:=wp TO wk DO I ;gdzie zm - Zmienna sterująca pętląwp - wartość początkowawk - wartość końcowa

I - pojedyncza instrukcja

Instrukcja OR jest realizacją pętli z warunkiem wejścia . Jest ona pewnymwariantem pętli WHILE. 6.3.2

Składnia instrukcji :FOR zm:=wp DOWNTO wk DOI ;gdzie zm - Zmienna sterująca pętląwp - wartość początkowawk - wartość końcowaI - pojedyncza instrukcja

Pętla FOR to przykład iteracji ograniczonej – z góry wiadomo ile razywykona się dana pętla.UWAGA!W treści pętli nie wolno zmieniać wartości zmiennej sterującej pętlą.

Przykład:var zn:char;k:Integer;begin zn:='*'; for k:=1 to 8 do

write(zn:k);end.PROGRAM Reprezentacja;

False

I

True

Zm <= wk

Zm:=wp

Zm:=succ(zm)

False

I

True

Zm >= wk

Zm:=wp

Zm:=pred(zm)

Page 32: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 32 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Uses Crt; VAR znak : Char; BEGIN Writeln('Program drukuje kody ASCII znakow'); FOR znak:='0' TO '9' DO Writeln('cyfra ',znak,' ma kod ',Ord(znak)); FOR znak:='A' TO 'Z' DO Writeln('litera ',znak,' ma kod ',Ord(znak)); REPEAT UNTIL Keypressed; END.

program srednia;uses crt;vari,ilosc,suma,a:integer;wynik:real;begin clrscr; writeln('Program oblicza srednia arytmetyczna'); write('Podaj ilosc liczb z ktorych obliczesrednia: ');

suma:=0;{przypisanie wartosci poczatkowej sumie} readln(ilosc); for i:=1 to ilosc do begin write('Podaj liczbe ',i,' a',i,'= '); readln(a); suma:=suma+a; end; wynik:=suma/ilosc; writeln('Srednia z podanych liczb wynosi ' ,wynik:2:2);

writeln('Nacisnij klawisz ENTER'); readln;end.

Page 33: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 33 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

PROGRAM Suma_liczb_parzystych; USES Crt; CONST n=100 ; VAR suma,licznik : Integer;

BEGIN ClrScr; Writeln('Program sumuje liczby parzyste od 1do ',n);

suma:=0;

FOR licznik:=1 to n DO IF NOT Odd(licznik) THEN suma:=suma+licznik;

Writeln; Writeln('Suma liczb przystych od 1 do ', n,'

wynosi ', suma); ReadLn END.6.3.3

Page 34: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 34 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

6.3.4 InstrukcjaWHILE

Składniainstrukcji :

WHILE wl DO I ;gdzie wl - wyrażenie logiczneI - pojedyncza instrukcja

Instrukcja WHILE jest realizacją pętli z warunkiemwejścia .Instrukcja oznacza: Dopóki prawdziwe jest

wyrażenie WL wykonuj instrukcję I .

Przykłady :Program Gwazdka;var zn:char;k:Integer;beginzn:='*';k:=1;while k<=8 do begin

write(zn:k);k:=k+1;

end;

Program Liczby;uses crt;begin

i:byte; i:=0; while i<10

do begin

i:=i+1; writeln(i);

end;end.

xxx

False

I

True

WL

Page 35: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

PROGRAM Petla2;USES Crt;VAR i, x, y, Nwd : Integer; BEGIN ClrScr; Write('Podaj 1-sza liczbe : '); ReadLn(x); Write('Podaj 2-ga liczbe : '); ReadLn(y); i:=1; WHILE (x>i) Or (y>i) DO Begin If (x Mod i=0) And (y Mod i=0) Then Nwd:=i; i:=i+1; End; Write('Najwiekszy wspolny dzielnik = ', Nwd); ReadKey;END.6.3.5 Instrukcja

Repeat

False

TrueWL

In;

I1;

...

Składnia instrukcji :

REPEAT I1; ... In UNTIL wl ;gdzie wl - wyrażenie logiczneI1, ..,In - instrukcje

Instrukcja REPEAT jest realizacją pętli z warunkiem wyjścia. Instrukcjaoznacza: Wykonuj instrukcję I1,..,!n aż prawdziwe będzie wyrażenie WL .Dowolna pętla zrealizowana za pomocą instrukcji WHILE może byćzbudowana za pomocą instrukcji REPEAT. Twierdzenie odwrotne nie jestprawdziwe .

Przykład :Read(zn); WHILE zn <>'*' do

Page 36: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

begin write(zn); read(zn); end;writeln; REPEAT zn <>'*' read(zn); if zn <> '*' then write(zn); UNTIL zn =*' writeln

Uses CRT;Var licz:byte;

Begin ClrScr; REPEAT Write('Wpisz jakąśliczbę (0-wyjscie) :'); ReadLn(licz); WriteLn('Potegaliczby ',licz,' to',licz*licz); WriteLn; UNTIL licz=0;End.

Page 37: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Przykład:PROGRAM Petla3;USES Crt;VAR n, x : Integer; y : Real; Zn : Char;BEGIN ClrScr; Write('Podaj X : '); ReadLn(x); y:=1; n:=1; REPEAT Write('N = ', n:3); y:=x/n; WriteLn(' X/N = ', y:7:2); n:=n+1; UNTIL y<0.2;Repeat Until KeyPressedEND.

Page 38: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

6.4 Inne instrukcje6.4.1 Instrukcja koduPosiada następującą składnię:

INLINE (lista_elementów);

Wszystkie elementy lis ta_elementów oddzielone są od siebieukośnikami i mogą być:

stałymi określającymi wartości liczbowe identyfikatorami zmiennych identyfikatorami zmiennych ze stałą poprzedzoną + lub - operatorami rozmiaru kody <i> Przykładowe użycie tej procedury:

INLINE($EA/$F0/$FF/$00/$F0); {spowodujezresetowanie się komputera}6.4.2 Instrukcja asemblerowa

Składnia jej jest następująca:ASM Instrukcja; ... Instrukcja;END;

Przykładasm mov al,0edh out 60h,al in al,64h mov al,x end;

Page 39: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

6.4.3 Instrukcja skokuLabel etykieta Begin...Goto etykieta...etykieta:Instrukcja ta może być przyczyną zaciemniania kodu programu i należy jejunikać.Praogam dane;Label Wyjscie:...BebinFor I:=1 to 1000 do For j:=2 to 2000 do For k:=3 to 3000 do Begin

... If t[I,j,k]=0 then goto wyjscie

else...

End; Write('Brak zera'); exit;Wyjscie: Write('Zero na pozycji’ i,' ',j,' ',k)End;

6.4.4 Instrukcje Break i ContinueBreak – przerwanie treści bloku pętliContinue – Opuszczenie reszty treści bloku pętli

Program BC;var i,x,y:Integer;

begin Write ('podaj dwie liczby całkowite'); for i:=1 to 32000 do begin Read(x,y); if (x=0) and (y=0) then break;

Page 40: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

if (x=0) or (y=0) then continue; writeln(x/y:5:2, ' ' , y/x :5:2); endend.

Page 41: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 41 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

7 Typy danych c.d.7.1 Typy wprowadzone wcześciej

Typy całkowite Byte, Short, Integer, Word, Longint

Typy rzeczywiste Real, single, double, extended

Typ Logiczny Boolean Typ Znakowy Char Typ Napisowy StringTyp String jest równoważny String[255] co oznaczatablicę 255 znaków.

7.2 Typ wyliczeniowyTyp definiowany przez użytkownika.Type Dni=(Poniedzialek, Wtorek, Sroda, Czwartek,

Piatek, Sobota, Niedziela);var d:dni;

begin for d:= Poniedzialek to piatek do writeln ('Dziś do pracy ');end.7.3 Typ okrojonyTyp okrojony może być utworzony z dowolnego typu prostego (całkowite,logiczny, znakowy, wyliczeniowy) poprzez zawężenie jego zakresu dojawnie podanego.Type LiteraMała = ‘a’ ..’z’;

Cyfra = 0..9; Dzienroboczy = Poniedzailek..Piątek; Wielkość zajętej pamięci przez typ okrojony jest taka sama jak przez typbazowy.

7.4 Typ zbiorowy Type Nazwa = Set of Typ_ Elmenetowy

Page 42: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 42 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Typ zbiorowy umożliwia na operowanie podzbiorach typuTyp_Elementowy. Typ_Elementowy musi być typem porządkowymo co najwyżej 256 różnych wartościach. Może to być typ okrojony bądźwyliczeniowy. Nie może to być typ Integer – bo zawiera za dużo możliwych wartości.

Type Dni=(Poniedzialek,Wtorek,Sroda,Czwartek,Piatek,

Sobota,Niedziela);Robocze =set of Dni;

var d : dni; r : Robocze;

begin r:=[]; r :=r+ [poniedzialek..Piatek]; randomize; d:=dni(random(7)+1); if d in r then

writeln (' Dzień roboczy',byte(d)) else

writeln('Dzień wolny', byte(d));

end.

Page 43: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 43 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

7.5 Typ tablicowyJest to typ złożony.

Array[typ_indeksowy]of typ_danych;

Przykład:Type Liczby= Array[1..10] of byte; Nazwiska= Array[100..1000] of String;

Dane=Array[Boolean]of Real;Zadania=Array[Poniedzialek..Piatek]of String;

Typ danych może być dowolnym wcześniej określonym typem.

Program T1;Var a:array[1..5] ofInteger;

Begin ReadLn(a[1]); ReadLn(a[2]); ReadLn(a[3]); ReadLn(a[4]); ReadLn(a[5]); WriteLn(a[5]); WriteLn(a[4]); WriteLn(a[3]); WriteLn(a[2]); WriteLn(a[1]);End.

Program T1a;Var a:array[1..5] ofInteger; i:byte; Begin for i :=1 to 5 do ReadLn(a[i]); for i :=5 downto 1 do WriteLn(a[i]); End.

Zmienna typu tablicowego w pamięci zajmie Wielkość jednego elementy * Ilość ElementówW powyższym przypadku SizeOf(Integer)* 5 czyli 2*5 = 10.

Page 44: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 44 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

7.5.1 StringTyp String jest równoważny String[255] co oznacza tablicę255 znaków. Jest to maksymalna długość pojedynczego łańcuch.Można ograniczyć go poprzez konstrukcję:String[B] gdzie B jest typu Byte 0..255var Imie : String[15];

Nazwisko : String[25];Typ String jest specyficznym typem tablicowym.Dopuszczalne są oracje na zmiennej Operatory:+ = <> < > <= >=var S: String;Read(s);Write(s);S:=’ Ala ma kota’S:=’Coś innego’ + ’ może jeszcze coś’;If s => ’tekst’then Delete(s,2,10);Funkcje i procedury operujące na elementach typu String:f.Length(S: String): Integer;f.Copy(S: String; Index: Integer; Count: Integer): String;f.Concat(s1 [, s2,..., sn]: String): String;f.Pos(Substr: String; S: String): Byte;p.Insert(Source: String; var S: String; Index: Integer);p.Delete(var S: String; Index: Integer; Count:Integer);Pos(Substr: String; S: String): Byte;var s: string;begin s := 'Ala ma kota'; Delete(s,5,3); Writeln(s); { 'Ala kota' } Insert('znalazła',s,5); Writeln(s); { 'Ala Znalazła kota' }end.

Page 45: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 45 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

7.5.2 Tablice wielowymiaroweW konstrukcjiArray[typ_indeksowy]of typ_danych;nic nie powiedziano o typ_danych. Może to być dowolny określonywcześniej, lub w tym momencie, typ danych. W szczególności może to byćtyp tablicowy.

7.5.2.1 Tablice dwu-wymiarowe Array[zakres1] of array [zakres2] of typ_danychArray[zakres1,zakres2] of typ_danych

T2a=Array [1..10,1..20] of Real;T2b=Array [ char,1..3] of Char;T2c=Array [32..255,Boolean] of Byte;Ilość elementów tablicy równa się iloczynowi mnogości typówindeksujących. Np. T2a posiada 10*20 czyli 200 elementów * 4B(typReal), czyli łącznie 800B.

Cała tablica musi zmieścić się w jednym segmencie danych 64KB.Przykład:Var T: array['a'..'z',1..3] of byte; C:char;I:byte; Begin Randomize; For c:= 'a' to 'z' do For I:=1 to 3 do T[c,I]:=Random(2); For I:=1 to 3 do begin For c:= 'a' to 'p' do If T[c,I]>0 then Write('*') Else write(' '); Writeln; End; END.Co oznaczają symbole T, T[c] , T[c,i].

Page 46: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 46 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Przykład:Program Przekatne;const N=6; M=7;Type Tablica2= Array[1..N,1..M] of char;var T : Tablica2; i,j,k,p:Integer;BEGIN Randomize; k:=1; For i:=1 to N do for j:=1 to M do T[i,j]:= chr(random(255-32)+32); for i:=1 to N do begin for j:=1 to M do write(ord(t[i,j]):4); writeln end; if N<M then k:=N else k:=M;

for i:=1 to K do writeln(ord(t[i,i]):i*4);

for i:=1 to K do writeln(ord(t[i,M-i+1]):(M-i+1)*4);

p:=K div 2; for i:=1 to p do writeln(ord(T[i,i]):i*4,

ord(T[i,M-i+1]):(M-2*i+1)*4); if odd(m) then begin inc(p); writeln(ord(T[p,p]):p*4) end; for i:=p+1 to K do writeln(ord(t[i,M-i+1]):(M-i+1)*4,

ord(T[i,i]):(2*i-M-1)*4);END.

7.5.2.2 Algorytmy dotyczące tablic

Page 47: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 47 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

PROGRAM SortowanieBabel ;CONST N = 10 ;VAR A : ARRAY[1..N] OF Integer ;

I,ZAM: Integer ;B : Integer ;

BEGIN Randomize;

FOR I := 1 TO N DO A[I]:=Random(199)-100;

Writeln('Wylosowany wektor:') ;Writeln ;FOR I := 1 TO N DO Write(A[I]:5) ;

REPEATZAM := 0 ;

FOR I := 1 TO N - 1DO BEGINIF A[I]> A[I+1]THEN BEGIN

B := A[I];A[I] := A[I+1];A[I+1] := B;ZAM := ZAM + 1END

ENDUNTIL ZAM = 0 ;

Writeln('Wektor po sortowaniu:') ;Writeln ;FOR I := 1 TO N DO Write(A[I]:5) ;

END.

Page 48: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 48 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

7.5.2.3 Tablice n-wymiarowe TypePozycja =[-10..10,-10..10,-10..10] of real;Tab3= Array [1..3,1..10,1,5] of Boolean;Tab4= Array[Boolean,1..3,6..10,2..4]of Real;Tab5= Array[1..2,1.10,1..5,1..4,0..9] ofInteger;Type Punkt = Array[1..3] of Real; Odcinek = Array[1..2] of Punkt; Figura = Array[1..4] of Punkt; Bryla = Array[1..6] of Figura; Ruch = Array[1..100] of Bryla;

Nie istnieje ograniczenie, poza zajętością pamięci, na ilość wymiarówtablicy. Jednakże niezmiernie rzadko stosuje się tablice o większejilości niż 3. Najczęściej pojawiają się tablice jedno i dwu wymiarowe.

Większa ilość wymiarów utrudnia określenie adresu elementu, a takżezależności pomiędzy sąsiadami.

Czasami lepszym rozwiązaniem jest skonstruowanie prostszego typudanych.

Załóżmy za var B:Bryła;Co oznaczają zmienne i czy poprawne są odwołani:B, B[1], B[1,2], B[1,2,3], B[1,2,3,4], B[1,2,3,4,5]

7.5.2.4 Zgodność typów tablicowych

Type T1=Array[1..N] of integer;T2=Array[1..N] of integer;Var a1:T1; a2:T2;

a1:=a2; a1:=T1(a2);

Page 49: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 49 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

8 Podprogramy8.1 Istota programowania proceduralnego

Historycznie ujmując pierwsze programy korzystały z programowanialiniowego. Nie wspominam tu z oczywistych względów językówmaszynowych, czy też „języków” programowania pierwszych komputerów.Programowanie proceduralne umożliwia podział jednego wielkiego projektuna kilka mniejszych zadań.8.1.1 Pojęcie procedury

Procedure NazwaProcedury ( var argument : Typ_argumentu ) ;

Deklaracje stałych i zmiennych lokalnych;Begin Ciało proceduryEnd;8.1.2 Pojecie funkcji

Function NazwaFunkcji ( var argument : Typ_argumentu )

: Typ_wyniku ;

Deklaracje stałych i zmiennych lokalnych;Begin... NazwaFunkcji:=wyrażenie typu Typ_wyniku;...End;

,

;

, ;

Page 50: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 50 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

8.1.3 Deklaracje, definicja i wywołaniepodprogramów

8.1.3.1 Procedury Program podprogramy;Procedura powieksz(var x:real;y:real);Begin X:=x+y;End; Var x,y : real;BEGIN x:= 2.0; y:= 1.0; Writeln(x,’ ’,y); Powieksz(x,y) Writeln(x,’ ’,y);END.

8.1.3.2 Funkcji Program Funkcje;Function Silnia(N:byte):longint;Var i:Byte; S: longint;Begin S:=1; For i:=1 to N do s:= s * i; Silnia:=s;End;

Function Potega(x:real;N:byte):Real;Var i:Byte; P: longint;Begin P:=1; For i:=1 to N do p:= p * x; Potega:=p;End;Var w,a:real; b:byte;Begin a:= 2.0; b:= 3; Writeln(b,’!=’silnia(b));

Page 51: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 51 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

w:= pot(a,b); Writeln(a,’^’,b,’=’,w);End.8.1.4 Parametry podprogramów8.1.4.1 Parametry formalne i aktualne, zmienne lokalne Parametry podprogramów umożliwiają komunikację procedury ze „światemzewnętyrznym”, czyli programem głównym bądź innym podprogramem,który go wywołał. Dzięki parametrom podprogramy działając nasparametryzowanych danych mogą być wielokrotnie używane dowykonywania zadań na różnych danych. Parametry procedur i funkcji stająsię ich zmiennymi lokalnymi. Jeśli jakaś zmienna globalna ma nazwętożsamą z nazwą parametru to w podprogramie będzie widoczna tylkozmienna lokalna związana z parametrem.8.1.4.2 Przekazywanie parametru poprzez wskaźnik i wartość Program Parametr_var;Procedure Dordaj( var x:Integer; y : Integer);Begin x := x + 2; y := y + 3; writeln('x =', x ,'y=',y ); End;

BEGIN x := 5; y := 6; writeln('x =', x ,'y=',y ); dodaj( x, y); writeln('x =', x ,'y=',y ); END.8.1.5 Inne przykładowe funkcje Zamiana dwóch zmiennych liczbowych Maximum i minimum Podprogramy operujące na elementach tablicy8.1.6 Zalety programowanie z wykorzystaniem

podprogramów Podział programu na mniejsze segmenty Wielokrotne wykorzystanie tego samego kodu

Page 52: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 52 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Realizacja podobnych problemów za pomocą tego samego podprogramu –wykorzystanie parametrów

8.1.7 Rekurencja8.1.7.1 Cechy rekurencji 8.1.7.2 Wywoływanie samej siebie 8.1.7.3 W pewnych warunkach następuje koniec wywoływania

rekurencyjnego8.1.7.4 Rekurencja a iteracja Program Rekurencja;Function Silnia(N:byte):longint;Begin If N>0 then silnia:= n*silnia(N-1) Else silnia:=1; End;

Function Potega(x:real;N:byte):Real;Begin If N>0 then potega:= x*potega(x,N-1) Else potega:=1; End;Procedure Hanoi(zlodlo,pomoc,cel,ilosc:byte);Begin If ilosc>0 then begin Hanoi(zrodlo,cel,pomoc,ilesc-1); Przenies(zrodlo,cel); Hanoi(pomoc,zrodlo,cel,ilesc-1); End;End;Gdzie procedura przenies może mieć w najprostszym przepadku postać:

Procedure przenies(zrodlo,cel:byte); Begin Write(zrodlo,’->’,cel,’ ’); End;

Page 53: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 53 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Ciekawszym rozwiązaniem, byłoby wykorzystanie tablic doprzechowywania krążków (liczb) i wyświetlania ich zawartości. Toumożliwiło by zasymulowanie animacji.Można też by zauważyć, że skoro zmienne zlodlo,pomoc,cel sąliczbami powiedzmy 1, 2, 3 to łatwo zauważyć, iż 1 + 2 +3 = 6 .zlodlo+pomoc+cel = 6 czylicel =6-zlodlo-pomoc a procedurę mo zemy zamienić na:

Procedure Hanoi(zlodlo,pomoc,ilosc:byte);

8.1.7.5 Zalety i wady rekurencji

Zastępuje iterację Prostota krótkiego kodu

Łatwe przepełnienie stosuKłopoty z rekurencyjną definicją problemu

Page 54: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 54 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

9 Rekordy i tablice rekordów9.1 Istota typu rekordowegoTyp rekordowy jest używany do opisu obiektów o strukturze niejednorodnej,czyli takich, w których elementy składowe zawierają dane różnych typów. Wten sposób możemy połączyć w jedną całość wiele różnych informacji. Jakoprzykład może posłużyć zbiór informacji o studencie.

9.2 Rekordy z częścią stałąDeklaracja typu rekordowego będzie miało następujący schemat.Type Nazwa_typu = RECORD

Pierwsza_lista_pól:T1;Druga_lista_pól :T2;

n-ta lista_pól:TN;

END;Gdzie każda lista pól to lista identyfikatorów oddzielonych on siebieprzecinkami, a każde Ti to identyfikator dowolnego wcześniejzdefiniowanego, przez użytkownika bądź systemowego, typu.DataT=Record d,m,r:byte; end; AdresT=Record ulica :string[20]; miasto:string[15]; kod :string[5]; end; Dane=record imie:String[15]; nazwisko:string[25]; data_ur:DataT; rok:0..6; adres:AdresT; wydzial,kierunek:byte; end;var D:Dane;

Page 55: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 55 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Dostęp do pól rekordu mamy za pomocą znaku „.”(kropka) oddzielającejnazwę zmiennej od nazwy pola. D.imie D.Data_ur.d9.2.1 Instrukcja wiążąca WITHInstrukcja postaci:With zmienna_recordowa do Instrukcja;powoduje, że w obrębie instrukcji Instrukcja mamy dostęp do pólzmiennej zmienna_recordowa bez konieczności pisania desygnatora wpełnej postaci.With D doBegin Write(’Podaj imię ’);

Readln(imie);Write(’Podaj nazwisko ’);

Readln(nazwisko); Write(’Podaj datę urodzenia (rr mm dd) ’); With data_ur do Readln(r,m.,d);

...End;9.2.2 Rekord z wariantami Pola opisane w poprzednim rekordzie są dostępne we wszystkich zmiennychtego typu. Możliwa jest również struktura, w której w zmiennychrekordowych tego samego typu istnieją różne pola. Pojawienie się kilkuwariantów zmiennej rekordowej umożliwia konstrukcja:Type Nazwa_typu = RECORD

Definicje pól stałych;CASE pole znacznikowe : Tc OF

Pierwsza lista stałych wyboru:(Pierwszalista pól);

Druga lista stałych wyboru:(Druga listapól);

...M-ta lista stałych wyboru:(M-ta lista pól);

END;

Page 56: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 56 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Gdzie pole znacznikowe oznacza pole typu Tc (pole to może byćopuszczone, ale typ musi być określony). Pola w wariantach mogą różnić sięzarówno typem jak i ilością. Przy przydzielaniu pamięci kompilator dlacałego wariantu przydzieli tyle pamięci ile zajmuje sumarycznie największaz list pól wariantowych. W poniższym przykładzie będzie to 26 bajtów /sizeof(string[25])/.

Ważne jest, że END kończy zarówno wariant jak i cały opis typurekordowego – powoduje to, że nie istnieje możliwość zdefiniowaniawiększej niż 1 ilości wariantów.Type Tplec=(K,M); Dane=record imie:String[15]; nazwisko:string[25]; data_ur:DataT; rok:0..6; adres:AdresT; wydzial,kierunek:byte; case plec:Tplec of M:( Nazwajw:string[15]; Nrjw:word; ); K:(NRodowe:string[25]) end; Dostęp do pól wariantowych jak i pola znacznikowego jest taki sam jak wprzy padku innych pól.

Page 57: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 57 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

10 Operacje wejścia – wyjścia10.1 Podstawowe operacje na plikachWiększość programów w trakcie pracywykorzystuje pliki do przechowywania danych. Dotychczas przechowywałeśdane w pamięci operacyjnej, tzn., że po zakończeniu programu twojedane ulegały zniszczeniu, po przeczytaniu tego rozdziału to się zmieni.Ze względu na typ danych przechowywanych w plikach możemy wyróżnić: pliki tekstowe - zawierające tekst ; pliki elementowe (zdefiniowane) - elementami tych plików są:

tablice, rekordy; pliki amorficzne - o nieokreślonej strukturze.

Pierwszą rzeczą w momencie rozpoczęcia pracy na plikach jest stworzeniezmiennej plikowej,robimy to tak:varnazwa_zmiennej : text; plik tekstowynazwa_zmiennej : file of typ: plik zdefiniowany;nazwa_zmiennej : file plik o nieokreślonejstrukturze;Zanim zaczniemy wykonywać jakiekolwiek operacje na pliku musimyzadeklarowanej zmiennej przypisać "fizyczną" nazwę pod jaką plikbędzie widoczny na dysku, robimy to tak:Assign(zmienna_plikowa,sciezka);zmienna_plikowa – wykonując operacje na pliku do niej będziemy

się odwoływać,sciezka - ścieżka do pliku np.: 'C:\TEMP\PLIK.DAT'

Uwaga:Procedura Assign nie sprawdza istnienia, a nawet możliwości dostępu dopliku opisanego ścieżką.

Page 58: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 58 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Po skojarzeniu należy plik otworzyć. Mamy do wyboru kilka procedurotwierających: Reset(zmienna_plikowa) - otwiera tylko plik już istniejący,

brak pliku powoduje wystąpienie błędu fatalnego wejscia-wyjścia. Plikotwarty do czytania lub czytania i pisania.

Rewrite(zmienna_plikowa) - tworzy plik, jeśli już istnieje tootwiera plik skojarzony ze zm_plikową. Jeśli plik już istnieje to dane wnim zapisane zostaną nadpisane. Plik otwarty do pisania.

Append(zmienna_plikowa) - Procedura ta dotyczy tylko plikówtekstowych. Otwiera do pisania istniejący plik, (skojarzony zezmienną_plikową). Dane będą dopisywane na koniec pliku.

Close(zmienna_plikowa) - zamyka plik skojarzony ze zmiennąplikową.

Function Eof(zm_Plik):Boolean; Zwraca TRUE gdyosiągnięty został koniec pliku FALSE w przeciwnym przypadku.

Zapisywanie i odczytywanie danych z pliku odbywa się za pomocąprocedur:Read, Readln, Write, Writeln:Read(zmienna_plikowa,lista_argumentów);Write(zmienna_plikowa,lista_argumentów);Procedury te były już używane wcześniej, pierwszy parametr był wtedyopuszczany. Oznaczało to operacje na specjalnym pliku tekstowym –konsoli. Pliku tego można używać jawnie:

var plikwe,plikwy;...

Assign(plikwe,’’); Assign(plikwy,’’); Reset(plikwe); Rewrite(plikwy);...read(plikwe,n);for i:=1 to 10 dowriteln(plikwy,'Tekst na ekran(',n,')razy');

Składnia procedur czytania i pisania z plików powinna więc być znana .

10.2 Pliki tekstowe

Page 59: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 59 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Konsola – plik tekstowy standardowo otwarty do czytania i pisania.Metody otwarcia:Reset – tylko do czytania Rewrite – tylko do pisaniaAppend –do aktualizacji, czyli pisania na końcu pliku.

10.2.1 Plik tekstowy a plik file of char

Program pliki_tekstowe;varplik_wejsciowy : text;plik_wyjsciowy : file of char;znak : char;beginAssign(plik_wejsciowy, 'plik.in');Assign(plik_wyjsciowy, 'plik.out');{$I-} Reset(plik_wejsciowy); {$I+}if IOResult <> 0 then exit;ReWrite(plik_wyjsciowy);while not EoF(plik_wejsciowy) do beginRead(plik_wejsciowy, znak);Write(plik_wyjsciowy, znak);Write(znak);end;Close(plik_wejsciowy);Close(plik_wyjsciowy);end.

Page 60: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 60 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

10.3 Pliki elementowe Metody otwarcia:Reset – do czytania i pisaniaRewrite – tylko do pisaniaAppend –NIE JEST DOSTĘPNA, ale w zamian mamy:Seek, FilePos, FileSize.PROGRAM Pliki;USES Crt;Const ESC_Key =#27;TYPE Osoba = RECORD Imie, Nazw : String[15]; Adres : String[50]; Tel : String[10]; END; PlikOsob = FILE OF Osoba;

Function Tworz(Var Plik : PlikOsob):Boolean;VAR Nazwa : String;Begin Twórz:=False; ClrScr; Write('Podaj nazwe pliku i sciezke : '); ReadLn(Nazwa); Assign(Plik, Nazwa); {$I-} Rewrite(Plik); {$I+} if IOResult <> 0 then exit; Twórz:=True End;Function Otworz(Var Plik : PlikOsob):Boolean;VAR Nazwa : String;Begin Otwórz:=False; ClrScr; Write('Podaj nazwe pliku i sciezke : '); ReadLn(Nazwa); Assign(Plik, Nazwa); {$I-} Reset(plik); {$I+} if IOResult <> 0 then exit; Otwórz:=TrueEnd;PROCEDURE CzytajRec(Var x:Osoba);Begin ClrScr;

Page 61: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 61 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Write('Podaj imie : '); ReadLn(x.Imie); Write('Podaj nazwisko : '); ReadLn(x.Nazw); Write('Podaj adres : '); ReadLn(x.Adres); Write('Podaj telefon : '); ReadLn(x.Tel);End;PROCEDURE WypiszRec(Var x:Osoba);Begin Writeln('IMIE : ', x.Imie); Writeln('NAZWISKO : ', x.Nazw); Writeln('ADRES : ', x.Adres); Writeln('TELEFON : ', x.Tel);End;PROCEDURE DopiszDoPliku(Var Plik : PlikOsob;

x:Osoba);Begin Seek(Plik, FileSize(Plik)); Write(Plik, x);End;PROCEDURE Wypisz(Var Plik : PlikOsob);Var x:Osoba;Begin Reset(Plik); While Not Eof(Plik) Do Begin ClrScr; Read(Plik, x);

WypiszRec(x) If ReadKey=ESC_Key then break; End;End;

10.4 Pliki amorficzneSą to pliki binarne o nieokreślonej strukturze. Procedury otwarcia Reset(pilk,wielkosc_jednostki)Rewrite(pilk,wielkosc_jednostki)

Page 62: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 62 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

wielkosc_jednostki (Word) – oznacza wielkość pojedynczegoelementu jaki będzie czytane z pliku; domyślnie 128.procedure BlockRead(var F: File; var Buf; Count:

Word [; var Result:Word]);procedure BlockWrite(var f: File; var Buf; Count:

Word [; var Result:Word]);gdzie: F zmienna plikowa Buf zmienna buforująca dane (Tablica, Wskaźnik) Count ilość elementów do odczytania(zapisania) Result ilość elementów odczytanych (zapisanych);

wynik czytania(pisania) Nie poprawne jest również sprawdzanie końca pliku poprzez EOF- trzebazamiast sprawdzać wartość zmiennej Resultvar FromF, ToF: file; NumRead, NumWritten: Word; Buf: array[1..2048] of Char;begin Assign(FromF, ParamStr(1)); Reset(FromF, 1); Assign(ToF, ParamStr(2)); Rewrite(ToF, 1); Writeln('Copying ', FileSize(FromF),

' bytes...'); repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); Close(FromF); Close(ToF);end.10.5 Funkcje i procedury operujące na plikach

Seek(Plik, n)Procedura Seek ustawia wskaźnik pliku przed składową o numerze n.Plik jest plikiem dowolnego typu z wyjątkiem typu Text, a n jestwyrażeniem typu LongInt. Pierwszy składnik pliku ma numer 0. Seek

Page 63: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 63 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

może być użyte do rozszerzenia pliku, poprzez ustawienie składnikapliku na pierwszy za końcem pliku, tzn. Seek(Plik, FileSize(Plik)).

FileSize(Plik)Funkcja ta zwraca aktualny wymiar pliku. Rezultat jest typu LongInt.Jeżeli Plik jest plikiem pustym, to FileSize(Plik)=0.

FilePos(Plik)Funkcja ta podaje aktualną pozycję wskaźnika pliku. Jeżeli wskaźnikpliku znajduje się na początku pliku, to FilePos(Plik)=0. Jeżeliwskaźnik pliku znajduje się na końcu pliku, FilePos(Plik)=FileSize(Plik). Funkcja FilePos może być użyta tylko wtedy, gdy plik jestotwarty.

Erase(Plik)Procedura ta wymazuje (usuwa) plik związany ze zmienną plikowąPlik. Nie jest dopuszczalne stosowanie Erase w stosunku do otwartegopliku. Plik musi być zamknięty przed użyciem procedury Erase.

Rename(Plik, Nowa_nazwa)Procedura ta zmienia nazwę pliku zewnętrznego związanego zezmienną plikową Plik.

Truncate(Plik)Procedura obcina wszystkie składowe pliku poza aktualnympołożeniem wskaźnika pliku. Aktualne położenie wskaźnika pliku stajesię końcem pliku.

Page 64: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 64 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

11 Biblioteki Turbo Pascala11.1 Moduł CrtModuł CRT zawiera procedury i funkcje obsługi ekranu, dźwięku iklawiatury.Pozwala na definiowanie okien, wybór koloru tekstu i jego tła w przypadkukolorowych kart graficznych, generowanie dźwięku o wybranejczęstotliwości i długości oraz odczytywanie znaków z klawiatury , włączniez jej rozszerzeniami.11.1.1 STALE- stałe trybów tekstowych.

BW40 = 0; czarno-biały karty kolorowej, 40 kolumnCO40 = C40 = 1; kolorowy karty kolorowej, 40 kolumnBW80 = 2; czarno-biały karty kolorowej, 80 kolumnCO80 = C80 = 3; kolorowy karty kolorowej, 80 kolumnMono = 7; czarno-biały karty monochromatycznej, 80 kolumnFont8*8 = 256; kolorowy karty EGA lub VGA, 43 lub 50 wierszy-stałe kolorów. Black = 0; czarnyBlue = 1; niebieskiGreen = 2; zielonyCyan = 3; turkusowyRed = 4; czerwonyMagenta = 5; karmazynowyBrown = 6; brązowyLightGray = 7; jasnoszaryDarkGray = 8; ciemnoszary

LightBlue = 9; jasnoniebieskiLightGreen = 10; jasnozielonyLightCyan = 11; jasnoturkusowyLightRed = 12; jasnoczerwonyLightMagenta = 13; jasnokarmazynowyYellow = 14; żółtyWhite = 15; białyBlink = 128; suma (Blink+kolor) wywołuje

miganie

Page 65: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 65 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

wyróżnionego koloru.11.1.2 ZMIENNE CheckBreak : Boolean - standardowo: True; wartość ta oznacza, że

polecenie Ctrl-Break działa tak, jak w DOSie.CheckEof : Boolean - standardowo: False; wartość funkcji Eof(plik)

jest równa CheckEof dla danego pliku tekstowego plikzwiązanego z CRT (po odczytaniu znaku generowanego przezCtrl-Z)

CheckSnow : Boolean - standardowo: True; wartość ta zabezpieczaekran przed śnieżeniem (ważne dla CGA)

DirectVideo :Boolean - standardowo: TRUESposób wyświetlania znaków na ekranie monitora.

True, bezpośrednie działania procedurCRT;False wykorzystanie procedur z ROM BIOS

LastMode : Word - wartość będąca ostatnim numerem sterownikaekranu, tzn. przed uruchomieniem programu

TextAttr : Byte - wartość oznaczająca atrybut wyświetlanych znakówWinMin : Word - zmienna przechowująca współrzędne lewego

górnego rogu bieżącego okna tekstowego (pierwszy bajt(-y),drugi-x)

WinMin : Word - jw. dla prawego dolnego rogu okna11.1.3 FUNKCJE I PROCEDURY 11.1.3.1 AssignCrt (var plik: Text) procedura Wynik : Skojarzenie pliku tekstowego z urządzeniem CRT (do realizacji

operacji wej/wyj związanych z konsola).11.1.3.2 KeyPressed: Boolean funkcja Wynik : Wartość True, gdy w buforze klawiatury znajduje się nie odczytany

jeszcze znak.Uses crt; begin repeat until keypressed; end. 11.1.3.3 ReadKey: Char funkcja Wynik : Czytanie kolejnego znaku znajdującego się w buforze klawiatury.Uses crt; var kl:char; begin

Page 66: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 66 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

repeat kl:=readkey; unitl kl = chr(27); end. 11.1.3.4 TextMode (tryb: Byte) procedura tryb - stała typu tekstowegoWynik : Zmiana bieżącego trybu tekstowego na nowy tryb

11.1.3.5 Window (x1, y1, x2, y2: Byte) procedura x1, y2 - współrzędne lewego górnego rogu oknax2, y2 - współrzędne prawego dolnego rogu oknaWynik : Zdefiniowanie okna tekstowego o podanych wspolrzadnych lewego

górnego i prawego dolnego rogu okna. Kursor znajdzie się wlewym górnym rogu okna.

11.1.3.6 GotoXY (x, y: Byte) procedura x, y - współrzędne znaku w oknieWynik : Umieszczenie kursora w kolumnie x i wierszu y bieżącego okna

tekstowego. Punkt (1,1) znajduje się w lewym górnym rogu okna.11.1.3.7 Funkcja WhereX: Byte { WhereY} Wynik : Współrzędne x(Y)znaku wskazywanego przez kursor

(bieżąca kolumna).Uses crt; Var pozX,pozY:Byte;begin poz_x:=wherex;poz_y:=wherey); gotoxy(10,10); write('JAREK'); end.11.1.3.8 ClrScr procedura Wynik : Wypełnienie bieżącego okna tekstowego znakami spacji i

umieszczenie kursora w lewym górnym rogu okna.Uses crt; begin clrscr; write('Przykład'); end. 11.1.3.9 ClrEol procedura Wynik : Wypełnienie znakami spacji obszaru miedzy pozycja kursora a

końcem wiersza, w którym się kursor znajduje.

Page 67: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 67 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

11.1.3.10 InsLine procedura Wynik : Wsławienie wiersza wypełnionymi spacjami bezpośrednio pod

wierszem, w którym znajduje się kursor. Wiersz ostatni bieżącegookna tekstowego zostanie usunięty, a wiersze, przed którymipostawiono ten nowy, przesunięte w dol.

11.1.3.11 DelLine procedura Wynik : Usuniecie wiersza , w którym w danej chwili znajduje się kursor.

Wiersze położone poniżej zostaną przesunięte w gore, a ostatniwiersz okna zostanie wypełniony znakami spacji.

11.1.3.12 TextColor (kolor: Byte) procedura kolor - stała koloruWynik : Zmiana kolorów wyprowadzanych znaków (patrz: Stale koloru).Uses crt; begin textcolor(1); writeln('przykład'); end.

11.1.3.13 TextBackground (kolor: Byte) procedura kolor - stała koloruWynik : Zmiana koloru tła. Możliwy jest wybór jednego z ośmiu kolorów

określonych wartościami od 0 do 7.Uses crt; begin textbackground(2); textcolor(0); writeln('Komputer'); end.

11.1.3.14 LowVideo procedura Wynik : Wyprowadzenie tekstu w kolorze ciemnym, odpowiadającym

wcześniejszemu kolorowi jasnemu(numer koloru większy niz. 7).Dzieje się tak na skutek wyzerowania bitu jasności zmiennejTextAttr.

11.1.3.15 HighVideo procedura

Page 68: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 68 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Wynik : Zmiana koloru wyprowadzanego tekstu z ciemnego na odpowiednijasny. Jest to wynikiem ustawienia bitu jasności zmiennej TextAttrw stan 1.

11.1.3.16 NormVideo procedura Wynik : Nadanie bitowi jasności zmiennej TextAttr stanu sprzed pierwszego

wywołania procedury HighVideo lub LowVideo.

11.1.3.17 Delay (ms: Word) procedura ms - liczba milisekundWynik : Wstrzymanie wykonywania programu na czas określony

parametrem ms.Uses crt; begin delay(5000); write('CD'); {wypisanie napisu "CD" po pewnym czasie} end.

11.1.3.18 Sound (Hz: Word) procedura Hz - częstotliwość dźwięku w hercachWynik : Rozpoczęcie generowania dźwięku o częstotliwości zadanej przez

parametr Hz.Uses crt; begin sound(100); delay(300); nosound; end.

11.1.3.19 NoSound procedura Wynik : Wstrzymanie generowania dźwięku.

Page 69: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 69 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

11.2 Moduł System Funkcje arytmetyczne:function Abs(X): (Taki jak typ argumentu);function ArcTan(X: Real): Real;function Cos(X: Real): Real;function Exp(X: Real): Real;function Frac(X: Real): Real;function Int(X: Real): Real;function Ln(X: Real): Real;function Pi: Real;{.1415926535897932385.}function Sin(X: Real): Real;function Sqr(X): (Taki jak typ argumentu);function Sqrt(X: Real): Real;Funkcje dynamicznej alokacji pamięciprocedure Dispose(var P: Pointer [ , Destructor ]);procedure FreeMem(var P: Pointer; Size: Word);procedure GetMem(var P: Pointer; Size: Word);procedure New(var P: Pointer[,Init: Constructor]);function MaxAvail: Longint;function MemAvail: Longint;Funkcje kontrolno-sterujące:procedure Exit;procedure Halt [ ( Exitcode: Word ) ];procedure RunError [ ( Errorcode: Byte ) ];

Funkcje wejscia-wyjściaprocedure Assign(var f; String);procedure ChDir(S: String);procedure Close(var F);function Eof(var F): Boolean;procedure Erase(var F);function FilePos(var F): Longint;function FileSize(var F): Longint; procedure GetDir(D: Byte; var S: String);

where D is set to:0 Default1 Drive A 2 Drive B 3 Drive C …

function IOResult: Integer;

Page 70: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 70 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

procedure MkDir(S: String);procedure Rename(var F; Newname);procedure Reset(var F [: File; Recsize: Word ] );procedure Rewrite(var F: File [; Recsize: Word ] );procedure RmDir(S: String);procedure Seek(var F; N: Longint);procedure Truncate(var F);Funkcje różne:procedure Exclude(var S: set of T;I:T);procedure FillChar(var X; Count: Word; value);function Hi(X): Byte;function High(X)procedure Include(var S: set of T; I:T);function Lo(X): Byte;function Low(X);procedure Move(var Source, Dest; Count: Word);function ParamCount: Word;function ParamStr(Index): String;function Random [ ( Range: Word) ]:

( Taki jak typ argumentu );procedure Randomize;function SizeOf: Integer;function Swap(X): (Taki jak typ argumentu);function UpCase(Ch: Char): Char;Funkcje porządkowe:procedure Dec(var X[ ; N: Longint]);procedure Inc(var X [ ; N: Longint ] );function Odd(X: Longint): Boolean;function Pred(X): (Taki jak typ argumentu);function Succ(X): (Taki jak typ argumentu);Funkcje zwiazane z adresami i wskaźnikami:function Addr(X): pointer;function Assigned(var P): Boolean;function CSeg: Word;function DSeg: Word;function Ofs(X): Word;function Ptr(Seg, Ofs: Word): Pointer;function Seg(X): Word;function SPtr: Word;function SSeg: Word;

Page 71: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 71 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Funkcje napisowe:function Concat(s1 [, s2,..., sn]: String): String;function Copy(S: String; Index: Integer; Count:

Integer): String;procedure Delete(var S: String; Index: Integer;

Count:Integer);procedure Insert(Source: String; var S: String;

Index: Integer);function Length(S: String): Integer;function Pos(Substr: String; S: String): Byte;procedure Str(X [: Width[:Decimals]];var S:string);procedure Val(S; var V; var Code: Integer);Funkcje związane z plikami tekstowymi:procedure Append(var f: Text);function Eoln [(var F: Text) ]: Boolean;procedure Flush(var F: Text);procedure Read(F , V1 [, V2,...,Vn ] );function SeekEof [ (var F: Text) ]: Boolean;function SeekEoln [ (var F: Text) ]: Boolean;procedure SetTextBuf(var F:Text;var Buf[;S:Word]);procedure Write(F, V1 [, V2,...,Vn ] );Funkcje konwersji:function Chr(X: Byte): Char;function Ord(X): Longint;function Round(X: Real): Longint;function Trunc(X: Real): Longint;Funkcje operujące na plikach amorficznych:procedure BlockRead(var F: File; var Buf; Count:

Word [; var Result: Word]);procedure BlockWrite(var f: File; var Buf; Count:

Word [; var Result: Word]);

Page 72: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 72 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

11.3 Moduł Dosconst FCarry = $0001; FParity = $0004; FAuxiliary = $0010; FZero = $0040; FSign = $0080; FOverflow = $0800;

fmClosed = $D7B0; fmInput = $D7B1; fmOutput = $D7B2; fmInOut = $D7B3;

ReadOnly = $01; Hidden = $02; SysFile = $04; VolumeID = $08; Directory = $10; Archive = $20; AnyFile = $3F;TypeComStr = string[127];PathStr = string[79];DirStr = string[67];NameStr = string[8];ExtStr = string[4]; RegistersFileRecTextBufTextRecSearchRecDateTimevarDosError: Integer;

function DosVersion: Word;procedure Intr(IntNo: Byte; var Regs: Registers);

Page 73: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 73 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

procedure MsDos(var Regs: Registers);procedure GetDate(var Year,Month,Day,DayOfWeek:

Word);procedure SetDate(Year,Month,Day: Word);procedure GetTime(var Hour,Minute,Second,Sec100:

Word);procedure SetTime(Hour,Minute,Second,Sec100: Word);procedure GetCBreak(var Break: Boolean);procedure SetCBreak(Break: Boolean);procedure GetVerify(var Verify: Boolean);procedure SetVerify(Verify: Boolean);function DiskFree(Drive: Byte): Longint;function DiskSize(Drive: Byte): Longint;procedure GetFAttr(var F; var Attr: Word);procedure SetFAttr(var F; Attr: Word);procedure GetFTime(var F; var Time: Longint);procedure SetFTime(var F; Time: Longint);procedure FindFirst(Path: PathStr; Attr: Word; var F: SearchRec);procedure FindNext(var F: SearchRec);procedure UnpackTime(P: Longint; var T: DateTime);procedure PackTime(var T: DateTime;var P: Longint);procedure GetIntVec(IntNo:Byte;var Vector:Pointer);procedure SetIntVec(IntNo: Byte; Vector: Pointer);function FSearch(Path: PathStr; DirList: String):

PathStr;function FExpand(Path: PathStr): PathStr;procedure FSplit(Path: PathStr; var Dir: DirStr;

var Name: NameStr; var Ext: ExtStr);function EnvCount: Integer;function EnvStr(Index: Integer): String;function GetEnv(EnvVar: String): String;procedure SwapVectors;procedure Keep(ExitCode: Word);procedure Exec(Path: PathStr; ComLine: ComStr);function DosExitCode: Word;uses Dos,crt;var DirInfo : SearchRec; Ver : Word; S : PathStr;

Page 74: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 74 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

begin FindFirst('*.pas', AnyFile, DirInfo); while DosError = 0 do begin Writeln(DirInfo.Name); FindNext(DirInfo); end; Writeln(DiskSize(0) div 1024, ' Kbytes capacity'); Writeln(DiskFree(0) div 1024, ' Kbytes free '); Ver := DosVersion; Writeln('System DOS :', Lo(Ver), '.',Hi(Ver)); S := FSearch('TURBO.EXE',GetEnv('PATH')); if S = '' then WriteLn('TURBO.EXE not found') else WriteLn('Found as ',FExpand(S));readkey;end.uses Dos,Crt;function LeadingZero(w : Word) : String;var s : String;begin Str(w:0,s); if Length(s) = 1 then s := '0' + s; LeadingZero := s;end; var h, m, s, hund : Word;poz_x,poz_y:byte;begin poz_x:=WhereX; poz_y:=WhereY; repeat GetTime(h,m,s,hund); gotoxy(poz_x,poz_y);Write(LeadingZero(h),':',LeadingZero(m),':',

LeadingZero(s)); until keypressed;end.11.4 Moduł tworzone przez użytkownikaUnit Nazwa;Interface{ Deklaracje publiczne}Implementation{ Deklaracje prywatne I definicje podprogramów}

Page 75: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 75 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Begin { może być pominięty gdy brak} {instrikcje inicjalizacyjne modułu}End. unit test;Interface function Czekaj(znaki:string):Byte;Implementation Uses crt; const KlawiszESC=#27; function czekaj; var z:char; w:byte;Begin {czyszczenie bufora klawiatury} while keypressed do readkey; repeat z:=readkey; if z=KlawiszESC then break; w:=pos(z,znaki); until w>0; Czekaj :=w;End;BEGINEND.Program Test_modulu;uses test;const s:string='TtNn';Begin write('Twoj wybor :',s[czekaj(s)]);End.

Page 76: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 76 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12 Dynamiczne struktury danych12.0.1 Pojęcie wskaźnikaWskaźnik do danych to dynamiczny adres pownego obszaru pamięci.Położenie tego obszaru może być, i bardzo często jest, różne podczaskolejnych uruchomiań programu. Type Pdane=^Dane; Dane =Integer;Var p:PDane; d:Dane;Begin d:=76; p:=@d; writeln(longint(p),' zawiera ',p^); inc(p^); writeln('d zawiera ',d); new(p); p^:=123; writeln(longint(p),' zawiera ',p^); writeln('d zawiera ',d); Dispose(p); End.

Var p:Pointer;Begin d:=76; p:=@d; writeln(longint(p),' zawiera ',PDane( p)^); new(PDane(p)); PDane(p)^:=123; writeln(longint(p),' zawiera ',PDane( p)^); writeln('d zawiera ',d);End.

Page 77: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 77 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12.1 Tablica wskaznikówPstring=^String[80];PTablica=Array [1..N] of PString;PTab=^Ptrablica;Var t:PTab;Język Turbo Pascal nie umożliwia deklaracji tablic w pełni dynamicznych.Powyższe konstrukcje tyklo trochę przyblizają to rozwiązanie. begin new(t); K:=N div 2; For i:=1 TO K DO begin new(T^[i]); str(i,T^[i]^);end;...For i:=1 TO N DO begin if T^[i]^ <>Nil then writeln(T^[i]^) else writeln; end;...end.

Dostp do elementów w takiej tablicy jest zbliżony do zwykłej tablicy. dane tablicy i wskaźniki są przechwywane na stercie – zwiększa to

ilość dostępnej pamięci dla programu Nie wszystkie wiersze muszą zawierać dane – usunięcie wiersza to

zwolnmienie Zakres nie oznacza deklaracji pełnej tablicy 2 wymiarowej

Z góry ograniczona ilość wierszy Utrudniopne dodanie wiersza ( z wyjątkiem końca) Usunięcia mogą powodować powstanie „rzadkich” tablic

Page 78: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 78 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12.2 Stos12.2.1 Struktura stosu

Stos danych w pewnym uproszczeniu można porównać do stosu talerzy nastole. Dostęp mamy tylko do jednego talerza znajdującego się na szczyciestosu. Aby sięgnąć do kolejnych talerzy musimy zdjąć ze stosu te, które sąpołożone wyżej. Element stosu może wyglądać następująco:

PElement=^Element; Element=record Data : Dane; Next : PElement; end;

12.2.212.2.3 Na stos

Procedure na_stos(e:Dane;var top:PElement); var Pom: Pelement;begin pom:=Top; New(Top); top^.next:=pom; Top^.Data:=e;end;

Page 79: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 79 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12.2.4 Ze stosufunction ze_stosu(var e:Dane;var top:PElement):

boolean; var Pom: Pelement;begin if (top<>nil)then begin ze_stosu:=True; e:=Top^.Data; Pom:=Top; Top:=Top^.next; Dispose(Pom); end else ze_stosu:=False;end;var i : Dane; s,x : PElement;BEGINs:=nil;for i:=1 to 10 do begin na_stos(i,s); write(s^.Data:4); end; writeln; while (Ze_stosu(i,s)) do write(i:4)END.

12.2.5 Zastosowanie stosu Odwracanie ciągu elementów Zamiana wyrażenia na notację polską Obliczenia wartości wyrażeń w notacji polskiej

Page 80: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 80 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12.3 Listy 1 i 2 kierunkowe12.3.1 Struktura listy 1 kierunkowej

Struktura danych listy jednokierunkowej jest tożsama ze strukturą stosu. Tutakże mamy powiązane za pomocą jednego wskaźnika dane.

Plista=^Lista; Lista= record d : Dane; next : Plista; end;Lista od stosu będzie odróżniać sposobem dostępu do danych. Zamiast

prostych procedur operujących na pierwszym elemencie, jak tobyło we wcześniejszym przypadku, będziemy mieli pełna kontrolęnad poszczególnymi częściami składowymi listy. Niestety te dużowiększe możliwości stawiają przed programistą dużo większewymagania. Trzeba pamiętać, że operacje na liście wiążą się zbezpośrednim dostępem do pamięci komputera. Dobrze jest więc iw tym przypadku ograniczyć się do operowania na elementachlisty za pośrednictwem odpowiednich procedur. Łatwiej przecieżdokładnie przeanalizować krótki kod źródłowy a następnie zniego umiejętnie korzystać.

12.3.2 Podstawowe operacje na liście12.3.2.1 Dodanie elementu procedure dolisty(var p,k:Plista;d:dane);var pom:Plista;Begin new(pom); pom^.d:=d; pom^.next:=nil; if k<>nil then k^.next:=pom else p:=pom; k:=pom;end;12.3.2.2 Wykonanie operacji na każdym elemancie listy

Page 81: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 81 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

procedure PiszWszystko(p:Plista);Begin Writeln; while(p<>Nil)do begin write(p^.D:3); P:=P^.Next; end;Bardziej uniwersalny sposób:

Type ProcDane=Procedure(x:Dane);procedure piszDane(x:Dane);far;begin write(x:4)end;

procedure DlaKazdego(p:Plista;proc:ProcDane);Begin Writeln; while(p<>Nil)do begin proc(p^.D); P:=P^.Next; end;End;

Wywołanie procedurydlaKazdego(p,PiszDane);

12.3.2.3 Szukanie elementu na liście Funkcja szukająca elementu na liście powinna zwracać jako wynik wskaźnik

na element, jeśli istnieje, bądź nil w przeciwnym przypadku. Wprzypadku listy 1 kierunkowej można pokusić się o zwracaniepoprzedniego wskaźnika na liście – użyteczne zarówno przydodawaniu jak i usuwaniu.

function Find(el:Dane;pocz:Plista;var B:PLista):PLista;

Page 82: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 82 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

begin if pocz^.d=el then begin B:=Nil; find:=pocz; end else begin while (pocz^.next<>nil)and

(pocz^.Next^.d<>el) do pocz:=pocz^.Next; B:=pocz; Find:=pocz^.Next; endend;12.3.2.4 Usunięcie elementu procedure usun(var p:PLista;el:dane);var b,Lpom:Plista;begin if p<>nil then begin Lpom:=find(el,p,b); if B =nil then {usunąć pierwszy element} begin P:=P^.Next; Dispose(Lpom); end else if Lpom <>nil then begin b^.next:=Lpom^.next; Dispose(Lpom); end else writeln('Element nie należy do listy'); end else writeln('Lista jest pusta');end;

Page 83: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 83 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12.3.2.5 Odwracanie listy function Odwroc(var pocz:Plista):Plista; var lPtr,Lpom:PLista; { Odwraca listę }begin { bez tworzenia nowych elementów } lPtr:=pocz; pocz:=nil; while lPtr <> nil do begin lPom:=lPtr^.Next; lPtr^.Next:=pocz; pocz:=lPtr; lPtr:=lPom; end; Odwroc:=pocz;end;12.3.2.6 Zmiana kolejności danych, sortowanie listy W powyższym przykładzie zastosowano dodawanie na koniec listy. Równie

łatwo można napisać procedurę, która już na etapie tworzenialisty ją posortuje. Duże podobieństwo listy do tablicyumożliwia implementacje niektórych algorytmów sortowaniatablic również dla listy. Zamianę elementów na liście możnazrealizować dwojako: poprzez zamianę danych-jak to było wtablicach, bądź dużo lepiej poprzez zamianę wskaźników.

procedure zamiana(var pocz, p1,p2:Plista); var pop1,pop2,pom:Plista;begin pop1:=Nil; pop2:=Nil; if p1 <>Nil then Find(p1^.D,pocz,pop1) else exit; if p2<>NIl then Find(p2^.D,pocz,pop2) else exit; if pop1=Nil then {czyli p1 = pocz} pocz:=p2 else pop1^.Next:=p2; if p1 = Pocz then {p2 = pocz} pocz:=p2 else pop2^.Next:=p1; pom:=p2^.Next; p2^.Next:=p1^.Next; p1^.Next:=pom;end;

Page 84: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 84 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12.3.3 Struktura listy 2 kierunkowejLista dwukierunkowa to tak jakby dwie listy jednokierunkowe, gdzie dane są

wspólne. W poprzedniej liście łatwe było poruszanie się poelementach listy tylko w jednym kierunku. Aby dostać się doelementy poprzedzającego bieżący trzeba przeglądać całą listę odpoczątku. Tej niedogodności tu już nie będzie.

lista2=^skladnik_listy2;skladnik_listy2 =record wsk1:lista2;{wiersz

porzedni } s:Wiersz; wsk2:lista2;{następny} end;12.3.4 Dodawanie do listyprocedure do_listy2(var element:Wiersz;var

pocz,kon:lista2);var pop_skl,nas_skl:lista2; podstaw:boolean;beginif kon<>nil thenbegin

podstaw:=false;pop_skl:=kon;nas_skl:=kon^.wsk2; end

elsebegin podstaw:=true;pop_skl:=nil;nas_skl:=nil end; new(kon); with kon^ do begin wsk1:=pop_skl; s:=element; wsk2:=nas_skl; end;if pop_skl<>nil then pop_skl^.wsk2:=kon;if nas_skl<>nil then nas_skl^.wsk1:=kon;if podstaw then pocz:=kon;end;

Page 85: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 85 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Function szukaj(w:wiersz;p:Lista2):Lista2;Beginwhile p<>nil do begin if p^.s=w then break; p:= p^.wsk2;end;szukaj:=p;End;Procedure Usun(w:Wiersz;var p,k:Lista2);var ew:Lista2;Beginew:=szukaj(w,p);if ew=nil then exit; if ew=p then p:=p^.wsk2 else ew^.wsk1^.wsk2:=ew^.wsk2; if ew=k then k:=k^.wsk1 else ew^.wsk2^.wsk1:=ew^.wsk1;Dispose(ew);End;procedure Zamien(x,y:Wiersz;var p,k:Lista2);var xw,yw,x2,x1,y2,y1:Lista2;Beginxw:=szukaj(x,p); if xw=Nil then exit;yw:=szukaj(y,p); if yw=Nil then exit;x1:=xw^.wsk1; x2:=xw^.wsk2;y1:=yw^.wsk1; y2:=yw^.wsk2;{-->}if x1=Nil then p:=yw else x1^.wsk2:=yw;yw^.wsk2:=x2;if y1=Nil then p:=xw else y1^.wsk2:=xw;xw^.wsk2:=y2;{<--}if y2=Nil then k:=xw else y2^.wsk1:=xw;xw^.wsk1:=y1;if x2=Nil then k:=yw else x2^.wsk1:=yw;yw^.wsk1:=x1;end;

Page 86: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 86 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12.3.5 Zastosowanie listListy mają podobne zastosowania, jak tablice. W odróżnieniu od tablic nie

jesteśmy tu ograniczeni jakąś z góry narzuconą maksymalnąilością elementów. Tych elementów może być zarówno kilka jak ikilkaset. Oczywiście ograniczeniem jest tu dostępna pomięćoperacyjna.

Page 87: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 87 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12.4 Drzewa binarneInna strukturą rekurencyjną są drzewa. Najciekawszą wersją jest drzewo

binarne uporządkowane. Mogą one być bardzo użyteczne przytworzeniu struktur słownikowych. Poszukiwanie danych może byćtu dużo prostrze niż na zwykłej liście.

Terminologia zaczerpmięta z biologi : Drzewo, Korzeń, gałąź, liście ,poddrzewo.

Ze względu na wyróżnienie oddrzew najbardziej natyralną metodąpostepowania z drzewami jest rekurencja.

12.4.1 Strukrura danychTyp danych właściwie ten sam co i w liscie 2 kierunkowej.PDrzewo=^Drzewo; drzewo=record L,P : PDrzewo; D : Dane; end;

1 32 5 76 8

1 3

2

5

7

6 8

Page 88: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 88 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12.4.2 Tworzenie Drzewa Dowdanie nowego elementu do drzewa.

procedure dodaj (var d:Pdrzewo;x:dane);begin if d = Nil then { miejsce dodania} begin new(d); d^.L:=Nil; d^.P:=Nil; d^.D:=x; end else if d^.D > x then dodaj(d^.L,x) else dodaj(d^.P,x);end;procedure pisz(d:PDrzewo;poz:byte);begin if D<>Nil then begin pisz(d^.L,poz+1); writeln(d^.D:poz); pisz(d^.P,poz+1) endend;

4

1 3

2

5

7

6 8

Page 89: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 89 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12.4.3 Szukanie elementu

function szukaj(d:PDrzewo;x:Dane):PDrzewo;Beginif d = nil then begin write('(Brak) ',x); Szukaj:=Nil endelse if d^.D = x then begin write(d^.D,' (Znaleziony)'); szukaj:=D; end else if d^.D > x then begin write(D^.D,'->'); szukaj:=szukaj(D^.L,x); end else{ d^.D < x } begin write(D^.D,'->'); szukaj:=szukaj(D^.P,x); endend;

Page 90: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 90 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12.4.4 Usuniecie liścia i węzła

procedure usun(var D:PDrzewo;x:Dane);var S,nk,pnk:PDrzewo;beginif d = Nil then exit;if d^.d < x then usun(d^.P,x)else if d^.d > x then usun(d^.L,x)else {d^.d = x}begin s:=d; if d^.P = nil then d:=d^.L else if d^.L = nil then d:=d^.P else{ obie gałęzie są niepuste} begin nk:=D^.L;pnk:=D; while(nk^.P<>Nil) do begin pnk:=nk; nk:=nk^.P; end; if pnk<>D then begin pnk^.P:=nk^.L; nk^.L:=D^.L; end; nk^.P:=D^.P; d:=nk; end; Dispose(s); end;end;

4

1 3

2

5

7

6 8

Page 91: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 91 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12.4.5 Równoważenie Drzewa

Procedure balance(var d:PDrzewo);var ileP,ileL:Integer;Beginif d = Nil then exit; ileP:=Ilosc(D^.P);IleL:=Ilosc(D^.L); Repeat if ileP-ileL>1 then begin dec(ileP);inc(ileL); zPrawoNaLewo(d); end else if ileL-ileP>1 then begin dec(ileL);inc(ileP); ZlewoNaPrawo(d); end else Break;Until False;Balance(D^.L);Balance(d^.P);End;

Function Ilosc(d:PDrzewo):Word;Begin

4

1 3

2

5

7

6

8

Page 92: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 92 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

if d = nil then Ilosc:=0 else Ilosc:=Ilosc(d^.L)+Ilosc(d^.P)+1;end;procedure ZlewoNaPrawo(var d:PDrzewo);var L,pl:PDrzewo;begin if d=Nil then exit; L:=D^.L;pl:=D; while L^.P<>nil do begin pl:=L;L:=L^.P; end; if pl<>D then begin pl^.P:=L^.L; L^.L:=D^.L; end; L^.P:=D; D^.L:=Nil; D:=L;end;procedure ZPrawoNaLewo(var d:PDrzewo);var P,pp:PDrzewo;begin if d=Nil then exit; P:=D^.P;pp:=D; while P^.L<>nil do begin pp:=P;P:=P^.L; end; if pp<>D then begin pp^.L:=P^.P; P^.P:=D^.P; end; P^.L:=D; D^.P:=Nil; D:=P;end;

Page 93: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 93 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

13 Grafika w Turbo Pascalu13.1 Programowanie w trybie graficznym Tryb tekstowy a tryb graficznyTryb tekstowy (znakowy):80 kolumn 25 wierszy (40x25, 80x40, 80x50, 160x50)Tryb graficzny (piksel)

640x480(standard VGA) przy 16 Kolorach 320x200, 800x600, 1024x768,1200x1024, 1600x1200

Ilość kolorów: 16(4 b), 256(8 b), 65 536(16Kb) , 16 777 216(24Mb), 42 949 672 96(32Mb)

13.1.1 Wprowadzenie do pracy w trybie graficznymProgram garficzny;Uses Graph,Crt;const PathToDriver:String='C:\Programy\TP7\BGI';

function TrybGraficzny:boolean;var dr,tryb:Integer;begin dr:=Detect; InitGraph(dr,tryb,PathToDriver); TrybGraficzny:=GraphResult=GrOK;end;

dr:=9; tryb:=2; {640x480x16}

Page 94: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 94 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Function InitVesa:Boolean; var VESA16 : Integer; tryb:Integer;begin Tryb:=0; VESA16 := InstallUserDriver('VESA16', Nil); InitGraph(Vesa16,Tryb,PathToDriver); InitVesa:=GraphResult=GrOK;end;function TrybGraficzny:boolean;var dr,tryb:Integer;beginif initvesa then TrybGraficzny:=Trueelsebegin dr:=Detect; { dr:=9; tryb:=2;} InitGraph(dr,tryb,PathToDriver); TrybGraficzny:=GraphResult=GrOK; end;end;function Int2Str(x:Integer):String;var s:string;Begin Str(x,s); Int2Str:=s;end;BEGIN if not trybGraficzny then exit; Rectangle(0,0,GetmaxX,GetMaxY); moveto(getmaxx div 2,getmaxy div 2); SetTextJustify(CenterText, CenterText);

OutText(Int2Str(getmaxX+1)+'x'+Int2Str(getmaxY+1)+ 'x'+Int2Str(getmaxColor+1));PutPixel(10,10,Yellow);SetAspectRatio(getmaxy, getmaxx);Circle(getmaxx div 2,getmaxy div 2,getmaxx div 2);

Readkey; closeGraph;END.

Page 95: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 95 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

13.2 Narzędzia graficzne w Turbo Pascalu13.2.1 Moduł GraphProcedury i funkcje modułu GRAPH

P. Arc (X,Y; Integer; StAngle, EndAngle, Radius; Word); *P. Bar(x1, y1, x2, y2: Integer); *P. Bar3D(x1, y1, x2, y2: Integer; Depth: Word; Top: Boolean); *P. Circle(X,Y: Integer; Radius: Word); *P. ClearDevice; *P. ClearViewPort; *P. CloseGraph; *P. DetectGraph(var GraphDriver, GraphMode: Integer); *P. DrawPoly(NumPoints: Word; var PolyPoints); *P. Ellipse(X, Y: Integer; StAngle, EndAngle: Word; XRadius, YRadius:Word); *P. FillEllipse(X, Y: Integer; XRadius, YRadius: Word) *P. FillPoly(NumPoints: Word; var PolyPoints); *P. FloodFill(X, Y: Integer; Border: Word); *P. GetArcCoords(var ArcCoords: _ArcCoordsType_);P. GetAspectRatio(var Xasp, Yasp: Word);F. GetBkColor: Word; *F. GetColor: Word; *F. GetDefaultPalette(var Palette: PaletteType);F. GetDriverName: string; *P. GetFillPattern(var FillPattern: FillPatternType); *P. GetFillSettings(var FillInfo: FillSettingsType); *F. GetGraphMode: Integer; *P. GetImage(x1, y1, x2, y2: Integer; var BitMap);P. GetLineSettings(var LineInfo: LineSettingsType); *F. GetMaxColor: Word; *F. GetMaxMode: Integer; *F. GetMaxX: Integer; *F. GetMaxY: Integer; *F. GetModeName(ModeNumber: Integer): string; *P. GetModeRange(GraphDriver:Integer; var LoMode, HiMode:Integer);P. GetPalette(var Palette: PaletteType);F. GetPaletteSize: Integer;F. GetPixel(X,Y: Integer): Word; *P. GetTextSettings(var TextInfo: TextSettingsType); *P. GetViewSettings(var ViewPort: ViewPortType);F. GetX: Integer; *F. GetY: Integer; *P. GraphDefaults;F. GraphErrorMsg(ErrorCode: Integer): string;F. GraphResult: Integer; *F. ImageSize(x1, y1, x2, y2: Integer): Word;P. InitGraph(var GraphDriver:Integer; var GraphMode: Integer; PathToDriver: string); *F. InstallUserDriver(Name: string; AutoDetectPtr: pointer): integer;F. InstallUserFont(FontFileName: string ): Integer;P. Line(x1, y1, x2, y2: Integer); *

Page 96: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 96 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

P. LineRel(Dx, Dy: Integer); *P. LineTo(X, Y: Integer); *P. MoveRel(Dx, Dy: Integer); *P. MoveTo(X, Y: Integer); *P. OutText(TextString: string); *P. OutTextXY(X,Y: Integer; TextString: string); *P. PieSlice(X, Y: Integer; StAngle, EndAngle, Radius: Word); *P. PutImage(X, Y: Integer; var BitMap; BitBlt: Word);P. PutPixel(X, Y: Integer; Pixel: Word); *P. Rectangle(x1, y1, x2, y2: Integer); *F. RegisterBGIdriver(driver: pointer): Integer;F. RegisterBGIfont(Font: pointer): Integer;P. RestoreCrtMode; *P. Sector(x, y: Integer; StAngle,EndAngle, XRadius, YRadius: Word);P. SetActivePage(Page: Word); *P. SetAllPalette(var Palette);F. SetAspectRatio(Xasp, Yasp: Word): Word;P. SetBkColor(ColorNum: Word); *P. SetColor(Color: Word); *P. SetFillPattern(Pattern: FillPatternType; Color: Word); *P. SetFillStyle(Pattern: Word; Color: Word); *P. SetGraphBufSize(BufSize: Word);P. SetGraphMode(Mode: Integer);P. SetLineStyle(LineStyle: Word; Pattern: Word; Thickness: Word); *P. SetPalette(ColorNum: Word; Color: Shortint);P. SetRGBPalette(ColorNum, RedValue, GreenValue, BlueValue:Integer);P. SetRGBPalette(ColorNum, RedValue, GreenValue, BlueValue:Integer);P. SetTextJustify(Horiz, Vert: Word); *P. SetTextStyle(Font, Direction: Word; CharSize: Word); *P. SetUserCharSize(MultX, DivX, MultY, DivY: Word);P. SetViewPort(x1, y1, x2, y2: Integer; Clip: Boolean); *P. SetVisualPage(Page: Word); *P. SetWriteMode(WriteMode: Integer); *F. TextHeight(TextString: string): Word; *F. TextWidth(TextString: string): Word; *

Page 97: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 97 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

13.2.1.1 Stałe i typy zdefiniowane w modułe GRAPH

Constants :

Bar3D Constants: TopOn True TopOff False

Clipping Constants: ClipOn True ClipOff False

BitBlt Operators: Constant | Value| Meaning --------------------------------------- NormalPut | 0 | MOV CopyPut | 0 | MOV XORPut | 1 | XOR OrPut | 2 | OR AndPut | 3 | AND NotPut | 4 | NOT

Color Constants:Dark Colors:(Foreground & Background) Black 0 Blue 1 Green 2 Cyan 3 Red 4 Magenta 5 Brown 6 LightGray 7 Light Colors:(Foreground)DarkGray 8 LightBlue 9 LightGreen 10 LightCyan 11 LightRed 12 LightMagenta 13 Yellow 14 White 15

For flashing (blinking) text foreground, Blink= 128.

Colors for the 8514:

Dark Colors: EGABlack 0 EGABlue 1 EGAGreen 2 EGACyan 3 EGARed 4 EGAMagenta 5 EGABrown 20 EGALightgray 7

Light Colors : EGADarkgray 56 EGALightblue 57 EGALightgreen 58 EGALightcyan 59 EGALightred 60 EGALightmagenta 61 EGAYellow 62 EGAWhite 63

Fill Pattern Constants Constant | Value| Meaning ------------------------------------------------- EmptyFill | 0 | Uses background color

SolidFill | 1 | Uses draw color LineFill | 2 | --- fill LtSlashFill | 3 | /// fill SlashFill | 4 | /// thick fill

Page 98: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 98 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

BkSlashFill | 5 | \thick fill LtBkSlashFill | 6 | \fill HatchFill | 7 | Light hatch fill XHatchFill | 8 | Heavy cross hatch InterleaveFill | 9 | Interleaving line WideDotFill | 10 | Widely spaced dot CloseDotFill | 11 | Closely spaced dot UserFill | 12 | User-defined fill

Graphics Drivers Constant | Value/Comment --------------ì------------------------ CurrentDriver | -128/For GetModeRange Detect | 0/Requests autodetection CGA | 1 MCGA | 2 EGA | 3 EGA64 | 4 EGAMono | 5 IBM8514 | 6 HercMono | 7 ATT400 | 8 VGA | 9 PC3270 | 10

Graphics Modes for Each DriverConstant | Value | Meaning Constant | Value | Meaning-----------ì-------ì----------- -----------ì-------ì------------CGAC0 | 0 |320 x 200 EGALo | 0 | 640 x 200CGAC | 1 | 320 x 200 EGAHi | 1 | 640 x 350CGAC2 | 2 | 320 x 200 | |CGAC3 | 3 | 320 x 200 EGA64Lo | 0 | 640 x 200CGAHi | 4 | 640 x 200 EGA64Hi | 1 | 640 x 350 | | | |MCGAC0 | 0 | 320 x 200 ATT400C0 | 0 | 320 x 200MCGAC1 | 1 | 320 x 200 ATT400C1 | 1 | 320 x 200MCGAC2 | 2 | 320 x 200 ATT400C2 | 2 | 320 x 200MCGAC3 | 3 | 320 x 200 ATT400C3 | 3 | 320 x 200MCGAMed | 4 | 640 x 200 ATT400Med | 4 | 640 x 200MCGAHi | 5 | 640 x 480 ATT400Hi | 5 | 640 x 400 | | | |EGAMonoHi | 3 | 640 x 350 IBM8514Lo | 0 | 640 x 480HercMonoHi | 0 | 720 x 348 IBM8514Hi | 1 |1024x768 | | | |VGALo | 0 | 640 x 200 PC3270Hi | 0 | 720 x 350VGAMed | 1 | 640 x 350 VGAHi | 2 | 640 x 480

Justification ConstantsHorizontal Constant | Value-------------------------- LeftText | 0 CenterText | 1 RightText | 2

Vertical Constant | Value------------------------------- BottomText | 0 CenterText | 1 TopText | 2

Line-Style and Width ConstantsLine Styles: SolidLn 0 DottedLn 1 CenterLn 2 DashedLn 3 UserBitLn 4 (User-defined line style)

Line Widths: NormWidth 1 ThickWidth 3

Text-Style ConstantsConstant |Value| Meaning--------------ì-------ì-------------------DefaultFont | 0 | 8x8 bit mapped fontTriplexFont | 1 | Stroked fontSmallFont | 2 | Stroked fontSansSerifFont | 3 | Stroked fontGothicFont | 4 | Stroked fontHorizDir | 0 | Orient left to rightVertDir | 1 | Orient bottom to topUserCharSize | 0 | User-defined character size

13.2.1.2 Types : ArcCoordsTypeFillPatternTypeFillSettingsTypeGraphics Memory PointersLineSettingsTypePaletteTypePointType

TextSettingsTypeViewPort

Page 99: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 99 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

procedure StatusLine(Msg : string);var TH:word;beginTH:= TextHeight('M'); SetViewPort(0, 0, MaxX, MaxY, ClipOn); SetColor(MaxColor); SetTextStyle(DefaultFont, HorizDir, 1); SetTextJustify(CenterText, TopText); SetLineStyle(SolidLn, 0, NormWidth); SetFillStyle(EmptyFill, 0); Bar(0, MaxY-( TH+4), MaxX, MaxY); Rectangle(0, MaxY-( TH+4), MaxX, MaxY); OutTextXY(MaxX div 2, MaxY-(TextHeight('M')+2), Msg); SetViewPort(1, TH+5, MaxX-1, MaxY-TH+5),ClipOn);end; { StatusLine }procedure ReportStatus;var ViewInfo : ViewPortType; LineInfo : LineSettingsType; FillInfo : FillSettingsType; TextInfo : TextSettingsType; Palette : PaletteType; DriverStr , ModeStr : string;begin DriveRStr := GetDriverName; ModeStr := GetModeName(GetGraphMode); GetViewSettings(ViewInfo); GetLineSettings(LineInfo); GetFillSettings(FillInfo); GetTextSettings(TextInfo); GetPalette(Palette); MainWindow('Informacje '); moveto(10,10); SetTextJustify(LeftText, TopText); WriteOut('Graphics device : '+DriverStr); WriteOut('Graphics mode : '+ModeStr); WriteOut('Screen resolution : (0, 0, ‘ Int2Str(GetMaxX)+', '+Int2Str(GetMaxY)+')'); with ViewInfo do begin WriteOut('Current view port : (' Int2Str(x1)+','+Int2Str(y1)+', '+Int2Str(x2)+', ' Int2Str(y2)+')'); if ClipOn then WriteOut('Clipping : ON') else WriteOut('Clipping : OFF'); end; WriteOut('Current position : ('+Int2Str(GetX)+','+Int2Str(GetY)+')'); WriteOut('Palette entries : '+Int2Str(Palette.Size));

WriteOut('GetMaxColor : '+Int2Str(GetMaxColor)); WriteOut('Current color : '+Int2Str(GetColor)); WaitToGo;end; { ReportStatus }procedure WriteOut(S : string);var x:integer;begin x:=Getx; OutText( S); Moveto(x,GetY+ TextHeight('M')+2);end; { WriteOut }procedure WaitToGo;const Esc = #27; var Ch : char;begin Ch := ReadKey; if ch = #0 then ch := readkey; if Ch = Esc then Halt(0) else ClearDevice;end; { WaitToGo }function Int2Str(L : LongInt) : string;var S : string;begin Str(L, S); Int2Str := S;end; { Int2Str }procedure DrawBorder;var ViewPort : ViewPortType;begin SetColor(MaxColor); SetLineStyle(SolidLn, 0, NormWidth); GetViewSettings(ViewPort); with ViewPort do Rectangle(0, 0, x2-x1, y2-y1);end; { DrawBorder }procedure MainWindow(Header : string);begin SetColor(MaxColor); ClearDevice; SetTextStyle(DefaultFont, HorizDir, 1); SetTextJustify(CenterText, TopText); SetViewPort(0, 0, MaxX, MaxY, ClipOn); OutTextXY(MaxX div 2, 2, Header); SetViewPort(0, TextHeight('M')+4, MaxX,MaxY-(TextHeight('M')+4), ClipOn); DrawBorder; SetViewPort(1, TextHeight('M')+5, MaxX-1,MaxY-(TextHeight('M')+5), ClipOn);end; { MainWindow }Procedure DemoPutPixel;Begin MainWindow('PutPixel');

Page 100: Skrypt wykładów z Podstaw Programowaniafizyka.umk.pl/~rjakubowski/zps/wyklady.pdf · 10.1Podstawowe operacje na plikach 10.2Pliki tekstowe 10.2.1Plik tekstowy a plik file of char

Języki programowania -Pascal Strona 100 ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

repeat PutPixel(random(GetMaxx),Random(GetMaxY),Random(getMaxColor)); until keypressed; waittogo;end;Procedure DemoLines;var x1,x2,y1,y2:Word;Begin MainWindow('Linie'); repeat x1:=random(GetmaxX); x2:=random(GetmaxX); y1:=random(GetmaxY); y2:=random(GetmaxY); setcolor(Yellow); Rectangle(x1,y1,x2,y2); setcolor(White); delay(100); Line(x1,y1,x1,y2); Line(x1,y2,x2,y2); Line(x2,y2,x2,y1); Line(x2,y1,x1,y1); SetColor(Blue); delay(100); MoveTo(x1,y1); Lineto(x1,y2); Lineto(x2,y2); { Lineto(x2,y1);} Lineto(x1,y1); SetColor(Red); delay(100); MoveTo(x1,y1); {LineRel(0,y2-y1); LineRel(x2-x1,0);} LineRel(x2-x1,y2-y1); LineRel(0,y1-y2); LineRel(x1-x2,0); until keypressed; waittogo;end;Procedure wieleokaty;const MaxPts = 5;type PolygonType = array[1..MaxPts] of PointType;var Poly : PolygonType; I, Color : word;begin MainWindow('Wilokaty'); repeat Color := Random(GetmaxColor)+1; SetFillStyle(Random(11)+1, Color); SetColor(Color); for I := 1 to MaxPts do with Poly[I] do begin X := Random(MaxX); Y := Random(MaxY); end; FillPoly(MaxPts, Poly); until KeyPressed; WaitToGo;end; {Wieloaty }procedure DrawBox(X, Y,W,H : word);

begin Bar(X, Y, X+W, Y+H); Rectangle(X, Y, X+W, Y+H);end; { DrawBox }Procedure DrawFigura(X, Y,W,H : word);begin Arc(x+W div 2,y+H div 2,0,180,W div 2); Moveto(x ,y+w div 2); Lineto(x,y+H); LineTo(x+W,y+H); LineTo(x+w,y+w div 2); FloodFill(x+W div 2,y+H div 2,GetColor);end;procedure FillStylePlay;var S,W,H,X,Y,I,J : word; ViewInfo : ViewPortType;begin MainWindow('Pre-defined fill styles'); GetViewSettings(ViewInfo); with ViewInfo do begin W:= 2 * ((x2+1) div 13); H := 2 * ((y2-10) div 10); end; X := W div 2; Y := H div 2; S := 0; for J := 1 to 3 do begin for I := 1 to 4 do begin SetColor(Random(GetMaxColor)+1); SetFillStyle(S,Getcolor+1); if s mod 2 = 0 then DrawBox(X, Y,W,H) else DrawFigura(X, Y,W,H); OutTextXY(X+(W div 2), Y+H+4, Int2Str(S)); Inc(S); Inc(X, (W div 2) * 3); end; X := W div 2; Inc(Y, (H div 2) * 3); end; SetTextJustify(LeftText, TopText); WaitToGo;end; { FillStylePlay }