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.