Tablice, rekordy i pliki
Transkrypt
Tablice, rekordy i pliki
Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Program Rozwojowy Potencjału Dydaktycznego Politechniki Świętokrzyskiej w Kielcach: kształcenie na miarę sukcesu. Priorytet IV Szkolnictwo wyższe i nauka. Działanie 4.1 Wzmocnienie i rozwój potencjału dydaktycznego uczelni oraz zwiększenie liczby absolwentów kierunków o kluczowym znaczeniu dla gospodarki opartej na wiedzy. Poddziałanie 4.1.1 Wzmocnienie potencjału dydaktycznego uczelni. Umowa: uda-pokl.040.01.01-00-175/08-00 Materiały dydaktyczne „Programowanie w języku wysokiego poziomu na przykładzie języka Pascal - część 2” (Moduł nr 12) zrealizowane do Zadania 9 Autorzy: mgr inż. Arkadiusz Chrobot, mgr inż. Karol Wieczorek, mgr inż. Robert Tomaszewski Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Programowanie w języku wysokiego poziomu na przykładzie języka Pascal - część 3 Tablice, rekordy i pliki Arkadiusz Chrobot Robert Tomaszewski Karol Wieczorek Katedra Informatyki, Politechnika Świętokrzyska w Kielcach Bibliografia Wprowadzenie Tablica jednowymiarowa Spis treści 1 Wprowadzenie 2 Tablica jednowymiarowa 3 Tablice wielowymiarowe 4 Algorytmy 5 Rekordy Budowa Użycie typu rekordowego Przykład 6 Pliki Wprowadzenie Definiowanie plików Operacje na plikach Przykłady 7 Zadania 8 Bibliografia Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Wprowadzenie Tablice i rekordy są strukturami danych, co oznacza, że zmienna typu tablicowego lub rekordowego może przechowywać jednocześnie kilka wartości. W przypadku tablic wszystkie te wartości są tego samego typu. Rekordy mogą przechowywać kilka wartości o różnych typach. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Tablica jednowymiarowa Najprostszym przykładem tablicy (i prawdopodobnie najczęściej stosowanym) jest tablica jednowymiarowa. Zanim dowiemy się w jaki sposób definiować takie tablice w języku Pascal przyjrzymy się jej budowie. Poniższy rysunek obrazuje strukturę tablicy jednowymiarowej. 0 1 2 3 4 5 3 4 2 5 Tablica podzielona jest na elementy. Każdy z elementów przechowuje pojedynczą wartość. Wszystkie wartości zgromadzone w elementach tablicy mają ten sam typ. Mogą to być dowolne wartości mieszczące się w typie elementu. Każdy element ma również swój indeks (na rysunku u góry elementu), który jednoznacznie określa jego położenie względem początku tablicy (jest jego unikatowym identyfikatorem). [1, 2] Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Typ tablicowy W języku Pascal istnieje kilka sposobów na zdefiniowanie zmiennej tablicowej (tablicy). Wygodnie jest najpierw zdefiniować w sekcji type program lub podprogramu odpowiedni typ tablicowy. Schemat definicji typu tablicowego nazwa typu = array [przedział indeksów ] of typ elementu; Typ elementu może być dowolny predefiniowanym typem języka Pascal lub typem zdefiniowanym przez programistę. Przedział indeksów jest definiowany za pomocą nazwanego lub anonimowego typu okrojonego. [1, 2] Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Typ tablicowy - przykłady Przykłady typów tablicowych type p r z e d z i a l = −5 . . 5 ; T t a b l i c a = a r r a y [ p r z e d z i a l ] o f byte ; T t a b l i c a 2 = array [ 1 . . 5 ] of r e a l ; W przykładzie zdefiniowano dwa typu tablicowe o nazwach Ttablica i Ttablica2. W pierwszym typie do określenia zakresu indeksów użyto zdefiniowanego wcześniej typu okrojonego o nazwie przedzial. Wszystkie typy okrojone budowane są na bazie typów porządkowych. Pierwsza wartość w definicji typu okrojonego musi być mniejsza lub równa wartości drugiej. W typie Tablica2 zakres indeksów został określony za pomocą anonimowego typu okrojonego, umieszczonego bezpośrednio w definicji typu tablicowego w nawiasach kwadratowych. [1, 2] Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Zmienne tablicowe Zmienne tablicowe, nazywane w skrócie tablicami, deklarowane są w sekcji var programu lub podprogramu, tak jak zmienne innych typów. Możemy też zadeklarować zmienną tablicową używając anonimowego typu tablicowego. Przykłady zmiennych tablicowych v ar tablica : Ttablica1 ; t a b l i c a 2 : a r r a y [ 0 . . 9 ] o f word ; Zmienna o nazwie tablica została zadeklarowana przy użyciu zdefiniowanego we wcześniejszym przykładzie typu o nazwie Ttablica1, a zmienna o nazwie tablica2 przy użyciu typu anonimowego. Zalecanym sposobem jest korzystanie z typów nazwanych przy deklarowaniu tablic. [1, 2] Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Odwołanie do elementów tablicy Wartość pojedynczego elementu tablicy można uzyskać umieszczając indeks tego elementu w nawiasach kwadratowych, za nazwą tablicy. Przykładowo, jeśli chcemy wypisać na ekran wartość elementu tablicy o indeksie równym pięć, to napiszemy w programie następujący wiersz kodu: writeln(tab[5]);. Należy pamiętać o tym, że wartość indeksu musi być prawidłowa, tj. element tablicy o takim indeksie musi istnieć!. Aby sprawnie odwoływać się do większej liczby elementów możemy użyć pętli. Na przykład, jeśli chcemy wypisać na ekran elementy tablicy o indeksach od 2 do 5 możemy napisać następujący fragment kodu: Indeksowanie elementów tablicy for i := 2 to 5 do write(tab[i]); Zakładamy, że zmienna i ma odpowiedni typ porządkowy, w którym mieszczą się wartości 2, 3, 4 i 5 (np.: byte). [1, 2] Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Odwołanie do elementów tablicy Jeśli wystąpi konieczność odwołania do wszystkich elementów tablicy, to można użyć funkcji low i high do wyznaczenia indeksu odpowiednio pierwszego i ostatniego elementu tej tablicy. Indeksowanie wszystkich elementów tablicy for i := low(tab) to high(tab) do write(tab[i]); Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Przekazywanie przez parametry do podprogramów Jeśli zdefiniowaliśmy wcześniej typ tablicowy w sekcji type, to możemy użyć go do zadeklarowania formalnego parametru tablicowego w nagłówku procedury lub funkcji: Przekazywanie przez parametry procedure dane(t:tablica); Można również w nagłówkach podprogramów deklarować otwarte parametry tablicowe. Otwarty parametr tablicowy procedure dane(t:array of byte); Za pomocą takich parametrów można przekazywać dowolne tablice, których typ elementów jest zgodny z typem elementów w otwartym parametrze tablicowym. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Przekazywanie przez parametry do podprogramów Uwaga 1 Jeśli przekazujemy tablicę do podprogramu przez parametr otwarty, to jej indeksy ulegją przeskalowaniu! Indeks pierwszego elementu wynosi zawsze 0, natomiast indeks ostatniego możemy wyznaczyć na podstawie jej rozmiaru i rozmiaru jej pojedynczego elementu, posługując się wyrażeniem: sizeof(tab)/sizeof(tab[0]) - 1 Uwaga 2 Korzystając z kompilatora Turbo Pascal należy pamiętać, że nie pozwala on przekazać za pomocą parametru o nazwanym typie tablicowym zmiennej o anonimowym typie tablicowym, nawet jeśli liczba elementów i ich typ w obu typach tablicowych się zgadzają. Inne kompilatory mogą nie posiadać takiego ograniczenia. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Przekazywanie przez parametry do podprogramów Uwaga 3 Jeśli używamy kompilatora Turbo Pascal, to nie powinniśmy tworzyć dużych tablic jako zmiennych lokalnych, a do procedur lub funkcji przekazywać tablice tylko przez stałą i zmienną (używać słów kluczowych const i var z parametrami tablicowymi). W przypadku innych kompilatorów nie musi to być prawdą. Uwaga 4 Tablice nie mogą być wartościami zwracanymi przez funkcje, jako wynik ich działania. Można obejść to ograniczenie przekazując tablie przez zmienną. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Tablice wielowymiarowe Aby uzyskać wartość elementu w tablicy jednowymiarowej musimy podać jedną współrzędną - jego indeks. W przypadku tablic wielowymiarowych każdy element ma wiele indeksów (współrzędnych), które należy określić, aby uzyskać wartość elementu. Najczęściej używa się tablic o niewielkiej liczbie wymiarów. Zwykle są to tablice dwuwymiarowe, które wykorzystuje się do reprezentowania macierzy. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Tablice dwuwymiarowe Typ tablicy dwuwymiarowej można zdefiniować na wiele sposobów. Definicje typów tablic dwuwymiarowych type macierz1 macierz2 wiersz = macierz3 = a r r a y [ 0 . . 3 ] o f a r r a y [ 0 . . 3 ] o f word ; = a r r a y [ 0 . . 3 , 0 . . 3 ] o f word ; a r r a y [ 0 . . 3 ] o f word ; = array [ 0 . . 3 ] of w i e r s z ; Można również deklarować zmienne o anonimowych typach tablic dwuwymiarowych, ale w przypadku niektórych kompilatorów, takich jak Turbo Pascal, występują problemy, kiedy próbujemy je przekazać przez parametry do podprogramów. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Odwołanie do elementu tablicy dwuwymiarowej Aby odwołać się do tablicy dwuwymiarowej należy podać dwie współrzędne (indeksy) elementu. Można to zrobić na dwa sposoby: tab[3,5]; lub tab[3][5];. Ten drugi sposób jest obowiązuje również w wielu innych językach programowania (np. C,C++,Java). Jeśli odwołujemy się do większej liczby elementów w tablicy dwuwymiarowej to możemy użyć pętli. Tablica dwuwymiarowa i pętle for i := 0 to 3 do for j := 0 to 3 do wirte(tab[i,j]); Jeśli tablica dwuwymiarowa przedstawia macierz, to pierwsza współrzędna jest indeksem wiersza, a druga indeksem kolumny. [1, 2] Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Sortowanie tablic Jedną z najczęściej wykonywanych czynności na wartościach zgromadzonych w tablicy jednowymiarowej jest ich porządkowanie, które nazywa się w informatyce sortowaniem. Istnieje wiele algorytmów sortowania, które różnią się efektywnością. Jednym z najprostszych jest algorytm sortowania przez wybór (ang. selection sort). Jego działanie można opisać następująco: 1 Znajdź najmniejszą wartość w tablicy i zapisz ją w jej pierwszym elemencie. 2 Znajdź ponownie wartość najmniejszą w tablicy, ale tym razem z poszukiwań wyłącz pierwszy element. Znalezioną wartość zapisz w drugim elemencie tablicy. 3 Podobnie postępuj z pozostałymi elementami, aż napotkasz na ostatni element tablicy. Następny slajd zawiera procedurę, która realizuje opisany algorytm. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Sortowanie tablic Sortwanie przez wybór procedure s e l e c t i o n s o r t ( var t : t a b l i c a ) ; var i , j , k , tmp : b y t e ; begin f o r i := l o w ( t ) t o h i g h ( t )−1 do begin k := i ; f o r j := i +1 t o h i g h ( t ) do i f t [ k ] > t [ j ] t h e n k := j ; i f i <>k t h e n begin tmp:= t [ k ] ; t [ k ]:= t [ i ] ; t [ i ] : = tmp ; end ; end ; end ; Rekordy Pliki Zadania Bibliografia Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Wyszukiwanie liniowe Inną czynnością równie często wykonywaną na tablicach jednowymiarowych jest znajdywanie sprawdzanie, czy określona wartość się w nich znajduje. Również w tym przypadku istnieje wiele algorytmów, według których może ona zostać wykonana. Jednym z najprostszych jest algorytm wyszukiwania liniowego. Polega on na sprawdzeniu wszystkich elementów tablicy. Jeśli podczas tego przeglądania zostanie znaleziony element zawierający daną wartość, to jest zwracany jego indeks. Jeśli zostaną odwiedzone wszystkie elementy w tablicy, ale żaden z nich nie będzie zawierał szukanej wartości, to algorytm zasygnalizuje jej brak w tablicy, np. poprzez zwrócenie nieistniejącego indeksu tablicy. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Wyszukiwanie liniowe Wyszukiwanie liniowe function wyszukiwanie liniowe ( var t : t a b l i c a ; const v a l u e : byte ) : byte ; { Indeks 0 nie i s t n i e j e w t a b l i c y . } var i : byte ; begin w y s z u k i w a n i e l i n i o w e :=0; i := l o w ( t ) ; w h i l e i <=h i g h ( t ) do begin i f t [ i ]= v a l u e t h e n begin w y s z u k i w a n i e l i n i o w e := i ; break ; end ; inc ( i ); end ; end ; Pliki Zadania Bibliografia Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Budowa Definicja typu rekordowego Definicja Rekordy są strukturami danych, które mogą służyć do przechowywania wartości różnych typów. [1, 2] Typ rekordowy definiuje się w sekcji type programu lub podprogramu według następującego wzorca: Budowa rekordu nazwa typu rekordowego = record nazwa pola 1: typ pola 1; nazwa pola 2: typ pola 2; .. . nazwa pola n: typ pola n; end; Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Budowa Opis budowy rekordu Poszczególne składowe rekordu nazywamy polami. Typ rekordowy nie może określać zmiennej, której rozmiar jest większy niż 64 KB. Typy pól rekordu mogą być dowolne. Jeśli któreś z pól rekordu jest rekordem, to mówimy, że mamy do czynienia z rekordem zagnieżdżonym. Jednym z najczęstszych przypadków użycia rekordu jest przechowywania informacji o osobie. Typ rekordu, który przechowuje takie informacje może być zdefiniowany następująco [1, 2]: Rekord „Osoba” type osoba = record imie:string[30]; nazwisko: string[50]; wiek:byte; end; Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Budowa Rekordy z wariantami Rekordy z wariantami pozwalają na pewne sparametryzowanie tego typu danych. [1, 2] Polem wariantowym zawsze jest ostatnie pole w rekordzie. Oto wzorzec takiego typu rekordowego: Rekord z wariantami nazwa typu rekordowego = record nazwa pola 1: typ pola 1; nazwa pola 2: typ pola 2; .. . case selektor: typ selektora of wartość selektora 1 : (pole 1: typ pole 2: typ wartość selektora 2 : (pole 1 : typ pole 2 : typ pole 3 : typ end; pola pola pola pola pola 1; 2); 1; 2; 3); Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Budowa Przykład rekordu z wariantem Załóżmy, że potrzebujemy opisać rekordem dwie postacie z gry komputerowej: maga i wojownika. Będą one miały oczywiście wspólne cechy, jak położenie w przestrzeni i nazwę, ale również będą miały cechy indywidualne, jak miara siły lub mocy magicznej. Moglibyśmy te postacie opisać jednym typem (nie licząc pomocniczego typu wyliczeniowego): Typ rekordu z wariantem type rodzaj = (mag, wojownik); postac = record x,y:real; nazwa:string[40]; case r:rodzaj of wojownik: (sila: byte); mag:(moc magiczna:word); end; Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Użycie typu rekordowego Deklaracja i użycie zmiennych rekordowych Zmienne typów rekordowych (inaczej zmienne rekordowe lub krótko: rekordy) deklarujemy tak samo, jak zmienne innych zdefiniowanych przez nas typów. Do pola zmiennej rekordowej możemy odwołać się na dwa sposoby: 1 za pomocą operatora kropki: nazwa rekordu.nazwa pola; 2 za pomocą konstrukcji with: with nazwa rekordu do nazwa pola; Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Przykład Przykład programu „Dane osoby” Na kilku poniższych slajdach będzie przedstawiony kod źródłowy programu, który umożliwi wypełnienie i wyświetlenie danych z tablicy rekordów przechowujących dane osobowe: Cz.1 - deklaracje typów program t a b l i c a r e k o r d o w ; uses crt ; type osoba = record imie : s t r i n g ; nazwisko : s t r i n g ; wiek : byte ; end ; t a b l i c a = a r r a y [ 1 . . 5 ] of osoba ; var tab : t a b l i c a ; Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Przykład Przykład programu „Dane osoby” c.d. Cz.2 - procedura do wprowadzania danych procedure w y p e l n i j ( var t : t a b l i c a ) ; var i : byte ; begin f o r i := l o w ( t ) t o h i g h ( t ) do w i t h t [ i ] do begin w r i t e ( ’ Podaj i m i e ’ , i , ’ : ’ ) ; readln ( imie ) ; w r i t e ( ’ Podaj nazwisko ’ , i , ’ : readln ( nazwisko ) ; w r i t e ( ’ Podaj wiek ’ , i , ’ : ’ ) ; readln ( wiek ) ; end ; end ; ’ ); Rekordy Pliki Zadania Bibliografia Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Przykład Przykład programu „Dane osoby” c.d. Cz.3 - procedura do wypisywania danych i program główny procedure wypisz ( const t : t a b l i c a ) ; var i : byte ; begin f o r i := l o w ( t ) t o h i g h ( t ) do begin writeln ( ’ Imie : ’ , t [ i ] . imie ) ; w r i t e l n ( ’ Nazwisko : ’ , t [ i ] . nazwisko ) ; w r i t e l n ( ’ Wiek : ’ , t [ i ] . w i e k ) ; readln ; end ; end ; { program g l o w n y } begin clrscr ; w y p e l n i j ( tab ) ; wypisz ( tab ) ; end . Zadania Bibliografia Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Wprowadzenie Jak przechowujemy dane? Jeśli dane, które przetwarza lub produkuje program komputerowy mają być dostępne po zakończeniu jego pracy, to muszą one zostać przechowane w pamięci masowej komputera. Pamięć tego typu jest urządzeniem pozwalającym zachować zapisane w niej informacje w sposób trwały. Takimi urządzeniami są np.: dyski twarde, płyty CD, DVD, Blue-Ray pamięci typu Flash (np.: pen-drive) Każde z tych urządzeń przechowuje dane w inny sposób. Aby ujednolicić sposób korzystania ze zgromadzonych na nich informacji wprowadzono specjalną strukturę danych nazywaną plikiem. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Wprowadzenie Rodzaje plików Pliki gwarantują ten sam sposób korzystania z informacji niezależnie od tego, czy znajdują się one na dysku twardym, w pamięci operacyjnej, czy innym nośniku. Język Turbo Pascal pozwala korzystać z trzech rodzajów plików [1, 2]: 1 plików tekstowych, 2 plików binarnych, 3 plików amorficznych (binarnych niezdefiniowanych) Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Wprowadzenie Elementy plików Pliki, niezależnie do którego rodzaju należą, składają się zawsze z pewnych elementów. W przypadku plików tekstowych tymi elementami są wiersze, czyli ciągi znaków zakończone znakami końca wiersza (w przypadku Turbo Pascala są to znaki #13 #10). Wynika stąd, że wiersze te mogą mieć różny rozmiar. Elementami plików binarnych są wartości określonego przez nas typu. Mogą to być wartości typu byte, integer, real, a nawet typu rekordowego. W plikach amorficznych wartości,które są przechowywane nie mają określonego typu. Cały plik jest podzielony na porcje o ustalonej wielkości, zwane blokami. Dla wszystkich typów plików możemy stosować dostęp sekwencyjny, tzn. taki, w którym aby przeczytać lub zapisać element znajdujący się w dowolnym miejscu pliku musimy przeczytać wszystkie elementy znajdujące się przed nim. W przypadku plików binarnych możemy mieć również swobodny dostęp. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Definiowanie plików Definicja plików w Pascalu W Turbo Pascalu jedynym typem plików, który powinniśmy zdefiniować jest typ pliku binarnego zdefiniowanego. Określamy go w sekcji type programu lub podprogramu według wzorca: Tworzenie typu plikowego nazwa typu pliku = file of nazwa typu elementu pliku; Przykładowo, plik binarny, którego elementy byłyby typu integer miałby następujący typ: Typ pliku binarnego integer type plik = file of integer; Pliki amorficzne, jak również tekstowe mają już zdefiniowane typy, które są częścią języka i nie musimy im nadawać nowej nazwy. Typem pliku amorficznego jest po prostu file, a tekstowego jest text. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Operacje na plikach Schemat korzystania z pliku Zanim będziemy mogli zapisać lub odczytać informacje z pliku musimy wykonać dodatkowe czynności. Oto one: 1 skojarzenie zmiennej z plikiem, 2 otwarcie pliku, 3 przetwarzanie informacji zawartych w pliku, 4 zamknięcie pliku. Należy zaznaczyć, że przy wykonywaniu każdej z tych operacji mogą pojawić się wyjątki, które należy obsłużyć. Powyższe operacje są realizowane za pomocą różnych funkcji i procedur. Zostaną one opisane na kolejnych slajdach. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Operacje na plikach Opis procedur i funkcji operujących na plikach Procedury do otwierania i zamykania plików assign - działa w ten sam sposób dla wszystkich typów plików. Wiąże ona zmienną plikową z nazwą pliku. Pierwszym parametrem jej wywołania jest nazwa zmiennej plikowej, a drugim ciąg znaków będący nazwą pliku. close - Operacja zamykania pliku (dla wszystkich rodzajów) rewrite - dla plików tekstowych procedura ta tworzy nowy plik, który można wyłącznie zapisywać. Przy plikach binarnych, również tworzony jest nowy plik, ale można zarówno odczytywać, jak i zapisywać dane. reset - dla plików tekstowych procedura ta otwiera już istniejący plik w trybie tylko do odczytu. Przy pracy z plikami binarnymi, procedura otwiera istniejący plik z prawami do odczytu i zapisu. Przy próbie otwarcia pliku, który nie istnieje, zostanie zgłoszony wyjątek. append - tryb występujący tylko w plikach tekstowych. Służy do otwarcia istniejącego pliku do dopisania treści do już istniejącej. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Operacje na plikach Opis procedur i funkcji operujących na plikach c.d. Procedury do odczytu i zapisu read/readln - jako pierwszy parametr wywołania podajemy nazwę zmiennej plikowej, a następnie zmienną do której będą wczytane informacje z pliku. Różnica między readln i read polega na tym, że pierwsza odczytuje cały wiersz znaków, zakończony znakami końca wiersza, natomiast druga czyta tyle informacji, ile wynika z liczby i typu zmiennych do których one będą zapisywane. W przypadku plików binarnych odczyt możliwy jest wyłącznie za pomocą procedury read. write/writeln - procedury służą do zapisywania danych do pliku, jeśli jako pierwszy parametr podamy zmienną plikową. Sposób działania jest analogiczny do procedur służących do odczytu. readblock/writeblock - procedury służące do odczytu/zapisu danych z/do plików amorficznych. Podajemy jej 3 parametry. Pierwsze dwa są analogiczne do procedur write/read. Trzeci parametr to liczba typu word określająca liczbę bloków do odczytu/zapisu. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Operacje na plikach Pozostałe procedury i funkcje operujące na plikach Procedury do odczytu i zapisu eof - zwraca wartość true, jeśli został osiągnięty koniec pliku. Działa dla wszystkich typów plików. seekeof - działa podobnie, ale tylko dla plików tekstowych i ignoruje znaki białe eoln - działa jedynie dla plików tekstowych i zwraca true, jeśli został osiągnięty koniec wiersza seekeoln - działa podobnie, ale ignoruje znaki spacji i tabulacji, jest przeznaczona wyłącznie dla plików tekstowych filesize - zwraca liczbę elementów pliku binarnego lub liczbę bloków pliku amorficznego filepos - działa dla plików binarnych i amorficznych, zwraca wartość typu longint, która oznacza pozycję wskaźnika pliku seek - ustawia pozycję wskaźnika pliku. Pierwszym argumentem jej wywołania jest nazwa zmiennej plikowej, drugim wartość nowej pozycji wskaźnika pliku, wartość ta jest typu longint, procedura ta jest przeznaczona dla plików binarnych i amorficznych truncat - „ucina” plik począwszy od bieżącej pozycji wskaźnika pliku, działa dla plików binarnych i amorficznych Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Przykłady Przykład 1 – pliki tekstowe Cz.1 program p l i k i t e k s t o w e ; uses crt ; var T: text ; procedure z a p i s z ( var F : text ) ; { Z a p i s u j e do p l i k u t e k s t o w e g o w i e r s z p o b r a n y od u z y t k o w n i k a . } var a: string [80]; i : byte ; begin rewrite (F ) ; readln (a ); w r i t e l n (F , a ) ; end ; close ( f ); end ; Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Przykłady Przykład 1 – pliki tekstowe c.d. Cz.2 procedure odczytaj ( var F : text ) ; { Odczytuje z p l i k u tekstowego wiersz . } var a : s t r i n g [ 8 0 ] ; begin reset (F ) ; repeat readln ( f , a ); writeln (a ); u n t i l eof ( f ); close ( f ); end ; begin { Program g l o w n y } clrscr ; a s s i g n (T , ’ dane . t x t ’ ) ; z a p i s z (T ) ; clrscr ; o d c z y t a j (T ) ; readln ; end . Pliki Zadania Bibliografia Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Przykłady Przykład 1 – pliki tekstowe – Opis Zmienna plikowa, typu text jest kojarzona z plikiem o nazwie dane.txt w bloku głównym programu. Plik ten tworzony jest w procedurze zapisz, w wyniku wywołania procedury rewrite. W tej też procedurze do pliku zapisywany jest wiersz zawierających ciągi znaków podane przez użytkownika (o wielkości maksymalnie 80 znaków). Procedura odczyt odczytuje dane z tego samego pliku. Odczytanie i wyświetlenie na ekran odbywa się wewnątrz pętli repeat. W obydwu procedurach ostatnią wykonywaną instrukcją jest zamknięcie pliku. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Przykłady Przykład 2 – pliki binarne Cz.1 program p l i k b i n a r n y ; uses crt ; type rec = record x , y : integer ; end ; p l r e c = f i l e of rec ; var plik : pl rec ; Algorytmy Rekordy Pliki Zadania Bibliografia Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Przykłady Przykład 2 – pliki binarne c.d. Cz.2 procedure z a p i s z ( var f : p l r e c ) ; var r : rec ; i : byte ; begin rewrite ( f ); f o r i :=1 t o 5 do begin w i t h r do begin w r i t e l n ( ’ Podaj x ’ ) ; readln (x ); w r i t e l n ( ’ Podaj y ’ ) ; readln (y ); end ; write ( f , r ); end ; close ( f ); end ; Algorytmy Rekordy Pliki Zadania Bibliografia Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Przykłady Przykład 2 – pliki binarne c.d. Cz.3 procedure wypisz ( var f : p l r e c ) ; var r : rec ; begin reset ( f ); w h i l e n ot e o f ( f ) do begin read ( f , r ) ; write ( r . x , ’ ’ ); writeln ( r . y ); end ; close ( f ); end ; begin a s s i g n ( p l i k , ’ dane . d a t ’ ) ; zapisz ( plik ); clrscr ; wypisz ( p l i k ) ; end . Algorytmy Rekordy Pliki Zadania Bibliografia Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Przykłady Przykład 2 – pliki binarne – Opis Powyższy program przetwarza informacje zawarte w pliku binarnym zdefiniowanym, którego elementami są rekordy. Taki rodzaj pliku nazywa się krótko plikiem rekordowym. Każdy rekord zawiera dwa pola x i y, które przechowują liczby całkowite. Zadaniem programu jest utworzenie pliku o nazwie dane.dat, zapisanie do niego pięciu rekordów zawierających dane pobrane od użytkownika, zamknięcie go, następnie ponowne otwarcie i wypisanie zawartości wszystkich rekordów z pliku na ekran. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Zadania Zadanie 1 Napisz podprogram odwracający porządek elementów w tablicy i wyświetlający tablicę przed i po operacji odwracania. Przed wywołaniem podprogramu użytkownik określa, ile elementów wprowadzi do tablicy. Zwróć uwagę, że odwrócenie porządku elementów to nie to samo co wyświetlenie tablicy od końca! Przykład wydruku z programu: Tablica WEJŚCIOWA: 12345 Tablica WYJŚCIOWA: 54321 Wykonaj powyższe zadanie z wykorzystaniem tablicy znaków (zmienna typu String[n]). Pamiętaj, że pod indeksem 0 kryje się informacja o rozmiarze łańcucha a nie żaden ze znaków! Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Zadania Zadanie 2 Napisz podprogram, który przyjmuje jako parametr tablicę elementów typu String, gdzie pojedynczy element tablicy (pojedyncza zmienna typu String) przechowuje jeden wyraz. Procedura/funkcja przepisuje do drugiej, nowej tablicy tylko wyrazy będące palindromami (mają „oś symetrii”, np. kajak, anna, abcba, itp.). Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Zadania Zadanie 3 W tablicy elementów typu String w pojedynczym elemencie (pojedyncza zmienna typu String) przechowywane jest imię i wiek rozdzielone dowolną liczbą spacji. Napisz podprogram, który podaną jako parametr, wyżej wymienioną tablicę przepisuje do tablicy rekordów w ten sposób, że imię trafia do pola imie (typu String), zaś wiek do pola wiek (typu Byte). Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Zadania Zadanie 4 Napisz program, który zapisuje informacje o osobach do pliku rekordowego (imię, nazwisko, wiek - ilość rekordów podaje użytkownik). Następnie program dla co drugiej osoby (pierwszej, trzeciej, piątej, itp.) sprawdza pole wiek i jeżeli jest mniejsze od 10 to zwiększa jego wartość o 5 uaktualniając plik. Program musi wyświetlić poprawioną bazę osób (imię, nazwisko, wiek, płeć). Wskazówka: pamiętaj, że każda operacja odczytu/zapisu z/do pliku przesuwa wskaźnik położenia w pliku - w tym zadaniu przydatna okaże się procedura Seek do cofania wskaźnika położenia po odczycie/zapisie. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Zadania Zadanie 4 W pliku tekstowym we.txt zapisane są linie składające się z poprawnie zapisanych liczb całkowitych (typu Word) oraz mieszaniny liter i cyfr. Napisz program, który do pliku wy.txt zapisze tylko cyfry (jeśli w danej linii nie ma żadnej poprawnie zapisanej cyfry to nic nie przepisujemy, pomijamy taką linię). Przykład: a3sfs 5dfg 45 044 f45 → 45 044 Wskazówki: do przetwarzania kolejnych elementów w linii tekstu przydatne będą funkcje/procedury Pos, Copy i Delete. Sprawdzenia, czy dany łańcuch znaków (String) jest liczbą można dokonać procedurą Val. Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Bibliografia Andrzej Marciniak. Borland Pascal 7.0. Wydawnictwo Nakom, Poznań, 1994. Keith Weiskamp. Borland Pascal 7.0. WNT, Warszawa, 1996. Rekordy Pliki Zadania Bibliografia Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia Program Rozwojowy Potencjału Dydaktycznego Politechniki Świętokrzyskiej w Kielcach: kształcenie na miarę sukcesu. Priorytet IV Szkolnictwo wyższe i nauka. Działanie 4.1 Wzmocnienie i rozwój potencjału dydaktycznego uczelni oraz zwiększenie liczby absolwentów kierunków o kluczowym znaczeniu dla gospodarki opartej na wiedzy. Poddziałanie 4.1.1 Wzmocnienie potencjału dydaktycznego uczelni. Umowa: uda-pokl.040.01.01-00-175/08-00 Materiały dydaktyczne „Programowanie w języku wysokiego poziomu na przykładzie języka Pascal - część 2” (Moduł nr 12) zrealizowane do Zadania 9 Autorzy: mgr inż. Arkadiusz Chrobot, mgr inż. Karol Wieczorek, mgr inż. Robert Tomaszewski