6602

Szczegóły
Tytuł 6602
Rozszerzenie: PDF
Jesteś autorem/wydawcą tego dokumentu/książki i zauważyłeś że ktoś wgrał ją bez Twojej zgody? Nie życzysz sobie, aby podgląd był dostępny w naszym serwisie? Napisz na adres [email protected] a my odpowiemy na skargę i usuniemy zabroniony dokument w ciągu 24 godzin.

6602 PDF - Pobierz:

Pobierz PDF

 

Zobacz podgląd pliku o nazwie 6602 PDF poniżej lub pobierz go na swoje urządzenie za darmo bez rejestracji. Możesz również pozostać na naszej stronie i czytać dokument online bez limitów.

6602 - podejrzyj 20 pierwszych stron:

O Copyright by Anna Struzi�ska-Walczak, Krzysztof Walczak Warszawa 1994 "Nauka programowania dla ju� nie ca�kiem pocz�tkuj�cych" Autorzy: Anna Struzi�ska-Walczak, Krzysztof Walczak Ksi��ka zawiera wyk�ad nauki programowania na poziomie nieco wy�szym ni� podstawowy. Jest ona kontunuacj� pracy "Nauka programowania dla pocz�tkuj�cych". W ksi��ce s� wyja�nione wszystkie techniki programowania mo�liwe do wykorzystania w j�zyku Pascal ��cznie z obszernym om�wieniem prngramowania obiektowego. Wyk�ad zosta� poprowadzony w spos�b jak najbardziej czytelny i przejrzysty, zamieszczone programy s� bogato skomentowane i opisane, a trudniejsze algorytmy s� zapisane w pseudokodzie. Ksi��ka jest przeznaczona dla wszystkich os�b interesuj�cych si� programowaniem. Mo�e by� tak�e wykorzystywana przez student�w wy�szych uczelni jako podr�cznik do nauki programowania. Uwaga: W wydawnictwie mo�na zakupi� dyskietk� zawier�j�c� kody �r�d�owe program�w zawartych w ksi��ce. Wydawca Wydawnictwo W & W Adres korespondencyjny ul. lb�stoja 1/13 Ol-910 Warszawa tel. 85 90 24 ISBN 83-900519-4-X SPIS TRESCI 1.Wst�p......................................... 5 2.Prostetypydanych.. .... ............8 3.Tablice (uzupe�nienie ).......... # 3.1.Tablice trzywymiarowe. ...11 3.2.Zadania.. ...16 4.Modu�y .. .........17 5. Pliki tekstowe i operacje na tekstach . . . . . . 22 5.1. Pliki input i output. . . 22 5.2. Pliki tekstowe. . . . 23 5.3. Wyprowadzanie danych na drukarkg . . 38 5.4. Operacje na tekstach. . . . 39 5.5. Zadania. . . . 43 6. Pliki elementowe. . . . . . . . . . 7.Zbiory .. .......... 51 7.1. Wprowadzenie. . . 51 7.2. Operacje na zbiorach. . . . 53 7.3. Podstawowe algorytmy. . . 55 7.4. Zadania. . . . . 67 8. Rekordy 8.1. Wprowadzenie. 8.2. Instrukcja with 8.3. Tablice rekord�w 8.4. Zadania. . #q . . 69 . . 74 . . 77 . . 95 Nauka programowania... 9. Rekurencja. . . 9.1. Wprowadzenie 9.2. Algorytmy z powrotami . . 101 9.3. Algorytmy sortowania 116 9.4. Zadania 128 10. Wska�niki. . . . 130 10.1. Wprowadzenie. 130 10.2. Operacje na wska�nikach i zmiennych dynamicznych 133 10.3. Tablice wska�nik�w 134 10.4. Zadania. 140 11. Podstawy programowania obiektowego 14 11.1. Wprowadzenie . 141 11.2. Dziedziczenie 147 11.3. Metody wirtualne. 155 11.4. Rozszerzalno�� obiekt�w. . . 159 11.5. Klasa do tworzenia menu programu. . 161 12. Pro#ramowanie dynamicznych struktur danych z wykorzystaniem programowania obiektowego 173 12.1. Listy 173 12.2. Stosy 241 12.3. Kolejki 249 12.4: Drzewa binarne. . 255 12.5. Zadania 276 1#. Podsumowanie . . . 279 LITERATURA UZUPE�NIAJ�GA. 280 SKOftOWIDZ 282 -4- Rozdzia� WST#P Niniejsza ksi��ka jest drug� z kolei w serii po�wi�conej nauce programowania. Pierwsza to "Nauka programowania dla pocz�tkuj�cych" [20). Zapoznanie sig z t� ksi��k� lub inn� zawieraj�c� podobny materia� oraz rozwi�zanie pewnej liczby przyk�ad�w jest niezb�dne do rozpoczgcia studiowania niniejszej pozycji. Praca ta mo�e by� r�wnie� wykorzystywana przez bardziej zaawansowanego Czytelnika, kt�ry chce pozna� techniki programowania obiektowego. Jak wskazuje sam tytu�, ksi��ka ta jest po�wi�cona nauce programowania na poziomie nieco wy�szym ni� podstawowy. Zak�adamy, �e Czytelnik posiada ju� podstawow� umiejgtno�� programowania i potrafi wykorzysta� instrukcje steruj�ce, tablice oraz podprogramy. Obecnie postaramy sig nauczy� Czytelnika programowa� z wykorzystaniem wszystkich mechanizm�w dost�pnych w j�zyku Pascal ��czni# z programowaniem obiektowym. Podobnie jak w pracy [20] jako j�zyk do nauki programowania wybrali�my jgzyk lhrbo Pascal w wersji 6.0 (mo�liwo�� programowania obiektowego jest dostgpna od wersji 5.5 j�zyka). Drogi Czytelniku, numer wersji danego j�zyka przy nauce programowania naprawdg nie jest istotny. Wa�ne jest jedynie, aby dana wersja posiada�a wszystkie wyk�adane mechanizmy. Ucz�c sig programowa�, nie nale�y zatem przejmowa� si� tym, �e ukaza�a sig ju� nowsza wersja j�zyka. Nale�y podkre�li�, �e ksi��ka nie zawiera pe�nego opisu j�zyka ltzrbo Pascal (nie zosta�y omowione mniej istotne w nauce programowania szcze -5- Nauka programowania... g�y jgzyka). Jest to ksi��ka do nauki programowania, a nie praca po�wi�cona samemu j�zykowi. Pe�ny opis j�zyka 'Itzrbo Pascal mo�na znale�� w pracach [6,13,14]. Materia� przedstawiony w ksi��ce mo�na podzieli� na kilka cz�ci. Pierwsza jest po�wi�cona uzupe�nieniu podstawowych wiadomo�ci dotycz�cych typ�w danych, wykorzystania tablic trzywymiarowych oraz projektowaniu modu��w (rozdz. 2,3,4). Cz�� druga omawia algorytmy stosowane przy przetwarzaniu plik�w i techniki stosowane w operacjach na zbiorach oraz rekordach (rozdz. 5-8). Nast�pna cz�� jest po�wigcona projektowaniu algorytm�w rekurencyjnych (rozdz. 9). Kolejna cz�� pod�je techniki programowania z wykorzystaniem wska�nik�w (rozdz. 10). Cz�� pi�ta zawiera wprowadzenie do programowania obiektowego (rozdz. 11). Ostatnia bardzo obszerna cz�� ksi��ki to om�wienie technik stosowanych przy przetwarzaniu list, stos�w, kolejek i drzew binarnych z jednoczesnym wykorzystaniem programowania obiektowego (rozdz.12). W ksi��ce znajduje si� wiele progi'am�w wraz z zaprojektowanymi algorytmami. Podobnie jak w pracy [20) algorytmy s� zapisywane n�jpierw w pseudo-kodzie. Zamieszczone przyk�ady s� ju� o wiele trudniejsze ni� podane w [20], wi�kszo�� z nich bazuje na klasycznych algorytmach wykorzystywanych w nauce programowanie i maj�cych jednocze�nie du�e zastosowanie praktyczne. Mo�na tu wymieni� zw�aszcza algorytmy sortowania szybkiego i przez scalanie, programy wykorzystuj�ce algorytm nawrotu oraz algorytmy stosowane przy przetwarzaniu list oraz drzew binarnych. Projektowanie algorytm�w powinno przebiega� w oparciu o systematyczne techniki ich projektowania. Do podstawowych technik nale�� projektowanie wst�puj�ce i zst�puj�ce. Projektowanie wst�puj�ce polega na rozpocz�ciu projektowania od wyodr�bnienia w danym algorytmie niepodzielnych cz�ci, kt�re nast�pnie ��c#y si� w wi�ksze jednostki tak d�ugo, a� otrzymamy rozwi�zanie danego problemu. Mo�na je okre�li� jako projektowanie od szczeg�u do og�u. Natomiast projektowanie zst�puj�ce polega na zaprojektowaniu algorytmu w pierwszym etapie bez rozpatrywania szczeg��w. Cz�ciami sk�adowymi algorytmu s� bloki funkcjonalne realizuj�ce �ci�le okre�lone operacje, kt�re nast�pnie w dalszej fazie projektowania u�ci�la si� tak d�ugo, a� dojdzie si� do operacji mo�liwych do zaprojektowania bezpo�rednio. Okre�lamy je jako projektowanie od og�u do szczeg�u. W niniejszej ksi��ce b�dziemy wykorzystywa� obie wymienione techniki projektowania algorytm�w. Mamy nadziej�, �e Czytelnik bez trudu zorientuje si�, kt�ra technika zosta�a wykorzystana w konkretnym przypadku. -6- 1. Wst�p Ca�y podany materia� zosta� wy�o�ony w spos�b jak n�jbardziej czytelny i przejrzysty, zamieszczone programy s� bogato skomentowane i opisane, a wszystkie trudniejsze algorytmy s� zapisane w pseudo-kodzie. Po ka�dym rozdziale s� podane przyk�adowe zadania utrwal�j�ce wy�o�ony materia�. Ksi��ka jest przeznaczona dla wszystkich os�b interesuj�cych sig programowaniem. Mo�e by� tak�e wykorzystywana jako podrgcznik do nauki programowania przez student�w wy�szych uczelni. -7- Rozdzia� PROSTE TYPY D##NYCH W poprzedniej ksi��ce [20] pierwszej w eyklu po�wi�conym nauce programowania wprowadzili�my nast�puj�ce typy danych: ca�kowity, rzeczywisty, znakowy, �a�cuchowy oraz logiczny. Obecnie om�wimy typy danych, kt�re mog� zosta� zdefiniowane przez programist�. Nale�y do nich typ wyliczeniowy oraz typ okrojony. Z#p wyliczeniowy jest definiowany nast�puj�co: type nazwa = (sl,...,s#) gdzie nazwa jest nazw� typu, a s; s� identyfikatorami sta�ych, kt�rych warto�ci rrio�e przyjmowa� zmienna danego typu. Przyk�ad type mebl e = C stol, krzesl o, szafa, wersal ka ) ; var ml,m2: meble; W przyk�adzie zdefiniowano typ wyliczeniowy meble oraz zmienne ml oraz m2 typu meble. Warto�ci typu wyliczeniowego nie mo�na wczytywae ani drukowa� w normalny spos�b. Mo�na je natomiast wykorzystywa� w relacjach, funkcjach i instrukcjach przypisania. Przyk�ady program�w, w kt�rych wyko 2. Proste typy danych rzystano typ wyliczeniowy s� podane w rozdziale 7. 1#p okrojony jest to podzbi�r warto�ci typu ca�kowitego, znakowego, logicznego lub wyliczeniowego.1#p ten defniujemy nast�puj�co: type nazwa = min..max gdzie nazwa jest nazw� typu, min jest dolnym a max g�rnym ograniczeniem warto�ci, jakie mo�e przyjmowa� zmienna typu okrojonego. Przyk�ad type litera = 'a'..'z'; tydzien = C poniedzialek, wtorek, sroda, czwartek, piatek sobota niedziela ); robocze = poniedzialek..piatek; zakres =10. .20; var 11,12:litera; dni: robocze; zl,z2: zakres Zmienne 11,12, dni, zl, z2 s� typu okrojonego i mog� przyjmowa� nast�puj�ce warto�ci: zmienne 11 i 12 - litery 'a ', 'b ',..., 'z ' zmienna dni - poniedzialek, wtorek, sroda, czwartek, piatek zmienne zl, z2 - liczby z przedzia�u <10,20> l#py integer, char, Boolean oraz wprowadzony wy�ej typ wyliczeniowy i okrojony s� tak zwanymi typami porz�dkowymi. Charakteryzuj� si� one tym, �e m�na je uporz�dkowa� i dla danej warto�ci poda� warto�� poprzed= ni� i nast�pn�. Dla typ�w porz�dkowych mo�na wykorzystywa� szereg u�ytecznych funkcji standardowych. Funkcja succ(arg) podaje warto�� nast�pn� w danym typie po warto�ci argumentu. Funkcja pred(arg) podaje warto�� poprzedni� w danym typie przed warto�ci� argumentu. Funkcja ord(arg) podaje numer, jaki warto�� argumentu zajmuje w danym typie. Przyk�ad type tydzien = C poniedzialek, wtorek, sroda, czwartek, pi atek, sobota, ni edzi el a ) ; var -9- Nauka programowania... d: tydzien; x:integer; Przy powy�szej deklaracji funkcja succ(sroda) pod�je warto�� czwartek, a funkcja succ(11) warto�� 12. Warto�ci� funkcji pred(wtorek) jest poniedzialek, a funkcji pred(15) warto�� 14. Funkcja ord(piatek) podaje warto�� 5, a funkcja ord(13) warto�� 13 (podawany numer jest taki jak dana warto�� ca�kowita). ' lO ' Rozdzia� TABLICE (UZUPE#NIENIE) 3.1. Tablice trzywymiarowe W pracy [20] podano szereg przyk�ad�w ilustruj�cych wykorzystanie tablic, ale tylko tablic jedno i dwuwymiarowych. W jgzyku Pascal tablice mog� mie� wigcej wymiar�w. W zaprezentowanym obecnie przyk�adzie wykorzystamy tablicg o trzech wymiarach. # Przyk�ad Napisa� program obliczania sumy element�w le��cych na dowolnej przek�tnej w tablicy trzywymiarovvej kwadrat#wej. Tablic� trzywymiarow� oraz jedn� przek�tn� g��wn� i jedn� boczn� ilustruje rys. 3.1. Zastan�wmy si� teraz nad algorytmem obliczania sumy element�w le��cych na dowolnej przek�tnej w tablicy trzywymiarowej. Najwa�niejsze jest oczywi�cie wyznaczenie wsp�rz�dnych poszczeg�lnych element�w. Wyobra�my sobie najpierw tablicg trzywymiarow� jako n tablic dwuwymiarowych po�o�onych jedna nad drug�. Rozwa�my na pocz�tek przek�tn� po�o�on� w pierwszej tablicy dwuwymiarowej. Um�wmy sig jeszcze, �e element tablica[i,j,k] oznacza element le��cy w i-tej tablicy dwuwymiarowej Nauka programowania... ftys. 3.1. Przyk�adowa tablica trzywymiarowa na przecigciu j-tego wiersza i k-tej kolumny. Na rys. 3.2 przedstawiono indeksy pierwszej tablicy dwuwymiarowej. lll 112 113 121 122123 131 132133 Rys. 3.2. Indeksy pierwszej tablicy dwuwymiarowej Przy pomocy pogrubienia zaznaczono indeksy jednej z dw�ch przek�tnych. Jeden z ko�c�w przek�tnej ma indeksy 111, a drugi koniec indeksy 133. Wykorzystany algorytm polega na znalezieniu liczby element�w prze- � k�tnej oraz trzech warto�ci oznaczanych w programie przy pomocy dx,dy,dz podaj�cych, o ile musz� sig zmieni� indeksy tablicy. Warto�� dx podaje zmian� dla zmiennej i, dy okre�la zmian� dla zmiennej j, a dz wyznacza zmiang-dla zmiennej k. W analizowanym przypadku dx ma warto�� 0, dy warto�� 1 oraz dz warto�� 1. Warto�ci te wyznacza si� przy pomocy poni�szej konstrukcji, ktor� dla przyk�adu podamy dla zmiennej x (wyra�enie to ma sens, wtedy gdy x2 - xl jest r�ne od zera): dx := Cx2 - xl) div absCx2 - xl); gdzie operator div wykonuje dzielenie ca�kowite. Jak �atwo mo�na zauwa�y�, warto�� ta mo�e by� r�wna albo +1 albo -1. Liczb� krok�w wyznaczamy przy pomocy konstrukcji: kroki := abs Cx2 - xl ) + 1; oczywi�cie tylko wtedy, gdy x2 - xl jest r�ne od zera. Poniewa� tablice dwuwymiarowe s� kwadratowe, to nie ma znaczenia, z obliczenia kt�rej zmiennej wyznaczymy warto�� kroku. Obliczenie sumy element�w le��cych na dowolnej przek�tnej odbywa si� ju� w bardzo prosty -12 - 3. Tablice (uzupe�nienie) spos�b poprzez wykonanie w p�tli nast�puj�cych instrukcji: suma := suma + tCi,j,k] ; C ustawienie wsp�lrzgdnych nastgpnego elementu przek#tnej ) k:=k+dz; j:=j+dy; i := i +dx; A oto kompletny program realizuj�cy omawiane zadanie. Program 3.1 program Trzywymiary; f Program obliczania sumy element�w le�#cych na dowolnej przek�tnej) constn=3: type tablica = array Cl..n,l..n,l..n] ofinteger; var t : tabl i ca ; f anal i zowana tabl i ca ) xl,yl,zl, ( wspdlrzgdnejednego ko�ca przek�tnej ) x2,y2,z2: f wspblrzgdne drugiego ko�ca przek�tnej ) integer; procedure Czytaj Cvart: tablica); ( Procedura wczytywania element�w tablicy trzywymiarowej ) var i, j, k : i nteger ; { zmi enne kontro I ne pgt I i ) begin for i :=1 to n do for j :=1 to n do fork:=ltondo . begin write C'C',i:2,',',j#2,',',k:2,') = '); readln Ct Ci,j,k]) end end; procedure Drukuj Ct: tablica); ( Procedura drukowania element�w tablicy trzywymiarowej ) var i, j, k : i nteger ; ( zmi enne kontrol ne pgtl i ) begin fori:=ltondo Nauka programowania... begin for j :=1 to n do begin fork:=ltondo write Ct Ci,j,k]:4); wri tel n end; writeln end end; function Przekatna Ct: tablica; xl,yl,zl,x2,y2,z2:integer):integer; ( Funkcja obl i czani a sumy el ement�w 1 e�dcych na przekdtnej owsp�rzgdnych jednego ko��a xl,yl,zl i wsp�rz�dnych drugi ego ko�ca x2,y2, z2 ) var i, j, k : i nteger ; ( zmi enne wyznaczaj #ce kol ejne el ementy na przek#tnej ) dx, ( zmi ana w ki erunku x ) dy, ( zmi ana w ki erun ku y ) dz : ( zmi ana w ki erunku z ) integer; suma : integew; ( suma el ement�w na przek#tnej ) kroki, 11 i czba el ement�w na przek�tnej ) ster : f zmi enna steruj dca obl i czani em sumy el ement�w ) integer; begin, dx := 0; dy := 0; dz := 0; kroki :=1; if x2 - xl C# 0 then # begin dx := (x2 - xl) div absCx2 - xl); kroki := absCx2 - xl ) + 1 end; if y2 - yl C# 0 then begin dy := Cy2 - yl ) di v abs Cy2 - yl ) ; kroki := absCy2 - yl ) + 1 end; -14 - 3. Tablice (uzupe�nienie) if z2 - zl C> 0 then begin dz := Cz2 - zl) div absCz2 - zl); kroki := absCz2 - zl ) + 1 end; suma :=0; i := xl ; j := yl ; k := zl ; for ster :=1 to kroki do begin suma := suma + tCi,j,k] ; C ustawienie wsp�lrzgdnych nast�pnego elementu przekatnej ) k := k + dz ; j:=j+dy; i := i + dx end; przekatna := suma end; begin writeln C'Wczytanie tablicy trzywymiarowej:'); Czytaj Ct); writeln C'Wczytane warto�ci:'); Drukuj Ct); wri tel n ; writeln C'Wsp�lrzgdne punktu poczatkowego'); readlnCicl,yl,z1); writeln C'Wspdlrzgd_ne#-unktu ko� Gswego'); readln Cx2,y2,z2); fsprawdzenie czy wczytane wsp�rz�dne nie wyprowadzaj# poza tabl i c� ) if Cxl in [1. .n]) and Cyl in [1. .n]) and Czl in [1. .n]) and Cx2 in [1. .n]) and Cy2 in [1. .n)) and Cz2 in [1. .n]) then writeln C'Przekatna C',xl,',',yl, '.',zl,') - C'.x2,',',y2, ,',z2,') = ',Przekatna Ct,xl,yl,zl,x2,y2,z2)) el se -15 - Nauka programowania... end. writeln('B�ad danych') 3.2. Zadania 1. Napisa� program znajdowania minimalnego i maksymalnego elementu w tablicy tr�jwymiarowej oraz jego po�o�enia. 2. Napisa� program tworzenia wektora zawieraj�cego sumy element�w tablic dwuwymiarowych odpowiadaj�eych pierwszemu indeksowi tablicy trzywymiarowej. 3. Napisa� program wyznaczania iloczynu oraz sumy element�w tablicy trzywymiarowej r�nych od zera. 4. Napisa� program wyznaczania sumy tych element�w tablicy trzywymiarowej, kt�rych wszystkie indeksy s� liczbami parzystymi. -16 - Rozdzia� MODU#Y Jak ju� wspomniano w ksi��ce [20], w systemie ltzrbo Pascal procedury i funkcje standardowe s� umieszczane w tak zwanych modu�ach. Modu�em podstawowym jest modu� System, kt�ry jest automatycznie do��czany do ka�dego programu. Ponadto istniej� jeszcze modu�y Dos, Crt, Graph, Printer i Overlay. Przypomnijmy jeszcze, �e je�li chcemy wykorzysta� procedury i funkcje zawarte w tych modu�ach, to nale�y w czg�ci g��wnej programu bezpo�rednio po instrukcji prngram u�y� instrukcjg uses. Obecnie wyja�nimy metodg tworzenia w�asnych modu��w, w kt�rych mo�na umie�ci� zaprojektowane procedury i funkcje. Modul tworzy sig w nastgpuj�cy spos�b. Piszemy najpierw s�owo kluczowe unit, po kt�rym podajemy nazw� modu�u. Nazwa pliku, w kt�rym znajduje sig modu�, powinna by� taka sama jak nazwa modu�u. W tre�ci modu�u mo�emy wyr�ni� trzy cz�ci: opisow�, implementacyjn�#oraz iz#icjuj�c�. Cz�� inicjuj�ca musi ko�czy� sig kropk�. Utworzone modu�y powinny by� przechowywane w plikach o rozszerzeniu.pas. Plik ten nale�y skompilowa� w analogiczny spos�b jak program, a tekst wynikowy zostanie zapisany w pliku o rozszerzeniu.tpu. Aby wykorzysta� skompilowany modu� w programie, nale�y poda� jego nazw� w instrukcji uaes. W�wczas wszystkie procedury i funkcje zdefniowane w module b�d� dost�pne w danym programie. -17 - Nauka programowania... deklaracje modu��w Cze�� opisowa definicje typ�w i sta�ych definic#e zmiennych lista nag��wk�w procedur i funkcji im I#m#nt#li0n de#nicje procedur i funkcji, kt�ry#h nag�bwki podano CzB�� implementacyjna w cze�ci interface definicje typ�w, sta�ych i zmienny#ch dost�pnych wyt�cznie wewn#tn modu�u Cze�� inicjujaca { instrukcja z�o�ona lub s�ovr# kluczowe #nd ftys. 4.1. Struktura modu�u Przyk�ad Modu� podany w przyk�adzie zawiera dwie procedury Czyt�j oraz Drukuj, kt,�re zosta�y zaprojekt,owane w poprzednim rozdziale. Procedura Czyt�j s�u�y do wprowadzania danych do tablicy trzywymiarowej, a procedura Drukuj umo�liwia wyprowadzanie danych. Procedury te mog� by� wykorzystywane r�wnie� w innych programach, dlat.ego jest celowe umieszczenie ich w module. Tre�� modu�u zamieszczono poni�ej. unit Wprowadz; interface con5t n=3; type tabl,ica = array C1. .n,l. .n,l. .n] of integer; procedure Czytaj Cvar t: tablica); procedure Drukuj Ct:tablica); implementation procedure Czytaj Cvar t: tablica); { Procedura wczytywania element�w tablicy trzywymiarowej) vari,j,k:integer; begin fori:=ltondo for j :=1 to n do fork:=Itondo -18 - 4. Modu�y begin write C'C',i:2,',',j:2 k:2,')= '); readln Ct Ci][j][k]) end end; procedure Drukuj Ct:tablica); ( Procedura drukowania element�w tablicy trzywymiarowej ) var i,j,k: integer; begin for i :=1 to n do begin for j :=1 to n do begin for k :=1 to n do write Ct Ci][j][k]:4); wri tel n end; writeln end end; end. Obecnie poka�emy na przyk�adzie programu obliczania sumy element�w na dowolnej przek�tnej tablicy trzywymiarowej wykorzystanie zaprojektowanego wy�ej modu�u Wprowadz. W celu u�ycia zamieszczonych tam procedur Czytaj oraz Drukuj wystarczy (po skompilowaniu modu�u) poda� w programie instrukcj�: uses Wprowadz; a tre�ci tych #rocedur nie potrzeba ju� zamieszcza�. Gdyby procedura Przekatna- mia�a by� t#ykorzystywana w innych programach, to r�wnie� mo�na j� umie�ci� w module. W przedstawionym ni�ej programie procedura ta jest podana bezpo�rednio w tre�ci programu. Program 4.1 program Trzywymiary; fProgram obliczania sumy element�w le��cych na dowolnej przek#tnej) uses Wprowadz; var t : tabl i ca ; C anal i zowana tabl i ca ) -19 - Nauka programowania... xl,yl,zl, t wsp�lrz�dnejednego ko�ca przek�tnej ) x2,y2,z2: C wsp�lrzgdne drugiego ko�ca przekatnej ) integer; function Przekatna Ct: tablica; xl,yl,zl,x2,y2,z2: integer):integer; ( Funkcja obliczania sumy element�w le��cych na przek�tnej o wsp�lrzgdnychjednego ko�ca xl,yl,zl i wsp�lrzgdnych drugi ego ko�ca x2,y2, z2 ) var i,j,k:integer; ( zmienne wyznaczaj�ce kolejne elementy na przek�tnej ) dx, f zmi ana w ki erunku x ; dy, � zmi ana w ki erunku y ) dz : ( zmi ana w ki erunku z ) integer; suma: integer; ( suma element�w na przek�tnej ) kroki, ( 1 i czba el ement�w na przek#tnej ) ster : ( zmi enna steruj �ca obl i czani em sumy el ement�w ) integer; begin dx := 0; dy := 0; dz := 0; kroki :=1; if x2 - xl C# 0 then begin dx := Cx2 - xl) div absCx2 - xl); kroki := absCx2 - xl ) + 1 end; ify2 - yl C# 0 then beg;in dy := Cy2 - yl ) di v abs Cy2 - yl ) ; kroki := abs(y2 - yl) + 1 end; if z2 - zl C# 0 then begin dz := Cz2 - zl) div absCz2 - zl); kroki := abs(z2 - zl) + 1 end; -20- 4. Modu�y suma :=0; i := xl ; j := yl ; k := zl ; for ster :=1 to kroki do begin suma := suma + tCi,j,k]; f ustawienie wspblrz�dnychnastgpnego elementu przekdtnej ) k:=k+dz; j:=j+dy: i := i + dx end; przekatna := suma end; begin writeln C'Wczytanie tablicy trzywymiarowej:'); Czytaj Ct); writelnf'Wczytane warto�ci:'); Drukujft); wri tel n ; writelnf'Wsp�rzgdne punktu poczatkowego'); readlnfxl,yl,zl); writelnf'Wsp�#rzgdne punktu ko�cowego'); readlnfx2,y2,z2); if fxl in [1. .n]) and fyl in [1. .n]) and Czl in [1. .n]) and fx2 in [1. .n]) and Cy2 in [1. .n]) and fz2 in [1. .n]) then writelnf'Przekatna f',xl,',',yl, ',',zl,') -f',x2,', ,y2, ',',z2,') = ',Przekatna Ct,-xl,yl,zl;x2,y2,z2)) el se writelnf'Bl#d danych') end - 21- Rozdzia� PLIKI TEKSTOWE I OPER#AC#E NA TEKSTACH W niniejszym rozdziale om�wimy pliki tekstowe tzn. takie, w kt�rych dane s� przedstawiane w postaci ci�gu znak�w. W nast�pnym rozdziale om�wimy pliki elementowe, w kt�rych dane s� przedstawiane w postaci zakodowanej, niemo�liwej do odczytania przez edytor. 5.1. Pliki input i output Pliki input i output s� standardowymi plikami tekstowymi zawier�j�cymi dane do programu i wyniki wykonania programu. Plik input mo�e by� wczytywany tylko jeden raz, natomiast inne pliki tekstowe mog� by� wczytywane wielokrotnie. Do wprowadzania danych i wyprowadzania wynik�w s�u�� instrukcje read, readln, write, writeln, kt�re zosta�y om�wione w ksi��ce [20) pierwszej w cyklu po�wi�conym nauce programowania. Przy wprowadzaniu i wyprowadzaniu danych mo�na wykorzystywa� funkcjg eofi) stwierdzaj�c�, czy osi�gn�li�my koniec pliku oraz funkcj� eoln() stwierdz�j�c� czy osi�gngli�my koniec linii. Wykorzystanie tych funkcji -22- 5. Pliki tekstowe i operacje na tekstach zostanie om�wione w nast�pnym punkcie po�wigconym plikom tekstowym. 5.2. Pliki tekstowe Pliki tekstowe s� to pliki zawieraj#ce informacj� niezakodowan�, czyteln� w bezpo�redni spos�b. Plik tekstowy deklarujemy w spos�b nastgpuj�cy: var nazwa#pliku: text; gdzie nazwa plikujest nazw� tak zwanej zmiennej plikowej. Przed wykonaniem jakichkolwiek operacji na tek�cie przechowywanym w pliku na dysku powinni�my najpierw przyporz�dkowa� nazwg pliku dyskowego do konkretnej zmiennej plikowej wykorzystywanej w programie. Do tego celu s�u�y procedura standardowa assign. Jej wywo�anie jest postaci: assign(nazwa#pliku, nazwa dysk); gdzie nazwa pliku jest nazw� zmiennej plikowej w programie, a nazwa dysk jest nazw� pliku na dysku. Nast�pnie nale�y otworzy� plik przy pomocy jednej ze standardowych procedur rewrite, reset lub append. Dokonuje sig tego w spos�b nast�puj�cy: rewrite(nazwa pliku); lub reset(nazwa pliku); lub append(nazwa pliku); Mi�dzy procedurami reset oraz rewrite istnieje drobna ale istotna r�nica. Ot� procedura reset.otwiera tylko ju� istniej�cy plik (w przypadku pr�by otwarcia nie istniej�cego pliku zostanie zasygnalizowany b��d). Natomiast procedura rewrite otwiera dany plik nawet wtedy, gdy nie istnia� on poprzednio na dysku. Jednak przy zastosowaniu tej procedury jest wymagana szczeg�lna ostro�no��. Je�li plik istnia� na dysku, to u�ycie procedury rewrite spowoduje nadanie mu zerowej d�ugo�ci. Procedura append powoduje otwarcie pliku wy��cznie do zapisu (dane b�d� dopisywane na koniec pliku). Po wykonaniu ��danych operacji na pliku nale�y go koniecznie zamkn�� przy pomocy procedury close o postaci: close(nazwa pliku); -23- Nauka programowania... Zapisywanie i odczytywanie danych z plik�w tekstowych dokonujemy przy pomocy instrukcji read, readln, write oraz writeln, kt�re zosta�y om�wione w [20]. Obecnie instrukcje te wzbogacimy o podanie nazwy pliku. Po tym uzupe�nieniu posta� tych instrukcji jest nast�puj�ca: read(nazwa pliku,lista argument�w); write(nazwa pliku,lisfa argumenf�w); Poni�sze przyk�ady zilustruj� wykonywanie operacji na plikach tekstowych. Przyk�ad W przyk�adzie podarny program realizuj�cy zapisywanie i odczytywanie danych z plik�w tekstowyeh. Po uruchomieniu programu mo�na obejrze� zawarto�ci utworzonych plik�w tekstowych. B�dziemy wykorzystywa� trzy pliki, wszystkie tekstowe, z kt�rych jeden przechowuje liczby ca�kowite, drugi liczby rzeczywiste, a trzeci znaki. Program 5.1 program Tekst 0 ; ( Program i 1 u5truj#ey zapi sywani e i odczytywani e danych z pl i k�w tekstowych ) const n=10; var pl i kcal k,( pl i k z 1 i czbami cal kowi tymi ) pl i krzecz,[ pl i k z 1 i czbami rzeczywi stymi ) pl i k#l ow : ( pl i k ze znakami ) text; i, [ zmi enna kontrol na p�tl i ) m: i nteger ; ( zmi enna pomocni cza ) `x, y: real ; ( zmienne pomocnicze ) slowo: string[10]; f zmienna pomocnicza ) begin assi gn Cpl i kcal k, 'tl ' ) ; ( przyporz#dkowani e nazwy do pl i ku ) rewri te C pl i kcal k ) ; ( otworzeni e pl i ku ) assign Cplikrzecz,'t2'); rewrite Cplikrzecz); assign Cplikslow,'t3'); rewrite Cplikslow); -24- 5. Pliki tekstowe i operacje na tekstach for i :=1 to n do write Cplikcalk,i:4); fori:=ltondo begin x:=0.345*i; writeCplikrzecz, x:8:3 ) end; fori:=ltondo write Cplikslow,'a'); reset C pl i kcal k ) ; f otworzeni e pl i ku ) whi 1 e not eof C pl i kca 1 k ) do begin read Cplikcalk,m); write Cm:8) end; writeln; reset Cplikrzecz); whi 1 e not eof C pl i krzecz) do begin read Cplikrzecz,y); write Cy:10:3) end; wri tel n; reset Cplikslow): while not eof Cplikslow) do begin read Cplikslow,slowo); writeCslowo, '' ) end end. Przyk�ad 1#-e�ci� przyk�adu jest procedura urno�liwiaj�ca kopiowanie zawarto�ci pliku tekstowego linia po linii. W podanym programie warto zwr�ci� uwag� na -25- Nauka programow#nia.. wykorzystanie funkcji eofi), kt�ra podaje warto�� true, je�eli napotkamy koniec pliku. Program 5.2 program Tekst#l; f Kopi owani e pl i ku tekstowego 1 i ni ami ) var pi erwszy, f pl i k pi erwszy ) drugi : f pl i k drugi ) text; 1i ni a : stri ng[80] ; f jedna 1i ni a tekstu ) nazwa 1, f nazwa pl i ku pi erwszego ) nazwa#2: f nazwa pl i ku drugi ego l string C20]; procedure Kopiuj Cnazwa#l,nazwa#2: string); f Procedura kopi owani a pl i k�w ) begin assignCpierwszy,nazwa#l); f przyporz#dkowanie nazwy do pliku ) reset C pi erwszy ) ; f otworzeni e pl i ku ) assign Cdrugi,nazwa 2); rewri te Cdrugi ) ; f otworzeni e pl i ku ) whi 1 e not eof C pi erwszy ) do begin f odczytanie jednej linii tekstu ) ' readln Cpierwszy,linia); f zapi sani e jednej 1 ini i tekstu ) writelnfdrugi,linia) end; cl ose C pi erwszy ) ; f zamkni �ci e pl i ku ) close Cdrugi); wri tel n C ' Skopi owano pl i k ', nazwa#l, ' do pl i ku ',nazwa#2 ) end; begin writeln C'Podaj nazw� pliku wej�ciowego:'); readln Cnazwa#l); -26- 5. Pliki tekstowe i operacje na tekstach writeln('Podaj nazwg pliku wyj�ciowego:'); readln Cnazwa 2); Kopi uj Cnazwa#l,nazwa 2 ) f skopi owani e pl i ku o nazwi e nazwa#l ) end. Przyh�ad W odr�nieniu od poprzedniego przyk�adu obecnie podamy procedurg kopiowania pliku tekstowego znak po znaku. Procedura ta zostanie wykorzystana w programie l#ekst 2. Warto zwr�ci� uwagg na funkcjg eoln(), kt�ra umo�liwia przetwarzanie znak�w umieszczonych w jednej linii. Funkcja ta podaje warto�� true, gdy napotkano koniec pliku. Program 5.3 program Tekst 2 ; f Kopi owani e pl i ku tekstowego znak po znaku ) var pi erwszy, f pl i k pi erwszy ) drugi : f pli k drugi ) text; znak: char; f jeden znak tekstu ) nazwa#l, f nazwa pl i ku pi erwszego ) nazwa#2: f nazwa pl i ku drugi ego ) string[20]; procedure Kopiuj Cnazwa#l,nazwa#2: string); f Procedura kopi owani a pl i kdw ) begin assign(pierwszy,nazwa#l); f przypisanie nazwy ) reset C pi erwszy ) ; f otworzeni e pl i ku ) assign Cdrugi,nazwa 2);# rewrite Cdrugi); whi 1 e not eof( pi erwszy ) do begin f skopi owani e do ko�ca 1 ini i ) while not eoln Cpierwszy) do begin read Cpierwszy,znak); write Cdrugi,znak) -27- Nauka programowania... end; readlnCpierwszy); f odczytanie znaku ko�ca linii ) wri tel n Cdrugi ) f zapi sani e znaku ko�ca 1 i ni i ) end; cl ose C pi erwszy ) ; f zamkni �ci e pl i ku ) close Cdrugi); writeln C'Skopiowano plik end; ', nazwa#l, ' do pl i ku ',nazwa#2) begin writeln C'Podaj nazwg pliku wej�ciowego:'); readln Cnazwa 1); writeln C'Podaj nazwg pliku wyj�ciowego:'); readln Cnazwa 2); Kopi uj Cnazwa#l, nazwa 2 ) f skopi owani e pl i ku o nazwi e nazwa#l ) end. Przyk�ad W przyk�adzie podamy procedurg umo�liwiaj�c� podanie liczby znak�w zawartych w pliku tekstowym. Wykorzystany algorytm polega na przejrzeniu wszystkich znak�w w tek�cie i zliczeniu ich liczby. Przegl�danie odbywa sig linia po linii z wykorzystaniem funkcji eoln(). Progra#z 5.4 program Tekst 3 ; f Program zliczania znak�w ) var - pl i k : t"ext ; f pl i k, w kt�rym zostan# zl i czone znaki ) n : i nteger ; f 1 i czba znak�w w pl i ku ; nazwa: string[12]; f nazwa pliku ) procedure Znaki Cnazwa: string; varliczba:integer); f Procedura zl i czani a znak�w w pl i ku, nazwa - nazwa pl i ku, 1 i czba - 1 i czba znak�w w pl i ku ) var znak: char; f jeden znak tekstu ) -28- 5. Pliki tekstowe i operacje na tekstach begin assign Cplik,nazwa); reset Cplik); 1 i czba := 0 ; whi 1 e not eof C pl i k ) do begin ( przetwarzaniejednej linii tekstu ) while not eoln Cpl i k) do begin read Cplik,znak); 1 i czba :=1 i czba + 1 end; readlnCplik) f wczytanie znaku ko�ca linii ) end; close Cplik) end; begin writeln C'Podaj nazw� pliku'); readln Cnazwa); Znaki Cnazwa.n); writelnC 'Liczba znak�w w pli ku ',nazwa, ' wynosi ',n:5) end. Przyklad W odr�nieniu od poprzednie;gn przyk�adu tematem kt�rego by�o podanie liczby znak�w tekstu, obe�nie zaprojektujemy procedurg, kt�ra umo�liwia wyznaczenie liczby wierszy tekstu. Podobnie jak w poprzednim przyk�adzie s� przegl�dane wszystkie znaki te#stu, a obliczanie liczby wierszy odbywa si� dopiero w momencie zako�czenia przegl�dania danego wiersza tekstu. Program 5.6 program Tekst 4; C Program obl i czani a 1 i czby wi erszy w pl i ku tekstowym ; var pl i k : text ; i pl i k, w ktbrym zostan# zl i czone wi ersze ) -29- Nauka programowania... n : i nteger ; { 1 i czba wi erszy w pl i ku ) nazwa : string[12] ; { nazwa pl i ku ) procedure Wiersze Cnazwa: string; varliczba:integer); { Procedura obl i czani a 1 i czby wi erszy ) var znak : char ; { j eden znak w pl i ku ) begin assign Cplik,nazwa); reset Cplik); liczba := 0; whi 1 e not eof C pl i k ) do begin { przetwarzani e jednego wi ersza tekstu ) while not eoln Cpl i k) do read Cplik,znak); readln Cplik); 1 i czba :=1 i czba + 1 { zwi �kszeni e 1 i czby wi erszy ) end; close Cplik) end; begin writeln C'Podaj nazwg pliku'); readln Cnazwa); Wiers#e Cnazwa,n); writelnC 'Liczba wierszy w pliku ',nazwa, ' wynosi ',n:5) end. Przyk�ad Przyk�ad jest po�wigcony obliczeniu liczby s��w w pliku tekstowym. Zak�adamy, �e poszczeg�lne s�owa s� oddzielone znakiem spacji, tabulacji lub ko�cem linii. Ponadto zak�adamy, �e mi�dzy s�owami mo�e by� tylko jeden znak spacji. Obliczenie liczby s��w realizuje procedura Slowa, kt�rej algorytm jest podany poni�ej. Algorytm 5.1. podczas gdy nie napotkano symbolu ko�ca pliku wykonuj '3O' II 5. Pliki tekstowe i operacje na tekstach wczytaj znak je�li znak jest symbolem ko�ca s�owa to zapami�taj, �e nowe s�owo w przeciwnym przypadku je�li nowe s�owo to zwi�ksz licznik s��w zapami�taj, �e nie nowe s�owo A oto program t#stuj�cy procedurg Slowa. Program 5.? program Tekst#5: ( Program obl i czani a 1 i czby sl6w w pl i ku tekstowym ) Con St TABU LACJA = 9 ; var pl i k : text ; f pl i k, w kt�rym zostand zl i czone slowa ) n : i nteger ; ( 1 i czba s� 6w w pl i ku ) nazwa : stri ng[12) ; ( nazwa pl i ku ) procedure Slowa Cnazwa: string; varliczba:integer); ( Procedura obl i czani a 1 i czby sl6w w pl i ku ) var znak: char; ( jeden znak z pl"iku ) noweslowo: boolean; begin . assign Cplik,nazwa); reset Cplik); liczba :=0; whi 1 e not eof C pl i k ) do begin read Cplik,znak); if Cznak= '') oreolnCplik) or Cord Cznak) = TABULACJA) then noweslowo := true el se i f nowesl owo then Nauka programowania... begin 1 i czba :=1 i czba + 1; noweslowo := false end end; close Cplik) end; begin writeln C'Podaj nazw� pliku'); readln Cnazwa); Slowa Cnazwa,n); writelnC'Liczba s��wwpliku ',nazwa,' wynosi ',n:5) end. Przyk�ad Przyk�ad zawiera funkcj� por�wnywania zawarto�ci dw�ch plik�w tekstowych. Wykorzystany algorytm polega na sprawdzaniu r�wno�ci znak�w do ko�ca kr�tszego pliku, a nast�pnie w przypadku pozytywnego wyniku na sprawdzeniu d�ugo�oi plik�w. Pro#ram 5.8 program Tekst 6 ; ( Program por�wnywani a dw�ch pl i k�w tekstowych ) var # pierwszy, drugi: text; nazwa 1; nazwa 2: string[12]; f pl i k pi erwszy ) ( pl i k drugi ) f nazwa pl i ku pi erwszego ) f nazwa pl i ku drugi ego ) function Porownaj Cnazwa#l,nazwa#2: string):boolean; f Funkcja por�wnywani a dw�ch pl i k�w tekstowych ) var znakl, C odczytany znak z pliku pierwszego ) znak2 : f odczytany znak z pl i ku drugi ego ) char; -32- 5. Plihi tehstowe i operacje na tehstach bl ad : bool ean ; Czmi enna i nformujaca o rbwno�ci pl i kbw) begin assignfpierwszy,nazwa#l); reset Cpierwszy); assign Cdrugi,nazwa 2); reset Cdrugi); bl ad := true ; ( pl i ki sa jednakowe ) f sprawdzeni e znak�w do ko�ca krbtszego pl i ku ) while blad and not eoffpierwszy) and not eofCdrugi ) do begin read Cpierwszy,znakl); readCdrugi,znak2); if znakl C# znak2 then bl ad := fal sef pl i ki s# rb�ne ) end; f je�l i r�na d�ugo�� pl i k6w ) if not C eof C pi erwszy ) = eof C drugi ) ) then blad := false; close Cpierwszy); close Cdrugi); Porownaj : = bl ad end; begin writeln C'Podaj nazw� pliku wej�ciowego#'); readln Cnazwa#l); writeln('Podaj nazw� pliku wyj�ciowego:'); readln Cnazwa 2); if Porownaj Cnazwa#l,nazwa#2) then wri teln C ' Pl i ki s# identyczne ' ) el se writelnC' Pliki nie s# identyczne') Ostatni przyk�ad jest po�wigcony nieco trudniejszemu problemowi, a nowicie wy�wietlaniu na ekranie zawarto�ci pliku tekstowego. W trakcie -33- Nauka programawania... wy�wietlania mo�na wykorzystywa� pewne klawisze umo�liwiaj�ce sterowanie przesuwaniem tekstu. Przyk�ad W przyk�adzie zaprojektujemy program umo�liwiaj�cy wy�wietlanie na ekranie zawarto�ci pliku tekstowego. Podczas wy�wietlania tekstu powinni�my mie� mo�liwo�� jego przewijania o jedn� linig w g�r� lub w d� oraz o jedn� stron� w g�rg lub w d�. Dost�pne powinny by� zatem nast�puj�ce klawisze: strza�ka w g�r�, strza�ka w d� oraz PgDn i PgUp. Ponadto naci�ni�cie klawisza Esc powinno zako�czy� wy�wietlanie tekstu. Sterowanie prac� programu odbywa si� przy pomocy funkcji Menu(), kt�ra podaje odpowiedni� warto�� w zale�no�ci od naci�ni�tego klawisza. W przypadku naci�nigcia klawisza strza�ka w g�rg jest wywo�ywana procedura Poprzedni, natomiast naci�ni�ciu klawisza strza�ka w d� powoduje wywo�anie procedury Nastepny, a po naci�nigciu klawiszy PgDn i PgUp s� odpowiednio wywo�ywane procedury Strona dol i Strona#gora. W programie jest ponadto wykorzystywana procedura Wyswietl umo�liwiaj�ca wy�wietlenie tekstu poczynaj�c od wskazanej linii. Kompletn� tre�� programu zamieszczono poni�ej. W programie u�yto nast�puj�cych funkcji i procedur zawartych w module Crt: CIrScr, GotoXY, InsLine, TextBackground, TextColor, Window. Ich dzia�anie jest wyja�nione w komentarzach zamieszczonych w programie. Program 5.9 Program Pokaz; ( Program wy�wi etl ani a zawarto�ci pl i ku tekstowego } uses crt#; const ..max#line=80; C maksymalna liczba znak�ww linii } max#row = 500 ; C maksymal na 1 i czba 1 i ni i w pl i ku } var pl i k : text ; C anal i zowany pl i k tekstowy ; nazwa : string[12] ; ( nazwa pl i ku } tablica: array Cl..max#row] ofstring[max#line); max: integer; C maksymalna liczba zajgtych wierszy tablicy} linia: integer;f aktualna linia tekstu } koniec: boolean; ( sterowanie zako�czeniem pracy programu ) procedure Wyswietl Ca:integer); -34- 5. Pliki tekstowe i operacje ha tekstach ( Wy�wietlenie tekstu na ekranie poczynaj#c od linii o numerze a ) var j:integer; begin C1 rScr ; C wyczyszczeni e ekranu ) j := a; C podczas gdy ni e wyjdzi emy poza ekran 1 ub poza koni ec tekstu ) while Cj C a + 23) and fj C max) do begin writeln; f wydruk j -tej 1 ini i tek5tu ) write Ctablica Cj]); j;=j+1 end; end procedure Nastepny; ( Wy�wi etl eni e nastgpnej 1 i ni i tekstu ) begin if 1 i ni a + 25 C max then f je�l i ni e wyjdzi emy poza koni ec tekstu ) begin f ustawi eni e kursora w 231 i ni i i w 80 kol umni e ) gotoxy C80,23); linia := linia + 1; writeln; fwy�wi etl eni e nowej 1 i ni i tekstu na dol e ekranu ) writeCtablicaClinia + 24]) # end end; procedure Poprzedni ; - # - ( Wy�wi etl ani e poprzedni ej 1 i ni i tekstu ) begin if 1 inia # 1 then f je�li nie wyjdziemy poza poczatek tekstu ) begin linia := linia - 1; gotoxy Cl,l); InsLine; f wstawienie linii ) Cwy�wi etl eni e nowej 1 i ni i tekstu na gdrze ekranu) -35- Nauka programowania... end end; write Ctablica Clinia)) procedure Strona#gora; ( Przesunigcie tekstu jedn# stron� w gdrg ) begin if linia # 1 then begin linia := linia - 23; if linia C 1 then linia :-1; Wyswietl Clinia) end end; procedure Strona Dol; C Przesunigcie tekstu jedna stron� w d61 ) begin if linia C max - 23 then begin linia := linia + 23: if linia # max - 23 then linia :=max - 23; Wyswietl Clinia) end end; functiott Menu : integer; C Sterowanie prac# programu ) var znak: char; begin # i sprawdzenie ostatnio naci�nigtego klawisza, kody u�ywanych kl awi szy : 27 - Esc, 72 - strzalka w g�r� 73 - PgUp 80 - strza�ka w d�l 81 - PgDn ) repeat -36- 5. Pliki tekstowe i operacje na tekstach znak := ReadKey; l wczytanie znaku ) until znak in Cchr CBO),chr C72),chr C73),chr C81),chrf27)]; if ordfznak) = 27 then menu := 0 ( klawisz Esc ) else if ordCznak) = 80 then menu :=1 ( klawisz strzalka w d61 ) else if ordCznak) = 72 then menu := 2 t klawisz strza�ka w gbr� ) else if ordCznak) = 81 then menu := 3 ( kl awi sz PgDn ) else if ordCznak) = 73 then menu := 4 f klawisz PgUp ) end; begin C1 rScr ; Goto XYC1,24); writeln C' 'l: wri te C ' Podaj nazwg pl i ku : ' ) ; readln Cnazwa); Assign Cplik,nazwa); reset Cplik); ( wpi sywani e wi erszy tekstu do tabl i cy ) max :=1; while not eofCpl i k) do begin readln Cplik,tablica Cmax]); max := max + 1 end; TextBackgroundCWhite); C Kolor tla: bialy ) TextColorCBlack); ( Kolor tekstu: czarny ) Goto X Y Cl,l); C1 r Eol ; f wyczyszczeni e do ko�ca 1 i ni i ) -37- Nauka programowania... writeC ' W & W Obejrzyj ', 'Liczba lini i : :60,max-1); Goto XYC1,25); ClrEo1; writef' Plik: ', nazwa, '@K. Walczak ':65); Text Background C Black); f Kolor tla: czarny ) TextColorCWhite);f Kolor tekstu: bia�y ) window Cl,2,80,24); ( ustawienie okna do wyprowadzania tekstu ) ; linia:=1; wyswietl Clinia); koni ec := fal se; repeat case Menu of 1: Nastepny ; f przesuni gci e o j edn# 1 i ni � w d61 ) 2 : Poprzedni ; ( przesuni �ci e o j edn# 1 i ni � w gbrg ) 3 : Strona dol ; f przesuni �ci e o strong w d�l ; 4: Strona#gora; ( przesuni�cie o stron� w g�r� ) 0 : begin windowCl,1,80,25); C okno na caly ekran ; Cl rScr ; koni ec := true ( koni ec pracy programu ; end end unti 1 koni ec end. 5:#. Wyprowadzanie danych na drukarkg Wyprowadzanie danych na drukark� zilustrujemy przyk�adem. Przyk�ad W przyk�adzie podamy dwa programy umo�liwiaj�ce skierowanie wydruku na drukark�. Program 5.10 program Wydruk#l; 5. Pliki tekstowe i operacje na tekstach var plik: text; begin assign Cplik,'lptl'); rewrite Cplik); writeln Cplik,'Pewien tekst'); closeCplik) end. Powy�szy program mo�na skr�ci� wykorzystuj�c dost�pny w j�zyku ltzrbo Pascal modu� Printer. Po przy��czeniu modu�u nale�y nast�pnie u�y� standardow� zmienn� lst, kt�ra oznacza kierowanie wydruku na drukark�. Program 5.11 program Wydruk#2; uses Printer; begin writeln Clst,'Pewien tekst') end. 5.4. Operacje na tekstach W tym punkcie zilustrujemy dwoma przyk�adami wykonywanie operacji na tekstach przechowywanych w plikach tekstowych. Najpierw jednak wspomnimy o kilku podstawowych funkcjach #dzia�aj�cych na zmiennych typu �a�cuchowego. Dok�adny opis tych funkcji mo�na znale�� w pracy [14]. Concat(x,y), sklejenie, takie samo dzia�anie jak x + y I.enght(x) podaje d�ugo#� zmiennej"x Pos(x,znak)podaje pozycj� pierwszego wyst�pienia znaku znak w zmiennej x Delete(x,n,k) usuwa k znak�w ze zmiennej x zaczyn�j�c od pozycji n Zmienne typu �a�cuchowego mo�na ze sob� por�wnywa� przy pomocy operator�w <, >, <>. Istnieje rownie� mo�liwo�� wstawienia odpowiedniego znaku na dan� pozycj�. Dokonuje si� tego w spos�b nast�puj�cy: x[n] :=znak gdzie x tak jak i poprzednio jest zmienn� typu �a�cuchowego, znak zmienn� typu znakowego. -39- Na#a pr#gramowania... Przyh�ad W przyk�adzie zaprojektujemy program centrowania tekstu w ka�dej linii pliku tekstowego. Centrowanie polega� bgdzie na umieszczeniu ka�dej linii tekstu na �rodku wydruku. W programie jest wykorzystana procedura Usun#spacje, kt�ra pozwala na usunigcie spacji umieszczonych na pocz�tku i na ko�cu tekstu. Po usuni�ciu tych spacji wyznaczamy d�ugo�� "czystego" tekstu, co umo�liwia wyznaczenie liczby spacji, kt�re powinny zosta� umieszczone na pocz�tku linu po to, by tekst znalaz� sig na �rodku. Program 5.12 program Centruj; f Programcentrowania tekstuw ka�dej linii pliku } const max#l i ne = 80 ; type jedna#linia = string[max#line]; var plikl, f plikwej�ciowy } pl i k2 : f pl i k wyj �Ci owy } text; linia: jedna#linia; f linia tekstu ) nazwa#l, f nazwa pl i ku wej �ci owego } nazwa#2: f nazwa pli ku wyj�ciowego } string[12); spacje:integer; function Usun#spacje Clinia:jedna#linia):jedna#linia; f Usuni�cie poczatkowych i ko�cowych spacji z jednej linii tekstu } var n, f dlugo�� linii } i. f zmienna pomocnicza startuj#ca od pocz#tku linii j: f zmienna pomocnicza startujdca od ko�ca linii } integer; wynik:jedna#linia; begin n := Length Clinia); i :=1; j :=n; wynik := ', -40- 5. Pliki tekstowe i operacje na tekstach C wyznaczeni e 1 i czby spacj i od poczatku 1 i ni i ) while Ci C= n) and CliniaCi]='' ) do i := i + 1; f wyznaczenie liczby spacji od ko�ca linii ) while Cj C=n) and fliniaCj] = '') doj :=j - 1; f przepi sani e tekstu bez pocz#tkowyeh i ko�cowych spacj i ) whi 1 e i C= j do begin wynik:=wynik+liniaCi]; i:#i+1 end; Usun spacje := wyni k end; begin writeln C'Podaj nazwg pliku wej�ciowego:'); readln Cnazwa#l); writeln C'Podaj na2wg pliku wyj�ciowego:'); readln Cnazwa 2); assign Cplikl,nazwa#l); reset Cplikl); assignCplik2,nazwa 2); rewrite Cplik2); while not eofCplikl) do begin re,adlnCplikl,linia); f wyznaczeni e 1 i czby spacj i na pocz#tku drukowanej 1 in�i i jspacje := Cmax#line - Length C Usun#spacje Clinia))) div2; writeln Cplik2,' :spacje, Usun#spacje Clinia)); end; close Cplikl); close Cplik2); end - 41- Nauka programowania... Przyk�ad Poni�ej zamieszczono program testuj�cy procedurg Usun, kt�ra umo�liwia usunigcie z tekstu zdefiniowanego fragmentu. Usuwane s� wszystkie wyst�pienia tego fragmentu tekstu. Przy usuwaniu jest wykorzystywana standardowa procedura Delet#, a przy wyznaczaniu po�o�enia danego fragmentu standardowa procedura Pos. Program 5.13 program Usuwanie; f Program usuwani a z tekstu zdefi ni owanego fragmentu ) var x, C tekst podstawowy ) y: ( fragment tekstu do usunigcia ) string; procedure UsunCvar tekst, zam: string) ; C Usuwanie tekstu zam z tekstu tekst ) var nr: integer; ( numer pozycji wyst#pienia tekstu ) begin repeat C wyznaczenie kolejnej pozycji wyst#pienia tekstu zam ) nr :=PosCzam,x); ifnrC#Othen ( usunigcie fragmentu tekstu o dlugo�ci Length Czam) poczynaj#c od pozycji nr ) # Delete Cx,nr,Length Czam)); unti 1 nr = 0 end; beg i n # x := 'Ala ma ma kota ma '. y := 'ma ' Usun Cx,y); writeln Cx) end. W wyniku wykonania programu otrzymamy wydruk: Ala kota -42- 5. Pliki tekstowe i operacje na tekstach 5.5. Zadania 1. Napisa� program kopiowania jednego pliku tekstowego do drugiego zast�puj�c jednocze�nie ka�dy ci�g spacji jedn� spacj� (ci�g spacji na pocz�tku wiersza ma pozosta� bez zmiany). 2. Napisa� program wczytywania s�owa i obliczania ile razy to s�owo wyst�pi�o w danym tek�cie. 8. Napisa� program zast�powania wyr�nionego s�owa w tek�cie innym s�owem. 4. Napisa� program usuwania zdefiniowanej linii w tek�cie. 5. Napisa� program wstawiania podanego tekstu po okre�lonej linii tekstu. 6. Napisa� program znajdowania najd�u�szego s�owa w tek�cie. 7. Napisa� program drukowania pliku tekstowego na drukarce wraz z numerami linii. 8.Zmodyfikowa� program Pokaz tak, by mo�liwe by�o przewijanie plik�w tekstowych o dowolnej d�ugo�ci. 8.Napisa� program drukowania tekstu dowolnego programu zapisanego w j�zyku Pascal w ten spos�b, by s�owa kluczowe by�y pogrubione. -43- Rozdzia� PLIKI ELEMENTOWE Pliki elementowe s� to pliki, w kt�rych przechowywana informacja jest przedstawiona w postaci zakodowanej niemo�liwej do bezpo�redniego odczytania. Deklaracja zmiennej plikowej dla pliku elementowego jest postaci: nazwa pliku: flle of typ sk�adowy gdzie nazwa pliku jest nazw� zmiennej plikowej, a typ#sk�adowy jest typem prostym lub strukturalnym (typ#sk�adowy nie mo�e by� typem plikowym lub wska�nikowym). PodObnie jak dla plik�w tekstowych przyporz�dkowanie nazwy pliku dyskowego do konkretnej zmiennej plikowej dokonujemy przy pomocy procedury assign. Otwieranie plik�w wykonujemy przy pomocy procedur re#rite i reset (ale bez procedury append), a zamykanie przy pomocy procedury close. Wykorzystanie plik�w elementowych zilustrujemy kilkoma przyk�adami. Przyk�ad W przyk�adzie podamy program, kt�ry umo�liwia wykonywanie dw�ch podstawowych operacji tzn. wczytywania i wyprowadzania danych z pliku elementowego. Operacje te wykonamy dla dw�ch plik�w: jednego przechowuj�cego liczby ca�kowite i drugiego przechowuj�cego liczby rzeczywiste. -44- 6. Pliki elementowe Program 6.1 Program Pliki#l; ( Programilustrujacy wykorzystanie plik�w elementowych } const n#100; var pl i kcal k : fi 1 e of i nteger ; pl i krzecz : fi 1 e of real ; i,m:integer; x,y: real ; begi n assign Cplikcalk,'pl'); rewrite Cplikcalk); assign Cplikrzecz,'p2'); rewrite Cplikrzecz); ( pl i k z 1 i czbami ca� kowi tymi } ( pl i k z 1 i czbami rzeczywi stymi } ( przyporz�dkowani e nazwy do pl i ku } # otworzeni e pl i ku } C zapi s do pl i k6w } for i :=1 to n do writeCplikcalk,i); for i : =1 to n do begin x:=0.345*i; wri te t pl i krzecz, x ) end; C odczytywani e z pl i k6w } reset Cpl i kcal k) ; ( otworzeni e pl i ku } while nQt eofCpli kcal k) do begin read C pl i kca-1 k,m) ;write Cm:4) end; reset C pl i krzecz ) ; ( o.tworzeni e pl i ku } while not eofCpl i krzecz) do begin read Cplikrzecz,y); write Cy:8:3) end -45- Nauka programowania... end. Przyk�ad Z#'e�ci� przyk�adu jest program umo�liwiaj�cy kopiowanie pliku elementowego przechowuj�cego liczby ca�kowite. Program 6.2 program P1 i ki#2 ; f Program kopi owani a pl i ku el ementowego } type pli k = file of integer; var pierwszy, ( plik, z kt�rego kopiujemy } drugi : ( pl i k, do kt�rego kopi ujemy } plik; nazwa#l, ( nazwa pl i ku pi erwszego } nazwa 2 : ( nazwa pl i ku drugi ego } string[20]; procedure Kopiuj Cvar pierwszy,drugi: plik); [ Kopi owani e pl i ku pi erwszy do pl i ku drugi } var el ement : i nteger ; ( el ement pl i ku } begin while not eofCpierwszy) do begin read Cpierwszy,element); write Cdrugi,element) end '-end ;. begin writeln C'Podaj nazw� pliku wej�ciowego:'); readln Cnazwa#l); writeln C'Podaj nazwg pliku wyj�ciowego:'); readln Cnazwa#2); assign Cpierwszy,nazwa#l); reset Cpierwszy); assign Cdrugi,nazwa#2); -46- 6. Pliki elementowe rewrite Cdrugi); Kopiuj Cpierwszy,drugi); close Cpierwszy); close Cdrugi) end.