Programowanie w języku Pascal Dr inż. Grażyna KRUPIŃSKA grazyna@novell.ftj.agh.edu.pl D-10 pokój 227
Tablice -wstęp Służą do przechowywania ustalonej liczby elementów (liczb całkowitych, rzeczywistych lub znaków) tego samego typu. tablica posiada nazwę każde pole tablicy posiada numer (indeks) nazwa nr pola liczby 1 1 2 3 5 8 13 21 34 55 1 2 3 4 5 6 7 8 9 10 Dostęp do każdego elementu tablicy uzyskujemy poprzez nazwę (tablicy) i numer Przykład odwołanie się do elementu tablicy: liczby[2]=1 liczby[6]=8 2011-10-22 Programowanie w języku Pascal 2
Tablice -deklaracje deklaracja klasyczna definicja 10 elementowej tablicy liczb całkowitych o nazwie liczby liczby:array[1..10] of integer; nazwa rozmiar typ elementów Rozmiar tablicy musi być stałą liczbą całkowitą 2011-10-22 Programowanie w języku Pascal 3
Tablice-deklaracje Można również zdefiniować tablicę o określonym rozmiarze jako nowy typ danych, a następnie zadeklarować zmienną tego typu program przykład; type tablica=array[1..10] of integer; liczby:tablica;... definicja typu danych tablica deklaracja zmiennej typu tablica 2011-10-22 Programowanie w języku Pascal 4
Tablice -odwołania do elementów Nadawanie wartości: poprzez wczytanie z klawiatury: read (liczby[i]); poprzez instrukcję przypisania : liczby[i]:=wyrażenie; Przypisywanie wartości całej tablicy wykonujemy nadając wartość każdemu elementowi z osobna Lub For i:=1 to 10 do liczby[i]:=wyrażenie; For i:=1 to 10 do readln (liczby[i]); 2011-10-22 5
Tablice -odwołania do elementów Wyprowadzanie wartości elementów tablicy również każdy element osobno For i:=1 to 10 do write (liczby[i]); 2011-10-22 Programowanie w języku Pascal 6
Łańcuchy Służą do przechowywania ciągu znaków (w tym spacji). Łańcuchy mogą mieć do 255 znaków. deklaracja zmiennej łańcuchowej: nazwa:string[liczba znaków]; - gdy brak liczby znaków Pascal przyjmie 255 Przykład deklaracja 30 znakowego łańcucha o nazwie wyraz wyraz:string[30]; 2011-10-22 Programowanie w języku Pascal 7
Łańcuchy Łańcuchy możemy traktować jak tablice znaków - jeżeli wyraz= parowóz to wyraz[1]= p wyraz[4]= o Wprowadzanie zawartości łańcucha Przez wczytanie z klawiatury readln(wyraz); Instrukcja przypisania wyraz:= parowóz tekst musi być ujęty w pojedyncze apostrofy 2011-10-22 Programowanie w języku Pascal 8
Łańcuchy -funkcje i procedury length(łańcuch) określenie długości łańcucha (liczba znaków) Length( parowóz )=7 pos(podłańcuch, łańcuch) określenie pozycji od której zaczyna się podłańcuch pos( men, dokumentacja )=5 concat(łańcuch1,łańcuch2,...) połączenie kilku łańcuchów w jeden copy(łańcuch,indeks,licznik) skopiowanie z łańcucha licznik znaków począwszy od indeks copy( dyrygent,5,3) oznacza gen 2011-10-22 Programowanie w języku Pascal 9
Łańcuchy -funkcje i procedury delete(łańcuch,indeks,licznik) usunięcie z łańcucha licznik znaków począwszy od indeks np. delete( telefon,1,4) da w wyniku fon insert(podłańcuch,łańcuch,indeks)wstawienie podłańcucha do łańcucha na określonym przez indeks miejscu insert( promujemy, gra,4) da w wyniku programujemy Zamiana liczba - łańcuch Val(łańcuch,liczba,kod)- zamiana łańcucha na liczbę(kod<>0 oznacza błąd) Str(liczba,łańcuch) zamiana liczby na łańcuch 2011-10-22 Programowanie w języku Pascal 10
Tablice dwuwymiarowe Służą do przechowywania ustalonej liczby elementów (liczb całkowitych, rzeczywistych lub znaków) tego samego typu. 1 7 2 13 5 8 3 21 89 55 wiersze 10 1 6 31 7 0 32 51 34 28 88 0 14 3 111 5 714 29 38 51 44 15 7 22 58 87 13 33 59 8 kolumny każde pole posiada dwa indeksy odwołanie do elementu tablicy wygląda tak: nazwa[wiersz, kolumna] tablica[1,3]=2 tablica[2,1]=10 tablica[4,10]=8 2011-10-22 Programowanie w języku Pascal 11
Tablice dwuwymiarowe deklaracja klasyczna tablica liczb całkowitych złożona z 4 wierszy i 10 kolumn o nazwie tabliczka tabliczka:array[1..4, 1..10] of integer; nazwa l.wierszy, l.kolumn typ elementów 2011-10-22 Programowanie w języku Pascal 12
Tablice dwuwymiarowe Przypisywanie wartości całej tablicy w podwójnej pętli for i:=1 to 4 do for j:=1 to 10 do tabliczka[i,j]:=wyrażenie; Lub for i:=1 to 4 do for j:=1 to 10 do readln(tabliczka[i,j]); Wyprowadzanie wartości elementów tablicy for i:=1 to 4 do for j:=1 to 10 do write(tabliczka[i,j]); 2011-10-22 Programowanie w języku Pascal 13
Podprogramy Pewne obliczenia (zestawy instrukcji) mogą być wykonywane w programie wielokrotnie dla takich samych lub innych danych. Korzystne jest wydzielenie takich fragmentów w postaci podprogramów. Podprogram służy do wyodrębnienie pewnego fragmentu programu, stanowiącego pewną całość logiczną w całość fizyczną identyfikowaną za pomocą nazwy. Taki podprogram może być wywołany w wielu miejscach programu. 2011-10-22 Programowanie w języku Pascal 14
Podprogramy Pascal posiada dwa rodzaje podprogramów Procedury używane do wykonania przez program jakiejś złożonej czynności np. wczytanie lub wydrukowanie zawartości tablicy, wyczyszczenie ekranu itp. Funkcje wykonują zespół instrukcji, którego efektem jest obliczenie jakiejś wartości ( być może poprzez wykonanie wielu rachunków elementarnych) 2011-10-22 Programowanie w języku Pascal 15
Procedury Program TakieCosTam; uses crt; type Tablica=array[1..10] of real; Definicja procedury: procedure nazwa(lista parametrów); lista zmiennych; begin zestaw instrukcji; end; procedure CzytajTablice( t:tablica); i:integer; begin for i:=1 to 10 do begin write( t[,i:2, ]= ); readln(t[i]); end; end; Zdefiniowaną procedurę wywołujemy w programie podając jej nazwę z listą parametrów a,b,c:tablica; Begin ClrScr; CzytajTablice(a); CzytajTablice(b);... end. 2011-10-22 Programowanie w języku Pascal 16
Definicja funkcji: function nazwa(lista parametrów):typ funkcji; lista zmiennych; begin zestaw instrukcji; nazwa:=wyrażenie; end; Typ funkcji to typ wartości obliczanej przez funkcję Funkcję wywołujemy w programie używając jej (z listą parametrów) w instrukcji przypisania Funkcje W zestawie instrukcji musi pojawić się instrukcja przypisania wartości obliczanej przez funkcję Program TakieCosTam; uses crt; function maks(x,y:real):real; begin if x>y then maks:=x else maks:=y; end; a,b,c:real; begin ClrScr; readln(a); readln(b); c:=maks(a,b);... end. 2011-10-22 Programowanie w języku Pascal 17
Zmienne globalne i lokalne Pascal wymaga zadeklarowania każdej zmiennej poprzez podanie jej nazwy i typu jest to związane przydzieleniem dla niej miejsca w pamięci operacyjnej W programie głównym deklarujemy zmienne globalne to znaczy takie które są widoczne w całym programie (zmienne globalne mają przydzieloną pamięć przez cały czas pracy programu) W procedurach i funkcjach deklarujemy zmienne lokalne widziane tylko przez podprogram w programie głównym nie są one widoczne (zmienne lokalne mają pamięć przydzieloną tylko na czas wykonywania podprogramu po jego wykonaniu pamięć jest zwalniana a wartość zmiennej ulega zagubieniu) 2011-10-22 Programowanie w języku Pascal 18
Przekazywanie parametrów Pascal pozwala przekazywać parametry do procedur i funkcji na dwa sposoby przez wartość procedure pisz(t:tablica); i:integer; begin for i:=1 to 10 do writeln(t[i]); end; wartości parametrów są kopiowane do zmiennych lokalnych po zakończeniu procedury zmiany ulegają zapomnieniu (pozostaje wartość pierwotna parametru) przez zmienną procedure czytaj( t:tablica); i:integer; begin for i:=1 to 10 do readln(t[i]); end; procedura otrzymuje dostęp do zmiennej globalnej (adres w pamięci operacyjnej) wprowadzone zmiany pozostają po wykonaniu procedury 2011-10-22 Programowanie w języku Pascal 19
Typy danych typ Rodzaj danych Zakres wartości rozmiar char znaki Znaki alfabetu ASCII 1 bajt boolean wartości logiczne TRUE/FALSE 1 bajt byte Liczby naturalne [0;255] 1 bajt shortint Liczby całkowite [-128;127] 1 bajt word Liczby naturalne [0;65 535] 2 bajty integer Liczby całkowite [-32 768;32 767] 2 bajty long Liczby całkowite [-2147483648;2147483647] 4 bajty real Liczby rzeczywiste (-1,7 38 ;1,7 38) 11-12 cyfr znaczących 6 bajtów single Liczby rzeczywiste (-3,4 38 ;3,4 38 ) 7-8 cyfr znaczących 4 bajtów double Liczby rzeczywiste (-1,7 308 ;1,7 308) 15-16 cyfr znaczących 8 bajtów extended Liczby rzeczywiste (-1,1 4932 ;1,1 4392) 19-20 cyfr znaczących 10bajtów 2011-10-22 Programowanie w języku Pascal 20
Deklaracja własnych typów danych Oprócz standardowych typów danych użytkownik może definiować własne Definicję rozpoczynamy kluczowym słowem TYPE Po którym następuje definicja: nazwa_typu=opis_typu; Przykład: definiujemy typ napisowy o długości 20 znaków: tekst20=string[20]; definiujemy 10 elementową tablicę liczb całkowitych tab10int=array[1..10] of integer; Po zdefiniowaniu typu deklarujemy zmienną, która będzie ten typ wykorzystywała type tekst=string[30]; komunikat:tekst; begin komunikat:= wszystko gra ;... 2011-10-22 Programowanie w języku Pascal 21
Typ wyliczeniowych Używany jest gdy pewne wartości stałe używane w programie mają odpowiedniki tekstowe [identyfikatory]: type nazwa_typu =(lista identyfikatorów); Przykładem mogą być oceny... type oceny=(niedostateczny,dopuszczajacy,dostateczny,dobry,bardzo_dobry,celujacy); odp,kl,pk:oceny; 1)Wykaz identyfikatorów <=255 pozycji 2)Nie mogą być słowami zastrzeżonymi 3)Są ponumerowane od 0 do n-1 2011-10-22 Programowanie w języku Pascal 22
Typ wyliczeniowych Używany jest gdy pewne wartości stałe używane w programie mają odpowiedniki tekstowe [identyfikatory]: Dostępne funkcje: ORD(identyfikator) zwraca numer identyfikatora ORD( dobry )=3 PRED(identyfikator) zwraca poprzedni identyfikator PRED( dobry )= dostateczny SUCC(identyfikator) - zwraca następny identyfikator SUCC( dobry )= bardzo _dobry 2011-10-22 Programowanie w języku Pascal 23
Typ okrojony Dotyczy konkretnego typu bazowego. Zbiór wartości typu okrojonego jest podzbiorem zbioru wartości typu bazowego. Definiujemy jak każdy inny typ użytkownika (potem deklarujemy zmienną nowozdefiniowanego typu) Możemy zdefiniować typ podczas deklarowania zmiennych type miesiac=1..12; mc_ur:miesiac; mc_ur:1..12; dz_ur:1..31; Próba nadania zmiennej typu okrojonego wartości spoza zakresu kończy się błędem wykonania 2011-10-22 Programowanie w języku Pascal 24
Rekordy dostęp do pól Rekord jest zmienną złożoną [strukturą] służącą do przechowywania danych różnego typu. Każde pole ma nazwę Każde pole ma określony typ danych,które przechowuje rekord data rekord osoba type osoba=record imie:string[30]; nazwisko:string[50]; wiek:integer; end; dzień l.całkowita miesiąc l.całkowita rok l.całkowita nazwisko łańcuch imię łańcuch wiek l.całkowita Deklaracja zmiennych rekordowych: uczen,nauczyciel,dyrektor:osoba; 2011-10-22 Programowanie w języku Pascal 25
Rekordy Dostęp do pól rekordu (wprowadzanie lub wyprowadzanie danych) uzyskujemy: Podając nazwę zmiennej (rekordu) i nazwę pola oddzieloną kropką Korzystając z instrukcji with podajemy nazwę zmiennej a następnie używamy tylko nazwy pola uczen,nauczyciel:osoba; begin readln(uczen.nazwisko); readln(uczen.imie); readln(uczen.wiek);... uczen,nauczyciel:osoba;... with uczen do begin readln(nazwisko); readln(imie); readln(wiek); end;... 2011-10-22 Programowanie w języku Pascal 26
Pliki Pliki zawierają dane przechowywane w pamięci dyskowej są zachowywane po zakończeniu pracy z programem Pliki reprezentowane są w programie przez zmienną plikową Zmienna plikowa musi zostać związana ze znajdującym się na dysku plikiem fizycznym [Plik fizyczny stanowi obszar pamięci dyskowej identyfikowalny poprzez nazwę] Podczas pracy programu dane z pliku są sprowadzane do pamięci operacyjnej tam są przetwarzane Dane w plikach są zapisywane po kolei (sekwencyjnie) można je odczytywać po kolei lub zażądać odczytania elementu o określonym numerze. Liczba elementów w pliku jest dowolna (ograniczona wolnym miejscem na dysku) Po przetworzeniu dane mogą być zapisane do tego samego lub innego pliku 2011-10-22 Programowanie w języku Pascal 27
Pliki -rodzaje Pliki tekstowe składają się ze znaków kodów ASCII pogrupowanych we wiersze o różnej długości Wiersz kończy się parą znaków CR LF (#10 #13) Plik kończy się znakiem końca pliku EOF (#26) Pliki binarne dane zapisane są binarnie (liczby dwójkowe) nie nadają się do bezpośredniego oglądania wymagają interpretacji przez program Pliki zdefiniowane składają się z elementów o określonej strukturze (np. ze zdefiniowanych w programie rekordów) Pliki niezdefiniowane poszczególne porcje danych mogą mieć różny rozmiar i różne znaczenie program odczytujący musi wiedzieć co tam jest 2011-10-22 Programowanie w języku Pascal 28
Pliki -przetwarzanie Deklaracja zmiennej plikowej zm_plik:rodzaj pliku; text plik tekstowy file of element - plik elementów File plik niezdefiniowany Skojarzenie zmiennej z plikiem fizycznym Otwarcie pliku Wykonanie operacji na pliku ReWrite(zm_plik); Reset(zm_plik); Append(zm_plik); Assign(zm_plik,nazwa pliku); Read(zm_plik,lista zmiennych); Write(zm_plik,lista zmiennych); nazwa pliku ze ścieżką dostępu nowy pliku do zapisu danych plik do odczytu danych plik tekstowy do dopisania danych na końcu Zamknięcie pliku Close(zm_plik); plik otwarty musi zostać zamknięty 2011-10-22 Programowanie w języku Pascal 29
Pliki -przydatne funkcje EOF(zm_plik) zwraca TRUE gdy osiągnięto koniec pliku EOLN(zm_plik) zwraca TRUE gdy osiągnięto koniec linii w pliku tekstowym Seek(zm_plik,n) ustawia wskaźnik pliku na elemencie o numerze n FilePos(zm_plik) zwraca aktualną pozycję wskaźnika pliku FileSize(zm_plik) zwraca liczbę elementów pliku IOResult zwraca 0 gdy ostatnią operację na pliku wykonano pomyślnie w przeciwnym wypadku zwraca kod błędu 2011-10-22 Programowanie w języku Pascal 30