You are on page 1of 82

Turbo Pascal - Programowanie Autor: Tomasz M.

Sadowski
ISBN: 83-86718-40-4 Format: B5, 136 strony Data wydania: 08/1996
a! wi"s#, sam !om$%t"r &"st &"dyni" #'ior"m do() s!om$*i!owany+, %!-ad.w "*"!troni+#ny+,, !t.r" sam" # si"'i" ni" s/ w stani" wy!ona) &a!i"&!o*wi"! #na+#/+"& o$"ra+&i0 "1o 2int"*i1"n+&a2 'i"r#" si3 w +a-o(+i # wi"d#y, !t.r/ $r#"!a#a*i m% $ro1rami(+i w $osta+i od$owi"dni"1o o$ro1ramowania0 Nini"&s#a !si/4!a w$rowad#i 5i3 w 6as+yn%&/+y (wiat $ro1ramowania w 7%r'o 8as+a*%0 - 5o to &"st 8ro'*"m, 9"toda, :*1orytm, Im$*"m"nta+&a, ;drowy ro#s/d"!000< - a! !or#ysta) # "dytora 7%r'o 8as+a*a< - =d +#"1o #a+#/), +#y*i &a! o'*i+#y) $o*" !o-a #a $omo+/ !om$%t"ra< - 5#ym si3 r.4ni -a>+%+, od *i+#'y r#"+#ywist"&< - Do +#"1o s-%4y instr%!+&a war%n!owa< - a! ro#wi/#a) dowo*n" r.wnani"< - 5o si3 !ry&" $od ta&"mni+#ymi na#wami: 6%n!+&" i $ro+"d%ry< - Do +#"1o s-%4/ ta'*i+", a do +#"1o $3t*"< - a! #a$isywa) dan" w $*i!% na dys!%< - a! twor#y) i !or#ysta) # mod%-.w 'i'*iot"+#ny+,< - a! %r%+,amia) 2o$orn"2 $ro1ramy< =d$owi"d#i na t" i inn" $ytania #na&d#i"s# w t"& !si/4+"? @s#yst!o o$isan" 4ywym i 'arwnym &3#y!i"m, #i*%strowan" !r.t!imi, $r#"&r#ystymi i $ra!ty+#nymi $ro1ramami0 S#!oda +#as%, 4"'y $r#"1ry#a) si3 $r#"# o$as-" tomis!a, a'y na%+#y) si3 $odstaw $ro1ramowania0 Ao#$o+#ni& od t"& !r.t!i"&, a*" ni"#wy!*" tr"(+iw"& !si/4!i, d#i3!i !t.r"& $ro1ramowani" stani" si3 s#y'!i", -atw" i $r#y&"mn"000

Strona numer 1 z 82

Jak wiesz, komputer jest jedynie zbiorem skomplikowanych ukadw elektronicznych, ktre same z siebie nie s w stanie wykona jakiejkolwiek znaczcej operacji! Je"o #inteli"encja$ bierze si% z wiedzy, ktr przekazali mu pro"rami&ci w postaci odpowiednie"o opro"ramowania! 'iniejsza ksi(ka wprowadzi )i% w *ascynujcy &wiat pro"ramowania w +urbo ,ascalu! - )o to jest ,roblem, .etoda, /l"orytm, 0mplementacja, 1drowy rozsdek!!!2 - Jak korzysta z edytora +urbo ,ascala2 - 3d cze"o zacz czyli jak obliczy pole koa za pomoc komputera2 - )zym r(ni si% a4cuch od liczby rzeczywistej2 - 5o cze"o su(y instrukcja warunkowa2 - Jak rozwiza dowolne rwnanie2 - )o kryje si% pod tajemniczymi nazwami6 #*unkcje i procedury2 - 5o cze"o su( tablice, a do cze"o p%tle2 - Jak zapisywa dane w pliku na dysku2 - Jak tworzy i korzysta z moduw biblitecznych2 - Jak uruchamia #oporne$ pro"ramy2 3dpowiedzi na te i inne pytania znajdziesz w tej ksi(ce7 8szystko opisane (ywym i barwnym j%zykiem, zilustrowane krtkimi, przejrzystymi i praktycznymi pro"ramami! Szkoda czasu (eby prze"ryza si% przez opase tomiska aby nauczy si% podstaw pro"ramowania! 9ozpocznij od tej krtkiej ale niezwykle tre&ciwej ksi(ki, dzi%ki ktrej pro"ramowanie stanie si% szybkie, atwe i przyjemne!!! ,rojekt okadki6 .aciej ,asek #/9+:9/;$ < =>?03', 1@@A 0SB'6 8CD8AE18DFGDF 8szelkie prawa zastrze(one! 'ieautoryzowane rozpowszechnianie cao&ci lub *ra"mentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione! 8ykonywanie kopii metod ksero"ra*iczn, *oto"ra*iczn, a tak(e kopiowanie ksi(ki na no&niku *ilmowym, ma"netycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji! 8yst%pujce w tek&cie znaki s zastrze(onymi znakami *irmowymi bdH towarowymi ich posiadaczy! /utor oraz 8ydawnictwo =elion doo(yli wszelkich stara4, by zawarte w tej ksi(ce in*ormacje byy kompletne i rzetelne! 'ie bior jednak (adnej odpowiedzialno&ci ani za ich wykorzystanie, ani za zwizane z tym ewentualne naruszenie praw patentowych lub autorskich!

Strona numer 2 z 82

Spis treci
Po co mi programowanie? Co to jest programowanie? ak to si! ro"i naprawd!?
8ro'*"m 9"toda :*1orytm 8ro&"!t Im$*"m"nta+&a Br%+,omi"ni" ;drowy ro#s/d"!

4 6 #

$arz!dzie
;aawansowan" 6%n!+&" "dytora ;a$ami3ta&

%% %# (% (4 (# .% .4 .#
4( 44 48 94 99 94 6. 64 #> #4 ## 4> 4(

Pierwsz& program
;a$ami3ta&

$ic nie jest doskona'e


;a$ami3ta&

)*epszam& da*ej
;a$ami3ta&

+&ra,enia
;a$ami3ta&

-nstrukcja warunkowa
;a$ami3ta&

/ozwi0zujem& dowo*ne r1wnanie


;a$ami3ta&

2unkcje i procedur&
;a$ami3ta&

ak program porozumiewa si! z 3unkcj0?


;a$ami3ta&

Programowanie na powa,nie T&p& struktura*ne5 cz&*i jak przec6owa7 wi!cej dan&c6


;a$ami3ta&

Struktura programu T&p& i sta'e


;a$ami3ta&

:o dzie'a; P*iki5 cz&*i jak uc6roni7 dane przed zgu"0


;a$ami3ta&

<a=cuc6&
;a$ami3ta&

+i!cej pami!ci;
;a$ami3ta&

Po,&teczne dro"iazgi5 cz&*i modu'& "i"*ioteczne


;a$ami3ta&

Modu'& w'asne
;a$ami3ta&

ak uruc6amia7 oporne program& ?iteratura

Strona numer C z 82

Po co mi programowanie?
1anim za"%bimy si% w dyskusj% o tajnikach pro"ramowania, wypadaoby odpowiedzie na podstawowe pytanie6 czy w ogle jest Ci ono potrzebne? 8 zasadzie I nie! Brak umiej%tno&ci pro"ramowania nie przeszkodzi )i w zdaniu matury, napisaniu listu, zrobieniu zakupw czy prowadzeniu samochodu! 'o, mo(e od czasu do czasu b%dziesz musia zapro"ramowa ma"netowid, ale czynno& ta z #prawdziwym$ pro"ramowaniem ma raczej mao wsplne"o!!! +ym niemniej I skoro si%"ne& po t% ksi(k% I mo(na zao(y , (e masz zamiar zawrze bli(sz znajomo& z komputerami! / to ju( zupenie inna sprawa! Jak wiesz sam komputer jest jedynie zbiorem do& skomplikowanych ukadw elektronicznych, ktre same z siebie nie s w stanie wykona jakiejkolwiek znaczcej operacji! Je"o #inteli"encja$ bierze si% w cao&ci z wiedzy, ktr przekazali mu pro"rami&ci w postaci odpowiednie"o opro"ramowania! 'awet tak trywialna operacja, jak wprowadzenie pojedyncze"o znaku z klawiatury, zwizana jest z wykonaniem sporej liczby operacji zakodowanych w opro"ramowaniu systemowym! / co dopiero wyliczenie bilansu *irmy czy wycieniowanie skomplikowane"o rysunku!!! / zatem nie ma mowy o *unkcjonowaniu komputera bez opro"ramowania! 3czywi&cie nie oznacza to, (e aby wprowadzi z klawiatury swoje nazwisko, musisz cokolwiek pro"ramowa 6 odpowiednie *unkcje zostay ju( dawno utworzone i przekazane do dyspozycji u(ytkownikw pod postaci systemu operacyjne"o i opro"ramowania u(ytkowe"o! 3 ile nie masz zamiaru zaj si% tworzeniem podobne"o opro"ramowania, nie musisz nawet wiedzie , jak takie *unkcje dziaaj, chocia( czasem przydaje si% to w r(nych kryzysowych sytuacjach! +ak wi%c znajomo& pro"ramowania nie jest konieczna do obsu"i komputera! .o(e w takim razie pro"ramowanie jest potrzebne do korzystania z pro"ramw u(ytkowych2 3kazuje si%, (e te( nie! 'owoczesne edytory tekstw, arkusze kalkulacyjne i inne powszechnie u(ywane aplikacje biurowe pozwalaj na wykonywanie wymy&lnych operacji przez naci&ni%cie kilku klawiszy lub klikni%cie myszk! +ypowa ksi%"owa Ju(ywajca >KcelaL, pisarz Jpiszcy w 8ordzieL czy "ra*ik Jkorzystajcy z )orelaL nie maj zwykle poj%cia o pro"ramowaniu I bo do nicze"o nie jest im ono potrzebne! No to o czym my w ogle mwimy? I m"by& zapyta ! 3t( sprawa wcale nie jest przesdzona! ,rzede wszystkim istnieje spora "rupa czytelnikw, ktrzy zamierzaj pozna sposoby przymuszenia komputera do wykonywania dokadnie te"o, cze"o sobie za(ycz I czyli wa&nie metody pro"ramowania! )z%& z nich zapewne zostanie w przyszo&ci pro"ramistami i zajmie si% tworzeniem opro"ramowania systemowe"o i u(ytkowe"o Jdziaalno& to wcale intratnaL! 0nni, podchodzcy do za"adnienia bardziej po amatorsku, zadowol si% satys*akcj intelektualn pync ze zrozumienia zasad dziaania pro"ramw i umiej%tno&ci zapanowania nad skomplikowanym narz%dziem, jakim jest nowoczesny komputer! Jeszcze inni Jtych b%dzie zapewne najwi%cejL b%d po prostu wykorzystywa zdobyte umiej%tno&ci do rozwizywania problemw spotykanych w codziennej pracy, nie pretendujc bynajmniej do miana pro"ramistw, cho by nawet amatorw! Ale przecie rwnie dobrze mog skorzysta z jakiego programu uytkowego 1"oda, z pewnym drobnym zastrze(eniem! 'owoczesne opro"ramowanie jest w stanie zrobi prawie wszystko za jednym naci&ni%ciem klawisza czy klikni%ciem myszk! 'ie znaczy to jednak, (e speni ono wszystkie nasze (dania, ani te( (e speni je dokadnie tak, jak by&my chcieli! ,oza tym du(e, wszystkoDwiedzceDiDmo"ce pakiety u(ytkowe s na o" tak skomplikowane, (e obmy&lenie metody realizacji zadania cz%sto zajmuje wi%cej czasu, ni( zapro"ramowanie "o od podstaw! 8reszcie mo(e si% po prostu zdarzy Ji najcz%&ciej si% zdarza!" (e odpowiednie"o opro"ramowania nie b%dzie pod r%k, albo te(, (e co prawda b%dzie, ale ze wz"l%du na wysokie wyma"ania sprz%towe Jdotyczy to zwaszcza nowej "eneracji pro"ramw dla 8indowsL je"o uruchomienie b%dzie mniej lub bardziej kopotliwe! )zy do banalne"o obliczenia &redniej ocen potrzebny )i b%dzie od razu zaawansowany pakiet matematyczny, jak #tatgrap$ics" czy arkusz kalkulacyjny, jak %&cell Czy +wj ulubiony edytor potra*i zliczy wszystkie znaki w tek&cie, ktry wa&nie napisae&2 / je&li tak, to czy jest w stanie okre&li &redni du"o& zdania2 8szystkie te operacje mo(na zrealizowa za pomoc prostych pro"ramikw w ,ascalu lub Basicu, ktrych napisanie i uruchomienie nawet niezbyt wprawnemu u(ytkownikowi zajmuje kilkana&cie minut! 'awet je&li jeste& wycznie u(ytkownikiem jakie"o& konkretne"o pro"ramu Jnp! edytora tekstwL i nie masz zamiaru zawiera znajomo&ci z ,ascalem czy Basicem, zapoznanie si% z podstawami sztuki pro"ramowania b%dzie nie od rzeczy! 5lacze"o2 8yobraH sobie, (e w dokumencie, nad ktrym pracujesz, znajduje si% kilkana&cie tabelek, a w ka(dej z nich musisz zamieni miejscami pierwszy wiersz z dru"im! ,raktycznie (aden edytor nie umo(liwia zamiany dwch wierszy tabeli w jednym kroku, a tym bardziej zrobienia te"o dla wszystkich tabelek w dokumencie! +ak jednak si% skada, (e wi%kszo& nowoczesnych edytorw J8ord,er*ect, 8ord dla 8indowsL umo(liwia u(ytkownikowi tworzenie tak zwanych makrode'inicji" b%dcych niczym innym, jak tylko programami

Strona numer F z 82

napisanymi w specjalnym j%zyku! 1amiast wi%c (mudnie wyszukiwa kolejne tabele i zamienia wiersze miejscami, mo(esz napisa odpowiedni pro"ram Jmakrode*inicj%L, ktra zrobi to automatycznie! 9zecz jasna, nie b%dziemy si% tutaj zajmowa j%zykami makrode*inicji, b%dziesz jednak mia okazj% zapozna si% z elementarnymi koncepcjami pro"ramowania I jak instrukcja warunkowa, p%tla czy procedura I ktrych znajomo& w znaczcy sposb uatwi posu"iwanie si% takimi j%zykami! ,o co wi%c potrzebne jest pro"ramowanie2 'ajo"lniej mwic, po to, by mc zrealizowa zadania kopotliwe lub niemo(liwe do wykonania #r%cznie$! ,ro"ram, niezale(nie od te"o, jakim narz%dziem utworzony i jakiemu celowi su(cy, umo(liwia automatyzacj% powtarzajcych si%, rutynowych czynno&ci, ktrych wykonywanie byoby zbyt nu(ce lub pochaniao za du(o czasu! 3czywi&cie, wszystko mo(na zrobi r%cznie I po co jednak przerzuca dwie tony piasku opat, skoro obok stoi "otowy do u(ycia spychacz!!! Sprbujmy nauczy si% "o obsu"iwa !

Strona numer M z 82

Co to jest programowanie?
,owiemy obecnie kilka sw na temat same"o procesu pro"ramowania! /by )i% za bardzo nie znudzi , o"raniczymy si% tutaj do krtkie"o omwienia je"o najwa(niejszych elementw, rezy"nujc z *ormalizmw i zb%dnej teorii! Je&li chcesz dowiedzie si% na ten temat cze"o& wi%cej, mo(esz Jale nie musiszL przeczyta kolejny rozdzia, zatytuowany (ak to si) robi naprawd)? Je&li nie masz ochoty, mo(esz wrci do nie"o pHniej! 'a rozwizanie dowolne"o zadania poprzez pro"ramowanie skada si% kilka etapw! ,rzede wszystkim musisz wiedzie , co wa&ciwie chcesz zrobi , czyli mie konkretny problem do rozwizania! 9zecz jasna, problem musi nadawa si% do rozwizania za pomoc komputera Jskd masz o tym wiedzie 2 'a obecnym etapie najlepiej zastosowa zdrowy rozsdekL! /nalizujc problem musisz sprecyzowa , jakie in*ormacje masz do dyspozycji i co chcesz uzyska w wyniku je"o rozwizania! 'ast%pnie musisz zdecydowa si%, jak rozwiza zadanie, czyli wybra odpowiedni metod) Nolejnym krokiem jest przyj%cie okre&lone"o sposobu post%powania, czyli schematu czynno&ci JkrokwL prowadzcych do rozwizania! Schemat taki okre&lany jest mianem algorytmu 5odatkow czynno&ci, ktr nale(y wykona na tym etapie, jest dobr struktur danyc$" czyli sposobw, w jakie przetwarzana przez nasz pro"ram in*ormacja b%dzie reprezentowana wewntrz komputera! )zynno& ta jest na o" wykonywana mechanicznie, istniej jednak problemy, dla ktrych mo(liwe jest przyj%cie kilku wariantw reprezentowania in*ormacji, zr(nicowanych w zale(no&ci od konkretnej sytuacji! 9zeczywiste problemy s w wi%kszo&ci zbyt skomplikowane, by day si% skutecznie rozwiza za pomoc pojedyncze"o al"orytmu! Skuteczne zrealizowanie al"orytmu wyma"a ponadto wykonania pewnych czynno&ci pomocniczych, jak cho by wprowadzenia czy wyprowadzenia danych! +ak wi%c zwykle musisz podzieli zadanie na pewne *ra"menty, dajce si% rozwiza za pomoc odpowiednich al"orytmw, a cao& obudowa odpowiednim zestawem operacji #administracyjnych$! 8 ten sposb tworzysz projekt pro"ramu! 5opiero teraz wchodzi do akcji komputer! 8ykorzystujc odpowiedni pro"ram u(ytkowy zapisujemy nasz projekt w postaci wykonywalnej przez komputer! 3peracja ta nosi miano kodowania lub implementacji" a jej wynikiem powinien by dziaajcy pro"ram! ,oniewa( jednak nie jest powiedziane, (e pro"ram musi by od razu bezb%dny, ostatnim etapem naszej pracy jest je"o testowanie, czyli inaczej uruc$amianie 'a dobr spraw% i to nie jest koniec6 #powa(ne$ pro"ramy musz by przez cay okres swojej eksploatacji konserwowane 3kre&lenie to oznacza sprawowanie przez autora nadzoru nad dziaaniem pro"ramu i korekt% ewentualnych b%dw! 1 konserwacj pro"ramw wi(e si% wreszcie za"adnienie opracowania ich dokumentacji! 5wie ostatnie czynno&ci zwizane s "wnie z pro"ramowaniem pro*esjonalnym, tote( nie b%dziemy si% nimi szcze"owo zajmowa ! +ak mniej wi%cej wy"lda caa procedura pro"ramowania i I jak nietrudno zauwa(y I samo pisanie i uruchamianie pro"ramu wcale nie jest w niej najwa(niejsze! ,oniewa( jednak naszym celem jest pokazanie )i podstaw rzemiosa, nie za& dyskusja o al"orytmach i teorii in*ormatyki Jna ten temat napisano wiele mdrzejszych ksi(ekL, w kolejnych rozdziaach skupimy si% "wnie na wykadzie j%zyka pro"ramowania i omwieniu je"o konstrukcji od strony praktycznej! Je&li chcesz rozszerzy swoje wiadomo&ci dotyczce #podo(a$ pro"ramowania, zach%cam )i% do przeczytania nast%pne"o rozdziau! Je&li nie masz ochoty, przejdH do rozdziau zatytuowane"o Narz)dzie" w ktrym poznasz "wne"o bohatera tej ksi(ki!

Strona numer A z 82

ak to si! ro"i naprawd!?


9ozdzia ten stanowi rozszerzenie poprzednie"o i wcale nie musisz "o czyta , chocia( mo(e )i si% to przyda ! 5owiesz si% z nie"o, jak wy"ldaj poszcze"lne kroki procesu pro"ramowania i co oznaczaj takie poj%cia jak al"orytm, schemat blokowy czy projekt! ,oznasz rwnie( kilka metod i wskazwek pozwalajcych na usystematyzowanie i uproszczenie pracy!

Pro"*em
,ro"ramowanie nie istnieje samo dla siebie6 aby w o"le miao ono sens, musi su(y konkretnemu celowi! ,rzyczyn utworzenia pro"ramu musi by problem, ktry masz rozwiza ! 3czywi&cie, nie ka(dy problem da si% rozwiza w ten sposb, nie ka(dy te( wyma"a zastosowania komputera! )o wi%c kwali*ikuje problem do zapro"ramowania2 - 1astosowanie komputera do rozwizania problemu powinno by uzasadnione i opacalne! ,isanie na u(ytek domowy pro"ramu pozwalajce"o na zapami%tywanie adresw znajomych jest strat czasu I pro&ciej to zrobi za pomoc notesu! 0naczej wy"lda sprawa w banku, w ktrym obsu"uje si% setki klientw, a od czasu do czasu trzeba wysa do wszystkich np! zawiadomienie o stanie rachunku! - Szcze"lnie podatne na zapro"ramowanie s zadania wykonywane wielokrotnie lub zo(one z ci"u powtarzajcych si% czynno&ci! ,isanie #do jednorazowe"o u(ytku$ pro"ramu wykonujce"o zestaw skomplikowanych oblicze4 na o" mija si% z celem, "dy( mo(na je wykona na kalkulatorze! )o inne"o, "dy przewidujesz mo(liwo& wielokrotne"o wykorzystania takie"o pro"ramu! - ,roblem powinien by dobrze okrelony 3znacza to, (e musisz dokadnie wiedzie , jakie in*ormacje masz do dyspozycji i co chcesz uzyska , a tak(e potra*i zapisa to w *ormie dajcej si% #wytumaczy $ komputerowi! ,rzykadem problemu Hle okre&lone"o mo(e by #rozwizanie zadania z *izyki$, "dy( nie wiadomo ani jakimi in*ormacjami dysponujemy, ani co chcemy wa&ciwie obliczy ! ,rawidowe okre&lenie zadania miaoby posta np! #wyznaczenie dro"i przebytej przez ciao w spadku swobodnym w pierwszych 1G sekundach ruchu$! ,rzy okazji mamy tu nawizanie do poprzednie"o punktu6 te same obliczenia trzeba wykona dziesi%ciokrotnie Jdla l, 2, C,!!!, 1G sekundL! *roblem przeznaczony do rozwizania powinien by jasno zde'iniowany i wystarczajco z+oony" by trud w+oony w programowanie mg+ si) op+aci

Metoda
,o ustaleniu co chcesz osi"n i jakimi in*ormacjami dysponujesz, musisz ustali sposb rozwizania problemu! 'iekiedy Jjak w przypadku spadku swobodne"oL sytuacja jest oczywista6 nale(y zastosowa wzr, ktry kto& kiedy& wymy&li! Niedy indziej trzeba wymy&li rozwizanie samemu! 8arto rwnie( zastanowi si% nad przyj%ciem zao(e4 upraszczajcych, ktre mo" zmniejszy nakad pracy potrzebny na stworzenie pro"ramu z niewielkim uszczerbkiem na dokadno&ci! ,rzykadem niech b%dzie wspomniana w poprzednim rozdziale kwestia wyznaczenia &redniej du"o&ci zdania w tek&cie! ,roblem nie jest wcale wzi%ty #z su*itu$6 zarwno zbyt krtkie, jak i zbyt du"ie zdania zmniejszaj czytelno& tekstu, aby wi%c nie znudzi czytelnika, musisz trzyma si% pewne"o optimum, wynoszce"o np! AG znakw! 3to kilka konkurencyjnych rozwiza4 te"o problemu6 - ustalamy liczb% znakw zawartych w ka(dym zdaniu w tek&cie, po czym uzyskane warto&ci u&redniamy! .etoda ta jest do& oczywista, jednak wyma"a okre&lenia &cisej de*inicji zdania, co mo(e by kopotliweO - przyjmujemy upraszczajce zao(enie, (e ka(de zdanie ko4czy si% kropk! 8 tym momencie liczba zda4 w tek&cie rwna b%dzie liczbie kropek Jco dla tekstw literackich jest w zasadzie prawdziweL! 1atem wystarczy zliczy wszystkie znaki w tek&cie, ustali , ile jest w&rd nich kropek, podzieli pierwsz warto& przez dru" i wynik "otowy! Najlepsz metod na znalezienie metody jest sprawdzenie" czy kto jej ju nie wymyli+ *o ustaleniu metody warto te zastanowi si) nad jej uproszczeniem

A*gor&tm
Skoro ju( mamy metod%, musimy zapisa j w sposb *ormalny i szcze"owy! ,o co2 Nomputer nie jest niestety na tyle inteli"entny, by zrozumie polecenie #zlicz wszystkie znaki w tek&cie$, tote( musimy nasze zadanie przedstawi w sposb bardziej elementarny! Jak2 8a&nie za pomoc al"orytmu! DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
)o prawda niektre pro"ramy, jak np! 8ord dla 8indows, udost%pniaj polecenie zliczania znakw w tek&cie, jednak jest ono wa&ciwo&ci pro"ramu, nie za& komputera, i musiao zosta wcze&niej zapro"ramowane przez twrcw edytora!
1

----------------------------------------------------------------------------------------------------------------------------------------

Strona numer E z 82

1"odnie z de*inicj, al"orytm to #zbir okre&lonych re"u post%powania, ktre realizowane z"odnie z ustalonym porzdkiem umo(liwiaj rozwizanie okre&lone"o zadania$! ,rzekadajc to na bardziej ludzki j%zyk mo(emy powiedzie , (e al"orytm jest zapisem czynno&ci, ktre nale(y krok po kroku wykona w celu uzyskania wyniku! 1apisujc al"orytm musisz wi%c ustali , jakie elementarne operacje b%dzie trzeba wykona w trakcie realizacji zadania i jaka powinna by ich kolejno& ! 5odatkowo musisz okre&li tak zwane kryterium stopu" czyli warunek, ktre"o spenienie powoduje zako4czenie wykonywania operacji Jnie chcesz chyba czeka na wynik w niesko4czono& L! Jak zapisa al"orytm2 'ajprostszym sposobem jest sowne wyra(enie poszcze"lnych operacji w postaci punktw, np! tak6 , otwrz plik z tekstem do odczytu - wyzeruj licznik znakw . wyzeruj licznik kropek / jeli koniec pliku" to id0 do punktu 1 2 wczytaj kolejny znak z pliku 3 jeli znak jest kropk" zwi)ksz licznik kropek o l 4 zwi)ksz licznik znakw 5 id0 do punktu / 1 jeli licznik kropek wynosi zero" id0 do punktu ,, ,6 wypisz 7licznik znakw8licznik kropek!! ,, #9:* +o samo mo(na przedstawi w postaci "ra*icznej, zwanej schematem blokowym lub z an"ielska 'lowc$art Schemat post%powania mo(na wreszcie zapisa w postaci tak zwane"o pseudokodu" czyli imitacji #prawdziwe"o$ j%zyka pro"ramowania6 start otwrz7plik!; znaki <= 6; kropki <= 6; dopki nie koniec>pliku7plik! start czytaj 7plik" znak! jeeli znak P Q!Q kropki <= kropki?,; znaki <= znaki?,; stop; wypisz7znaki@kropki!;

Start 'ie 3twrz plik do odczytu 1wi%ksz licznik znakw ?icznik znakw 6PG ?icznik kropek 6PG

)zy znak jest kropk2 +ak 1wi%ksz licznik kropek

1
)zy licznik kropek P G2 'ie 'ie 8ypiszJlicznik znakwRlicznik kropek Noniec +ak

)zy koniec pliku2 +ak

'ie

1
)zytaj znak

Strona numer 8 z 82

Rysunek 1. #c$emat blokowy obliczania redniej liczby znakw w zdaniu Na(da z powy(szych metod ma swoje wady i zalety! 1apis poszcze"lnych krokw w postaci punktw jest prosty, ale przy bardziej zo(onych zadaniach staje si% mao czytelny! 1apis w postaci schematu blokowe"o jest bardzo czytelny, ale pracochonny w wykonaniu! 8reszcie zapis w pseudokodzie ma t% zalet%, (e po przetumaczeniu na j%zyk an"ielski staje si% praktycznie "otowym tekstem pro"ramu! 8 my&l te"o, co powiedzieli&my na zako4czenie poprzednie"o punktu, nie musisz, a nawet nie powiniene&, wymy&la al"orytmu samodzielnie! Jest to co prawda zaj%cie bardzo ksztacce i przynoszce du(o satys*akcji intelektualnej, jednak cz%sto okazuje si%, (e korzystajc z "otowych rozwiza4 mo(na zrobi to samo znacznie e*ektywniej i szybciej! 'iektre problemy s natomiast na tyle nietypowe, i( metod% ich rozwizania trzeba wymy&li od podstaw! 3mawiajc al"orytmy nie sposb pomin kwestii struktur danych! Jest oczywiste, i( rozwizanie jakie"okolwiek problemu wi(e si% z przetwarzaniem in*ormacji! +% z kolei trzeba jako& przechowa , nie mwic ju( o wprowadzeniu jej do komputera i pHniejszym wyprowadzeniu! Nomputerowe sposoby reprezentowania in*ormacji s znacznie &ci&lej okre&lone, a jednocze&nie znacznie mniej r(norodne ni( te, ktrych u(ywamy na co dzie4! 8 wi%kszo&ci przypadkw dobr odpowiedniej struktury danych jest automatyczny, "dy( albo narzuca si% sam Jnp! rozwizujc zadanie matematyczne nie b%dziesz przedstawia liczb w postaci znakowejL, albo jest wymuszony przez al"orytm! )zasem jednak sprawa nie jest tak oczywista! ,rzykadowo, konstruujc pro"ram zajmujcy si% przetwarzaniem danych osobowych pracownikw mo(esz zdecydowa si% na przechowywanie tych (e danych w tak zwanych tablicach lub listach! 3bydwa rozwizania maj swoje zalety i wady, jak rwnie( wi( si% z zastosowaniem odpowiednich metod przetwarzania danych, czyli wa&nie al"orytmw!

Projekt
Jak ju( powiedzieli&my, al"orytm przeznaczony jest do rozwizania zasadniczej cz%&ci zadania i #nie przejmuje si%$ takimi detalami, jak wprowadzenie i wyprowadzenie danych czy utworzenie struktur danych! 'a dodatek wi%kszo& problemw jest na tyle skomplikowana, i( nie daje si% rozwiza za jednym zamachem! 8 takiej sytuacji musisz rozbi swoje zadanie na mniejsze *ra"menty, dajce si% wyrazi za pomoc prostych al"orytmw i uzupeni ten zestaw przez opis operacji pomocniczych! 8szystko to nale(y powiza w spjn cao& , zwan" projektem pro"ramu! ,rojekty mo" by tworzone dwiema przeciwstawnymi metodami, znanymi jako projektowanie wst%pujce Jan"! bottomAup desigri! oraz projektowanie zst%pujce Jan"! topAdown design! ,ierwsza z nich jest realizacj zasady #od szcze"u do o"u$6 na samym pocztku okre&lamy zestaw elementarnych zada4, ktrych wykonanie b%dzie konieczne do realizacji "wne"o problemu Jnp! wprowadzanie danych, wyprowadzanie wynikw, obliczanie warto&ci po&rednichL! ,o skonstruowaniu takich ce"ieek budujemy z nich wi%ksze struktury, zajmujce si% przetwarzaniem odpowiednio wi%kszych *ra"mentw zadania, z tych I struktury jeszcze bardziej o"lne, a( w ko4cu dochodzimy do "wne"o schematu dziaania, ktry zarzdza poszcze"lnymi moduami! ,rojektowanie zst%pujce, jak nietrudno si% domy&la , wy"lda odwrotnie! ,ocztkiem procesu jest o"lne s*ormuowanie zadania, ktre nast%pnie poddaje si% analizie i rozbiciu na wspdziaajce ze sob cz%&ci, te za& dzieli si% dalej a( do uzyskania elementarnych *ra"mentw, ktrych zapro"ramowanie jest ju( atwe, a nawet typowe! Jednocze&nie na ka(dym etapie podziau ule"aj u&ci&leniu kompetencje poszcze"lnych *ra"mentw pro"ramu Ja raczej projektuL, czyli zakres przetwarzanych przeze4 danych i posta zwracanych wynikw! 'iezale(nie od te"o, jak metod% zastosujesz, e*ektem projektowania powinno by u&ci&lenie wybranej metody rozwizania zadania i dostosowanie jej do konkretnych okoliczno&ci i mo(liwo&ci! 3si"a si% to rozbijajc zadanie na elementarne skadniki, ktrych rozwizanie zostao ju( opisane lub jest atwe do samodzielne"o opracowania! :otowy projekt mo(e przyj posta podobn do omawianych przy okazji al"orytmw6 zapisu sowne"o lub "ra*icznej reprezentacji ci"u czynno&ci! 3dpowiednie zapisanie poszcze"lnych elementw projektu znacznie uatwi )i je"o implementacj% oraz przysze wprowadzanie zmian i ulepsze4!

-mp*ementacja
S**! ,rzynajmniej w teorii wszystko powinno ju( dziaa ! 5ysponujc odpowiednio rozpisanym projektem mo(na przystpi do mechanicznej w zasadzie czynno&ci pro"ramowania! 9ak" to nie pomy+ka< praktycznie cao& pracy umysowej po&wi%canej na rozwizanie dane"o zadania poprzez pro"ramowanie skupia si% w etapach opisanych poprzednio! Samo pro"ramowanie JkodowanieL jest jedynie czynno&ci pole"ajc na przetumaczeniu zapisu projektu na odpowiedni zapis symboliczny, czyli tak zwany j%zyk pro"ramowania Jnajcz%&ciej wysokie"o poziomuL! 1anim do te"o dojdzie, mo(esz jeszcze stan przed konieczno&ci wyboru odpowiednie"o j%zyka, czyli narz%dzia pracy Jzakadajc, (e masz z cze"o wybiera , tj! potra*isz si% posu"iwa kilkoma j%zykamiL!

Strona numer @ z 82

)ruc6omienie
Sruchamianie &wie(o napisanych pro"ramw nale(y do bardziej ekscytujcych momentw w (yciu pro"ramisty! ,eny proces uruchamiania skada si% z kilku etapw, ktre krtko opiszemy poni(ej! 'apisany pro"ram nale(y po pierwsze przetumaczy na posta wykonywaln przez komputer, czyli Jna o"L skompilowa "o! 8i%kszo& narz%dzi pro"ramistycznych skutecznie wyapie przy tej okazji wszelkie b%dy literowe i skadniowe, ktre miae& okazj% popeni podczas wpisywania pro"ramu Jb%dy takie zwane s o"lnie b+)dami kompilacji! ,o wyeliminowaniu wszystkich b%dw kompilacji mo(esz sprbowa wykona pro"ram! ,rzedtem jednak bezwzgldnie zapisz go na dysku. 8 przypadku bardziej skomplikowanych pro"ramw e*ekty pierwsze"o uruchomienia mo" by do& zaskakujce, z zawieszeniem komputera wcznie6 lepiej zapami%ta pro"ram, ni( nara(a si% na konieczno& odtwarzania cz%&ci lub cao&ci wynikw pracy! 8szelkie b%dy, ktre pojawiaj si% w trakcie pracy ju( uruchomione"o pro"ramu, nosz nazw% b+)dw wykonania B%dy te mo" powodowa przerwanie dziaania pro"ramu Ja nawet zawieszenie lub restart komputeraL lub je"o zachowanie niez"odne z oczekiwaniami Jnp! brak reakcji na dziaania u(ytkownika, zwracanie b%dnych wynikwL! Je&li pro"ram po uruchomieniu zachowuje si% w miar% poprawnie Jtj! nie zawiesi si%, rea"uje na prby komunikowania si% z nim, zwraca w miar% poprawne wyniki i daje si% zako4czy L, mo(esz przej& do je"o testowania! +estowanie pro"ramu pole"a z "rubsza na badaniu je"o reakcji na r(ne zachowania u(ytkownika! ,rzede wszystkim nale(y sprawdzi , czy wynik pracy pro"ramu jest z"odny z naszymi oczekiwaniami! Je&li tak, warto sprbowa podrzuci mu do przetworzenia inne dane, dla ktrych wynik znamy lub potra*imy obliczy ! 5obr danych do testowania nie powinien by przypadkowy, lecz winien opiera si% na przewidywaniu mo(liwych sabych punktw pro"ramu! ,rzykadowo, je&li pro"ram zajmuje si% obsu" kartoteki pracownikw, warto sprawdzi je"o zachowanie w przypadku niepodania (adne"o nazwiska, podania nazwiska du(sze"o ni( przyj%te maksimum itp! 5obr metod jest rwnie( testowanie pro"ramw przez u(ytkownikw, ktrzy zwykle nie maj poj%cia o zasadach *air play obowizujcych w pro"ramowaniu i potra*i bardzo skutecznie #rozo(y $ pro"ramy uwa(ane przez ich twrcw za cakowicie bezb%dne! 8 przypadku uruchamiania bardzo opornych pro"ramw nieocenione usu"i oddaj wreszcie tzw! narz)dzia uruc$omieniowe" (ar"onowo zwane debuggerami ,ozwalaj one na &ledzenie i analiz% zachowania pro"ramw instrukcja po instrukcji, co umo(liwia lokalizacj% nawet bardzo wyra*inowanych b%dw!

@drow& rozs0dek
Jest on najwa(niejszym elementem procesu pro"ramowania Ja dokadniej, jakiejkolwiek dziaalno&ci praktycznej podejmowanej w (yciuL! 1astosowanie zdrowe"o rozsdku w pro"ramowaniu sprowadza si% przede wszystkim do zachowania odpowiedniej proporcji pomi%dzy tre&ci i *orm oraz doboru metod odpowiednich do realizowanych zada4! /by rozwiza rwnanie kwadratowe mo(esz oczywi&cie napisa w Borland )TT M!G odpowiedni pro"ram dla 8indows, wykonujc uprzednio solidne przy"otowanie w postaci schematu blokowe"o, listy zmiennych i spisu literatury! .o(esz rwnie( nic nie pisa , a jedynie si%"n po kalkulator! 8 wi%kszo&ci przypadkw najlepsze jest rozwizanie kompromisowe, tj! napisanie krtkie"o pro"ramiku w +urbo ,ascalu! Samo przy"otowanie teoretyczne rwnie( powinno by traktowane z umiarem! 5obr al"orytmu czy opracowanie projektu bardzo cz%sto wykonywane s automatycznie, za& ich rozpisywanie ma na celu jedynie uatwienie ich zrozumienia i nie powinno by celem samym w sobie! ,rzewa(ajca cz%& zada4, ktre b%dziesz rozwizywa, jest na tyle prosta, i( nie wyma"a specjalnych przy"otowa4! ,owy(sze uwa"i powiniene& wi%c traktowa raczej jako sposoby uatwienia sobie rozwizywania bardziej zo(onych problemw, ewentualnie or"anizowania pracy zespoowej Jo ile masz zamiar zosta zawodowym pro"ramistL! 5ysponujc tymi wiadomo&ciami mo(esz ju( spokojnie przej& do dziea! 8 kolejnym rozdziale zapoznasz si% z narz%dziem, za pomoc ktre"o b%dziesz tworzy pro"ramy!

Strona numer 1G z 82

$arz!dzie
Skoro powiedzieli&my ju( kilka sw na temat teorii, czas omwi podstaw% dziaalno&ci praktycznej I j%zyk pro"ramowania, czyli narz%dzie, za pomoc ktre"o tworzy si% pro"ramy! J%zyk pro"ramowania umo(liwia zapisanie w zrozumiaej dla czowieka postaci czynno&ci, ktre maj zosta zrealizowane przez komputer! 3dpowiednie narz%dzie, zwane translatorem Jczyli tumaczemL, przekada taki zapis na instrukcje zrozumiae dla komputera! 'owoczesne narz%dzia do tworzenia pro"ramw zwykle zawieraj oprcz translatora rwnie( edytor" pozwalajcy na wprowadzania i poprawianie tekstu pro"ramu, konsolidator umo(liwiajcy e*ektywne tworzenie wi%kszych pro"ramw, program uruc$omieniowy Jan"! debugger! uatwiajcy lokalizacj% i usuwanie b%dw w pro"ramach oraz r(ne narz%dzia pomocnicze! ?iczba j%zykw pro"ramowania u(ywanych obecnie na &wiecie si%"a setek, jednak tylko kilka zyskao sobie popularno& na tyle du(, by zastanawia si% nad ich wybraniem! S to bez wtpienia j%zyki Basic, ) i ,ascal! Ntry z nich wybra 2 Basic jest j%zykiem prostym i popularnym, jednak nie promuje nawykw ele"anckie"o pro"ramowania! J%zyk ) zyska sobie ostatnio o"romn popularno& i zdominowa &rodowisko zawodowych pro"ramistw! Jednak i on nie nadaje si% zbytnio do nauki podstaw pro"ramowania ze wz"l%du na wysoki poziom komplikacji i mao czyteln skadni%! +rzeci z kandydatw, ,ascal, ust%puje nieco popularno&ci j%zykowi ), jest jednak znacznie czytelniejszy i przez to najcz%&ciej u(ywany do celw dydaktycznych! 8 dalszym ci"u nasze"o wykadu b%dziemy wi%c u(ywali j%zyka ,ascal! Jedn z wci( najpopularniejszych wersji ,ascala przeznaczonych dla komputerw ,) jest bez wtpienia +urbo ,ascal E!G, stanowicy wr%cz idealne narz%dzie do nauki i tworzenia mniej skomplikowanych pro"ramw! Je"o te( wybierzemy jako narz%dzie naszej pracyO podstawom posu"iwania si% &rodowiskiem +urbo ,ascala po&wi%cimy reszt% te"o rozdziau! 1acznijmy od uruchomienia nasze"o narz%dzia! 'a pocztek, rzecz jasna, musisz wczy komputer, a po wy&wietleniu znaku "otowo&ci systemu operacyjne"o Jzwykle )6 UVLnapisa turbo (eli uywasz systemu Bindows" musisz wczeniej przej do C:#Au 7w tym celu znajd0 i kliknij dwukrotnie ikon) D#AC:# *rompt! (eli 9urbo *ascal jest dost)pny pod postaci ikony" moesz go uruc$omi klikajc na niej dwukrotnie .o(e si% jednak okaza , (e po wydaniu powy(sze"o polecenia ujrzysz na ekranie komunikat
Bad command or file name

oznaczajcy, (e wywoywany pro"ram nie jest dost%pny z poziomu bie(ce"o katalo"u lub w o"le nie zosta zainstalowany! 8 takiej sytuacji musisz odszuka katalo" zawierajcy kompilator +urbo ,ascala o nazwie +S9B3!>W> Jzwykle jest to katalo" )6U+,UB0' lub )6U+,EUB0'L i doczy je"o nazw% do tzw! systemowej cieki dost)pu" umo(liwiajcej wywoywanie pro"ramw znajdujcych si% w katalo"ach innych ni( bie(cy! 8 tym celu do znajdujce"o si% w pliku )6U/S+3>W>)!B/+ polecenia ,/+= dopisz na ko4cu &rednik, a po nim nazw% katalo"u zawierajce"o +urbo ,ascala, np!
path=c:\dos;c:\windows;c:\norton;c:\tp7

Je(eli nie uda )i si% odszuka +urbo ,ascala, b%dziesz musia "o zainstalowa ! 8 tym celu weH pierwsz z dyskietek instalacyjnych pro"ramu Jopisan #0nstall$L, w( j do nap%du /6 Jlub B6L i napisz
install

Sruchomiony w ten sposb pro"ram instalacyjny dostarczy )i dalszych wskazwek odno&nie instalacji! 8i%cej in*ormacji na temat instalacji i wywoywania +urbo ,ascala znajdziesz w literaturze X1YO mo(esz rwnie( zasi%"n pomocy lokalne"o specjalisty od komputerw! Je&li udao )i si% bezkolizyjnie wywoa +urbo ,ascala, na ekranie monitora powiniene& zobaczy widok przedstawiony na ssiednim rysunku! Zrodkow cz%& ekranu zajmuje obszerne okno, w ktrym znajduje si% mi"ajcy kursor! 3kno to, zwane okienkiem edytora b%dzie su(yo nam do wpisywania i poprawiania pro"ramw! 'a samej "rze ekranu znajduje si% menu g+wne" zawierajce "rupy polece4 su(cych do zarzdzania pro"ramem! 8reszcie najni(szy wiersz ekranu I tak zwany wiersz statusowy I zawiera in*ormacje na temat najcz%&ciej wykorzystywanych kombinacji klawiszy lub aktualne"o stanu pro"ramu! 8szystkie elementy dost%pne poprzez okno edytora, menu "wne oraz kombinacje klawiszy tworz razem zintegrowane rodowisko robocze +urbo ,ascala, okre&lane rwnie( an"ielskim skrtem 05> 7Entegrated CeFelopment %nFironmen'! (eli po wywo+aniu 9urbo *ascala zobaczysz na ekranie jedynie jasne t+o" b)dziesz musia+ otworzy okienko edytora poleceniem New 7Nowy! z menu File 7*lik! #posb pos+ugiwania si) menu poznasz za c$wil)

Strona numer 11 z 82

Menu gwne

Wiersz statusowy

Rysunek 2! Gintegrowane rodowisko robocze 7EC%! 9urbo *ascala 3mawianie poszcze"lnych elementw 05> zaczniemy od "ry ekranu, czyli od menu "wne"o! .enu +urbo ,ascala E!G zawiera dziesi% pozycji6 Pile 7*lik! I zawiera polecenia umo(liwiajce odczytywanie, zapisywanie i drukowanie tekstw pro"ramw, a tak(e zako4czenie pracyO Edit7%dycja! I zawiera polecenia pozwalajce na mody*ikacj% tekstu pro"ramu i przenoszenie *ra"mentw tekstu pomi%dzy pro"ramamiO Search7Byszukiwanie! I zawiera polecenia su(ce do wyszukiwania i zamiany *ra"mentw tekstu pro"ramu oraz lokalizacji b%dwO Run7Hruc$omienie!I zawiera polecenia sterujce wykonaniem "otowe"o pro"ramuO Compile 7Iompilacja! I zawiera polecenia umo(liwiajce kompilacj%, czyli przetumaczenie tekstu Hrdowe"o pro"ramu na posta wynikow I wykonywaln przez komputerO Debug 7Hsuwanie b+)dw! I zawiera polecenia uatwiajce usuwanie b%dw z pro"ramw i wspoma"ajce ich uruchamianieO Tools 7Narz)dzia! I zawiera polecenia umo(liwiajce wywoanie pomocniczych pro"ramw zewn%trznychO Options 7:pcje! I zawiera polecenia pozwalajce na kon*i"urowanie elementw 05> Jkompilatora, edytora, pro"ramu uruchomieniowe"oL, czyli dostosowanie ich do wymo"w i potrzeb u(ytkownikaO Window 7:kno! I zawiera polecenia sterujce ukadem okienek na ekranieO Help 7*omoc! I zawiera polecenia umo(liwiajce dost%p do obszerne"o systemu pomocy Jsu*leraL +urbo ,ascala! Jak dosta si% do polece4 zawartych w menu2 .etod jest kilka! .o(esz np! nacisn klawisz ;1G, a nast%pnie wybra (dan pozycj% Jopcj%L menu "wne"o u(ywajc klawiszy kursora JstrzaekL [D oraz DV i #rozwin $ j naciskajc >'+>9! Gnacznie pro&ciej jest jednak wykorzysta kombinacj% klawisza /?+ z wyr(nion w nazwie opcji liter Jna przykad dla menu Jile b%dzie musisz jednocze&nie nacisn klawisze /?+ i ;L! +rzeci mo(liwo&ci jest u(ycie myszki I w tym celu musisz klikn jej lewym przyciskiem po wskazaniu wybranej pozycji menu "wne"o! 'iezale(nie od te"o, ktrej metody u(yjesz, wybranie dowolnej pozycji z menu "wne"o spowoduje pojawienie si% kolejne"o menu Jtzw! menu rozwijanego lub z an"ielska pullAdown menu!" zawierajce"o bardziej szcze"owy wykaz polece4 zwizanych z danym tematem! /by wybra (dane polecenie, musisz tym razem u(y klawiszy + lub \ Ji oczywi&cie >'+>9L, nacisn klawisz odpowiadajcy wyr(nionej literze Juwa"a6 tym razem bez klawisza /?+7L, ewentualnie klikn w odpowiednim miejscu myszk! 1auwa( przy tej okazji, (e niektrym poleceniom towarzysz nazwy klawiszy *unkcyjnych, specjalnych lub ich kombinacji, wy&wietlone w menu z prawej strony! S to tak zwane klawisze skrtu 7s$ortcut keys!" umo(liwiajce wywoanie dane"o polecenia bez rozwijania menu! S(ycie klawiszy skrtu znacznie upraszcza korzystanie z 05>, tote( warto zapami%ta kilka z nich Jnp! ;2 I zapisanie pro"ramu na dysku, )+9?D;@ I

Strona numer 12 z 82

uruchomienie pro"ramu itd!L! 3to przykad6 aby otworzy nowe okienko edytora, musisz wyda polecenie JileA New" czyli wybra z menu "wne"o J;1GL pozycj% Jile J;L, a z rozwini%te"o menu polecenie New 7Nowy! .enu Jile mo(esz rwnie( rozwin za pomoc myszki lub naciskajc jednocze&nie klawisze /?+ i ; J/?+D;L! /by wreszcie zako4czy prac% w 05>, wystarczy nacisn klawisz skrtu /?+DW Jmo(na zrobi to samo za pomoc menu, chocia( jest to nieco bardziej czasochonneL!

Ro!wini$te menu File

Rysunek 3. Kozwini)te menu Jile 1auwa( przy okazji, (e rozwini%cie menu wi(e si% ze zmian zawarto&ci wiersza statusowe"o, w ktrym b%dzie si% obecnie znajdowa krtki opis wybrane"o polecenia lub opcji! Skoro potra*imy ju( otworzy okienko edytora, mo(emy wyprbowa je"o mo(liwo&ci! +re& wpisywane"o tekstu nie ma na razie znaczenia, ale je&li chcesz, mo(esz od razu zajrze do nast%pne"o rozdziau i wpisa znajdujcy si% tam pro"ram przykadowy! Jak ju( prawdopodobnie wiesz, do wprowadzania tekstu su( tzw! lawis!e al"anumer#c!ne" czyli "wny blok klawiszy zawierajcy litery ]8>9+^!!! i cy*ry! Blok ten zawiera rwnie( kilka dodatkowych klawiszy zawierajcych symbole Jnp! T czy VL oraz klawisze specjalne, ktrymi zajmiemy si% ni(ej! 1auwa(, (e podczas wpisywania kursor Jmi"ajcy znak podkre&leniaL przesuwa si% tak, by zawsze wskazywa na pozycj% kolejne"o wprowadzane"o znaku, za& po przekroczeniu prawe"o brze"u okienka tekst nie jest automatycznie amany Jjak w wi%kszo&ci edytorw tekstuL! Je&li rzucisz okiem na ramk% otaczajc okienko edytora, to w okolicy lewe"o dolne"o ro"u zauwa(ysz "wiazdk% i dwie liczby rozdzielone dwukropkiem! :wiazdka sy"nalizuje, (e zawarto& okienka edytora zostaa zmody*ikowana Jprzez dopisania lub usuni%cie tekstuL, za& liczby oznaczaj numer wiersza i kolumny, w ktrych znajduje si% kursor! 3kienko edytora ma szeroko& co najwy(ej E8 znakw Jmo(na je pomniejszy L i dobrym zwyczajem jest nieprzekraczanie tej wa&nie du"o&ci wiersza! 1najdujce si% na klawiaturze klawisze specjalne i *unkcyjne nie su( do bezpo&rednie"o wprowadzania tekstu, umo(liwiaj jednak je"o poprawianie i sterowanie dziaaniem 05>! 5ziaaniem klawiszy sterujcych nie b%dziemy si% na razie zajmowa 6 na obecnym etapie znajomo&ci +urbo ,ascala wystarczy )i znajomo& kombinacji /?+DW Jzako4czenie pracyL i klawisza ;1 Jwywoanie pomocyL! ,oni(ej omwimy krtko dziaanie klawiszy edycyjnych! Nlawisz >'+>9, jak ju( zapewne wiesz, su(y do przej&cia do nowe"o wiersza! Je"o naci&ni%cie powoduje przemieszczenie kursora do pocztku kolejne"o wiersza Jznajdujcy si% pod spodem tekst jest przesuwany w dL, za& je&li wczony jest tzw! tryb automatyczne"o wcinania Jan"! autoindent mode!" kursor lokuje si% nie w pierwszej kolumnie, lecz na wysoko&ci pocztku poprzednie"o wiersza! Nlawisze B/)NS,/)> Jpoo(ony nad >'+>9L i 5>?>+> Jznajdujcy si% z prawej strony klawiatury w bloku klawiszy numerycznych i sterowania kursoremL pozwalaj na usuwanie tekstu! 'aci&ni%cie klawisza B/)NS,/)> usuwa znak poo(ony na lewo od kursora Ji przesuwa kursor w lewoL, za& klawisz 5>?>+> usuwa znak

Strona numer 1C z 82

znajdujcy si% #pod$ kursorem, nie przesuwajc te"o ostatnie"o! /by usun wiersz wskazany kursorem, wystarczy nacisn klawisze )+9?D^! 8arto rwnie( wiedzie , (e omykowo usuni%ty tekst mo(na odtworzy naciskajc klawisze /?+DB/)NS,/)> Jodpowiadaj one poleceniu %ndo z menu Edit&' .o(liwo& ta przydaje si% zwaszcza osobom roztar"nionym! Nlawisz +/B JtabulatorL powoduje przesuni%cie kursora o kilka kolumn do przodu, co umo(liwia wcinanie tekstu S(ywanie wci% podczas pisania pro"ramw jest spraw bardzo wa(n, pozwala bowiem na zachowanie przejrzysto&ci i czytelne"o ukadu tekstu! 5o sprawy wcinania wrcimy jeszcze w kolejnych rozdziaach! Nolejna "rupa klawiszy, w wi%kszo&ci klawiatur ulokowana pomi%dzy blokiem al*anumerycznym a numerycznym, su(y do poruszania si% po tek&cie! S to klawisze strzaek Jprzesuwajce kursor o jedn pozycj% lub wierszL oraz klawisze =3.>, >'5, ,/:>S, i ,/:>538', umo(liwiajce przemieszczenie kursora do pocztku lub ko4ca wiersza oraz wy&wietlenie poprzednie"o lub nast%pne"o ekranu JstronyL tekstu! 'aci&ni%cie klawisza 0'S pozwala na wybr pomi%dzy tzw! trybem wstawiania Jan"! insert mod) I wpisywane znaki s wstawiane w ju( istniejcy tekst i #rozpychaj$ "oL i trybem zast)powania Jan"! oFerwrite mod) I nowo wpisywane znaki zast%puj ju( istniejceL! 5ziaanie obu trybw mo(esz sprawdzi ustawiajc kursor #wewntrz$ ju( napisane"o wiersza tekstu i wpisujc nowy tekst z klawiatury! Gwr rwnie( uwa"% na ksztat kursora oraz dziaanie klawiszy >'+>9 i +/B! 3statnim wa(nym klawiszem jest >S)/,> J>S)L! Su(y on Jjak sama nazwa su"erujeL do wyco*ywania si% z poczynionych dziaa4 Jzamykania pl dialo"owych, #zwijania$ menu itp!L! Je&li przez przypadek tra*isz w jakie& nieznane )i okolice, mo(esz sprbowa przywrci poprzedni stan 05> wa&nie naciskajc >S)! ;unkcji te"o klawisza nie powiniene& jednak myli z poleceniem Sndo J/?+DB/)NS,/)>L, ktre umo(liwia anulowanie zmian dokonanych w tre&ci wpisywane"o pro"ramu! ,rzedstawione wy(ej wiadomo&ci powinny wystarczy )i do rozpocz%cia pracy z prostymi pro"ramami! Je&li chcesz, mo(esz pomin kolejny podrozdzia i od razu przej& do nast%pne"o rozdziau, z ktre"o dowiesz si%, jak napisa i uruchomi najprostszy pro"ram w ,ascalu! Je(eli interesuj )i% dodatkowe *unkcje i mo(liwo&ci edytora, zapraszam do dalszej lektury!

@aawansowane 3unkcje ed&tora


3mwimy obecnie najcz%&ciej u(ywane z dodatkowych *unkcji edytora +urbo ,ascala, a mianowicie operacje blokowe oraz wyszukiwanie i zast%powanie *ra"mentw tekstu! ,odczas pisania wi%kszych pro"ramw cz%sto zachodzi konieczno& powielenia, przeniesienia lub usuni%cia wi%kszych *ra"mentw tekstu I zarwno wewntrz pojedyncze"o okienka edytora Jw obr%bie jedne"o plikuL, jak i pomi%dzy okienkami JplikamiL! 1amiast przepisywa tekst r%cznie, mo(na wykorzysta tak zwane operacje blokowe" umo(liwiajce manipulowanie caymi je"o *ra"mentami! ,ierwsz czynno&ci jest zaznaczenie *ra"mentu tekstu, co najatwiej zrobi naciskajc klawisze sterujce kursorem Jrwnie( =3.>, >'5, ,/:>S, i ,/:>538'L przy wci&ni%tym klawiszu S=0;+! 1aznaczany *ra"ment zostaje na o" wy&wietlony w ne"atywie! Blok mo(na rwnie( zaznaczy za pomoc myszki, przesuwajc jej kursor przy wci&ni%tym lewym przycisku Jjest to tzw! cigni)cie I an"! Cragging!AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
2

+rzeci mo(liwo&ci jest u(ycie klawiszy skrtu )+9?DN, B i )+9?DN, =, b%dcych zaszo&ci z poprzednich wersji +urbo ,ascala i edytora 8ordStar! 5okadniejsze in*ormacje na ten temat znajdziesz w literaturze i systemie pomocy! DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

,o zaznaczeniu odpowiednie"o *ra"mentu mo(emy "o przenosi i powiela , wykorzystujc tzw! sc$owek Jan"! clipboard! 8 celu skopiowania zaznaczone"o *ra"mentu do schowka musisz nacisn klawisze )l9?Dl'S Jkombinacja S=0;+D5>? przeniesie *ra"ment do schowka, usuwajc "o z tekstuL! /by wstawi tekst ze schowka w wybrane miejsce, wska( je kursorem i naci&nij klawisze S=0;+Dl'S! 3pisane operacje umo(liwi )i nie tylko powielanie i przenoszenie *ra"mentw zawarto&ci aktywne"o okienka edytora, lecz rwnie( przenoszenie tekstu do innych okienek! .o(esz rwnie( zapisa zaznaczony blok na dysku J)+9?DN, 8L i odczyta "o z dysku J)+9?DN, 9L! /by usun wyr(nienie, u(yj kombinacji )+9?DN, =! /ktualn zawarto& schowka mo(esz wreszcie podejrze poleceniem Show clipboard z menu Edit Jpowoduje ono wy&wietlenie okienka zatytuowane"o Clipboard( ktre mo(esz zamkn naci&ni%ciem klawiszy /?+D;CL! 5ru" cz%sto wykorzystywan wasno&ci edytora jest wyszukiwanie i zamiana tekstu! ,ozwala to na szybkie znalezienie w pro"ramie (dane"o *ra"mentu tekstu lub zastpienie "o innym tekstem! ;unkcje te wywoywane s odpowiednio kombinacjami klawiszy )+9?DG, ; i )+9?DG, / Jnaci&ni%cie klawiszy )+9?D? powoduje wyszukanie lub zamian% kolejne"o wystpienia dane"o *ra"mentuL! ,oniewa( operacja wyszukania lub zamiany wyma"a ustalenia kilku parametrw Jjak cho by poszukiwany tekstL, wywoanie jednej z omawianych *unkcji powoduje wy&wietlenie tzw okna dialogowego ,oni(ej pokazano okno dialo"owe wy&wietlane dla operacji zamiany tekstu!

Strona numer 1F z 82

Rysunek 4. :kno dialogowe wywietlane dla operacji zamiany tekstu 1najdujce si% u "ry okienka dwa pola tekstowe su( do wprowadzenia tekstu, ktry ma by zastpiony )Te*t to"ind& i tekstu zast%pujce"o 7New te*t&' ,oni(ej poo(one s cztery grupy" zawierajce spokrewnione ze sob opcje! :rupa Options umo(liwia ustawienie parametrw przeszukiwania Jrozr(nianie maych i du(ych liter, wyszukiwanie tylko caych sw i tzw! wyra(e4 re"ularnych, zamiana z potwierdzeniemL! :rupa Direction pozwala na okre&lenie kierunku wyszukiwania Jw przd lub wsteczL! :rupa Scope pozwala na zaw%(enie zakresu dziaania *unkcji do zaznaczone"o bloku tekstu, za& "rupa Origin umo(liwia rozpocz%cie wyszukiwania od bie(cej pozycji kursora lub od pocztku tekstu! 'a samym dole okienka znajduj si% cztery przyciski su(ce do bezpo&rednie"o uruchomienia JwywoaniaL lub anulowania wybranej czynno&ci! ,rzycisk O+ powoduje rozpocz%cie operacji z ustalonymi wcze&niej parametrami, Change all pozwala na zamian% wszystkich wystpie4 poszukiwane"o tekstu, Cancel umo(liwia rezy"nacj% z wykonywania operacji, za& Help wywouje system pomocy! Je&li ju( wyprbowae& dziaanie *unkcji Replace J*unkcja wyszukiwania, Find( dziaa podobnie, nie powoduje jednak zamiany znalezione"o tekstu, a jedynie wskazuje "o kursoremL, sprbujemy obecnie omwi konstrukcj% i dziaanie pola dialo"owe"o! ,ola dialo"owe s powszechnie wykorzystywane przez 05> do komunikacji z u(ytkownikiem, tote( warto od razu zaznajomi si% z ich elementami! 8yboru elementu pola dialo"owe"o dokonujesz klikni%ciem myszk lub naci&ni%ciem klawisza +/B Jalbo S=0;+D+/B I wybr elementu poprzednie"oL! Gwr uwa"%, (e w przypadku "rupy naci&ni%cie +/B udost%pnia jej pierwszy element I aby dosta si% do pozostaych, musisz u(y klawiszy kursora! 8ybranie elementu sy"nalizowane jest przez je"o wyr(nienie Jna o" koloremL i umo(liwia zmian% je"o stanu! 8 przypadku pola tekstowe"o zmian stanu jest po prostu wprowadzenie tekstu! 5ziaanie elementw "rup wyma"a nieco szersze"o omwienia! Jak zapewne zauwa(ye&, "rupy zawarte w polu Replace zawieraj dwa rodzaje #elementw manipulacyjnych$6 tak zwane pola wyboru Jan"! c$eck bo&!" oznaczone nawiasami kwadratowymi, oraz przyciski opcji Jan"! radio buttori!" oznaczone nawiasami okr"ymi! ,ola wyboru umo(liwiaj niezale(ne wczenie lub wyczenie danej *unkcjiO jak atwo sprawdzi , opcje umieszczone w "rupie Options nie wykluczaj si% wzajemnie i mo" by wczane niezale(nie od siebie! 1 kolei przyciski opcji pozwalaj na wybr jednej z kilku wzajemnie wykluczajcych si% mo(liwo&ci Jnp! przeszukiwanie tekstu mo(e odbywa si% albo do przodu, albo do tyuL, tote( wczenie jedne"o z nich powoduje automatyczne wyczenie pozostaych! Stan wczenia sy"nalizowany jest dla pola wyboru symbolem XWY, za& dla przycisku opcji I symbolem J-L! 3statni "rup% elementw pola dialo"owe"o stanowi przyciski Jan"! buttori! #'aci&ni%cie$ przycisku Jtj! wyr(nienie "o za pomoc klawisza +/B i naci&ni%cie spacji lub klawisza >'+>9, ewentualnie klikni%cie myszkL powoduje natychmiastowe wykonanie odpowiadajcej mu czynno&ci i Jna o"L zamkni%cie pola dialo"owe"o! +rzy spo&rd znajdujcych si% w polu Replace przyciskw I O+( Cancel i Help I znajdziesz praktycznie w ka(dym innym polu dialo"owym! Jak atwo si% domy&li , #naci&ni%cie$ przycisku O+ powoduje zaakceptowanie in*ormacji wprowadzonej do pola dialo"owe"o, je"o zamkni%cie i wykonanie danej operacji Jnp! zamiany znakwL! ,rzycisk Cancel pozwala na rezy"nacj% z wykonywania operacji Jwprowadzone do pola in*ormacje s traconeL, za& przycisk Help wywouje okienko systemu pomocy zawierajce odpowiedni do kontekstu in*ormacj%! 8arto zapami%ta , (e omwione wy(ej przyciski maj swoje odpowiedniki na klawiaturze6 s to mianowicie >'+>9 Jodpowiadajcy przyciskowi :I" o ile ten zosta wyr(niony, tzn! jest tzw! przyciskiem domy&lnymL, >S)/,> Jodpowiadajcy przyciskw Cancel& oraz ;1 Jodpowiadajcy przyciskowi Help&' 8arto jeszcze powiedzie kilka sw na temat systemu pomocy, czyli wa&nie *unkcji Help' #,odr%czna &ci"awka$ dost%pna w 05> o*eruje, oprcz bardzo szerokie"o zestawu in*ormacji, kilka nader przydatnych *unkcji! ,rzede wszystkim system pomocy +urbo ,ascala jest tzw! systemem kontekstowym 3znacza to, (e po naci&ni%ciu klawisza ;1 uzyskasz in*ormacj% &ci&le zwizan z sytuacj, w jakiej si% znajdujesz Jnp! po otwarciu okna dialo"owe"o Replace system pomocy wy&wietli opis te"o( pola i je"o elementwL! Nontekstowo& oznacza rwnie( mo(liwo& atwe"o uzyskania in*ormacji na temat b%dw sy"nalizowanych przez kompilator! 5ru" ciekaw cech systemu pomocy jest mo(liwo& uzyskania in*ormacji o wybranym elemencie pro"ramu Jo ile je"o nazwa zostaa zde*iniowana w ramach +urbo ,ascalaL! ;unkcja ta

Strona numer 1M z 82

wywoywana jest naci&ni%ciem klawiszy )+9?D;1, po uprzednim wskazaniu interesujce"o nas sowa kursorem! +ak wi%c, aby dowiedzie si% cze"o& na temat procedury write Jb%dziesz z niej korzysta w nast%pnym rozdzialeL, musisz napisa write i nacisn )+9?D;1 pami%tajc, by kursor znajdowa si% w obr%bie napisane"o sowa! 8 podobny sposb mo(esz uzyska in*ormacj% na temat innych obiektw! 5ost%p do skorowidza hase opisanych w systemie pomocy mo(esz uzyska naciskajc klawisze S=0;+D;1! /by wybra haso ze skorowidza, wystarczy wskaza je kursorem i nacisn >'+>9 Jewentualnie klikn myszkL! ,odczas korzystania z systemu pomocy istnieje rwnie( mo(liwo& powrotu do poprzednio wy&wietlanych opisw przez naci&ni%cie klawiszy /?+D;1! ,ozostae, rzadziej u(ywane polecenia z"rupowane s w menu Help' 8 ten sposb zako4czyli&my prze"ld podstawowych in*ormacji na temat &rodowiska +urbo ,ascala! .o(esz teraz po wiczy posu"iwanie si% edytorem i poznanymi *unkcjami, zako4czy prac% naciskajc klawisze /?+DW lub od razu przej& do nast%pne"o rozdziau, w ktrym zademonstrujemy pierwszy pro"ram w ,ascalu!

@apami!taj
/by uruchomi +urbo ,ascala, wydaj polecenie turbo! )hcc zako4czy prac% z +urbo ,ascalem, naci&nij klawisze /?+DW! 8szystkie polecenia 05> +urbo ,ascala dost%pne s poprzez menu "wne Jwywoywane klawiszem ;1G lub za pomoc myszkiL! )z%& polece4 mo(na rwnie( wywoa naciskajc klawisze skrtu! 5o wprowadzania i poprawiania tekstw pro"ramw su(y okienko edytora! Nonwersacja z 05> prowadzona jest za pomoc pl dialo"owych! Nlawisz >S)/,> umo(liwia )i rezy"nacj% z wykonywania rozpocz%tej operacji! Je&li potrzebujesz pomocy, naci&nij klawisz ;1!

Strona numer 1A z 82

Pierwsz& program
'ajwy(sza pora na napisanie jakie"o& pro"ramu! By nie by on cakowicie niepraktyczny, sprbujmy za pomoc komputera obliczy pole koa o promieniu M centymetrw! Jak wiadomo, pole koa wyra(a si% wzorem "dzie r oznacza promie4, za& ,0 jest znan od do& dawna sta wynoszc okoo C!1F! Sam pro"ram powinien jedynie wypisywa obliczon warto& na ekranie, czyli dziaa z "rubsza tak6 poc!,te w#pis! pi ra!# r do wadratu oniec 3N! ,omijajc niejasne na razie kwestie mno(enia, podnoszenia liczby do kwadratu i warto&ci -, mo(esz wczy komputer i uruchomi +urbo ,ascala, piszc turbo po pojawieniu si% na ekranie okienka edytora Jje&li takowe si% nie pojawi, z menu Jile wybierz polecenie New" czyli Nowy!" sprbuj przetumaczy nasz schemacik na j%zyk an"ielski i wprowadzi "o do komputera! ,owinno to wy"lda mniej wi%cej tak6
begin write (Pi ! !" # end.

1auwa(, (e powy(szy pro"ram jest prawie dosownym tumaczeniem te"o, co napisali&my poprzednio! +a wa&nie #dosowno& $ stanowi jedn z najpowa(niejszych zalet +urbo ,ascala6 tworzenie prostych pro"ramw mo(na w du(ej cz%&ci sprowadzi do tumaczenia odpowiednie"o al"orytmu na j%zyk an"ielski Jwarto jeszcze zna podstawy an"ielskie"o, ale naprawd% wystarcz podstawyL! Sam pro"ram chyba nie mo(e by prostszy! Skada si% on z jednej jedynej instrukcji wypisujcej warto& wyraenia #pi razy r do kwadratu$, przy czym podnoszenie liczby do kwadratu zostao zastpione wymno(eniem jej przez siebie! Samo mno(enie symbolizowane jest operatorem L J"wiazdkaL, za& staa _ to po prostu ,i! 3 wyra(eniach, operatorach i staych powiemy nieco wi%cej ju( wkrtce, na razie za& wyja&nijmy rol% pozostaych skadnikw pro"ramu! Na(dy pro"ram w ,ascalu rozpoczyna si% sowem kluczowym begin 7pocztek! i ko4czy sowem kluczowym end' 7koniec I z kropkL! #+owa kluczowe stanowi podstawowy #al*abet$ j%zyka, su(cy do tworzenia bardziej zo(onych struktur! +urbo ,ascal automatycznie wyr(nia sowa kluczowe w tre&ci pro"ramu przez wy&wietlanie ich w innym kolorze, natomiast w ksi(ce b%dziemy zaznaczali je $z$ionk% pogrubion%. ,omi%dzy sowami kluczowymi oznaczajcymi pocztek i koniec pro"ramu znajduje si% je"o zasadnicza tre& , czyli tak zwana cz) operacyjna Skadaj si% na ni instrukcje opisujce kolejne czynno&ci wykonywane przez komputer! 8 naszym przypadku pro"ram zawiera tylko jedn instrukcj%, a mianowicie wywoanie tzw! procedury bibliotecznej write 7wypisz! wypisujcej na ekranie uprzednio obliczon warto& wyra(enia! Jak si% wkrtce przekonasz, instrukcje mo" rwie( zawiera zapis dziaa4 arytmetycznych, wywoania *unkcji systemowych i wiele innych operacji! Na(da instrukcja, z wyjtkiem instrukcji znajdujcej si% bezpo&rednio przed sowem end, musi by zako4czona &rednikiem JOL, ktry w ,ascalu jest tzw! separatorem instrukcji /by procedura write wiedziaa, co wa&ciwie ma wypisa , musisz przekaza jej odpowiednie in*ormacje w postaci tzw! argumentw 8 naszym przypadku ar"umentem procedury writeln jest wyra(enie ,i`M`M, ktre z kolei skada si% z identy*ikatorw, staych i operatorw Jo tym za chwil%L! Je&li procedura wyma"a kilku ar"umentw, nale(y rozdzieli je przecinkami, za& caa lista ar"umentw musi by zawsze uj%ta w nawiasy okr"e! +ak wi%c skadnia Jczyli symboliczny opis sposobu wykorzystaniaL naszej procedury write jest nast%pujca6
write[(argument, argument...)]

8 powy(szym zapisie nawiasy kwadratowe oznaczaj elementy nieobowizkowe Jmo(liwe jest u(ycie procedury write bez ar"umentwL, za& wielokropek sy"nalizuje mo(liwo& u(ycia dalszych ar"umentw w bli(ej nieokre&lonej liczbie! ,oprawne b%d wi%c nast%pujce wywoania procedury write6 - write JMLO wypisze liczb% M - write Jl, 2, C, FLO wypisze liczby l, 2, C i F Jjako #12CF$L - writeO nic nie wypisze ,ozostao nam jeszcze wytumaczy poj%cia staej, operatora i identy*ikatora! #ta+a to po prostu!!! staa, czyli pewna staa warto& zapisana jawnie Jna przykad liczba M czy nazwa Q8arszawaQL! 3 tak zwanych sta+yc$ symbolicznyc$ powiemy nieco pHniej! :peratorem nazywamy symbol reprezentujcy pewne dziaanie, np! dodawanie JTL czy porwnanie JPL! 3peratory, b%dce sowami zastrze(onymi, stanowi jeden z podstawowych elementw wyraeM" o ktrych powiemy wi%cej w nast%pnym rozdziale! 8reszcie identy'ikator jest po prostu nazw obiektu Jnp! staej ,0L lub operacji Jna przykad wypisywania warto&ci I writeL! .o(e on zawiera litery Jdu(e litery nie s odr(niane od maych, zatem write i write to ten sam identy*ikatorL, cy*ry i znaki podkre&lenia, lecz nie mo(e zaczyna si% od cy*ry! .usisz rwnie( pami%ta , (e tworzenie identy*ikatorw brzmicych tak samo, jak sowa kluczowe i operatory Jb%dce sowami zastrze(onymiL jest niedozwolone, tak wi%c nie mo(esz utworzy obiektu o nazwie >nd czy P! +yle teorii! aeby przekona si%, (e pro"ram naprawd%

Strona numer 1E z 82

dziaa, sprbuj "o skompilowa Jnaciskajc klawisz ;@ I .a e! 3 ile nic nie popsue& przy przepisywaniu, wynikiem kompilacji powinno by przedstawione ni(ej okienko!

Rysunek M! :kienko wywietlane po prawid+owej kompilacji programu 'azwa pliku, rozmiar wolnej pami%ci i inne szcze"y mo" by u )iebie nieco inne I najwa(niejszy jest komunikat )ompile success*ul6 ,ress any key wy&wietlany u dou okienka! Je&li udao )i si% popeni jaki& bd, kompilator zasy"nalizuje to odpowiednim komunikatem, wskazujc jednocze&nie kursorem podejrzane miejsce w pro"ramie!

Rysunek &. Iompilator sygnalizuje b+d kompilacji ,owy(ej zilustrowano reakcj% kompilatora na brak kropki po ko4czcym pro"ram sowie end! Jak wida , kursor znalaz si% w wierszu zawierajcym bd, za& wy&wietlony na ekranie komunikat oznacza, (e tre& pro"ramu nie zostaa prawidowo zako4czona! 5odatkowe wyja&nienia dotyczce b%du mo(esz uzyska naciskajc klawisz ;1 7Nelp! Je&li w pro"ramie znajduje si% kilka b%dw, kompilator wykryje tylko pierwszy z nich Jpo je"o poprawieniu I nast%pny i tak dalejL! 8 charakterze wiczenia mo(esz wprowadzi kilka b%dw do pro"ramu Jnp! przestawi litery w sowie writeL i przekona si%, jak rea"uje na nie kompilator! Dusisz zdawa sobie spraw)" e bezb+)dna kompilacja nie zawsze gwarantuje poprawne wykonanie programu O+)dy" o ktryc$ powiedziano przed c$wil" nazywane s b/edami ompilac0i 7ang compileAtime error! i wynikaj g+wnie z pomy+ek podczas wpisywania programu 7np b+)dnie wpisanyc$ s+w kluczowyc$! Crug" znacznie mniej przyjemn kategori) tworz b/ed# w# onania 7ang runtime error!" wynikajce z niew+aciwej konstrukcji programu lub uycia nieprawid+owyc$ danyc$ O+)dy te nie s wykrywane przez kompilator i ujawniaj si) dopiero w trakcie pracy programu" prowadzc najcz)ciej do jej przerwania 9ypowym przyk+adem jest prba dzielenia liczby przez zero lub odczytania danyc$ z nieistniejcego pliku 7kompilator nie moe wiedzie" czy plik o danej nazwie b)dzie istnia+ w c$wili wykonania programu! Na szcz)cie programy" ktrymi b)dziemy si) zajmowa w najbliszym czasie" s na tyle proste" e trudno w nic$ o b+)dy wykonania +yle na temat b%dw, ktrych oczywi&cie (ycz% )i jak najmniej! Je&li ju( skompilowae& pro"ram, mo(esz "o wykona , naciskajc klawisze )+9?D;@! Ju(2 0 jaki jest wynik2 =m!!! a wa&ciwie gdzie on jest2 'ie ma si% cze"o obawia ! 3bliczone w pro"ramie pole koa zostao wypisane na ekranie, lecz jest przesoni%te przez okienko edytora! /by si% o tym przekona , naci&nij klawisze /?+D;M6 powiniene& zobaczy znajdujcy si% #pod spodem$ ekran 53SDowy, zawierajcy Joprcz innych rzeczyL liczb% 7. !"# $%"&'()'$ czyli z "rubsza E8!M Jcentymetrw kwadratowychL! /by wrci do okienka edytora, wystarczy nacisn >'+>9! S**! 'a pierwszy raz to chyba wystarczy! /by nie utraci swoje"o pierwsze"o pro"ramu, musisz "o jeszce zapami%ta , czyli zapisa na dysku! 8 tym celu wybierz polecenie Sa1e 7Gapami)taj! z menu File lub po prostu naci&nij klawisz ;2! Je&li wcze&niej nie nadae& pro"ramowi nazwy Jnazwa wy&wietlana jest na "rnej kraw%dzi ramki okienka edytoraO je&li znajduje si% tam napis '3'/.>33!,/S, pro"ram nie zosta jeszcze nazwanyL, na ekranie pojawi si% pole dialo"owe Sa1e File 2s /by zapisa pro"ram pod przykadow nazw ,93:9/.0!,/S, wystarczy wpisa j w pole Sa1e"lle as i nacisn >'+>9! ,oniewa( rozszerzenie !,/S jest dla pro"ramw pascalowych przyjmowane domy&lnie, nie musisz "o podawa ! 1auwa(, (e po wykonaniu tej operacji nazwa pro"ramu wy&wietlana w ramce okienka edytora zmienia si% z '3'/.>33!,/S na ,93:9/.0!,/S! Je&li teraz ponownie naci&niesz ;2, pro"ram zostanie zachowany pod t sam nazw bez

Strona numer 18 z 82

wy&wietlania pola dialo"owe"o!

9ysunek E! :kno dialogowe #aFe *ile As +worzenie nowe"o pro"ramu poleceniem JileANew i pHniejsza zmiana nazwy poleceniem JileA#aFe@#aFe as nie s zbyt wy"odne! 3to dwie metody utworzenia pro"ramu nie wyma"ajce pHniejszej zmiany nazwy! 1amiast polecenia New mo(esz wykorzysta polecenie :pen 7:twrz! z menu Jile ,ozwala ono na odczytanie z dysku zapisane"o wcze&niej tekstu pro"ramu, wy&wietlajc okno dialo"owe :pen a Jile pokazane poni(ej!

9ysunek 8! :kno dialogowe :pen a Jile 'azw% (dane"o pro"ramu mo(esz wpisa w pole Name lub wybra z listy Jiles" zawierajcej zawarto& katalo"u robocze"oO nast%pnie nale(y nacisn >'+>9! Je&li plik o podanej nazwie nie istnieje, +urbo ,ascal utworzy nowe, odpowiednio zatytuowane okienko edytora, ktre"o zawarto& b%dzie mo(na w dowolnym momencie zapisa bez konieczno&ci podawania nazwy! 5ru"a metoda pole"a na odpowiednim wywoaniu +urbo ,ascala z poziomu 53SDu! /by otworzy istniejcy plik z pro"ramem lub utworzy nowy plik, wystarczy napisa turbo nazwa P,o uruchomieniu system automatycznie odczyta plik o zadanej nazwie Ji rozszerzeniu !,/SO podobnie jak poprzednio, rozszerzenia nie trzeba podawa L lub, je&li taki plik nie istnieje, otworzy puste okienko edytora o odpowiednim tytule! 8 ten sposb poznae& absolut nie podstawy posu"iwania si% &rodowiskiem +urbo ,ascala i uruchomie& swj pierwszy pro"ram! / oto kilka wicze4, ktre pomo" )i nabra wprawy i zdoby dodatkowe wiadomo&ci6 - wykorzystaj system pomocy do wy&wietlenia in*ormacji o poszcze"lnych elementach pro"ramu Jsowach kluczowych, identy*ikatorach, operatorachLO - sprbuj wprowadzi do pro"ramu kilka b%dw! Jaka jest reakcja kompilatora2 - popraw pro"ram tak, by dao si% za je"o pomoc obliczy pole koa o promieniu 2 cm, 1G cm itd! Sprbuj napisa pro"ram obliczajcy pole trjkta o znanej du"o&ci podstawy i wysoko&ciO - zastanw si%, co nale(aoby zmieni w przedstawionym pro"ramie, by uczyni "o lepszym Jbardziej czytelnym, uniwersalnym, praktycznym, atwiejszym w obsudzeL!

@apami!taj
,ro"ram pascalowy skada si% z ci"u rozdzielonych &rednikami instrukcji poo(onych pomi%dzy sowami kluczowymi be"in i end! 0nstrukcje stanowi symboliczny zapis operacji, ktre ma wykona komputer! 0nstrukcje mo" zawiera wyra(enia oraz wywoania *unkcji i procedur! 8yra(enia skadaj si% ze staych, operatorw i identy*ikatorw! 0denty*ikatory s nazwami obiektw skadajcych si% na pro"ram! .o" one zawiera litery, cy*ry i znaki podkre&lenia, nie mo" jednak zaczyna si% od cy*r! /by skompilowa pro"ram, musisz u(y polecenia .a e J;@L! >wentualne b%dy kompilacji s odpowiednio sy"nalizowane! )hcc uruchomi pro"ram, musisz wyda polecenie Run J)+9?D;@L! 5o obejrzenia wynikw dziaania pro"ramu mo(e okaza si% niezb%dne polecenie %ser Screen J/?+D;ML!

Strona numer 1@ z 82

/by zapisa pro"ram, u(yj polecenia Sa1e J;2L! 5o odczytania zapisane"o pro"ramu z dysku su(y polecenie Open J;CL!

Strona numer 2G z 82

$ic nie jest doskona'e...


!!! a zwaszcza pierwszy w (yciu pro"ram w ,ascalu! Je(eli prbowae& zastanowi si% nad pytaniem zamykajcym poprzedni rozdzia, najprawdopodobniej widzisz ju( mo(liwo&ci ulepszenia swe"o dziea! 'a pocztek sprbujemy zaj si% czytelno&ci pro"ramu, a nast%pnie zastanowimy si%, jak uczyni "o bardziej praktycznym! )o wa&ciwie robi nasz pro"ram2 #3blicza pole koa$ I odpowiesz! Skd to wiadomo2 #+ak byo napisane w ksi(ce$! / je&li kto& nie czyta ksi(ki2 #.o(e si% domy&li po przeczytaniu pro"ramu$! /le po co ma czyta pro"ram2 )o prawda zrozumienie jednej instrukcji to (aden problem, ale je&li instrukcji b%dzie sto!!!2 Gnacznie lepiej byoby umie&ci w pro"ramie in*ormacj% opisujc je"o przeznaczenie i JewentualnieL metod% realizacji zadania! .o(na to zrobi na kilka sposobw6 umieszczajc odpowiednie zapisy w pro"ramie oraz u(ywajc stosownej nazwy pliku! 1rbmy to od razu6
program *ole+,ola; - *rogram o.lic/a pole ,o0a o promieniu ! 1 begin write(*i2!2!); (2 o.lic/ i w3pis/ pole ,o0a 2) end.

8 porwnaniu do poprzedniej wersji pro"ramu pojawiy si% w nim trzy nowe elementy6 nag+wek" komentarze oraz wci)cia 'a"wek Jpro"ram ,olebkolaL peni wycznie *unkcj% in*ormacyjn i nie ma wpywu na dziaanie pro"ramu, co nie zmienia *aktu, (e u(ywanie "o I chocia( nieobowizkowe I nale(y do dobrej praktyki, uatwia bowiem czytanie osobom trzecim! Skadnia na"wka to
program na/wa;

1auwa( przy okazji, (e #,ole koa$ to dwa oddzielne wyrazy6 poniewa( nazwa jako identy*ikator nie mo(e zawiera znaku spacji, zast%puje si% "o podkre&leniem JbL! Gnacznie wa(niejsze dla czytelno&ci pro"ramu s komentarze! Nomentarzem w ,ascalu jest dowolny ci" znakw uj%ty w nawiasy klamrowe c i d! 1 oczywistych wz"l%dw ci" taki nie mo(e zawiera nawiasw klamrowych, natomiast wszystkie inne znaki s dozwolone! Je(eli koniecznie chcesz umie&ci nawiasy klamrowe w komentarzu, musisz u(y jako o"raniczniki dwu znakowych symboli J` i `L Jco wida w dru"im komentarzuL! ,odobnie jak w przypadku na"wka, komentowanie pro"ramw nie jest obowizkowe, nale(y jednak do dobrej praktyki pro"ramowania! 3czywi&cie, komentarze powinny by u(ywane rozsdnie6 nie ma sensu ich nadu(ywanie czy komentowanie rzeczy oczywistych, jak np! sowa be"in! 8arto jednak zdawa sobie spraw%, (e komentarze nic nie kosztuj Jtj! nie maj wpywu na wielko& skompilowane"o pro"ramuL, a jednocze&nie w znaczcy sposb poprawiaj czytelno& pro"ramu! Iomentarze bywaj rwnie cz)sto stosowane do c$wilowego wy+czenia 'ragmentu programu z kompilacji *ozwala to unikn usuwania i powtrnego wpisywania tekstu< zamiast tego wystarczy uj Qniec$cianyR'ragment programu w znaki komentarza" ktre potem mona +atwo usun 3statnim #kosmetycznym$ elementem nasze"o pro"ramu s wci)cia 'asz pro"ram jest co prawda tak may, (e u(ywanie wci% jest nieco dyskusyjne, jednak w wi%kszych pro"ramach, ktrymi zajmiemy si% ju( wkrtce, wci%cia pozwalaj na szybkie zlokalizowanie *ra"mentw tworzcych lo"iczn cao& i znajdujcych si% na tym samym poziomie w strukturze pro"ramu! 8cinanie, podobnie jak inne re"uy pisania adnych i czytelnych pro"ramw, jest w du(ej mierze kwesti stylu Jzwykle pojedyncze wci%cie ma "%boko& l R C znakwL, warto jednak przyjrze si% sprawdzonym wzorcom Jnp! pro"ramom przykadowym *irmy BorlandL, a nast%pnie wypracowa wasny styl i stosowa "o konsekwentnie! +yle spraw #*ormalnych$O nie b%dziemy si% nad nimi wi%cej rozwodzi , zostawiajc reszt% praktyce! ,rzejdziemy obecnie do znacznie bardziej interesujcej cz%&ci te"o rozdziau6 co zrobi , (eby nasz pro"ram sta si% bardziej praktyczny2 .o(e inaczej6 co pro"ram robi obecnie2 3blicza i wy&wietla pole koa o promienu M cm! Ba, ale skd wiadomo, (e to pole koa, a nie np! &rednia opadw z ubie"e"o procza2 aeby si% o tym przekona , musisz zajrze do ksi(ki J"dzie jest to napisane wprostL lub do pro"ramu Jnad ktrym musisz troch% pomy&le , o ile nie wpisae& jeszcze odpowiednich komentarzyL! 'a dodatek wy&wietlana liczba ma cokolwiek niestrawny *ormat i niezbyt ch%tnie nam si% pokazuje!!! )hwileczk%, nie wszystko naraz 'a pocztek sprbujmy s*ormuowa list% (ycze4, czyli zapisa w uporzdkowany sposb to, co nam si% w pro"ramie nie podoba i co chcieliby&my zmieni ! / zatem6 - pro"ram powinien in*ormowa u(ytkownika o tym, co robiO - wynik dziaania pro"ramu nie powinien znika , lecz zostawa na ekranie tak du"o, jak yczy sobie u(ytkownikO - wy&wietlana liczba powinna adniej wy"lda ! ,ierwszy problem mo(na rozwiza wyprowadzajc na ekran dodatkow in*ormacj% w postaci tekstu! Su(y do te"o znana )i ju( procedura write, ktra tym razem b%dzie wypisywaa na ekranie nie wyra(enie liczbowe, lecz +aMcuc$ Ja &ci&lej rzecz biorc, tzw! sta a4cuchowL, czyli ci" znakw! Sta a4cuchow jest w ,ascalu

Strona numer 21 z 82

dowolny ci" znakw uj%ty w apostro*y JQ, nie $L! )i" taki mo(e zawiera dowolne znakiO znak apostro*u Jnormalnie ko4czcy a4cuchL zapisuje si% jako dwa apostro*y Jtj! dwa oddzielne znaki Q, a nie znak cudzysowu $L! )ao& b%dzie wy"ldaa nast%pujco6
write(4*rogram o.lic/a pole ,ola o promieniu ! cm.4)

Sprbuj teraz przyjrze si% opisowi procedury write z poprzednie"o rozdziau i zastanowi si%, jak powinna wy"lda instrukcja wypisujca na ekranie tekst
,ole kola P !!!!!

Jw miejscu kropek powinna znale0 si% obliczona przez nasz pro"ram liczbaL! Je&li nie wiesz, jak to zrobi , rzu okiem na tekst nast%pne"o pro"ramu! 1auwa( przy okazji, (e pojawia si% w nim drobna nowinka, mianowicie procedura writeln, r(nica si% od write tylko tym, (e po jej wykonaniu kursor przechodzi do nowe"o wiersza Ji tam te( wypisywane s kolejne in*ormacjeL! /by przekona si% o r(nicy w dziaaniu obu procedur, zamie4 pierwsz instrukcj% writeln na write i wykonaj pro"ram! Sprawa dru"a, czyli zatrzymanie wyniku na ekranie monitora, rwnie( daje si% prosto rozwiza ! 8ystarczy mianowicie na ko4cu pro"ramu dopisa instrukcj%
readlnO

i "otowe! )o to takie"o readln I to ju( inna sprawa6 procedur readln i pokrewn jej read zajmiemy si% wkrtce, na razie za& wystarczy )i wiedzie tyle, (e readln odczytuje z klawiatury dowolny ci" znakw zako4czony znakiem nowe"o wiersza Jkodem klawisza >'+>9L, tote( jej wywoanie powoduje zatrzymanie dziaania pro"ramu do momentu naci&ni%cia te"o( klawisza! ,ozostaa sprawa ostatnia, tj! zrobienie porzdku z mao czyteln reprezentacj wyprowadzane"o pola! 'a pocztek rozszy*rujmy zapis
7. !"# $%"&'()'$

Jest to nic inne"o, jak E!8MC@81ACFG ` 1G1, czyli okoo E8!M! 1apis K ! KKKK>nn oznacza wi%c liczb% K! KKKK pomno(on przez 1G do pot%"i nn i zwany jest zapisem naukowym 1auwa( przy okazji, (e cz%& uamkowa liczby oddzielona jest od cz%&ci rzeczywistej nie przecinkiem, lecz kropk Jbardzo wa(ne7L! 8ykadnik nn jest zawsze dobierany tak, by znajdujca si% #przed nim$ liczba miaa tylko jedn cy*r% przed kropk, tj! zawieraa si% w przedziale od l do 1G! 8ielko& litery > symbolizujcej wykadnik nie ma znaczenia, za& znak T mo(na pomin ! 3to kilka przykadw6 C!1F>TGG P C!1F 1!2CFMeF P 12CFM 2!E8>DC P G!GG2E8 1,CM>12 P bd7 Jjaki2L 1apis naukowy pozwala na atwe i jednolite reprezentowanie bardzo maych i bardzo du(ych liczb, jest jednak niezbyt czytelny! /by uczyni "o bardziej strawnym, mo(na u(y tzw! 'ormatowania" pole"ajce"o na przekazaniu procedurze write JwritelnL dodatkowych in*ormacji opisujcych sposb wyprowadzenia liczby! 8 przypadku liczb rzeczywistych in*ormacje te okre&laj cakowit szeroko& pola zawierajce"o liczb% oraz ilo& pozycji po kropce dziesi%tnej i mo" by symbolicznie zapisane jako
warto56:s/ero,o567pola:lic/.a7c3fr7po7,ropce

?iczba zawierajca mniej cy*r ni( okre&lono w szeroko&ci pola jest #dosuwana$ do prawej strony i uzupeniana z lewej znakami spacji! Sstalajc szeroko& pola musisz rwnie( uwz"l%dni miejsce na kropk% dziesi%tn i ewentualny znak liczby! 8 ten sposb dotarli&my do kolejnej wersji pro"ramu obliczajce"o pole koa6
program *ole+,ola; - *rogram o.lic/a pole ,o0a o promieniu ! 1
begin

writeln(4*rogram o.lic/a pole ,o0a4); write(4*ole = 4; *i2!2!: :"); (2 o.lic/ i w3pis/ 2) (2 pole ,o0a 2) readln; end. warto56:s/ero,o567pola

Skoro ju( mwimy o *ormatowaniu, warto jeszcze wspomnie , (e dla liczb cakowitych, nie posiadajcych cz%&ci uamkowej, wystarczy okre&lenie szeroko&ci pola, czyli zapis 8 identyczny sposb mo(na rwnie( *ormatowa np! a4cuchy, co jednak stosowane jest rzadko! 1a przykad niech posu(y kolejny pro"ram6
program 8ormatowanie; begin

- 9emonstrac:a mo;liwo5ci formatowania w3dru,<w 1 writeln(l.="&!%7:$':$); writeln($="&!%7:":'); writeln(l.=":$'); writeln($=":$'); writeln (4>4:=') - /a ma0o mie:sca po ,ropce 1 - /a ma0o mie:sca w og<le 1 - o,re5lam3 t3l,o s/ero,o56 pola 1 - formatowanie lic/.3 ca0,owite: 1 - formatowanie 0a?cucha 1 end.

8 ten sposb omwili&my podstawowe zabie"i kosmetyczne, ktrym mo(emy podda nasz pro"ram! ,rezentuje si% on ju( nieco adniej, jednak zmiany, ktrych dokonali&my, maj charakter powierzchowny! )o bowiem zrobisz, (eby obliczy pole koa o promieniu C cm2 ,oprawisz pro"ram i skompilujesz "o jeszcze raz2 )hyba

Strona numer 22 z 82

jednak pro&ciej wzi kalkulator!!! a mo(e nie!!

@apami!taj
,ro"ramy nale(y pisa czytelnie, "dy( uatwia to ich zrozumienie i ewentualne wprowadzanie pHniejszych zmian! ,ro"ram mo(na opisa na"wkiem, zaczynajcym si% od sowa kluczowe"o pro"ram! Bardzo wa(ne dla czytelno&ci pro"ramu s komentarze, zapisywane w nawiasach klamrowych, oraz odpowiednie wcinanie poszcze"lnych instrukcji! /by wyprowadza in*ormacje w kolejno nast%pujcych po sobie wierszach, powiniene& u(y procedury writeln! )hcc wstrzyma dziaanie pro"ramu, mo(esz u(y procedury readln! /by uczyni wydruk bardziej czytelnym, zastosuj *ormatowanie wyj&cia!

Strona numer 2C z 82

)*epszam& da*ej
'ie trzeba chyba niko"o przekonywa , (e porzdny pro"ram powinien umie sam zapyta u(ytkownika o warto& promienia i obliczy pole bez konieczno&ci uci(liwe"o poprawiania i kompilowania tekstu! 8 tym celu nale(aoby wypisa na ekranie odpowiednie pytanie Jco ju( potra*isz zrobi L, a nast%pnie wprowadzi z klawiatury warto& promienia i wykorzysta j do obliczenia pola koa ze wzoru S P ,ir2! Ba, atwo powiedzie 6 ale jak wprowadzi jak& warto& do pro"ramu i "dzie j przechowa 2 9ozwizaniem te"o problemu jest u(ycie zmiennej ,odobnie jak w matematyce, zmienna symbolizuje pewn warto& , czyli mo(e by traktowana jako swe"o rodzaju pojemnik, do ktre"o wkadamy np! liczb% Jwarto& promieniaL! #;izycznie$ warto& zmiennej umieszczana jest "dzie& w pami%ci komputera i mo(e by zlokalizowana poprzez adres" czyli numer odpowiedniej komrki pami%ci! ,oniewa( posu"iwanie si% adresami jest niezbyt wy"odne, ,ascal umo(liwia odwoywanie si% do zmiennej za pomoc nazwy" b%dcej zwykym identy*ikatorem Jin*ormacje na temat identy*ikatorw znajdziesz na stronie 2EL! 5odatkow in*ormacj, niezb%dn do ustalenia sposobu posu"iwania si% zmienn i jej reprezentacji w pami%ci, jest typ I w naszym przypadku b%dzie to typ zmiennoprzecinkowy, odpowiadajcy warto&ci rzeczywistej JrealL! ,oniewa( kompilator tumaczy tekst Hrdowy pro"ramu na bezpo&rednio wykonywaln przez komputer posta wynikow, musi wiedzie jak reprezentowa dan zmienn w pami%ci i jak si% z ni obchodzi ! 'iezb%dne jest zatem zadeklarowanie ka(dej u(ywanej w pro"ramie zmiennej, czyli przekazanie kompilatorowi in*ormacji o jej nazwie i typie! 5o deklarowania zmiennych su(y specjalne sowo kluczowe ear Jan"! Fariable I zmiennaL, za& skadnia deklaracji ma posta
ear lista7na/w : t3p7$; lista7na/w : t3p@= ...

przy czym listaAnazw to ci" nazw zmiennych te"o same"o typu rozdzielonych przecinkami! /by zadeklarowa kolejn "rup% zmiennych Jinne"o typuL, nie musisz ponownie u(ywa sowa earO wystarczy dopisa pod spodem now list% i poda nazw% typu! 3statnim wyma"aniem, o ktrym musisz pami%ta , jest umieszczanie wszystkich deklaracji przed cz%&ci operacyjn pro"ramu6 poniewa( bezpo&rednio wykorzystuje ona zadeklarowane obiekty, musz one zosta opisane przed jej rozpocz%ciem! ,o zadeklarowaniu mo(na ju( #normalnie$ korzysta ze zmiennej, czyli nadawa jej warto& , wykorzystywa w wyra(eniach lub wyprowadza na ekran monitora! .usisz jednak pami%ta , (e sama deklaracja nie nadaje zmiennej sensownej warto&ci, a jedynie in*ormuje kompilator o jej istnieniu i wa&ciwo&ciach! ,rzed u(yciem zmiennej musisz konie$znie nada jej warto& 7zainicjalizowa jL przez wprowadzenie jej warto&ci z klawiatury lub za pomoc tzw! instrukcji przypisania aeby du(ej nie teoretyzowa , zademonstrujmy now wersj% nasze"o pro"ramu6
program *ole+,ola; - *rogram o.lic/a pole ,o0a o promieniu ! 1 - *romie? wprowad/an3 :est / ,lawiatur3 1 Aar - de,larac:a /mienn3ch 1 r : real; - promie? ,o0a 7 /mienna r/ec/3wista 1
begin writelnJQ,ro"ram oblicza pole koaQLO writeJQ,odaj promie4 koa6 QLO
readlnJrLO readlnO end. codczytaj zmien z klawiaturyd

writeJQ,ole P QO ,i`r`r686CLO c oblicz i wypisz pole koad

1apewne zauwa(ye& ju( w pro"ramie znan )i z poprzednie"o rozdziau procedur% readln! +utaj peni ona inn Jwa&ciwie swoj zasadniczL *unkcj%, a mianowicie odczytuje warto& zmiennej r z klawiatury! Skadnia procedury readln jest nast%pujca6
readlnXJzmienna, zmienna!!!LYO

i wy"lda podobnie, jak dla #odwrotnej$ procedury writeln, z t drobn r(nic, (e ar"umentami readln mo" by jedynie zmienne! 5lacze"o2 ,rocedura readln pobiera z klawiatury Ja &ci&lej rzecz biorc, z tzw! wejcia pro"ramuL pewn warto& i musi j "dzie& umie&ci ! 8arto& mo(e zosta umieszczona w zmiennej, czyli "dzie& w pami%ci, nie mo(e jednak zosta zapisana w wyra(eniu, ktre jest jedynie zapisem pewnej operacji i nie posiada lokalizacji w pami%ci komputera! ,odobnie niedopuszczalne b%dzie u(ycie jako ar"umentu staej lub Jo z"rozo7L operatora! ,okrewna procedura read stosowana jest znacznie rzadziejO r(nica mi%dzy ni a readln sprowadza si% Jpodobnie jak dla write i writelnL do te"o, i( po odczytaniu swoich ar"umentw readln przechodzi do nast%pne"o wiersza danych wej&ciowych, a read nie! ,rocedura read u(ywana jest "wnie do czytania danych z plikw Jo ktrych pHniejL, za& jej u(ycie do wprowadzania danych z klawiatury mo(e doprowadzi do niespodziewanych e*ektw, dlate"o te( na razie lepiej jej unika ! ,ora powiedzie co& wi%cej na temat typw! +yp zmiennej okre&la jej wewn%trzn reprezentacj% w pami%ci komputera Jliczb% bajtw zajmowanych przez

Strona numer 2F z 82

zmienn, zakres dopuszczalnych warto&ci i dokadno& reprezentacjiL oraz zestaw operacji, ktre mo(na na niej wykonywa ! Nilkana&cie standardowych typw dost%pnych w +urbo ,ascalu opiszemy w poni(szej tabeli! 1 wyjtkiem typu strin", wszystkie one nale( do tzw! typw prostyc$ Jnie dajcych si% rozbi na prostsze typyL! 'abli$a 1. Najwaniejsze typy dost)pne w 9urbo *ascalu
Nazwa
inte"er real char

Gnaczenie
liczba cakowita ze znakiem liczba rzeczywista znak napis Ja4cuch, ci" znakwL warto& lo"iczna

Gakres wartoci
DC2EA8!!TC2EAE 2!@D 1G !!!1!ED 1G znaki o kodach G!!2MM ci" do 2MM znakw prawda 7true! lub *asz 7'alse! G!! AMMCM G!!2MM D128!!T12E
DC@ C8

*rzyk+ad
D1FMEF 1!2C2FMelE QaQ Q'apisQ
'alse

strin"
boolean word byte shortint lon"int sin"le double eKtended

sowo
bajt krtka liczba cakowita ze znakiem du"a liczba cakowita ze znakiem krtka liczba rzeczywista du"a liczba rzeczywista bardzo du"a liczba rzeczywista

MAF12 12E D1C D1@8AECF2CF C!1FeG1 D1!8eT2CF F!Me2CFM Ael2 g12CF6/B)5

comp
pointer

bardzo du"a liczba cakowita wskaHnik

D21FEF8CAF8!! T21FEF8CAFE 1!MD 1GfM!!C!FD 1GCE M!GD 1J+C2F!!1!ED 1GCG8 C!FD 1Gf@C2!!1!1! 1GF@C2 D@!2D 1G18!!@!2D 1G18 3333h63333h!!;;;;h6; ;;;h

)ztery pierwsze typy wymienione w tabeli stanowi podstawowy zestaw, ktrym b%dziesz posu"iwa si% podczas pisania pro"ramw! +ypy cakowite Jinte"er, word, shortint, byte, lon"intL, typ znakowy JcharL oraz lo"iczny JbooleanL tworz z kolei "rup% tzw! typw porzdkowyc$ Jan"! ordinal types!" w ramach ktrych okre&lona jest relacja porzdku Jczyli kto przed kim, a kto po kimL! 'ypy $akowite u(ywane s w pro"ramach do reprezentacji licznikw, adresw i indeksw tablic oraz zawarto&ci komrek pami%ci Jbyte i wordL! ,ami%taj, (e ze wz"l%du na specy*iczn reprezentacj% wewn%trzn liczb cakowitych przekroczenie zakresu dopuszczalne"o dla dane"o typu powoduje #przeskoczenie$ na dru"i koniec zakresu Jnp! dodanie l do C2EAE da w wyniku DC2EA8L! >*ekt ten zwykle nie jest sy"nalizowany przez kompilator i mo(e prowadzi do do& dziwaczne"o zachowania pro"ramw! /by "o unikn , mo(esz zastosowa pojemniejszy typ Jnp! lon"intL! 5ru" obszern "rup% tworz typy rze$zywiste, przeznaczone do przechowywania warto&ci niecakowitych i realizacji wi%kszo&ci bardziej zo(onych oblicze4 matematycznych! 8 wi%kszo&ci przypadkw zadowalajce rezultaty osi"a si% przy u(yciu liczb typu real, jednak dla poprawy dokadno&ci, powi%kszenia zakresu warto&ci i przyspieszenia oblicze4 warto odwoa si% do jedne"o z pozostaych typw! 0ch wykorzystanie wyma"a zadeklarowania u(ycia w pro"ramie tzw! koprocesora arytmetycznego Jspecjalne"o ukadu przeznaczone"o do operowania na liczbach rzeczywistych, dost%pne"o jako oddzielny ukad lub wbudowane"o w procesory F8A5W i #lepsze$L albo tzw! emulatora" czyli specjalne"o podpro"ramu #udajce"o$ koprocesor! /by byo mo(liwe odwoanie si% do koprocesora, nale(y wczy opcj% 3umeric Processing I 5654@56-54 w polu dialo"owym Options4Compiler( za& wczenie emulacji realizuje znajdujca si% poni(ej opcja Emulation' /lternatyw jest umieszczenie w pro"ramie tzw! dyrektyw kompilatora" majcych odpowiednio posta c g'T d i cghTd! 'ypy znakowy i a4cuchowy wykorzystywane s do reprezentowania napisw i wszelkiej in*ormacji #sownej$! +yp boolean pozwala na przechowywanie warto&ci lo"icznych, wykorzystywanych do sterowania dziaaniem pro"ramu, za& typ wskaHnikowy JpointerL u(ywany jest w operacjach na zawarto&ci pami%ci komputera Jnieco dziwny zapis g12CF6/B)5 oznacza adres komrki pami%ci w postaci szesnastkowej, sy"nalizowanej znakiem gL! 'a tym zako4czymy ten krtki rozdzia! 'a kolejnych kilku stronach zajmiemy si% wyra(eniami i ich elementami skadowymi, za& w charakterze wiczenia proponuj% )i zmody*ikowanie nasze"o pro"ramu tak, by oblicza on pole trjkta na podstawie wprowadzonej z klawiatury du"o&ci podstawy i wysoko&ci!

@apami!taj
- 5o przechowywania warto&ci su( w pro"ramie zmienne! - )echami charakterystycznymi zmiennej s nazwa i typ! 'azwa pozwala na zidenty*ikowanie zmiennej, za& typ okre&la jej wewn%trzn reprezentacj% i zakres warto&ci oraz dopuszczalnych operacji! - ,rzed u(yciem zmienna musi zosta zadeklarowana Jza pomoc sowa kluczowe"o earL oraz zaincjalizowana Jprzez przypisanie lub wprowadzenie warto&ci z zewntrz, np! z klawiaturyL! - 5o wprowadzania warto&ci zmiennych z klawiatury su( procedury readln i read!

Strona numer 2M z 82

- +urbo ,ascal o*eruje kilkana&cie standardowych typw, spo&rd ktrych najcz%&ciej stosowanymi s typ cakowity Jinte"erL, rzeczywisty JrealL, znakowy JcharL i a4cuchowy Jstrin"L! - +ypy cakowitoliczbowe, znakowe oraz typ boolean tworz "rup% typw porzdkowych!

Strona numer 2A z 82

+&ra,enia
+emat wyra(enia zosta #przemycony$ do ksi(ki ju( do& dawno temu i wypadaoby w ko4cu t% kwesti% wyja&ni ! 8 niniejszym rozdziale sprbujemy wyja&ni , czym s wyra(enia, do cze"o su( oraz jakie s ich skadniki i re"uy tworzenia! 8yra(enia pozwalaj na przeksztacanie in*ormacji w celu uzyskania odpowiednich wynikw i stanowi jeden z podstawowych skadnikw pro"ramw! Na(de wyra(enie stanowi symboliczny zapis pewnej operacji na danych reprezentowanych przez zmienne Jopisane identy*ikatoramiL i stae Jzapisane jawnieL! Sama operacja realizowana jest za pomoc operatorw oraz 'unkcji ,oj%cie wyra(enia najatwiej b%dzie nam zilustrowa na przykadzie matematycznym6 jak wiadomo, du"o& przeciwprostoktnej c trjkta prostoktne"o wyra(a si% wzorem6

c= a b
2

,rzekadajc to na ,ascal otrzymamy


c 6P sirt Ja`a T b`bL

1apis znajdujcy si% po prawej stronie znaku 6 P Jtak zwane"o operatora pr!#pisania! jest wa&nie wyra(eniem! 8 je"o skad wchodz cztery identy*ikatory Ja i bL symbolizujce zmienne przechowujce du"o&ci przyprostoktnych, trzy operatory J` i TL symbolizujce operacje mno(enia i dodawania oraz identy*ikator sirt reprezentujcy *unkcj% I pierwiastek kwadratowy! ,oniewa( o zmiennych i staych ju( mwili&my, zajmiemy si% obecnie operatorami! 3perator jest zastrze(onym sowem j%zyka, stanowicym symboliczn reprezentacj% pewne"o dziaania na danych reprezentowanych przez argumenty operatora! 8 wi%kszo&ci przypadkw operatory posiadaj dwa ar"umenty, istniej jednak rwnie( operatory jednoar"umentowe! 8 ,ascalu zde*iniowano kilka "rup operatorw, z ktrych najcz%&ciej wykorzystywanymi s zapewne operatory arytmetyczne< 'abli$a 2! :peratory arytmetyczne
:perator L ,
die mod T D

Gnaczenie
mno(enie dzielenie dzielenie cakowite reszta z dzielenia dodawanie odejmowanie zmiana znaku

*rzyk+ad

-L- P F 2RC P G!AAAAA!!! 2 die C P G C mod 2 P 1 2TCPM


2DCPDl D 1 PD1

D Jjednoar"umentowyL

1 wyjtkiem operatorw die i mod, przeznaczonych wycznie do dziaa4 na liczbach cakowitych, wszystkie pozostae operatory #wsppracuj$ zarwno z liczbami cakowitymi, jak i rzeczywistymi! 8 przypadku wykonywania kilku dziaa4 w obr%bie jedne"o wyra(enia istotny jest tzw! priorytet operatorw" okre&lajcy pierwsze4stwo pewnych dziaa4 przed innymi! 5la operatorw arytmetycznych priorytety wy"ldaj mniej wi%cej tak, jak w #zwykej$ matematyce6 pierwsze4stwo maj operatory mno(enia i dzielenia J`, R, die i modL, wykonywane zawsze przed dodawaniem i odejmowaniem! 5ziaania reprezentowane przez operatory o tym samym priorytecie wykonywane s w kolejno&ci od lewej do prawej! ,ami%tanie o priorytetach operatorw jest spraw bardzo istotn, "dy( niewa&ciwa kolejno& wykonywania dziaa4 prowadzi cz%sto do uzyskania zupenie inne"o wyniku, ni( si% spodziewali&my! ,rzykadowo, iloraz

1 2 C
nie zostanie poprawnie obliczony, je&li zapiszesz "o w postaci 1 T 2RC bowiem zamiast warto&ci l otrzymasz l plus 2RC, czyli 1!AAAA!!! ! 8a&ciw kolejno& wykonywania dziaa4 mo(esz jednak wymusi za pomoc nawiasw, zapisujc nasz iloraz jako
C1 D EF / 3

;ra"menty wyra(enia uj%te w nawiasy s zawsze obliczane przed wykonaniem wszystkich pozostaych dziaa4! 'awiasw warto Ja nawet nale(yL u(ywa rwnie( wwczas, "dy nie jest si% pewnym co do kolejno&ci wykonywania dziaa4! ,ami%taj, (e nawiasy nie powoduj "enerowania dodatkowe"o kodu wynikowe"o, a jedynie zmieniaj kolejno& operacji, a wi%c #nic nie kosztuj$ Joprcz konieczno&ci wpisania kilku dodatkowych znakw, co jednak jest lepsze od nara(ania si% na trudno wykrywalne b%dyL! 3peratory

Strona numer 2E z 82

arytmetyczne nie wyczerpuj oczywi&cie arsenau dost%pne"o w +urbo ,ascalu! Nolejn "rup% tworz operatory bitowe i logiczne" nazwane tak dlate"o, i( przeznaczone s do wykonywania dziaa4 na bitach liczb cakowitych lub do przeksztacania warto&ci lo"icznych! / oto one6 +ablica C! :peratory bitowe i logiczne
:perator
not and shl shr or Kor

Gnaczenie
ne"acja iloczyn lo"iczny przesuni%cie bitw w lewo przesuni%cie bitw w prawo suma lo"iczna suma modulo 2

*rzyk+ad logiczny not true ='alse


true and *alse P *alse

bitowy
not 1M P 2FG E and 1M P E E shl 2 P 28 128shrF P 8

true or 'alse = true true Kor true = 'alse

E or 128 P 1CM E Kor 1M P 8

1rozumienie dziaania operatorw lo"icznych nie powinno nastr%cza trudno&ci! Je&li chodzi o operatory bitowe, to ich dziaanie sprowadza si% do manipulowania poszcze"lnymi bitami Jmo"cymi przyjmowa warto&ci 3 lub 1L w komrkach pami%ci zajmowanych przez liczb%! Jednoar"umentowy operator not ne"uje poszcze"lne bity Jzmienia ich warto&ci na przeciwneL, operator and ustawia dany bit wyniku na l tylko wtedy, "dy odpowiadajce sobie bity obu ar"umentw maj warto& l, or I "dy co najmniej jeden z nich ma warto& l, za& Kor ustawia bit na l tylko wtedy, "dy jeden z bitw ma warto& l a dru"i G! 3peratory shl i shr maj charakter wycznie bitowyO dla liczb cakowitych Jw pewnym uproszczeniuL przesuni%cie bitw o n pozycji w lewo lub w prawo odpowiada pomno(eniu lub podzieleniu przez 2n! 8 ramach wicze4 proponuj% )i sprawdzi poprawno& podanych wy(ej przykadw Jpotrzebna )i b%dzie znajomo& systemu dwjkowe"o, w ktrym np! cakowita liczba E zapisywana jest jako GGGGG111, czyli sekwencja o&miu bitw, z ktrych trzy najmniej znaczce maj warto& 1L! 3statni wa(n "rup% operatorw stanowi operatory relacyjne" su(ce do porwnyD wania obiektw Jnie tylko liczb, ale rwnie( znakw czy a4cuchwL! 8szystkie operatory relacyjne s dwuar"umentowe Joczywi&cie typy obu ar"umentw musz by z"odne, tj! nie mo(na porwnywa a4cucha z liczbL i daj w wyniku warto& lo"iczn! 'abli$a 4. :peratory relacyjne
:perator =
o [ [P V VP

Gnaczenie
rwny!!! r(ny od!!! mniejszy od!!! mniejszy lub rwny!!! wi%kszy od!!! wi%kszy lub rwny

*rzyk+ad
C P C!1F S'alse!

C [VC!1F 7true!

.T. ,/7true!
C [P C!1F 7'alse! C V C!1F 7'alse! C VP C 7true!

.usimy jeszcze ustosunkowa si% do wyra(e4 #mieszanych$, zawierajcych operatory nale(ce do kilku "rup! ,rzykadowo, obliczajc wysoko& stypendium studenckie"o nale(y okre&li , czy &rednia ocen delikwenta jest wystarczajco wysoka, a dochd na jedne"o czonka rodziny wystarczajco niski! /by zatem ustali , czy Nowalskiemu nale(y si% stypendium, u(yjemy przykadowe"o wyra(enia
J5ochodR?iczba3sob [ 1MGL and JZrednia V C!EML

8yra(enie to zawiera doskona mieszank% operatorw arytmetycznych, lo"icznych i relacyjnych! 8 takich sytuacjach kolejno& wykonywania dziaa4 jest nast%pujca6 'abli$a M! *riorytety operatorw
:peratory
not j ` die md and shl shr R T D j or Kor P [[PVVP
[ V

*riorytet
, Jnajwy(szyL 2 Jni(szyL C Jjeszcze ni(szyL F Jnajni(szyL

3czywi&cie, je&li wyra(enie zawiera nawiasy, ich zawarto& zostanie wyliczona przed wykonaniem pozostaych dziaa4! ,okazany wy(ej przykad ilustruje jednocze&nie do& typow sytuacj%, w ktrej musimy poczy ze sob kilka warunkw Jwyra(onych nie rwno&ciami, czyli operatorami relacyjnymiL! ,oniewa( do czenia warunkw su( operatory lo"iczne Jzwykle or lub andL, majce wy(szy priorytet, niezb%dne jest u(ycie

Strona numer 28 z 82

nawiasw Jich pomini%cie jest bardzo pospolitym b%demO o reakcji kompilatora najlepiej przekonaj si% samL! Jak ju( powiedzieli&my, wyra(enia mo" zawiera elementy najr(niejszych typw Jliczby, znaki, a4cuchy itp!L, jednak najcz%&ciej b%dziesz spotyka si% z wyra(eniami reprezentujcymi operacje arytmetyczne! /by rozdzia ten nie o"ranicza si% do puste"o teroretyzowania, sprbujemy zastosowa wyra(enia w praktyce, tworzc pro"ram rozwizujcy rwnanie kwadratowe znan )i zapewne metod wyznacznikw! 1apisujc nasze rwnanie w postaci

aA&-?bA&?c
mo(emy obliczy pierwiastki Jtj! warto&ci &" dla ktrych rwnanie przyjmuje warto& zeroL jako "dzie
b delta 2 a

delta jest tzw! wyznacznikiem rwnania, obliczanym jako

delta =b 2 Fac
1nak w poprzednim wzorze oznacza" (e rwnanie ma w o"lno&ci dwa pierwiastki, z ktrych jeden oblicza si% przez dodanie warto&ci w liczniku uamka, za& dru"i I przez ich odj%cie! Sam pro"ram powinien wy"lda nast%pujco6 poc!,te odczytaj wartoci wsp+czynnikw a" b i c" oblicz warto wyznacznika oblicz pierwiastki i wypisz je na ekranie oniec 8 postaci pascalowej b%dzie to nieco bardziej skomplikowane6
program Bownanie+Cwadratowe; - *rogram ro/wiD/u:e r<wnanie ,wadratowe metodD w3/nac/ni,<w 1 Aar a, ., c : real; - wsp<0c/3nni,i 1 delta : real; - w3/nac/ni, 1 El, E= : real; - pierwiast,i 1 begin writeln(4*rogram ro/wiD/u:e r<wnanie ,wadratowe4) writeln(4a2EF= ) .2E ) c4); write(4*oda: wsp<0c/3nni, a: 4); - wprowadG wsp<0c/3nni,i 1 readln(a); write(4*oda: wsp<0c/3nni, .: 4); readln(.); write(4*oda: wsp<0c/3nni, c: 4); readln(c); delta := sHr(.) 7 &2a2c; - o.lic/ w3/nac/ni, 1 El := (7. ) sHrt(delta))I(=2a); - o.lic/ pierwiast,i 1 E= := (7. 7 sHrt(delta))I(=2a); - /nac/e, := to t/w. 1 - pr/3pisanie 1 writeln(4*ierwiast,i:4); - w35wietl pierwiast,i 1 writeln(4El = 4, El: $=:&); writeln(4E= = 4, E=:$=:&); readln; end.

8yra(enia wykorzystywane do obliczania poszcze"lnych warto&ci s tu nieco bardziej skomplikowane, ale nadal nie powiniene& mie problemw z ich analiz! 5woma nowymi Jno, nie do ko4caL elementami s operator przypisania oraz 'unkcje 3perator przypisania jest jednym z najpospoliciej wykorzystywanych operatorw pascalowych! 1naczek 6P Jdwukropek i znak rwno&ciL czyta si% #staje si%$ lub #przypisz$, za& je"o e*ekt sprowadza si% do umieszczenia w obiekcie znajdujcym si% po lewej stronie warto&ci znajdujcej si% po prawej stronie! #3biekt$ umieszczony po lewej stronie operatora przypisania okre&lany jest mianem RDwarto&ci Jan"! lFalue! Jest to na o" zmienna, mo(liwe jest jednak przypisanie warto&ci do identy*ikatora *unkcji Jo tym b%dziemy jeszcze mwi L! ,oniewa( przypisanie pole"a na umieszczeniu warto&ci "dzie& w pami%ci komputera Jw miejscu okre&lonym przez nazw% obiektuL, nie (o)esz po lewej stronie operatora przypisania umie&ci staej czy wyra(enia! ,o prawej stronie operatora przypisania panuje znacznie wi%ksza demokracja6 dopuszczalne s tam praktycznie dowolne wyra(enia Ja wi%c w szcze"lno&ci rwnie( pojedyncze stae i zmienneL, byleby typ warto&ci uzyskanej w wyniku obliczenia wyra(enia by z"odny z typem obiektu znajdujce"o si% po dru"iej stronie operatora 6 P! 1a"adnienie z"odno&ci typw w sensie przypisania Jan"! assignment compatibility! jest tyle( istotne, co zo(one! 1 do& dobrym przybli(eniem mo(na powiedzie , (e typ wyra(enia znajdujce"o si% po prawej stronie operatora 6 P powinien by identyczny z typem obiektu znajdujce"o si% po lewej stronie, z kilkoma wyjtkami! 5o najwa(niejszych wyjtkw nale( przypisania6

Strona numer 2@ z 82

- warto&ci typu cakowite"o do obiektu typu rzeczywiste"o Jale nie odwrotnieLO - warto&ci typu rzeczywiste"o do obiektu inne"o typu rzeczywiste"o Jw dowoln stron%LO - warto&ci typu znakowe"o do obiektu typu a4cuchowe"oO - warto&ci typu #wskaHnik do typu$ do obiektu typu pointer! ,rzy tej okazji warto rwnie( wspomnie , (e niektre przypisania pomi%dzy typami rzeczywistymi mo" spowodowa utrat% dokadno&ci lub przekroczenie zakresu Jnp! prba #wci&ni%cia$ warto&ci typu eKtended do zmiennej typu sin"leL! Je&li idzie o dru" nowo& , czyli *unkcje, to w naszym pro"ramie pojawiy si% wywoania dwch tzw! bibliotecznych *unkcji arytmetycznych6 sir i sirt! +emat *unkcji b%dzie dyskutowany nieco pHniejO na razie wystarczy )i wiedzie , (e *unkcja Ji pokrewna jej proceduraL jest pewnym narz%dziem pozwalajcym na przeksztacenie podanych jej warto&ci Jtzw! argumentw! do (danej postaci! ,raktycznie ka(dy j%zyk pro"ramowania dysponuje mniejszym lub wi%kszym zestawem JbibliotekL *unkcji realizujcych operacje arytmetyczne, znakowe, "ra*iczne i inne! Biblioteka *unkcji i procedur dost%pnych w +urbo ,ascalu jest o"romna i omawianie jej mijaoby si% z celemO w&rd cz%sto wykorzystywanych *unkcji arytmetycznych, oprcz nierzadko mylonych ze sob sir Jpodniesienie do kwadratuL i sirt Jpierwiastek kwadratowyL, znajduj si% rwnie( *unkcje try"onometryczne Jsin, cos, arctanL, lo"arytmiczne Jln, eKpL i wiele innych! 8 ten sposb omwili&my zasadnicze tematy zwizane z wyra(eniami i realizacj oblicze4 arytmetycznych! 8ykorzystujc poznane wiadomo&ci mo(esz pokusi si% o napisanie pro"ramu obliczajce"o warto&ci bardziej skomplikowanych wzorw Jjakich2 to ju( pewnie sam wiesz najlepiejL! 'iestety, o czym by mo(e ju( si% przekonae&, +urbo ,ascal nie jest na tyle inteli"entny, by obroni si% przed prb wykonania operacji niele"alnej z matematyczne"o punktu widzenia Jnp! dzielenia przez zeroL! Je&li jeszcze nie miae& okazji potkn si% o ten problem, sprbuj za pomoc nasze"o pro"ramiku znaleH miejsca zerowe *unkcji6 &-?-&?.! 'asze rwnanie nie ma pierwiastkw rzeczywistych6 warto& wyznacznika wynosi D8, a zatem je"o pierwiastek kwadratowy nie daje si% obliczy ! ,oniewa( jednak +urbo ,ascal o tym nie wie, e*ektem podj%tej prby jest bd wykonania 7EnFalid 'loating point operation I niele"alna operacja zmiennoprzecinkowaL i przerwanie realizacji pro"ramu! )o prawda (adna to tra"edia, bo *unkcja i tak nie ma pierwiastkw, ale pro"ram m"by zachowywa si% przyzwoiciej, tj! zamiast #pada $ I wy&wietla odpowiedni in*ormacj%! 'ie ma problemu!!! ale to ju( mo(e w nast%pnym rozdziale!

@apami!taj
5o przeksztacania in*ormacji w pro"ramie su( wyra(enia! 8 skad wyra(e4 wchodz stae i zmienne Jreprezentujce daneL oraz operatory i *unkcje Jreprezentujce sposoby przeksztacania in*ormacjiL! 'ajwa(niejsze "rupy operatorw pascalowych to operatory arytmetyczne, bitowe, lo"iczne oraz relacyjne Joperatory porwnaniaL! Nonstruujc wyra(enia musisz pami%ta o kolejno&ci wykonywania dziaa4, czyli priorytetach operatorw! 5o zmiany kolejno&ci dziaa4 su( nawiasy! ;unkcje reprezentuj bardziej zo(ony sposb przeksztacania in*ormacji ni( operatory! 5o nadawania warto&ci zmiennym su(y operator przypisania 6 P! ,o lewej stronie operatora przypisania musi znajdowa si% RDwarto& ! ,o je"o prawej stronie mo(e znajdowa si% dowolne wyra(enie!

Strona numer CG z 82

-nstrukcja warunkowa
/by unikn b%du wynikajce"o z prby pierwiastkowania liczby ujemnej, wypadaoby umie&ci w naszym pro"ramie zastrze(enie w postaci #je(eli wyznacznik jest wi%kszy od zera to wykonaj dalsze obliczenia, w przeciwnym przypadku wypisz odpowiedni komunikat$! ,rzekadajc to na j%zyk an"ielski i nieco uo"lniajc, otrzymujemy struktur% instrukcji warunkowej<
if warune, then instru,c:a7$ else instru,c:a7=

8 powy(szym zapisie warunek jest niczym innym, jak wyra(eniem dajcym w wyniku warto& true lub 'alse" na o" wykorzystujcym znane )i ju( operatory relacyjne Jmwic po ludzku, jest to zwyke porwnanieL, instrukcje opisuj czynno&ci, ktre powinny by wykonane po spenieniu lub niespenieniu warunku, przy czym cz%& zaczynajca si% od sowa kluczowe"o else nie jest obowizkowa Jtj! nie musisz okre&la #wariantu awaryjne"o$L! 0nstrukcja warunkowa, dost%pna praktycznie w ka(dym j%zyku pro"ramowania, stanowi podstawowe narz%dzie umo(liwiajce podejmowanie decyzji w zale(no&ci od aktualnych warunkw, czyli wbudowywanie w pro"ram #inteli"encji$, pozwalajcej mu zachowa si% odpowiednio do sytuacji! Sprbujmy wkomponowa instrukcj% warunkow w nasz poprzedni pro"ram6
program Jowe+Bownanie+Cwadratowe; - *rogram ro/wiD/u:e r<wnanie ,wadratowe metodD w3/nac/ni,<w 1 - uw/glKdnia:Dc mo;liwo56 u:emnego /na,u w3/nac/ni,a 1 Aar D, ., c : real; - wsp<0c/3nni,i 1 delta : real; - w3/nac/ni, 1 El, E= : real; - pierwiast,i 1 begin writeln(4*rogram ro/wiD/u:e r<wnanie ,wadratowe4) writeln(4a2EF= ) .2E ) c4); write(4*oda: wsp<0c/3nni, a: 4); - wprowadG wsp<0c/3nni,i 1 readln(a); write(4*oda: wsp<0c/3nni, .: 4); readln(.); write(4*oda: wsp<0c/3nni, c: 4); readln(c); delta := sHr(.) 7 &2a2c; - o.lic/ w3/nac/ni, 1 if delta >= L then - w3/nac/ni, LC 1 begin - w3,onu:em3 o.lic/enia1 El := (7. ) sHrt(delta))I(=2a); - o.lic/ pierwiast,i 1 E= := (7. 7 sHrt(delta))I(=2a); writeln (4*ierwiast,i:4); - w35wietl pierwiast,i 1 writeln(4El = 4, El:$=:&);: writeln ( 4E= = 4, E=:$=:&); end - tu JM( NO 5redni,a> 1 else - w3/nac/ni, u:emn3 1 writeln(4B<wnanie nie ma pierwiast,<w r/ec/3wist3ch.4); readln; end.

,osta warunku jest w naszym przypadku oczywista6


i* delta VPG

czyli #je(eli wyznacznik nie jest mniejszy od zera R 1auwa(, (e je&li warunek jest speniony, nale(y wykona wi%cej ni( jedn instrukcj%, a zatem caa "rupa instrukcji zajmujcych si% obliczaniem i wy&wietlaniem pierwiastkw musi zosta otoczona sowami kluczowymi be"in i end, oznaczajcymi tzw! instrukcj) z+oon" czyli zestaw instrukcji wykonywanych jako jedna cao& ! 1apominanie o tym wyma"aniu jest jednym z pospolitszych b%dw popenianych przez pro"ramistw pascalowych Jnie tylko pocztkujcychL i mo(e prowadzi do niezbyt przyjemnych b%dw wykonania! 3to przykad6
i* n +, - t.en

Pic/.a*ro.e, := n; 5rednia := sumaIPic/.a*ro.e,;

,owy(szy *ra"ment powinien przypisywa zmiennej ?iczba,robek warto& n, a nast%pnie oblicza &rednia jako suma podzielona przez ?iczba,robek, "warantujc, (e w przypadku n rwne"o zero dzielenie nie b%dzie wykonywane! ,oniewa( jednak przypisania nie zostay poczone w instrukcj% zo(on, dla n rwne"o zeru pierwsze przypisanie nie wykona si%, a zatem zmienna ?iczba,robek b%dzie miaa warto& nieokre&lon! .o(e to by zero Jwwczas wykonanie pro"ramu zostanie przerwaneL lub dowolna warto& , co oczywi&cie doprowadzi do zupenie bezsensowne"o wyniku! ,rawidowa posta powy(szej instrukcji b%dzie wy"ldaa nast%pujco6

Strona numer C1 z 82

i* n +, - t.en begin

Pic/.a*ro.e, := n; 5rednia := sumaIPic/.a*ro.e,; end;

8r my do nasze"o rwnania! 1auwa(, (e w pewnym szcze"lnym przypadku I "dy wyznacznik jest rwny zeru I ma ono tylko jeden pierwiastek6 jest tak dla rwnania

&-?-&?,
ktre"o podwjnym pierwiastkiem jest liczba D1! 8 tym przypadku musimy uwz"l%dni trzy mo(liwo&ci, w zale(no&ci od warto&ci wyznacznika6 W#!nac!ni Pierwiast i wi%kszy od zera rwny zeru

b delta b delta i 2 a 2 a b 2 a

mniejszy od brak pierwiastkw rzeczywistych zera ,oniewa( pojedyncza instrukcja warunkowa potra*i obsu(y tylko dwie wzajemnie si% wykluczajce sytuacje, aby uwz"l%dni wszystkie warianty, niezb%dne jest zagniedenie dwch takich instrukcji! Schemat post%powania pokazany jest poni(ejO w ramach wicze4 proponuj% )i samodzielne dokonanie odpowiednich mody*ikacji w pro"ramie!
i* delta [ G t.en - .ra, pierwiast,<w r/ec/3wist3ch 1 else if delta = ' then - o.lic/ i w3pis/ po:ed3nc/3 pierwiaste, 1 else - odnosi siK do drugiego if7a 1 - o.lic/ i w3pis/ o.3dwa pierwiast,i 1

8 przypadku wi%kszej liczby wariantw takie #pi%trowe$ konstrukcje staj si% niepor%czne, trudne w interpretacji i podatne na b%dy! 1astanw si% na przykad, jak wy"ldaaby instrukcja warunkowa wypisujca na ekranie nazw% dnia ty"odnia dane"o numerem Jniech l oznacza poniedziaekL! .o(e tak6
if d/ie? = l then writeln(4*onied/ia0e,4) else if d/ie? = = then writeln(4Qtore,4) else if ...

)o prawda u(ywanie penej *ormy instrukcji warunkowej Ji*DthenDelseL nie jest tu konieczne i sowa else mo(na usun Jpami%tajc o &rednikachL, jednak w dalszym ci"u powy(szy twr b%dzie co najmniej nieele"ancki! Skutecznym sposobem obsu"i wyborw wielowariantowych jest instrukcja wyboru case, odpowiadajca z "rubsza #stercie$ za"nie(d(onych instrukcji warunkowych6
case pr/e0Dc/ni, of warto567$ : a,c:a7$; warto567= : a,c:a7=; else a,c:a7dom35lna end;

,owy(sza struktura jest swoist tablic akcji odpowiadajcych poszcze"lnym warto&ciom zmiennej przecznik i doskonale nadaje si% do realizacji wielowariantowych wyborw, ktrych klasycznym przykadem jest menu! 1auwa(, (e oprcz akcji skojarzonych z poszcze"lnymi warto&ciami przecznika masz mo(liwo& okre&lenia akcji domy&lnej, realizowanej w przypadku wystpienia warto&ci nie znajdujcej si% w naszej #tablicy$! 3dpowiada za ni sowo kluczowe else umieszczone na ko4cu instrukcji! ,ewnym o"raniczeniem narzucanym przez instrukcj% case jest wyma"anie, by zmienna przecznik bya typu porzdkowe"o Jtak wi%c nie b%dziemy mo"li zastosowa jej w naszym pro"ramie, w ktrym wyznacznik jest liczb rzeczywistL! Satwieniem natomiast jest mo(liwo& #"rupowe"o$ de*iniowania warto&ci odpowiadajcych poszcze"lnym akcjom, np!6
case L l, = "..% else lic/.a+interesantow of : mo/na+w3:sc+do+fr3/:era; : niech+c/e,a:a; : tr/e.a+o.slu/3c; w3pis/(4MJQ(JROBSTOUVO4) end;

8arto&ci odpowiadajce poszcze"lnym akcjom mo" by wyliczane jawnie lub podawane w postaci zakresw Jod! !doL, o ile tylko tworz ci" "rup%! .usisz rwnie( pami%ta , (e I w odr(nieniu od instrukcji warunkowej I przed sowem else mo(esz postawi &rednik! 0 to by byo na tyle, co oczywi&cie nie znaczy, (e mo(esz spocz na laurach! .io jest mie pro"ram potra*icy rozwiza rwnanie kwadratowe, jednak znacznie przyjemniejsze byoby posiadanie narz%dzia do rozwizywania bardziej skomplikowanych rwna4! /le czy to aby nie za trudne2 Bynajmniej!!!

Strona numer C2 z 82

@apami!taj
5o warunkowe"o wykonywania operacji su(y w pro"ramach pascalowych instrukcja warunkowa i*DthenDelse! S(ywajc instrukcji warunkowych musisz pami%ta o wa&ciwym stosowaniu instrukcji zo(onej oraz o braku &rednika przed sowem else! /by obsu(y wi%cej ni( dwa warianty, mo(esz u(y za"nie(d(onych instrukcji warunkowych! Je&li wyborem steruje warto& typu porzdkowe"o, lepszym rozwizaniem jest u(ycie instrukcji wyboru case!

Strona numer CC z 82

/ozwi0zujem& dowo*ne r1wnanie


,roblem rozwizania dowolne"o rwnania nie nale(y bynajmniej do zada4 typu kamienia *ilozo*iczne"o czy uniwersalne"o rozpuszczalnika! )hocia( dla pewnych klas rwna4 istniej dawno opracowane wzory i metody, spora "rupa rwna4 nieliniowych nie daje si% rozwiza #na papierze$ w sposb dokadny! 'ie oznacza to jednak, (e nie mo(na ich w o"le rozwiza 6 kwestii przybli(one"o rozwizywania rwna4 nieliniowych po&wi%cono z niezym skutkiem spory dzia matematyki znany jako metody numeryczne 8 niniejszym rozdziale sprbujemy zademonstrowa jedn z najprostszych metod rozwizywania rwna4 nieliniowych I tak zwan metod) bisekcji Jest ona na tyle prosta, (e praktycznie nie wyma"a znajomo&ci skomplikowanej matematyki Ja jedynie lo"iczne"o my&leniaL, a jednocze&nie cakiem skuteczna!

Rysunek /. Gasada dzia+ania metody bisekcji Ga+my" (e chcemy znaleH miejsce zerowe *unkcji '7&! przedstawionej powy(ej! Szukamy wi%c takie"o punktu c na osi &" dla ktre"o '7c! P G! 8ybierajc na osi & dwa punkty a i b takie, by warto&ci ' 7a! i ' 7b! miay przeciwne znaki, mo(emy z pewno&ci stwierdzi , (e *unkcja ma pomi%dzy a i b co najmniej jedno miejsce zerowe J"dy( musi "dzie& przeci o& &! ,odzielmy przedzia pomi%dzy a i b na dwie rwne cz%&ci! 8arto& *unkcji w nowo uzyskanym punkcie c1 ma nadal znak przeciwny do '7a!" a zatem miejsce zerowe le(y "dzie& pomi%dzy a i c1! ,odzielmy nowo uzyskany przedzia na poowy6 tym razem okazuje si%, (e warto& *unkcji w punkcie c- ma znak przeciwny do *Jc1L, a wi%c miejsce zerowe le(y pomi%dzy c1 a c- 8ykonujc kolejne podziay dojdziemy w ko4cu do punktu!!! no, wa&nie! 1auwa(, (e z ka(dym kolejnym podziaem zbli(amy si% do miejsca zerowe"o coraz wolniej6 za ka(dym razem przedzia poszukiwania zaw%(any jest dwukrotnie, tak wi%c JteoretycznieL dokadne poo(enie miejsca zerowe"o Jodpowiadajce przedziaowi o zerowej szeroko&ci, czyli pojedynczemu punktowiL osi"niemy po niesko4czonej liczbie podziaw! )hyba nie masz zamiaru czeka a tak d+ugoU 9ozwizaniem te"o problemu jest wa&ciwe s*ormuowanie tzw! kryterium zakoMczenia obliczeM lub kryterium stopu 8 naszym przypadku kolejne cykle podziaw Jzwane *achowo iteracjami! b%dziemy prowadzili tak du"o, a( bezwz"l%dna warto& *unkcji w punkcie cn zmaleje poni(ej zadane"o pro"u! Sprbujmy zapisa w bardziej *ormalny sposb pojedynczy podzia6 poc!,te wyznacz punkt c w po+owie odleg+oci pomi)dzy a i b jeeli '7a! ma znak rny od ' 7c!" to przenie punkt b do punktu c w przeciwnym przypadku przenie punkt a do punktu c oniec /le jak zabra si% za wykonywanie kolejnych podziaw2 3czywi&cie nie b%dziesz musia wielokrotnie wpisywa odpowiednich instrukcji6 zamiast te"o wykorzystasz do ich cykliczne"o wykonywania instrukcj) p)tli Spo&rd trzech dost%pnych w ,ascalu struktur p%tli do realizacji nasze"o zadania odpowiednie s dwie I while i repeat Jtrzeci p%tl, *or, zajmiemy si% nieco pHniejL! 'ale( one do "rupy p)tli sterowanyc$ warunkiem" co oznacza, (e wykonuj si% tak du"o, jak du"o spenione b%dzie odpowiednie kryterium Jwhile I powtarzaj, dopki!!!L lub do momentu, kiedy zostanie ono spenione Jrepeat I powtarzaj, a(!!!L! 'ie trzeba chyba dodawa , (e owym kryterium b%dzie wa&nie nasze kryterium stopu6 zakoMcz iteracje" jeli warto bezwzgl)dna ' 7c! jest mniejsza od zadanego progu Ntrej instrukcji u(y 2 8 zasadzie w naszym przypadku jest to oboj%tne! 5ziaanie p%tli while i repeat jest bardzo zbli(one, za& r(nica sprowadza si% do *aktu, (e w pierwszej z nich warunek przerwania p%tli sprawdzany jest na pocztku6
while warune,

Strona numer CF z 82

do instru,c:a

za& w dru"iej I na ko4cu p%tli6


repeat instru,c:a until warune,

8 konsekwencji instrukcje tworzce zawarto& p%tli repeat musz wykona si% co najmniej raz, za& w przypadku p%tli while mo" nie wykona si% ani razu Jje&li warunek b%dzie od razu spenionyL! ,onadto musisz pami%ta , (e s*ormuowanie warunku jest dla obu p%tli dokadnie przeciwne Jp%tla while wykonuje si% tak du"o, jak du"o warunek jest speniony, repeat I tak du"o, jak du"o jest niespenionyL! 1apami%taj rwnie(, (e umieszczajc kilka instrukcji w p%tli while musisz poczy je w instrukcj% zo(on sowami be"in i end, za& w przypadku p%tli repeat konieczno& ta nie wyst%puje Jo"ranicznikami instrukcji zo(onej s tu sowa repeat i untilL! Sprbujmy zapisa nasz al"orytm z wykorzystaniem p%tli repeat! B%dzie on wy"lda mniej wi%cej tak6 poc!,te wprowad0 wartoci kraMcw przedzia+u i dok+adnoci powtar!a0 wyznacz punkt c w po+owie odleg+oci pomi)dzy a i b jeeli ' 7a! ma znak rny od '7c!" to przenie punkt b do punktu c w przeciwnym przypadku przenie punkt a do punktu c a5 do momentu( gd# warto bezwzgl)dna '7c! jest mniejsza od zadanego progu wypisz znalezione miejsce zerowe oniec Ga+my" (e chcemy rozwiza rwnanie6

1 e sin&cos& = G
posiadajce Jjak nietrudno obliczy na kartceL pierwiastek w punkcie & = G! +umaczc powy(szy schemat na an"ielski Ji ,ascalL otrzymamy nast%pujcy pro"ram6
program Bise,c:a; - *rogram ro/wiD/u:e r<wnania nieliniowe metodD .ise,c:i 1 var a, ., c : real; - granice pr/ed/ia0u i pun,t pod/ia0u 1 eps : real; - do,0adno56 1
begin

writeln(4*rogram /na:du:e mie:sce /erowe fun,c:i4) writeln(4w pr/ed/iale [a;.]4); write(4*oda: warto56 a: 4); - wprowadG granice pr/ed/ia0u 1 readln(a); write(4*oda: warto56 .: 4); readln(.); write(4*oda: do,0adno56: 4); readln(eps);
repeat then else

c := (a ) .)I=; - pod/iel pr/ed/ia0 na p<0 1 if (l 7 eEp(sin (a)2cos(a)))2(l 7 eEp (sin (c)2cos(c))) W L . := c - fun,c:a ma pr/eciwne /na,i w a i c 1

a := c; - fun,c:a ma pr/eciwne /na,i w.i61 writeln(c); until a.s (l 7 eEp(sin(c)2cos (c))) W eps; - .adam3 warto56 .e/w/glKdnD> 1 writeln (4NiK:sce /erowe: c = 4,c:$=: ); readln;
end.

'asz pro"ram do& dokadnie odpowiada schematowi podanemu powy(ej i w zasadzie nie wyma"a dodatkowych komentarzy Jmimochodem poznae& kilka nowych *unkcji arytmetycznych I eKp, sin, cos i absL! 8arto jednak zwrci uwa"% na kryterium stopu6
until abs Jl D eKp Jsin JcL`cosJcLLL [ epsO

Jak wspomnieli&my, zapis ten pozwala unikn niesko4czenie du"ie"o dochodzenia kolejnych podziaw do punktu stanowice"o wa&ciwe rozwizanie! /le czy tylko2 Sprbuj wykona poni(szy pro"ram6
program 9odawanie; - ilustrac:a ,umulac:i .0Kd<w /ao,rDgle? 1 - /miennopr/ecin,ow3ch 1 Aar E : real; begin x := 0.0 repeat E := E ) '.$; - po $'' dodawaniach powinni5m3... 1

Strona numer CM z 82

writeln(E:$%:$=); until E = $'.'; - ... otr/3ma6 do,0adnie $' 1 end.

Jak atwo sprawdzi , nasza p%tla wcale nie ma zamiaru zako4czy dziaania po osi"ni%ciu warto&ci 1G! )zy(by wi%c dziesi%ciokrotne dodanie G!1 do G!G nie dawao 1!G2 0stotnie6 liczby rzeczywiste reprezentowane s w komputerze ze sko4czon dokadno&ci i operacje na wi%kszo&ci z nich obarczone s pewnym b%dem, ktry kumuluje si% w przypadku wykonywania wi%kszej ilo&ci oblicze4! 5late"o te( porwnania zmiennoprzecinkowe wykorzystujce operator P Jsprawdzajcy dokadn rwno& L zwykle okazuj si% nieskuteczne! 9ozwizaniem jest u(ycie operatorw VP i [P, czyli nierwno&ci nieostrych! ,oprawne kryterium zako4czenia p%tli miaoby u nas posta
until 0 ,1 1-.-#

8ielu pocztkujcych pro"ramistw zapomina o niedoskonao&ci komputera, prbujc przeo(y #idealny$ zapis matematyczny wprost na j%zyk pro"ramowania! >*ekty mo" by niezbyt przyjemne, zwaszcza w przypadku wykorzystania takich zapisw w p%tlach Jdodatkowo wyst%puje wwczas kumulacja b%dwL i instrukcjach warunkowych! *rogramujc operacje na liczbac$ rzeczywistyc$ naley zawsze pami)ta o ic$ niedok+adnej reprezentacji 3mwione wy(ej p%tle while i repeat nale( do "rupy p%tli sterowanych warunkiem, co oznacza" (e liczba przebie"w p%tli nie jest z "ry okre&lona! +ypowym zastosowaniem p%tli while i repeat jest wykonywanie oblicze4 Jlub innych dziaa4L a( do spenienia okre&lone"o kryterium, wprowadzanie danych z klawiatury lub pliku i wszelkie inne operacje, w ktrych nie jeste&my w stanie wcze&niej ustali , jak wiele cykli trzeba b%dzie wykona ! )zasem jednak okazuje si%, (e musimy zrealizowa &ci&le okre&lon liczb% operacji, np! wypisa na ekranie wszystkie litery od #/$ do #1$ wraz z ich kodami /S)00! 3czywi&cie i to mo(na zrobi za pomoc p%tli while lub repeat, jednak znacznie por%czniejsza okazuje si% tu p%tla *or, sterowana nie warunkiem, lecz licznikiem / oto i sam pro"ram6
program OXUMM; - w3prowad/a /na,i OXUMM od 4O4 do 4T4 i ich ,od3 1 var c : char; - w3pis3wan3 /na, 1 begin for c := 4O4 to 4T4 do write(c:&, ord(c):&) end.

Jak wida , skadnia p%tli *or jest nast%pujca6


*or licznik 6P pocztek to koniec do instrukcja

co tumaczy si% #na nasze$ jako #dla licznika przebie"ajce"o warto&ci od pocztek do koniec wykonuj instrukcj%$! ,%tl% #w d$ Jwarto& ko4cowa licznika jest mniejsza od pocztkowejL zapisuje si% nieco inaczej6
*or licznik 6P pocztek downto koniec do instrukcja

8arto o tym pami%ta , "dy( u(ycie do te"o celu poprzedniej postaci spowoduje, (e p%tla nie wykona si% ani razu! Je&li wreszcie warto& pocztkowa licznika jest rwna ko4cowej, p%tla wykona si% dokadnie jeden raz Jco ma niewielki sensL niezale(nie od te"o, ktrej z powy(szych *orm u(yjemy! ,ro"ramujc p%tl% *or musisz dokadnie wiedzie , ile razy b%dzie si% ona wykonywaa, czyli zna warto& pocztkow i ko4cow licznika! 'ie jest oczywi&cie powiedziane, (e warto&ci te musisz poda w postaci staych6 rwnie dobrze mo(esz u(y do te"o celu zmiennych lub wyra(e4, byle tylko daway one w wyniku warto&ci typu porzdkowe"o, np6
*or i 6P l to .aKlndeK die 2 do c !!! d

Sam licznik rwnie( musi by zmienn typu porzdkowe"o Jzwykle inte"er lub charL i w trakcie wykonywania p%tli zmienia si% z krokiem l od warto&ci pocztek do koniec wcznie! 1apro"ramowanie w ,ascalu p%tli z krokiem r(nym od l Jw szcze"lno&ci niecakowitymL jest nieco bardziej skomplikowaneO zwykle lepiej w tym celu u(y p%tli while lub repeat, chocia( mo(na to zrobi tak6
for i := l to =' do begin writeln (i); Mnc(i) - doda: l do lic/ni,a 1 end;

,owy(sza konstrukcja wypisze na ekranie wszystkie liczby nieparzyste zawarte mi%dzy G a 2G! Sztuczka, ktrej tu u(yli&my, pole"a na zmianie licznika w trakcie wykonywania p%tli Jnormalnie zajmuje si% tym sama p%tla, a my nie powinni&my si% do te"o wtrca L 1 I chocia( le"alna i poprawna I jest niezbyt bezpieczna! Sprbuj np! zmieni warto& ko4cow licznika na 21 Jpro"ram #przeskoczy$ zako4czenie p%tliL lub instrukcj% inc JiL na 5ec JiL Jzmniejszenie licznika o l zamiast zwi%kszenia I p%tla #zap%tli si%$ na warto&ci 1L! *rogramujc p)tl) 'or naley stanowczo unika jawnego mody'ikowania licznika wewntrz p)tli Aby

Strona numer CA z 82

zaprogramowa p)tl) z krokiem rnym od l" lepiej uy konstrukcji w$ile lub repeat! 8zmiankowane wy(ej instrukcje inc i 5ec pozwalaj odpowiednio na zwi%kszenie Jinkrementacj%L lub zmniejszenie Jdekrementacj%L warto&ci ar"umentu typu porzdkowe"o o zadan warto& Jrwnie( typu porzdkowe"oL i odpowiadaj instrukcjom dodania lub odj%cia warto&ci, np!
5ec Jk, CGLO c to samo, co k 6P k D CGO d

'a tym zako4czymy rozwa(ania na temat p%tli w ,ascalu Ji kilku drobnych dodatkwL, cho do zastosowa4 p%tli b%dziemy wraca jeszcze wielokrotnie! 8 kolejnym rozdziale zajmiemy si% pewn niedo"odno&ci pro"ramu Bisekc ja, pole"ajc na kopotliwym zadawaniu postaci rozwizywane"o rwnania! 1auwa(, (e nasza *unkcja nieliniowa jest w pro"ramie wykorzystywana dwa razy6 raz podczas wa&ciwej iteracji, dru"i raz w kryterium stopu! Jest to niewy"odne i nieele"anckie, "dy( chcc znaleH miejsce zerowe innej *unkcji musimy wpisywa j dwa razy! Jednocze&nie sam al"orytm pozwala nam znaleH miejsce zerowe dowolnej *unkcji '7&! )zy zatem nie daoby si% zamkn naszej *unkcji w jakie& pudeko, do ktre"o wkadaliby&my tylko warto& ar"umentu i odbierali wynik2 3czywi&cie, (e tak! 8 ramach wicze4 praktycznych proponuj% )i nast%pujce zadania6 - zmody*ikuj pro"ram Oisekcja tak, by wykorzystywa p%tl% whileO - napisz pro"ram wypisujcy warto&ci *unkcji '7&! = lA esinK`cosK w przedziale od & = 6 do & = CAG stopni J2,0L z krokiem 1G stopni! ,ami%taj, (e ar"umenty *unkcji try"onometrycznych podawane s w radianach! Sprbuj wykorzysta wszystkie poznane p%tle!

@apami!taj
5o cykliczne"o Jiteracyjne"oL wykonywania instrukcji su( w ,ascalu p%tle! 0nstrukcje p%tli mo" by sterowane warunkiem JwhileDdo, repeatDuntilL lub licznikiem J*orDtoRdowntoL! - ,%tle while i repeat u(ywane s wwczas, "dy nie znamy z "ry liczby przebie"w p%tli, mo(emy natomiast okre&li warunek jej zako4czenia! - ,ro"ramujc kryterium zako4czenia p%tli while i repeat Ji nie tylkoL nale(y pami%ta o niedokadno&ci reprezentacji liczb rzeczywistych i kumulacji b%dw oblicze4! - ,%tla *or wykorzystywana jest w sytuacjach, "dy mo(emy dokadnie okre&li liczb% przebie"w! - ?icznik p%tli *or jest zawsze typu porzdkowe"o i zmienia si% z krokiem - l! - .ody*ikacja licznika wewntrz p%tli *or jest dopuszczalna, ale mo(e prowadzi do trudnych do wykrycia b%dw i nale(y jej unika ! - 5o inkrementacji lub dekrementacji zmiennych typu porzdkowe"o mo(na wykorzysta instrukcje inc i 5ec!

Strona numer CE z 82

2unkcje i procedur&
Jak w (yciu, tak i w pro"ramowaniu obowizuje zasada, (e nie nale(y robi te"o same"o wi%cej ni( raz! Je&li np! musisz kilkakrotnie obliczy w pro"ramie warto& jakie"o& skomplikowane"o wyra(enia, to oczywi&cie mo(esz to zrobi przepisujc Jlub powielajc za pomoc operacji blokowychL odpowiednie *ra"menty pro"ramu, ale trudno powiedzie , by byo to najlepsze rozwizanie! ,o pierwsze, wyma"a to troch% pracy! ,o dru"ie, pro"ram robi si% du(szy, mniej elastyczny i mniej czytelny Jo ele"ancji nie mwicL! ,o trzecie, jakakolwiek poprawka w tre&ci wyra(enia musi zosta wprowadzona do wszystkich powielonych *ra"mentwO je&li zapomnisz cho by o jednym, wyniki mo" by opakane! ,owy(sze ar"umenty w wystarczajcym stopniu uzasadniaj potrzeb% wprowadzenia rozwizania umo(liwiajce"o #ukrycie$ wybranej operacji Jlub "rupy operacjiL w pojemniku, do ktre"o dostarczaliby&my dane i odbierali wynik bez przejmowania si% sposobem przetwarzania in*ormacji wewntrz! 9ozwizaniem takim s 'unkcje i procedury 3bydwa poj%cia s )i ju( znane I wielokrotnie wykorzystywae& procedury i *unkcje biblioteczne ,ascala Jnp! writeln czy eKpL bez zastanawiania si% nad zasad ich dziaania! 3kazuje si% jednak, (e w nieskomplikowany sposb mo(esz rwnie( tworzy wasne procedury i *unkcje, co pozwoli )i unikn prowizorki, jak zaprezentowali&my w poprzednim rozdziale! )zym jest *unkcja2 1 punktu widzenia pro"ramu, ktry j wykorzystuje, jest to rodzaj #czarnej skrzynki$, przetwarzajcej wo(one do niej in*ormacje i zwracajcej odpowiedni wynik! 1 punktu widzenia pro"ramisty natomiast *unkcja jest swoistym #miniDpro"ramem$ I zestawem zamkni%tych w lo"iczn cao& instrukcji! 0nstrukcje te mo" zajmowa si% wykonywaniem dowolnych operacji, chocia( na o" ich celem jest przeksztacenie wprowadzonych do *unkcji in*ormacji Jtzw! parametrw! do (danej postaci, zwracanej nast%pnie poprzez nazw% *unkcji! ,rocedura r(ni si% od *unkcji jedynie sposobem zwracania wyniku, o czym powiemy za chwil%! )o nale(y zrobi , (eby wykorzysta w pro"ramie *unkcj% lub procedur%2 ,o pierwsze trzeba j zde'iniowa" a nast%pnie wywo+a 1ajmijmy si% na pocztek de*inicj, ktra pole"a na6 - okre&leniu sposobu kontaktowania si% jej z otoczeniem Justaleniu nazwy, zestawu parametrw i typu zwracane"o wynikuL, oraz - okre&leniu jej zawarto&ci Jczyli zestawu tworzcych j instrukcji i pomocniczych obiektw lokalnych, o ktrych pHniejL! / oto skadnia de*inicji *unkcjiC6
function na/wa7fun,c:i(lista7parametr<w):t3p7w3ni,u; de,iarac:e7i7definic:e7o.ie,t<w lo,aln3ch begin instrukcjeDreali(ujceDtre& *unkcji endO
pro$edure nazwaDproceduryJlistaDparametrwLO dekiaracjeDiDde*inicjeDobiektwDlokalnych begin

instrukcjeDreali(ujceDtre& Dprocedury endO

5e*inicja rozpoczyna si% tak zwanym nag+wkiem" sy"nalizowanym sowem kluczowym *unction lub procedur%, po ktrym nast%puje umieszczona w nawiasach okr"ych lista parametrw 7argumentw! 'ormalnyc$ ,arametry te symbolizuj warto&ci, ktre zostan przekazane do *unkcji i przetworzone, za& sama lista ma posta 6
listaDnazw 6 typO listaDnazw 6 typO !!!

czyli zawiera zestawy nazw parametrw te"o same"o typu rozdzielone &rednikami Jw obr%bie zestawu nazwy parametrw rozdzielone s przecinkamiL! 8arto zauwa(y , (e lista parametrw nie jest obowizkowym elementem de*inicji, tak wi%c istnieje mo(liwo& zde*iniowania *unkcji bezparametrowej, nie pobierajcej in*ormacji z otoczenia! 3statnim elementem na"wka jest okre&lenie typu zwracane"o wyniku, wyma"ane wycznie dla *unkcji! Sama tre& *unkcji zde*iniowana jest pomi%dzy sowami kluczowymi be"in i end i mo(e by poprzedzona deklaracjami i de*inicjami tak zwanych obiektw lokalnych, wykorzystywanych przez *unkcj% do u(ytku wewn%trzne"o! 3biektami lokalnymi zajmiemy si% szerzej w dalszej cz%&ci ksi(ki! Same instrukcje skadajce si% na tre& de*inicji *unkcji nie r(ni si% niczym od u(ywanych w #zwykym$ pro"ramie, z wyjtkiem te"o, (e w przypadku *unkcji nale(y umie&ci w de*inicji instrukcj% przypisania
na/wa7fun,c:i := warto567w3ni,u

umo(liwiajc przekazanie obliczone"o wyniku #na zewntrz$! )o ciekawe, obecno& tej instrukcji w tre&ci *unkcji nie jest sprawdzana przez kompilator Jjak ma to miejsce np! dla kompilatorw j%zyka )L, tote( zapominalskim pro"ramistom mo(e si% przytra*i zde*iniowanie *unkcji kompletnie nie potra*icej skomunikowa si% z otoczeniem Jnie pobierajcej (adnych parametrw i nie zwracajcej wynikuL, a wi%c

Strona numer C8 z 82

praktycznie bezu(ytecznej! 8arto zdawa sobie spraw%, (e wywoanie *unkcji pozbawionej instrukcji zwrcenia wyniku da w rezultacie warto& nieokre&lon JprzypadkowL, co raczej nie mo(e by uznane za e*ekt pozytywny! DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DD
C

5la uproszczenia, w dalszym ci"u naszych rozwa(a4 b%dziemy u(ywali sowa #*unkcja$ zarwno na okre&lenie *unkcji, jak i procedury! >wentualne r(nice b%d wyraHnie zaznaczane!

----------------------------------------------------------------------------------------------------------------------------------------Jak wida z powy(szych zapisw, de*inicja *unkcji lub procedury przypomina may pro"ram! 5e*inicje wszystkich *unkcji i procedur wykorzystywanych w pro"ramie musz by umieszczone przed miejscem ich wywoania! +o ostatnie mo(e nastpi w cz%&ci operacyjnej pro"ramu Ja zatem de*inicje musz poprzedza rozpoczynajce wa&ciwy pro"ram sowo begin" lub w tre&ci innej *unkcji lub procedury Jco wymusza odpowiednie uo(enie de*inicji wz"l%dem siebieFL! Struktura pro"ramu wykorzystujce"o *unkcje i procedury powinna wi%c wy"lda nast%pujco6
nag0<we,7programu de,iarac:e7i7definic:e7o.ie,t<w7glo.aln3ch definic:e7fun,c:i7i7procedur begin c/K567operac3:na7programu end.

Smieszczanie deklaracji i de*inicji obiektw "lobalnych Jo ktrych rwnie( powiemy pHniejL przed de*inicjami *unkcji nie jest co prawda obowizkowe Jchyba, (e obiekty te s wykorzystywane w *unkcjachL, stanowi jednak element dobrej praktyki pro"ramistycznej! 'atomiast jednym z pospolitych b%dw popenianych przez pocztkujcych pro"ramistw jest prba umieszczania de*inicji *unkcji i procedur w cz%&ci operacyjnej pro"ramu, co jest oczywi&cie niele"alne! Samo zde*iniowanie *unkcji nic nam jeszcze nie daje 7jego e*ektem jest wycznie utworzenie odpowiednie"o *ra"mentu kodu wynikowe"oL! 5opiero wywo+anie *unkcji powoduje wykonanie skadajcych si% na jej tre& instrukcji i rzeczywiste przeksztacenie in*ormacji podanej w postaci parametrw! /by wywoa procedur% lub *unkcj%, wystarczy umie&ci w pro"ramie jej nazw% wraz z list parametrw aktualnyc$" czyli wyra(e4 zawierajcych in*ormacj%, ktra ma by przetworzona! 1awarto& listy parametrw aktualnych musi odpowiada li&cie podanej w de*inicji *unkcji! 8 szcze"lno&ci, je&li w de*inicji pomini%to list% parametrw, nie podaje si% ich podczas wywoania Jmamy wwczas do czynienia z *unkcj lub procedur bezparametrowL! 8ywoanie procedury ma posta
na/wa7procedur3(lista7parametr<w7a,tualn3ch);

za& w przypadku *unkcji, ktra zwraca obliczon warto& poprzez swoj nazw%, musisz dodatkowo zadba o umieszczenie "dzie& zwrcone"o wyniku, np! tak6
/mienna := na/wa7fun,c:i(lista7parametr<w7a,tualn3ch);

;unkcj% mo(esz rwnie( wykorzysta jako element wyra(enia lub instrukcji Jnp! writelnLO o"lnie, mo(esz j zastosowa wsz%dzie tam, "dzie mo(liwe jest u(ycie wyra(eniaM!
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DD F 3"raniczenie to mo(na obej& , wykorzystujc tzw! deklaracje zapowiadajce, rozpoczynane sowem kluczowym * orward! M ,ami%taj, (e identy*ikator *unkcji u(yty w pro"ramie nie jest RDwarto&ci, a wi%c nie mo(esz u(ywa *unkcji tak samo, jak zmiennej I nie mo(esz np! przypisywa jej warto&ci Jmo(liwe to jest wycznie w obr%bie de*inicji *unkcji i ma wwczas nieco inne znaczenieL! DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DD

*oczwszy od wersji 3 6 9urbo *ascal umoliwia Ci zignorowanie wyniku zwracanego przez 'unkcj)" czyli wykorzystanie j ej tak samo" jak procedury (est to moliwe po w+czeniu opcji kompilatora E*tended S#nta* lub uyciu odpowiadajcej jej dyrektywy SV&?W S**! ,o tej solidnej Ji nu(cejL dawce teorii czas na nieco praktyki! 'a pocztek sprbujmy zaradzi problemowi przedstawionemu pod koniec poprzednie"o rozdziau! 3to poprawiona wersja pro"ramu Bisekc ja, wykorzystujca *unkcj%6
program Bise,c:a; - *rogram ro/wiD/u:e r<wnania nieliniowe metodD .ise,c:i 1 var a, ., c : real; - granice pr/ed/ia0u i pun,t pod/ia0u 1 eps : real; - do,0adno56 1
function f (E:real) :real; begin - .adana fun,c:a 1

f := l 7 eEp(sin(E)2cos(E));

- tre56 fun,c:i 1 end;

Strona numer C@ z 82

begin

writeln(4*rogram /na:du:e mie:sce /erowe fun,c:i4) writeln(4w pr/ed/iale [a; .]4); write(4*oda: warto56 a: 4); - wprowadG granice pr/ed/ia0u 1 readln(a); write(4*oda: warto56 .: 4); readln(.); write(4*oda: do,0adno56: 4); readln(eps);
repeat

c := (a ) .)I=; - pod/iel pr/ed/ia0 na p<0 1 if (f(a)2f(c)) W L then - w3glDda 0adnie:, prawdDY 1 . := c - fun,c:a ma pr/eciwne /na,i w a i c 1 else a := c; - fun,c:a ma pr/eciwne /na,i w.i61 writeln(c); until a.s(f(c)) W eps; - .adam3 warto56 .e/w/glKdnD> 1 writeln(4NiK:sce /erowe: c = 4,c:$=: ); readln; end.

)zym r(ni si% nasz pro"ram od wersji poprzedniej2 ,o pierwsze, de*inicja badanej *unkcji zostaa wyodr%bniona jako oddzielny *ra"ment, ktry atwo znaleH , zinterpretowa i poprawi ! ,o dru"ie, tre& same"o pro"ramu jest czytelniejsza Jpro"ram zajmuje si% teraz wycznie realizacj wa&ciwe"o al"orytmu, czyli szukaniem pierwiastka pewnej 'unkcji '7&! ,o trzecie, zmniejszya si% podatno& pro"ramu na b%dy Jzmiana de*inicji *unkcji wyma"a poprawienia tylko jednej linijkiO zastanw si%, jak wy"ldaaby poprzednia wersja pro"ramu, "dyby obliczenia wyma"ay u(ycia kilku oddzielnych instrukcjiL! 8reszcie po czwarte, pro"ram wy"lda adniej, jest bardziej ele"ancki i wyma"a mniej pisania! Norzystanie z procedur wy"lda bardzo podobnie, z wyjtkiem te"o, (e nie musisz si% troszczy o za"ospodarowanie zwracanej warto&ci Jponiewa( jej nie maL! 3"lnie rzecz biorc, *unkcje wykorzystywane s "wnie tam, "dzie zachodzi potrzeba obliczenia jakiej& pojedynczej warto&ci i przekazania jej do kolejnych instrukcji pro"ramu, natomiast procedury pozwalaj na e*ektywne wykonywanie powtarzajcych si%, rutynowych czynno&ci! /by na przykad uatrakcyjni szat% "ra*iczn pro"ramu, mo(esz wykorzysta w nim nast%pujc procedur%6
pro$edur SzlaczekO begin for i := l to %' do - w3pis/ s/lac/e, 1 write (424); - /0o;on3 / %' gwia/de, 1 writeln; - pr/e:dG do nowego wiers/a 1 end; SzlaczekO

:dzie umie&ci de*inicj% procedury I ju( wiesz! ,ozostaje j wywoa , co robi si% bardzo prosto6 Na(de takie wywoanie umie&ci na ekranie #szlaczek$ skadajcy si% z AG "wiazdek! 3czywi&cie, powy(sza procedura nie jest idealna, bo je&li np! zachce )i si% wypisa szlaczek zo(ony z kresek, b%dziesz musia zmieni jej tre& ! Gnacznie lepszym rozwizaniem jest co& takie"o6
procedur X/lac/e,(Tna,:char; Mle:.3te); begin for i := l to Mle do - w3pis/ s/lac/e, 1 write(Tna,); - /0o;on3 / ilu5 /na,<w 1 writeln; end;

Sprbujmy w ramach zabawy wykorzysta nasz procedur% do wy&wietlenia na ekranie trjkta zo(one"o z "wiazdek, czyli cze"o& takie"o6 itd! 3dpowiedni pro"ram b%dzie wy"lda tak6 pro"ram SzlaczkiO
ear i : integer; - lic/ni, wiers/3 1 procedur X/lac/e, (Tna, : char; Mle : integer); begin for i := l to Mle do - w3pis/ s/lac/e, 1 write(Tna,); - /0o;on3 / ilu5 /na,<w 1 writeln end; begin for i := l to = L do X/lac/e, ( 424, i); - w3pis/ =' s/lac/,<w 1 end.

Je&li uwa(asz, (e wszystko jest 3N, sprbuj teraz zmieni pro"ram tak, by ka(dy szlaczek mia du"o& rwn kolejnej liczbie nieparzystej, tj! pierwszy l, dru"i C itd! 3"lnie du"o& szlaczka wyrazi si% wzorem Ele = -A numer A1, "dzie numer jest numerem wiersza, tak wi%c wystarczy zmieni "wn p%tl% pro"ramu na

Strona numer FG z 82

for i := l to =' do - w3pis/ =' s/lac/,<w 1 X/lac/e,(424, =2i 7 $);

=m!!! no, chyba nie cakiem to chciae& uzyska , prawda2 >*ekt, ktre"o do&wiadczye& uruchamiajc pro"ram wynika z u(ycia w procedurze i wywoujcej j p%tli tej samej zmiennej i, a wy"lda nast%pujco6
Barto
ma by jest przed procedur jest po procedurze jest po inkrementacji licznika

*rzebieg p)tli ,
2 2 C F 2 1 1 1 2

.
C C E 8

Na(de wywoanie procedury powoduje mody*ikacj% zmiennej i, ktra jest jednocze&nie licznikiem p%tli w pro"ramie "wnym! /by te"o unikn , nale(aoby w procedurze u(y jako licznika p%tli innej zmiennej! +o z kolei nakada na pro"ramist% obowizek przejrzenia wszystkich procedur znajdujcych si% w pro"ramie i wcze&niejsze"o zadeklarowania odpowiednich zmiennych tak, by si% nie #nakaday$! 8 e*ekcie otrzymujemy kolejny zestaw atwych do przeoczenia puapek! 9ozwizaniem te"o problemu s zmienne lokalne" ktrymi jednak zajmiemy si% ju( w nast%pnym rozdziale! +am rwnie( doko4czymy omawianie przekazywania parametrw i warto&ci z i do procedur i *unkcji!

@apami!taj
,rocedury i *unkcje pascalowe pozwalaj zamkn dany zestaw operacji w lo"iczn cao& , pobierajc z otoczenia odpowiednie in*ormacje i zwracajc (dany wynik! ,rzed wykorzystaniem JwywoaniemL *unkcji lub procedury nale(y j zde*iniowa , czyli okre&li jej tre& i sposb komunikowania si% z otoczeniem! - 5o przekazywania in*ormacji do *unkcji JproceduryL su( parametry Jar"umentyL! 8 trakcie de*iniowania in*ormacja przekazywana do *unkcji JproceduryL symbolizowana jest parametrami *ormalnymi! - 5e*inicje *unkcji JprocedurL musz by umieszczone w pro"ramie przed cz%&ci operacyjn i musz wyst%powa w odpowiedniej kolejno&ci! - Samo wywoanie *unkcji JproceduryL odbywa si% przez podanie w pro"ramie jej nazwy uzupenionej odpowiedni list parametrw aktualnych! - Stosowanie *unkcji i procedur jest korzystne ze wz"l%du na popraw% czytelno&ci i e*ektywno&ci pro"ramu, zmniejszenie podatno&ci na b%dy i skrcenie czasu potrzebne"o na je"o pisanie!

Strona numer F1 z 82

ak program porozumiewa si! z 3unkcj0?


Jak powiedzieli&my w poprzednim rozdziale, *unkcja JproceduraL pozwala zamkn zestaw zo(onych operacji w swoisty pojemnik, wykorzystywany przez wywoujcy pro"ram na zasadzie czarnej skrzynki6 po wo(eniu do *unkcji zestawu in*ormacji, pro"ram odbiera wynik nie przejmujc si% sposobem je"o uzyskania! 'iestety, jak mo"e& si% ju( przekona , nasza skrzynka nie jest szczelna i stosunkowo atwo doprowadzi do sytuacji, w ktrej *unkcja w sposb niekontrolowany #uszkodzi$ zmienne pro"ramu! 1jawiska te"o typu Jzarwno kontrolowane, jak i niekontrolowaneL zwane s e'ektami ubocznymi Jan"! side e''ects! i do& cz%sto utrudniaj (ycie mniej do&wiadczonym pro"ramistom! 'a szcz%&cie e*ektw ubocznych mo(na atwo unikn 6 pozwalaj na to zmienne lokalne3 Jak sama nazwa wskazuje, zmienna lokalna jest #prywatn wasno&ci$ *unkcji lub procedury, wewntrz ktrej zostaa zde*iniowana! 1mienna taka nie jest widoczna na zewntrz *unkcji Jczyli np! w wywoujcym j pro"ramieL, natomiast jest dost%pna dla wszelkich *unkcji i procedur zde*iniowanych w obr%bie danej *unkcji lub procedury Jo ile ich de*inicje umieszczone s po deklaracji zmiennejL! ,rzeciwie4stwem zmiennej lokalnej jest oczywi&cie zmienna globalna" #widoczna$ w caym obszarze pro"ramu od momentu jej zadeklarowania! Na(da zde*iniowana w pro"ramie *unkcja i procedura ma peny dost%p do wszystkich zmiennych "lobalnych, cze"o jednak nie nale(y nadu(ywa Ja wr%cz nie nale(y u(ywa w o"leL! #1akres widzialno&ci$ zmiennej nazywany jest jej zasi)giem Jan"! scope! 1arwno deklaracja, jak i sposb wykorzystania zmiennych lokalnych s #na oko$ takie same, jak dla zmiennych "lobalnych! 9(nica kryje si% w lokalizacji zmiennych obu DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DD
Zci&lej, obiekty lokalne, bowiem oprcz zmiennych lokalne mo" by rwnie( stae i typy, o ktrych jednak na razie nie mwili&my! DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DD
3

typw6 zmienne "lobalne przechowywane s w tzw! segmencie danyc$ i istniej przez cay czas wykonywania pro"ramu! 5zi%ki temu s zawsze dost%pne dla ka(dej ze zde*iniowanych w pro"ramie *unkcji, o ile nie zachodzi tzw! zjawisko przysaniania, o ktrym za chwil%! 1mienne lokalne umieszczane s z kolei na stosie" czyli w specjalnym obszarze pami%ci przeznaczonym do tymczasowe"o przechowywania in*ormacji! 8 odr(nieniu od zmiennych "lobalnych, czas (ycia zmiennych lokalnych o"raniczony jest do czasu wykonywania posiadajcej je *unkcji, tak wi%c #lokalno& $ ma charakter nie tylko przestrzenny, ale i czasowy I zmienne lokalne s tworzone w momencie rozpocz%cia wykonywania *unkcji i znikaj po jej zako4czeniu! 3czywiste jest wi%c, (e prba odwoania si% do zmiennej lokalnej na zewntrz deklarujcej j *unkcji jest niele"alna, "dy( zmienna taka po prostu nie istniejeE! Jak wcze&niej wspomnieli&my, *unkcja JproceduraL przypomina struktur may pro"ram, tote( deklaracje zmiennych lokalnych umieszcza si% zwykle na jej pocztku, po na"wku! S(ycie zmiennych lokalnych zademonstrujemy na przykadzie pro"ramu Szlaczki, doprowadzajc "o przy okazji do stanu penej u(ywalno&ci! /by to zrobi , wystarczy poprawi procedur% Szlaczek6
procedur X/lac/e,(Tna, : char; Mle : integer); var - de,larac:a /mienne: lo,alne:, 1 i : integer; - c/3li lic/ni,a /na,<w 1 begin for i := l to Mle do - w3pis/ s/lac/e, 1 write(Tna,); - /0o;on3 / ilu5 /na,<w 1 writeln end;

+ak poprawiony pro"ram powinien dziaa poprawnie niezale(nie od (danej du"o&ci ci"u znakw! 8prowadzajc do procedury Szlaczek deklaracj% zmiennej i spowodowae&, (e podczas ka(de"o wywoania korzysta ona nie ze zmiennej "lobalnej, ale ze swojej #prywatnej$ zmiennej lokalnej! 1auwa( przy okazji, (e obie zmienne nazywaj si% tak samo, a mimo to pro"ram dziaa poprawnie! 1jawisko #maskowania$ zmiennej "lobalnej przez identycznie nazwan zmienn lokaln nazywa si% przys+anianiem i daje )i "warancj%, (e nawet

Strona numer F2 z 82

je&li zadeklarujesz w *unkcji zmienn lokaln o nazwie takiej samej jak zmienna zewn%trzna Jw szcze"lno&ci "lobalnaL, wszelkie odwoania wewntrz *unkcji b%d zawsze kierowane do zmiennej lokalnej, za& odpowiednia zmienna zewn%trzna pozostanie nienaruszona! 5zi%ki temu nie musisz dba o to, by zmienne deklarowane w ramach poszcze"lnych *unkcji miay r(ne nazwy i by ktra& przypadkiem nie nazywaa si% tak samo, jak odpowiednia zmienna "lobalna! /by zobrazowa poj%cia zasi%"u i przysaniania, wyobraHmy sobie pewien abstrakcyjny pro"ram, w ktrym zde*iniowano kilka zmiennych "lobalnych oraz procedur i *unkcji DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DD
8yjtkiem s tutaj lokalne zmienne prede*iniowane Jzmienne z warto&ci pocztkowL, ktre lokowane s w se"mencie danych, a wi%c istniej przez cay czas wykonywania pro"ramu! 'ie zmienia to *aktu, (e i one nie s widoczne na zewntrz posiadajcych je *unkcji i procedur! DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DD
E

posiadajcych swoje zmienne lokalne! 'a rysunku obok przedstawiony jest schemat takie"o pro"ramu! 8 tabelce pokazany jest zasi%" poszcze"lnych zmiennych Jwidzialno& w pro"ramie i procedurachL, znak "wiazdki oznacza przysanianie! Niedy u(ywa zmiennych lokalnych, a kiedy "lobalnych2 1asadniczo, zmiennych "lobalnych w procedurach i *unkcjach nie nale(y u(ywa w o"le! 1darzaj si% jednak sytuacje, kiedy 2wiado(e u(ycie zmiennej "lobalnej Jczyli &wiadome wykorzystanie e*ektw ubocznychL upraszcza pro"ram! >*ekty uboczne znajduj na o" zastosowanie do przekazywania in*ormacji z i do *unkcji JprocedurL, pozwalajc na zredukowanie liczby parametrw! Je&li jednak chciaby& zaoszcz%dzi sobie pisania deklarujc w pro"ramie jedn zmienn "lobaln i i u(ywajc jej jako licznika we wszystkich procedurach, ktre takowe"o potrzebuj, szukasz "uza! ,r%dzej czy pHniej ktra& z przyszych mody*ikacji pro"ramu spowoduje ujawnienie si% e*ektw ubocznych w *ormie prowadzcej do b%du wykonania! ,oniewa( wszelkie czynno&ci wykonywane przez *unkcj% lub procedur% s niedostrze"alne dla wywoujce"o j pro"ramu, zmienne wykorzystywane w trakcie wykonywania tych czynno&ci powinny by dla nie"o niedostrze"alne, a zatem powinny by deklarowane jako zmienne lokalne! 8 szcze"lno&ci dotyczy to zmiennych tymczasowych i pomocniczych, jak liczniki p%tli, tymczasowe warto&ci maksimw i minimw, zmienne tekstowe u(ywane przy wyprowadzaniu komunikatw itp! Bszelkie zmienne przeznaczone wy+cznie do uytku wewn)trznego 'unkcji i procedur powinny by bezwzgl)dnie deklarowane jako zmienne lokalne Gmienne globalne powinny by wykorzystywane tylko do przec$owywania danyc$ istniejcyc$ przez ca+y czas trwania programu 8 ostatniej cz%&ci te"o rozdziau zajmiemy si% spraw przekazywania in*ormacji pomi%dzy *unkcjami i procedurami a wywoujcym je pro"ramem! Jak ju( wiesz, wymiana taka mo(e by zrealizowana z wykorzystaniem e*ektw ubocznych Jco nie jest wskazaneL lub za pomoc parametrw Jar"umentwL! 5eklarowanie i wykorzystanie parametrw byo ju( omawiane poprzednio, przypomnijmy wi%c w skrcie6 - parametry deklarowane s w na"wku *unkcji JproceduryL jako tzw! parametry 'ormalne" czyli identy*ikatory JnazwyL symbolizujce dane przekazywane do *unkcjiO - podczas wywoania w miejsce parametrw *ormalnych podstawiane s rzeczywiste warto&ci zmiennych, staych i wyra(e4, tworzce tzw! parametry aktualne; - parametry *ormalne opisuj jedynie posta in*ormacji przekazywanej do *unkcji JproceduryLO rzeczywist in*ormacj% nios ze sob dopiero parametry aktualne! Rysunek 1-. Bidzialno zmiennyc$ lokalnyc$ i globalnyc$ w programie

Strona numer FC z 82

progra( 1asi%"iO 3ar i, j6 inte"erO K 6 real

pro$edure ,ierwszaO 3ar k 6 inte"erO

pro$edure 5ru"a JK6 realLO 3ar k 6 inte"erO

pro$edure +rzecia JK6 realLO 3ar k 6 inte"erO pro$edure 8ewnO 3ar k,l 6 inte"erO

6mienna )w/a7ciciel& i Jpro"ramL j Jpro"ramL K Jpro"ramL j J,ierwszaL k J,ierwszaL K J5ru"aL k J5ru"aL K J+rzeciaL k J+rzeciaL k J8ewnL ,ro"ram tak tak tak nie nie nie nie nie nie nie ,ierwsza tak nieJ`L tak tak tak nie nie nie nie nie

6asi$g 5ru"a tak tak nieJ`L nie nie tak tak nie nie nie +rzecia tak tak nieJ`L nie nie nie nie tak tak nie 8ewn tak tak nie nie nie nie nie tak nieJ`L tak

l J8ewnL nie nie nie nie tak 8ewntrz *unkcji parametry zachowuj si% jak normalne zmienne Jmo(na wykonywa na nich wszelkie operacje tak samo, jak na zmiennych lokalnychL! .o(liwe jest zadeklarowanie parametru o nazwie takiej samej, jak zmienna "lobalna Jw o"lno&ci I zmienna zadeklarowana w bloku nadrz%dnymLO wystpi wwczas e*ekt przysaniania, tj! wszelkie odwoania wewntrz *unkcji korzystajcej z parametru b%d odnosiy si% do nie"o, a nie do przysoni%tej przeze4 zmiennej! 'iele"alne jest natomiast deklarowanie zmiennych lokalnych i parametrw o identycznych nazwach Jnie mwic ju( o zadeklarowaniu parametru o nazwie identycznej z nazw *unkcji, ktra "o wykorzystujeL! Bszystkie identy'ikatory 7tj nazwy zmiennyc$" sta+yc$" typw" parametrw" procedur i 'unkcji! deklarowane w obr)bie danego bloku 7z wyjtkiem blokw podrz)dnyc$! musz by unikalne Doliwe jest natomiast QzdublowanieR identy'ikatora w bloku podrz)dnym" co spowoduje e'ekt przys+aniania 8arto wspomnie , (e pocztkujcy pro"rami&ci cz%sto nadu(ywaj parametrw, wykorzystujc je jako zmienne lokalne lub Jco jest ju( zbrodniL deklaruj dodatkowe parametry tylko i wycznie w tym celu! ,raktyka ta, chocia( le"alna, jest sprzeczna z zasadami poprawne"o pro"ramowania6 parametry przeznaczone s do wymiany in*ormacji pomi%dzy *unkcj, nie za& do #podpierania si%$ w wykonywanych przez ni operacjach o charakterze

Strona numer FF z 82

wewn%trznym! 9worzc program musisz pami)ta o w+aciwym podziale kompetencji pomi)dzy sk+adajcymi si) naM obiektami (eli obiekt przeznaczony jest do przekazywania in'ormacji" nie powiniene uywa go jako zmiennej lokalnej *oczta nie luzy do przesy+ania wiadomoci do ssiedniego pokoju 5o tej pory koncentrowali&my si% na przekazywaniu in*ormacji z wywoujce"o pro"ramu do *unkcji lub procedury! ,o przetworzeniu tej in*ormacji na o" zachodzi konieczno& zwrcenia wyniku do wywoujce"o! Je&li wynik jest pojedyncz warto&ci Jjest typu proste"oL, najlepiej u(y *unkcji, ktra pozwala na zwrcenie "o przez nazw%! 9ozwizanie to bywa jednak czasami niewy"odne, nie mwic ju( o sytuacjach, "dy trzeba zwrci do wywoujce"o dwie lub wi%cej warto&ci! ,oniewa( trzymamy si% z daleka od e*ektw ubocznych, pozostaje wykorzystanie do te"o celu parametrw! 8yobraH sobie na przykad, (e jest )i potrzebna *unkcja obliczajca jednocze&nie sinus i cosinus dane"o kta! .o(na to zrobi np! tak6
program Rr3gonometria; - demonstrac:a pr/e,a/3wania parametr<w 1 Aar i : integer; s, c : real; procedure XinUos(E : real; XinZ, UosZ : real); - o.lic/a :ednoc/e5nie sinus i cosinus argumentu 1 begin XinZ := sin (E); UosZ := cos (E); end; begin XinUos(*iI",s,c); - o.lic/ warto5ci 1 writeln(s: :", c: :"); - i w3pis/ :e na e,ranie 1 end.

'iestety, wynik bynajmniej nie jest satys*akcjonujcy6 zamiast obliczonych warto&ci pro"ram wy&wietla zera lub inne pozbawione sensu liczby! 5zieje si% tak dlate"o, i( w swojej obecnej *ormie parametry sinK i )osK pozwalaj jedynie na przekazanie in*ormacji do procedury, nie za& odwrotnie! 'a szcz%&cie wystarczy jedna drobna mody*ikacja w pro"ramie6
pro$edure Sin)osJK 6 realO 3ar SinW, )osW 6 realL# by wszystko zacz%o dziaa poprawnie! )o takie"o si% zmienio2 3t( dodanie sowa kluczowe"o ear przed nazw

parametru JparametrwL zasadniczo zmienia sposb ich przekazywania! ,oprzednio mieli&my do czynienia z tak zwanym przekazywaniem przez warto" umo(liwiajcym wycznie wo(enie danych do *unkcji JproceduryL! 5ziaanie przekazywania przez nazw% sprowadzao si% do umieszczenia w odpowiednim miejscu Jtj! na stosieL kopii wartoci parametru aktualnego" ktra nast%pnie mo"a by przetwarzana wewntrz *unkcji lub procedury! 3becnie wykorzystywany mechanizm nosi nazw% przekazywania przez nazw) Jinne mdre okre&lenie to przekazywanie przez wskaHnik lub przez re*erencj%L i r(ni si% od poprzednie"o tym, (e procedura otrzymuje nie kopi% warto&ci parametru aktualne"o, lecz in'ormacj) o jego po+oeniu .o(na to przedstawi nast%pujco6

aL ,ro"ram adres 2CAF@h KD12CF

bL ,ro"ram adres 2CAF@h KD12CF 2 2CAF@h

12CF

,ami%

,ami%

Rysunek 11. Dec$anizm przekazywania parametrw< a! przez warto" b! przez nazw) 8 przypadku przekazywania przez warto& *unkcja otrzymuje jedynie kopi% rzeczywiste"o parametru! 1asi%" operacji dokonywanych na takiej kopii o"ranicza si% do wn%trza *unkcji, za& "dy ta ko4czy dziaanie, warto& parametru jest tracona! ,arametry przekazywane przez warto& zachowuj si% wi%c identycznie jak zmienne lokalne, r(nic si% od nich jedynie przeznaczeniem! 0naczej wy"lda sprawa w przypadku przekazywania przez nazw%6 *unkcja otrzymuje tu nie kopi% parametru, lecz tzw! wska0nik opisujcy je"o rzeczywiste poo(enie!

Strona numer FM z 82

8szelkie operacje dokonywane przez *unkcj% na parametrze przekazywanym przez nazw% dotycz nie kopii, ale rzeczywiste"o obiektu b%dce"o wasno&ci pro"ramu! .o(na wi%c powiedzie , (e *unkcja #si%"a na zewntrz$ do zasobw pro"ramu i mody*ikuje je ze skutkiem natychmiastowym, a e*ekty wszystkich operacji pozostaj #utrwalone$ w tre&ci obiektu b%dce"o parametrem! 1auwa(, (e poniewa( *unkcja otrzymuje tu wskaHnik do rzeczywiste"o parametru, nie mo(esz przekaza przez nazw% obiektu nie posiadajce"o lokalizacji w pami%ci Jnp! staej czy wyra(eniaL, czyli nie b%dce"o lDwarto&ci! ,rzekazanie takie"o parametru przez warto& jest natomiast najzupeniej le"alne! Niedy stosowa przekazywanie parametrw przez warto& , a kiedy przez nazw%2 ,rzekazywanie przez warto& u(ywane jest w #komunikacji jednokierunkowej$, czyli wwczas, "dy zwrcenie warto&ci do wywoujce"o pro"ramu nie jest wyma"ane lub wr%cz jest niewskazane Jtj! chcemy zabezpieczy si% przed mody*ikacj obiektu b%dce"o parametremL! Je(eli zachodzi potrzeba przekazania warto&ci z powrotem do wywoujce"o, konieczne jest u(ycie przekazywania przez nazw%, czyli poprzedzenie nazwy parametru sowem ear! ,rzekazywanie przez nazw% stosuje si% rwnie( dla ar"umentw o wi%kszych rozmiarach Jnp! tablic, a4cuchw i innych zmiennych strukturalnych, o ktrych powiemy wkrtceL, nawet wwczas, "dy nie chcemy zwraca ich warto&ci! Jak powiedzieli&my przed chwil, przekazanie przez warto& powoduje umieszczenie na stosie kopii parametru, co przy wi%kszych rozmiarach parametrw zajmuje sporo czasu i mo(e doprowadzi do przepenienia stosu Jna ktrym oprcz te"o musz zmie&ci si% zmienne lokalne i kilka innych rzeczyL! ,odczas przekazywania przez nazw% na stosie umieszczany jest zawsze czterobajtowej du"o&ci wskaHnik do parametru Jniezale(nie od *aktycznej wielko&ci te"o ostatnie"oL, co oczywi&cie trwa znacznie krcej! /by zabezpieczy taki parametr przed niepo(dan mody*ikacj, mo(emy zastosowa w miejsce sowa ear sowo kluczowe const, ktre rwnie( powoduje przekazanie wskaHnika do parametru, blokujc jednocze&nie mo(liwo& mody*ikowania te"o ostatnie"o! /by si% o tym przekona , sprbuj zmierzy czas wykonania nast%pujce"o pro"ramu6
progra( ,arametryO

type

Ra.lMnt = array [$..!'''] of integer; var i : integer; ti : Ra.lMnt; procedure *usta(t : Ra.lMnt); Aar , : integer;
begin begin

, := t[l] end; for i := l to $''' do - to mo;e potrwa6> 1 *usta(ti); end.

Je&li ju( to zrobie&, zmie4 na"wek procedury ,usta na procedure ,ustaJear t 6 +abl0ntL +ym razem pro"ram powinien wykona si% byskawicznie Jprzynajmniej w porwnaniu do poprzedniej wersjiL! 5zieje si% tak dlate"o, (e podczas ka(de"o wywoania procedury na stosie umieszczany jest jedynie wskaHnik do tablicy t Jw sumie tysic razy po F bajtyL, podczas "dy poprzednio na stos kopiowana bya caa tablica Jtysic razy 1G GGG bajtw, czyli 2MGG razy wi%cejL! 5odatkow #atrakcj$ zwizan z przekazywaniem wi%kszych struktur przez warto& jest mo(liwo& przepenienia stosu Jstandardowo wielko& se"mentu stosu ustawiana jest przez +urbo ,ascala na 1A kBL! /by si% o tym przekona , zmie4 w pierwotnej wersji pro"ramu Jtej bez sowa ear w na"wku proceduryL rozmiar tablicy na 1GGGG liczb6
type

Ra.lMnt = array [$..$''''] of integer;

,rba wykonania pro"ramu sko4czy si% tym razem komunikatem stack oeer*low error6 sumaryczny rozmiar tablicy wynosi 2GGGG bajtw J1GGGG dwubajtowych liczb cakowitychL, czyli wi%cej ni( mo(na umie&ci na stosie! ,odobnie jak poprzednio, przekazanie parametru przez nazw% rozwizuje problem! *rzekazujc wi)ksze struktury danyc$ jako parametry 'unkcji i procedur naley unika przekazywania przez warto i stosowa w zamian przekazywanie przez nazw) Aby zabezpieczy si) przed przypadkow mody'ikacj wartoci parametru" mona zastosowa s+owo kluczowe const w miejsce Far 8 ten sposb zako4czyli&my omawianie podstawowych za"adnie4 zwizanych z procedurami i *unkcjami! 8 nast%pnych rozdziaach zajmiemy si% wyja&nianiem dwch nowinek, ktre pojawiy si% w ostatnim pro"ramie, i ktre zapewne przyje& na wiar%! S to mianowicie tablice Ja wa&ciwie typy strukturalneL oraz de*iniowanie wasnych typw, czyli sowo kluczowe type!

@apami!taj
8szelkie obiekty zadeklarowane wewntrz *unkcji JproceduryL s tzw! obiektami lokalnymi! 3biekty

Strona numer FA z 82

lokalne s niewidoczne na zewntrz *unkcji! - 3biekty zadeklarowane w pro"ramie "wnym Jna zewntrz wszystkich procedur i *unkcjiL s obiektami "lobalnymi! S one dost%pne dla wszystkich elementw pro"ramu! - 8szelkie obiekty przeznaczone wycznie do u(ytku wewn%trzne"o *unkcji JproceduryL powinny by deklarowane jako lokalne! - 1akres #widzialno&ci$ obiektu zwany jest je"o zasi%"iem! - 1adeklarowanie w *unkcji JprocedurzeL obiektu lokalne"o o takiej samej nazwie jak obiekt z bloku nadrz%dne"o powoduje przysoni%cie te"o ostatnie"o! - .ody*ikowanie obiektw nielokalnych Jczyli przekazywanie in*ormacji doRz *unkcji lub procedury dro" inn ni( przez parametry lub nazw% *unkcjiL nosi nazw% e*ektw ubocznych! - >*ektw ubocznych nale(y unika , a je&li si% ich u(ywa I czyni to z rozwa"! - ,ascal udost%pnia dwie metody przekazywania parametrw6 przez warto& i przez nazw%! - ,rzekazywanie przez warto& dziaa jednokierunkowo, tj! przekazuje in*ormacj% od wywoujce"o do wywoywanej *unkcji lub procedury! - ,rzekazywanie przez nazw% umo(liwia zwrcenie zmody*ikowanej warto&ci parametru do wywoujce"o! - ,rzekazujc do *unkcji lub procedur wi%ksze struktury danych nale(y stosowa przekazywanie przez nazw%! Skraca to czas wykonania pro"ramu i umo(liwia unikni%cie przepenienia stosu!

Strona numer FE z 82

Programowanie na powa,nie
8 kolejnych kilku rozdziaach zajmiemy si% realizacj proste"o acz pouczajce"o zadania6 masz oto napisa pro"ram wspoma"ajcy obsu"% maej biblioteki! 3prcz wyja&nienia zasy"nalizowane"o uprzednio tematu przechowywania wi%kszych ilo&ci danych Ji kilku innych rzeczyL, sprbujemy na tym przykadzie przedstawi metodyk% projektowania pro"ramu realizujce"o pewne rzeczywiste i praktyczne zadanie! S*ormuowanie nasze"o zadania brzmi #'apisz pro"ram wspoma"ajcy obsu"% biblioteki szkolnej$ i jest oczywi&cie zbyt o"lnikowe, by dao si% skutecznie przetumaczy na pro"ram! /by je u&ci&li , musimy sprecyzowa wyma"ania u(ytkownika Jczyli osoby obsu"ujcej bibliotek%L oraz okre&li o"raniczenia pro"ramu, czyli rzeczy, ktrych z de*inicji nie b%dzie on w stanie zrobi i nad ktrymi nie b%dziemy si% w o"le zastanawia ! /by ustali list% wyma"a4 Jb%dc podstaw do zaprojektowania poszcze"lnych *unkcji pro"ramuL, musimy skonsultowa si% z je"o przyszym u(ytkownikiem Jco w znacznej mierze sprowadza si% do tumaczenia, dlacze"o te"o czy tamte"o si% nie da zrobi L! 1a(my, (e w wyniku pertraktacji z bibliotekark ustalili&my, (e nasz komputerowy katalo" powinien umo(liwia 6 - wprowadzenie z klawiatury i wy&wietlenie na ekranie in*ormacji o autorze i tytule ksi(kiO - wy&wietlenie listy ksi(ek uporzdkowanych al*abetycznie wedu" nazwiska autora lub tytuuO - wyszukanie ksi(ki wedu" pierwszych liter tytuuO - sprawdzenie, czy ksi(ka jest na pce, czy te( zostaa wypo(yczona Jje&li tak I to komuLO - wyszukanie ksi(ki najcz%&ciej i najrzadziej wypo(yczanej! 5u(o te"o, ale jako& sobie poradzimy! .ajc do dyspozycji list% (ycze4 klienta mo(emy przystpi do projektowania pro"ramu, ktre"o zasadniczymi elementem b%dzie ustalenie sposobu przechowywania in*ormacji Jczyli struktur danychL oraz sposobu jej przetwarzania Jczyli al"orytmwL! ,oniewa( dane reprezentuj pewne rzeczywiste obiekty Jksi(kiL, musimy projektowa nasz pro"ram pod ktem wa&ciwo&ci tych obiektw! 'ajpierw zatem utworzymy reprezentacj% danych, a nast%pnie metody, za pomoc ktrych b%dziemy je przetwarza ! +aka wa&nie kolejno& post%powania stosowana jest podczas projektowania wi%kszo&ci pro"ramw! )hocia( biblioteka zawiera wiele ksi(ek, wszystkie one maj pewien zestaw wsplnych cech! Nolejne u&ci&lenie b%dzie pole"ao na opisaniu pojedynczej ksi(ki Jrzecz jasna, nale(y pomin in*ormacje majce mae znaczenie dla u(ytkownika, jak np! liczba stronL! ,o przyjrzeniu si% li&cie (ycze4 mo(na stwierdzi , (e w skad opisu pojedynczej ksi(ki powinny wchodzi nast%pujce in*ormacje6 - tytu Jci" znakwLO - nazwisko autora Jci" znakwLO - nazwisko osoby, ktra ksi(k% wypo(yczya Jci" znakwLO - licznik wypo(ycze4 Jliczba cakowitaL! 0 tu pierwszy problem6 jak reprezentuje si% w pro"ramie ci" znakw2 8 +urbo ,ascalu su(y do te"o celu specjalny typ +aMcuc$owy" z an"ielska strin"! 1mienna typu a4cuchowe"o mo(e przechowywa ci" o du"o&ci do 2MM znakw i deklarowana jest np! tak6
t3tu0 : string;

/by nie narusza ci"o&ci te"o rozdziau, dokadniejszy opis wa&ciwo&ci i mo(liwo&ci typu a4cuchowe"o przeniesiemy nieco dalej Jzobacz rozdzia XaMcuc$y na stronie 11GL, na razie za& wrcimy do biblioteki! Skoro mamy ju( do dyspozycji wa&ciwe typy, mo(emy zadeklarowa w pro"ramie zmienne opisujce ksi(k%6
ear t3tu0, autor, w3po/3c/a:ac3 : string; l+w3po/3c/en : integer;

'iestety, biblioteka zawiera znacznie wi%cej ni( jedn ksi(k%! 9zecz jasna, deklarowanie dla ka(dej pozycji oddzielnych zmiennych typu +ytull, +ytul2!!! jest cakowicie bez sensu, wyma"aoby bowiem utworzenia o"romnej liczby zmiennych Jpomijajc *akt, (e nie zawsze wiadomo, z iloma obiektami b%dziemy mieli do czynieniaL! ,roblem ten zosta jednak ju( dawno rozwizany6 aby mc obsu(y w pro"ramie du( liczb% jednakowych Jpod wz"l%dem strukturyL obiektw, musisz wykorzysta tablice +ak oto przechodzimy do bardzo wa(ne"o za"adnienia, jakim s typy strukturalne!

Strona numer F8 z 82

T&p& struktura*ne5 cz&*i jak przec6owa7 wi!cej dan&c6


1 punktu widzenia u(ytkownika tablica jest po prostu ci"iem jednolitych #szu*ladek$ przechowujcych Jto wa(neL dane te"o same"o typu! Na(da szu*ladka Jktr w naszym przypadku mo(na z "rubsza uto(samia z kart katalo"owL jest identy*ikowana numerem I tzw! indeksem I ktry musi by typu porzdkowe"o Jtrudno bowiem wyobrazi sobie element tablicy o numerze ptoraL! +ablice deklarowane s za pomoc sowa kluczowe"o array JtablicaL, za& skadnia deklaracji jest nast%pujca6
na/wa+ta.lic3 : arra3[inde,s+doln3..inde,s+g<rn3] of t3p;

8 nawiasach kwadratowych Jczy nie kojarz )i si% z tablic2L musisz umie&ci dwie stae okre&lajce najmniejszy i najwi%kszy dopuszczalny indeks tablicy! ,ami%taj, (e warto&ci u(yte w deklaracji musz by znane w momencie kompilacji pro"ramu Jnajcz%&ciej podawane s jawnie, ewentualnie w postaci prostych wyra(e4 dopuszczalnych w de*inicjach staychL! ,ascal wyma"a okre&lenia rozmiaru tablicy w chwili kompilacji i nie dopuszcza u(ycia tzw! tablic dynamicznych Jo rozmiarze okre&lanym podczas wykonaniaL znanych z Basica! 3ba indeksy mo" mie dowolne warto&ci, ale musz by te"o same"o typu porzdkowe"o, a "rny indeks nie mo(e by mniejszy od dolne"o! 1wykle tablice indeksuje si% od l, jak np! tablic% autorw ksi(ek6
Outor/3 : arra3[l..$'''] of string["'];

ale cakowicie le"alne s rwnie( deklaracje6


Aar Xinus3 : arra3[L.."!#] of real; Ldch30,a : arra3[7$'..$'] of real;

'ie do& te"o, tablice wcale nie musz by indeksowane liczbami! Je&li np! chcesz zliczy cz%sto& wyst%powania w tek&cie poszcze"lnych znakw al*abetu, mo(esz u(y e*ektownej konstrukcji 3ar
?iczniki 6 arrayXQaQ!!QzQY o* wordO

Na(dy z elementw takiej tablicy jest licznikiem o pojemno&ci okoo AM tysi%cy #impulsw$, adresowanym za pomoc odpowiednie"o znaku al*abetu! /by odwoa si% do elementu tablicy o danym numerze, musisz u(y skadni
nazwabtablicyXindeks Y

"dzie indeks jest numerem (dane"o elementu Jsta lub zmienn typu porzdkowe"o o warto&ci zawartej pomi%dzy dolnym a "rnym zadeklarowanym indeksemL! /by zatem wy&wietli trzeci z kolei pozycj% tablicy autorw, wystarczy u(y instrukcji
writelnJ/utorzyXCYLO

za& instrukcja

Outor/3[!] := 4(rnest [emingwa34;

ustali nazwisko autora pitej ksi(ki w katalo"u! 8 przypadku naszej tablicy licznikw znakw odwoania b%d wy"lday nast%pujco6
Mnc (Pic/ni,i[/na,]); - /wiK,s/3 lic/ni, dla /na,u o l 1 writeln(Pic/ni,i[4a4]; - w35wietli warto561- lic/ni,a /na,<w 4a4 1

,rba u(ycia indeksu le(ce"o poza zadeklarowanym zakresem ko4czy si% na o" b%dem wykonania, o ile opcja kontroli zakresw )Options4Compiler4Range chec ing& nie zostaa wyczona (uwaga4 domy&lnie opcja ta jest wyczona7L! 8 tym ostatnim przypadku odczyt z tablicy zwrci bezsensown warto& , za& zapis mo(e mie skutki opakane Jz zawieszeniem komputera wcznieL, "dy( warto& zostanie wstawiona w miejsce przeznaczone na co& zupenie inne"o! 5wa "wne obszary zastosowania tablic to bazy danych Jczyli pro"ramy su(ce do przechowywania i zarzdzania in*ormacj opisujc rzeczywiste obiekty, np! ksi(ki w bibliotece, towary w hurtowni itp!L oraz opro"ramowanie in(ynierskie i naukowe, wykorzystujce tzw! wektory i macierze, czyli liniowe i prostoktne tablice liczb! Jak zapisa wektor Jczyli liniow lub jednowymiarow tablic% liczbL, ju( wiesz! ,rzykadowemu wektorowi zo(onemu z dziesi%ciu liczb rzeczywistych Y&, &ZZZ &,6 [ b%dzie odpowiadaa tablica 8ektor 6 arrayX1!!1GY o* real za& dla prostoktnej tablicy JmacierzyL o wymiarach m na
n<

Strona numer F@ z 82

k mK11 K12 K1C !!! K1n mK21 K22 K2C !!! K2n mKC1 KC2 KCC !!! KCn m!!! !!! !!! !!! mKm1 Km2 KmC !!! Kmn n u(yjemy deklaracji
.acierz 6 arrayXl!!.,

l m m m m m o
1!!'Y o* real

Jak wida , tworzenie tablic odpowiadajcych dwuD i wi%cejwymiarowym strukturom danych nie stanowi w ,ascalu trudne"o zadania! 3"lna skadnia deklaracji tablicy wielowymiarowej wy"lda tak6
na/wa+ta.lic3 : arra3[/a,res+l, /a,res+=, /a,res+n] of t3p

"dzie zakresbk opisuje zakres indeksw dla kAtego wymiaru i ma *orm% pocztek, !koniec! 5la tablic dwuwymiarowych pierwszy indeks oznacza numer wiersza, za& dru"i I numer kolumny Jw pami%ci komputera dane przechowywane s wierszami uo(onymi jeden za dru"imL! )hocia( ,ascal nie narzuca o"raniczenia na liczb% wymiarw tablicy Jjedynymi o"raniczeniami s czny rozmiar elementw, nie mo"cy przekracza AMM2G bajtw, oraz zakres indeksw, nie mo"cy wykracza poza zakres liczb cakowitychL, tablic wi%cej ni( dwuwymiarowych u(ywa si% bardzo rzadko! +ablice dwuwymiarowe stosowane s przede wszystkim w pro"ramach obliczeniowych Jrealizujcych obliczenia tzw! rachunku macierzowe"oL i nie b%dziemy si% tu nimi szcze"owo zajmowa ! /by jednak nie poprzestawa na samym opisie, zademonstrujmy krtki przykad6 oto pro"ram pozwalajcy na wprowadzenie z klawiatury warto&ci elementw macierzy o wymiarach C na C i wy&wietlajcy najwi%kszy wprowadzony element oraz sum% wszystkich elementw le(cych na przektnej i powy(ej niej!
program Nacier/"E"; - program demonstru:e elementarne o.lic/enia macier/owe 1 var t : arra3[$..", $.."] of real; - macier/ "E" 1 maE, sum : real; - t3mc/asowe ma,simum i suma element<w 1 i, : : integer; - lic/ni,i wiers/3 i ,olumn 1 begin - wc/3tanie /awarto5ci macier/3 1 for i := l to " do for : := l to " do begin write(4*oda: element macier/3 E[4,i,4,4,:,4]: 4); readln(t[i,:]); end; - w3s/u,anie ma,s3malnego elementu 1 maE := 7$el=; - pamiKta: o inic:ali/ac:i ma,simum 1 for i := l to " do for : := l to " do if t [i !" > max then maE := t [i,:]; - o.lic/enie sum3 element<w na i nad pr/e,DtnD 1 sum := '.'; - pamiKta: o w3/erowDniu sum3 pr/ed o.lic/aniem 1 for i := l to " do for : := i to " do sum := sum)t[i,:]; writeln(4Ja:wie,s/3 element: 4, maE: :"); writeln(4Xuma elementow na i nad pr/e,atna: 4, sum: :"); readln; end.

Jak nietrudno si% domy&li , obsu"a tablic Jnie tylko dwuwymiarowychL wyma"a intensywne"o u(ycia p%tli *or Jna o" #przechodzimy$ kolejno po elementach wiersza lub kolumny, znajc numer pierwsze"o i ostatnie"o elementuL! ,owy(szy pro"ram demonstruje dwie typowe operacje na tablicach6 - wyszukanie maksymalne"o Jminimalne"oL elementu, pole"ajce na sprawdzaniu, czy kolejny element nie jest wi%kszy JmniejszyL od aktualnej warto&ci maksimum JminimumL, a je&li tak I przyj%cie je"o warto&ci jako nowe"o maksimum JminimumLO - obliczenie warto&ci sumy elementw na i ponad przektn Jw zbli(ony sposb oblicza si% sum% elementw pod przektn, sum% wszystkich elementw dodatnich itp!L! 1auwa(, (e w trakcie oblicze4 nale(y przeszukiwa zarwno wiersze, jak i kolumny, co realizowane jest za pomoc dwch za"nie(d(onych Jumieszczonych jedna w dru"iejL p%tli *or! 1a"nie(d(ajc p%tle musisz pami%ta , by u(yway one r)ny$. li$znikw5 w przeciwnym przypadku bowiem wewn%trzna p%tla b%dzie w niezamierzony sposb mody*ikowaa licznik p%tli zewn%trznej Jbd ten jest tyle( pospolity, co nieprzyjemnyL! 1auwa( ponadto, (e wewn%trzna p%tla rozpoczyna si% nie od jedynki, lecz od bie(ce"o indeksu p%tli

Strona numer MG z 82

zewn%trznej, dzi%ki czemu od razu omijamy elementy le(ce pod przektn Jmajce numer wiersza wi%kszy od numeru kolumnyL! .ajc do dyspozycji tablice mo(emy ju( zaprojektowa struktury danych opisujce zawarto& katalo"u biblioteczne"o! 5la uproszczenia za(my, (e wszystkie dane b%dziemy przechowywali w pami%ci komputera! ,oniewa( ma ona o"raniczon pojemno& , warto od razu przyj pewne zao(enia co do maksymalnej pojemno&ci katalo"u i poszcze"lnych *ra"mentw opisu ksi(ki! 5o& oczywistym podej&ciem b%dzie o"raniczenie du"o&ci pl przeznaczonych na tytu i nazwisko autora oraz osoby wypo(yczajcej! 'iech opis pojedynczej ksi(ki wy"lda tak6
tytu6 strin"XCGY O

- nazwisko autora6 strin" X2MYO - nazwisko wypo(yczajce"o6 strin" X2MYO - licznik wypo(ycze46 wor d! 8szystkie pola cznie zajmuj 8M bajtw, tak wi%c zakadajc, (e mamy do dyspozycji A2 kB Jco& trzeba jeszcze zostawi na pomocnicze zmienneL jeste&my w stanie opisa okoo EMG pozycji! #kd jednak wzi)+y si) te 3- kilobajty" przecie w komputerze pami)ci jest znacznie wi)cej I m"by& zapyta ! +o prawda, jednak aby si% do niej dosta , potrzebne s nieco bardziej wymy&lne rozwizania, ktre zostan omwione w rozdziale pt! Bi)cej pami)ciU Jstrona 11FL! 8y"ldaoby na to, (e mo(na zakasa r%kawy i wzi si% do roboty, czyli zadeklarowa nast%pujce tablice6 ear
R3tu0 : array[$..7!'] of string["']; Outor : arra3[l..7!'] of string[=!]; Q3po;3c/a:Dc3 : arra3[l..7!'] of string[=!]; Pic/ni, : arra3[l..7!'] of word;

1auwa( jednak, (e opis pojedynczej ksi(ki rozproszony jest w czterech r(nych tablicach! )o prawda poszcze"lne elementy opisu s #zjednoczone$ wsplnym numerem JindeksemL, jednak z punktu widzenia lo"iki rozwizanie takie jest niespjne i mao ele"anckie Jchocia( da si% wykorzysta L! 9ozproszenie danych opisujcych pojedynczy obiekt w *izycznie odr%bnych strukturach danych ma te( t% wad%, (e atwiej jest przeoczy jaki& *ra"ment in*ormacji lub pomyli numeracj%! Jak temu zaradzi 2 ,rzyjrzyjmy si% naszej karcie katalo"owej6

+ytu /utor 8ypo(yczajcy ?icznik

>mi"ranci .rozek Sawomir 'owak Nrzyszto* E8

8szystkie dane opisujce *izyczny obiekt s tu poczone w jedn lo"icznie spjn cao& , stanowic znacznie bardziej przekonujcy i sensowny opis, ani(eli poprzednio JwyobraH sobie, jak ucieszyby si% bibliotekarz, "dyby kazano mu posu"iwa si% odr%bnymi katalo"ami zawierajcymi tytuy, nazwiska itd!L! ,ascalowym odpowiednikiem takie"o opisu jest rekord 3 ile tablice pozwalay na pomieszczenie w jednej strukturze wielu danych te"o same"o typu, rekordy umo(liwiaj zamkni%cie w cao& danych r(nych typw, nie pozwalajc z kolei na indeksowany do nich dost%p! Skadnia deklaracji zmiennej typu rekordowe"o jest nast%pujca6
na/wa : record pole@l : t3p@$; pole7= : t3p@=; pole7n : t3p7n; end;

"dzie pola s po prostu nazwami elementw JplL rekordu zawierajcych poszcze"lne dane, za& typy okre&laj ich typ! ,rzykadowy rekord odpowiadajcy naszej karcie katalo"owej nale(aoby zadeklarowa tak6
Aar CsiD;,a : record R3tu0 : string["']; Outor : string[=!]; Q3po/3c/a:ac3 : string[=!]; Pic/ni, : word end;

9zecz jasna, powy(sza deklaracja nie rozwizuje nasze"o problemu, pozwala bowiem na opisanie tylko jednej ksi(ki! 5lacze"o jednak nie zor"anizowa rekordw w tablice2 3to przykad6
ear Catalog : arra3[l..7!'] of record R3tu0 : string["']; Outor : string[=!];

Strona numer M1 z 82

Q3po/3c/a:ac3 : string[=!]; Pic/ni, : word end;

,rzedstawiona powy(ej struktura danych jest tablic rekordw i stanowi Jnie uwz"l%dniajc kilku drobnych poprawekL ostateczn *orm%, jak b%dziemy si% posu"iwa w naszym pro"ramie! ,odobnie, jak szu*lada katalo"u zawiera wiele jednakowych kart opisujcych pojedyncze ksi(ki, tak i nasza tablica zawiera wiele jednakowych rekordw stanowicych elektroniczn *orm% takie"o opisu! +ablice rekordw stanowi jedn z cz%&ciej wykorzystywanych struktur danych, umo(liwiajcych e*ektywne tworzenie baz danych i przechowywanie in*ormacji opisujcej wiele jednakowych obiektw! Jak zapami%tywa i odczytywa in*ormacj% z rekordu2 1auwa(, (e ka(dy element opisu identy*ikowany jest dwiema nazwami6 nazw same"o rekordu JNatalo"X! ! YL oraz odpowiednie"o pola Jnp! +ytuL! /by odwoa si% do konkretne"o pola rekordu, musisz poda obydwie nazwy rozdzielajc je kropk6
na/wa7re,ordu.na/wa7pola

)hcc wi%c wstawi do rekordu numer FM nazwisko autora ksi(ki, wykorzystamy instrukcj%
Catalog[&!].Outor := 4Nro/e, X0awomir4;

za& instrukcja

writeln(Catalog[=#].Q3po;3c/a:Dc3);

poin*ormuje nas, w czyim posiadaniu znajduje si% obecnie ksi(ka opisana rekordem numer 2@ ! 8 przypadku wykonywania kilku operacji na polach te"o same"o rekordu u(ywanie za ka(dym razem notacji #z kropk$ jest nieco uci(liwe! ,ascal umo(liwia uproszczenie odwoa4 do pl rekordu przez wykorzystanie tzw! instrukcji wicej with6
with Catalog[$='] do begin R3tu0 := 4*aragraf ==4; Outor := 4[eller Voseph4; Q3po/3c/a:ac3 := 4Sossarian Vohn4; Pic/ni, := $=!&; end;

0nstrukcja wi(ca wydatnie upraszcza zadania podobne do pokazane"o wy(ej, musisz jednak pami%ta o uj%ciu wszystkich instrukcji operujcych na polach rekordu w instrukcj% zo(on be"in end Jw przeciwnym przypadku operacja b%dzie dotyczya tylko pierwsze"o pola, a prba skompilowania kolejnych instrukcji najpewniej sko4czy si% b%demL! 8 zamian za to mo(esz wykorzysta instrukcj% with do operowania na kilku rekordach naraz! Je&li np! zadeklarowae& nast%pujce struktury6
9aneClienta : arra3[l..$'''] of record na/wis,o : string["']; - na/wis,o ,lienta 1 XumaTa,upow : real; - suma /a,up<w w dan3m ro,u 1 MdClienta : integer; - ident3fi,ator ,lienta 1 MdRowaru : integer; - ident3fi,ator towaru 1

Xaldo : real; - .ie;Dce saldo ,lienta 1 end; Ta,up : arra3[l..$'''] of record Jale/nosc : real; - nale;no56 /a towar 1 end;

to operac:a

for i := l to Pic/.aTa,upow do with 9aneClienta[!'], Ta,up[i] do if MdClienta = !' then begin XumaTa,upow := XumaTa,upow ) Jale/nosc; Xaldo := Xaldo \ Jale/nosc; end;

spowoduje przeszukanie tablicy zakupw i ustalenie sumy, jak klient numer MG zapaci za wszystkie swoje zakupy oraz pomniejszenie je"o salda o t% sum%! 1auwa(, (e opis klienta nie zawiera pola identy*ikatora, ktry zastpiony zosta indeksem w tablicy rekordw! /by skopiowa wszystkie pola rekordu do inne"o rekordu te"o same"o typu, nie musisz w o"le u(ywa odwoa4 z kropk ani instrukcji with! +urbo ,ascal umo(liwia cao&ciowe kopiowanie rekordw, np!
9aneClienta[$"=] := 9aneClienta[l];

'iestety, operacji te"o typu nie da si% u(y do wprowadzenia zawarto&ci rekordu z klawiatury ani wyprowadzenia jej na ekran! 3peracje te nale(y wykonywa #pole po polu$ Ju(yteczna jest tu instrukcja withL, jak w poni(szym przykadzie6
writeln(4*o/3c:a w ,atalogu: # i); with Catalog[i] do begin writeln(4R3tu0: 4, R3tu0); - w3pis/ /awarto56 1 - odpowiednich p<l 1 writeln(4Outor: 4, Outor); writeln(4Q3po/3c/a:ac3: 4, Q3po/3c/a:ac3); end;

8 analo"iczny sposb mo(na wprowadza dane do rekordu! 8 ten sposb przedstawili&my dwa najpopularniejsze typy strukturalne dost%pne w ,ascalu i zaprojektowali&my podstawow struktur% su(c do przechowywania in*ormacji w naszym pro"ramie! 8 kolejnych rozdziaach zajmiemy si% metodami przetwarzania in*ormacji Jczyli al"orytmami i ich realizacj w postaci procedur i

Strona numer M2 z 82

*unkcjiL oraz wynikajcymi z tych za"adnie4 problemami!

@apami!taj
5o przechowywania wi%kszych ilo&ci danych su( typy strukturalne! 5wa najwa(niejsze typy strukturalne w ,ascalu to tablice i rekordy! +ablice pozwalaj na "rupowanie danych te"o same"o typu! 1awarte w tablicy dane s dost%pne poprzez indeksy! +ablice mo" by jednoD lub wielowymiarowe! 1akres indeksw tablicy jest dowolny, ale nie mo(e przekracza zakresu dozwolone"o dla liczb cakowitych! 5o obsu"i tablic wykorzystuje si% cz%sto p%tle *or! 9ekordy "rupuj dane r(nych typw! 1awarte w rekordzie dane s dost%pne poprzez nazwy pl!

Strona numer MC z 82

Struktura programu
8iemy ju(, w jakiej *ormie b%dziemy przechowywa in*ormacj%O kolejnym krokiem jest ustalenie sposobu jej przetwarzania odpowiednie"o do u(ywanych w pro"ramie struktur danych! ,rzede wszystkim musimy zatem ustali , jakie operacje na danych pro"ram powinien wykonywa , a nast%pnie zaprojektowa odpowiadajce im procedury lub *unkcje 7jako (e pro"ramujemy porzdnie, czyli strukturalnie I wykorzystujc procedury i *unkcjeL! ,o skonsultowaniu si% z list (ycze4 Jzobacz strona EML stwierdzamy, (e nasz pro"ram powinien umo(liwia 6 - wprowadzenie zawarto&ci wybrane"o rekordu z klawiaturyO - wyprowadzenie zawarto&ci wybrane"o rekordu na ekranO - zbadanie i zmian% zawarto&ci pola wypo(yczajcy wybrane"o rekorduO - wyszukanie rekordu zawierajce"o zadany ci" znakw w polu +ytuO - posortowanie tablicy rekordw wedu" zadane"o kryterium Jtytu lub nazwisko autoraLO - wyszukanie rekordu o najmniejszej i najwi%kszej zawarto&ci pola ?icznik! ,owy(sza lista mo(e zosta bezpo&rednio przetumaczona na zestaw podstawowych procedur tworzcych pro"ram Jrzecz jasna, trzeba b%dzie jeszcze dorzuci kilka procedur pomocniczych, no i oczywi&cie cz%& operacyjnL! 1 *ormalne"o punktu widzenia wyma"any jest jeszcze schemat blokowy lub przynajmniej sowny zapis al"orytmu, aby jednak unikn przerostu *ormy nad tre&ci, o"raniczymy si% do o"lne"o schematu dziaania pro"ramu6 , wywietl menu dost)pnyc$ operacji - w zalenoci od wybranej opcji< wprowad0 nowy rekord 7dodanie ksiki do katalogu!" lub zmieM zawarto pola wypoyczajcy 7wypoyczenie ksiki!" lub wyszukaj rekord zawierajcy dany tytu+ 7wyszukiwanie ksiki!" lub wywietl wszystkie rekordy uporzdkowane wed+ug tytu+w lub nazwisk autorw" lub zakoMcz prac) programu . wr do punktu 7,! Jak wida , cz%& operacyjna sprowadza si% w zasadzie do wywoywania odpowiednich procedur stosownie do wybranej przez u(ytkownika *unkcji Jdoskonae miejsce dla instrukcji caseL! ,oniewa( przedstawianie schematw poszcze"lnych procedur zaj%oby zbyt du(o miejsca, poprzestaniemy na zaprezentowaniu ich zapisu w ,ascalu! .etoda, ktr wykorzystamy do tworzenia nasze"o pro"ramu, jest typowym przykadem projektowania wst%pujce"o6 najpierw utworzymy zestaw odpowiednich procedur Jrealizujcych poszcze"lne zadania podrz%dneL, a nast%pnie powi(emy je w cao& , czyli dziaajcy pro"ram! Ganim jednak do te"o dojdzie, zastanwmy si% przez chwil% nad przekazywaniem danych do i z odpowiednich procedur i *unkcji! 8 my&l dobrej praktyki nie b%dziemy do te"o celu wykorzystywa e*ektw ubocznych, lecz stosownie zaprojektowane listy parametrw! 9ozwa(my jako przykad procedur% wprowadzania zawarto&ci rekordu z klawiatury! ,owinna ona przyjmowa jako ar"ument #pusty$ rekord i zwraca ten(e rekord wypeniony wpisanymi przez u(ytkownika danymi! .usimy wi%c wykorzysta mechanizm przekazywania parametru przez nazw%! /le jak zadeklarowa sam parametr2 'a"wek w postaci6
procedurK Qprowad/(Aar r : record R3tu0 : string["']; Outor : string[=!]; Q3po/3c/a:ac3 : string[=!]; Pic/ni, : word);

wy"lda co najmniej podejrzanie! 0stotnie6 prba skompilowania podobnej konstrukcji sko4czy si% wy&wietleniem komunikatu +ype identi* ier eKpected Jspodziewany identy*ikator typuL! 9ozwizaniem te"o problemu zajmiemy si% w nast%pnym rozdziale! 1najdzie si% w nim rwnie( kilka sw o tak zwanych staych symbolicznych!

Strona numer MF z 82

T&p& i sta'e
1ajmiemy si% obecnie dwoma spokrewnionymi ze sob za"adnieniami6 de*iniowaniem wasnych typw oraz staymi symbolicznymi! :wny obszar zastosowa4 staych i typw zwizany jest z wykorzystaniem typw strukturalnych Jdlate"o mwimy o nich wa&nie terazLO wykorzystanie de*inicji typw pozwala na omini%cie pewnych o"ranicze4 w przekazywaniu parametrw Jzobacz koniec poprzednie"o rozdziauL! ,oza tym u(ywanie wa&ciwie dobranych de*inicji typw i staych polepsza czytelno& i estetyk% pro"ramu oraz zmniejsza ryzyko b%dw! ,okazany na ko4cu poprzednie"o rozdziau przykad ilustruje niezr%czn prb% przekazania do procedury parametru typu strukturalne"o! 'iestety, nasz zapis stanowi prb% przemycenia opisu Jde*inicjiL typu w miejscu do te"o nie przeznaczonym6 na li&cie parametrw *ormalnych procedury lub *unkcji mo" znajdowa si% wycznie identy*ikatory parametrw i odpowiadajce im identy'ikatory Jnie de*inicje7L typw! 5opki posu"iwali&my si% parametrami typu proste"o, problem nie istnia, "dy( na li&cie parametrw umieszczae& po prostu nazw% odpowiednie"o typu! 8 przypadku typw strukturalnych sprawa si% komplikuje! 'ie do& , (e na li&cie parametrw nie wolno umie&ci de*inicji typu Jjak wi%c zde*iniowa parametr strukturalny2L, to jeszcze identycznie wy"ldajce deklaracje tablic
3ar

tl : array[$..$''] of real; t= : arra3[$..$''] of real;

wcale nie tworz obiektw identyczne"o typu I ka(da z nich interpretowana jest jako de*inicja nowe"o typu, co utrudnia niektre operacje Jnie mo(na np! dokona przypisania caej tablicy t2 do t1L! 'a dobitk% okazuje si%, (e z"odno& typw wyma"ana jest rwnie( w przypadku przekazywania parametrw Jco byo zreszt atwe do przewidzeniaL! 8yj&ciem z te"o impasu jest zde*iniowanie identy'ikatora typu" czyli nazwy b%dcej synonimem dane"o typu strukturalne"o! 0denty*ikator taki wykorzystamy nast%pnie do deklarowania zmiennych i parametrw dokadnie tak samo, jak czyniliby&my to z identy*ikatorem typu proste"o! /by zde*iniowa identy*ikator typu, musisz u(y sowa kluczowe"o type JtypL w nast%pujcej konstrukcji6
type nazwaDtypu P opisDtypu

Jzwr uwa"%, (e w de*inicji typu wykorzystuje si% znak rwno&ci, a nie dwukropekL! 'azwaDtypu okre&la de*iniowany identy*ikator Ji podle"a wszystkim re"uom dotyczcym identy*ikatorwL, za& opisDtypu jest takim samym opisem, jaki stosowany jest w deklaracjach zmiennych! 9(nica pole"a tylko na tym, (e w przypadku deklaracji zmiennej kompilator tworzy odpowiedni struktur% danych i rezerwuje dla niej miejsce w pami%ci, natomiast zde*iniowanie typu powoduje jedynie utworzenie szablonu Jnie jest tworzony (aden *izyczny obiektL, ktry b%dzie wykorzystywany w deklaracjach Jdopiero wtedy kompilator b%dzie rezerwowa miejsce na daneL! ,rzykadowa de*inicja typu rekordowe"o opisujce"o ksi(k% Ji deklaracja odpowiedniej tablicy rekordwL b%dzie wi%c miaa posta
type

CsiD;,a = record - ta, samo, :a, w de,larac:i /mienne: 1 R3tu0 : string["']; Outor : string[=!]; Q3po/3c/a:ac3 : string[=!]; Pic/ni, : word); end; var Catalog : arra3[l..7!'] of Csia/,a;

Ju( na pierwszy rzut oka wy"lda to adniej JNatalo" zawiera Nsi(ki, a nie jakie& rekordy, ktrych przeznaczenia nale(y si% dopiero domy&la L, no a poza tym mo(liwe jest wreszcie zadeklarowanie odpowiednich parametrw6 procedure Qprowad/$var r : Csia/,a); 5e*iniowanie nowych identy*ikatorw typw ma zastosowanie "wnie w pro"ramach posu"ujcych si% strukturalnymi reprezentacjami danych, chocia( mo(liwe jest rwnie( de*iniowanie nowych typw prostych Ja nawet przede*iniowywanie typw standardowychL! 3to przykad6
type

*loat P eKtendedO c real je&li nie masz koprocesora d

,owy(sza de*inicja tworzy nowy typ zmiennoprzecinkowy *loat, to(samy z typem eKtended Jdajcym najwi%ksz mo(liw precyzj% i zakres warto&ciL! Je&li pro"ram przeznaczony jest dla komputera pozbawione"o koprocesora Ji nie ma emulowa te"o ostatnie"oL, wystarczy w miejsce typu eKtended wpisa real! 5eklarujc wszystkie liczby rzeczywiste w pro"ramie jako *loat uzyskasz w ten sposb mo(liwo& atwej adaptacji pro"ramu do warunkw sprz%towych! 1auwa(, (e w deklaracji zmiennej Natalo" wymiar tablicy okre&lony jest jawnie liczb EMG Jwynika ona z podzielenia wielko&ci dost%pnej pami%ci przez wielko& rekorduL! Jest do& prawdopodobne, (e do warto&ci tej b%dziesz si% w pro"ramie odwoywa jeszcze kilkakrotnie Jcho by podczas przeszukiwania katalo"u lub usuwania je"o elementwL! 8yobraH sobie teraz, (e postanowie& doda do

Strona numer MM z 82

rekordu krtki opis ksi(ki w postaci a4cucha 2G znakw! 8pynie to rzecz jasna na wielko& rekordu, a zatem i na dopuszczaln wielko& tablicy, ktra zmaleje teraz do okoo AGG pozycji! ,o dokonaniu zmiany b%dziesz musia wyszuka w pro"ramie wszystkie miejsca, w ktrych wyst%powaa liczba EMG i zastpi j liczb AGG I je&li o ktrym& zapomnisz, konsekwencje mo" by niezbyt przyjemne Jdo zawieszenia komputera wcznieL! 5ru"i problem zwizany z u(yciem liczby EMG Jlub AGGL pojawia si% w kilka miesi%cy po napisaniu pro"ramu i sprowadza si% do *aktu, (e zwykle trudno sobie przypomnie , co to za EMG i dlacze"o akurat tyle! >le"anckim sposobem na poradzenie sobie z opisanym problemem s sta+e symboliczne ,odobnie jak de*inicja typu pozwala na utworzenie identy*ikatora b%dce"o synonimem de*inicji typu, tak de*inicja staej symbolicznej umo(liwia utworzenie identy*ikatora b%dce"o synonimem okre&lonej warto&ci staej Jniekoniecznie liczbowejL! 5o de*iniowania staych u(ywane jest sowo kluczowe const Jan"! constant I staaL, za& skadnia de*inicji wy"lda nast%pujco6
$onst

nawa7sta0e: = warto56

Na(de wystpienie nazwyDstae j w pro"ramie zostanie podczas kompilacji zastpione warto&ci! ,odobnie jak w przypadku typw, zde*iniowanie staej nie powoduje zarezerwowania miejsca w pami%ciO w zwizku z tym musisz pami%ta , (e staa symboliczna nie jest lDwarto&ci i nie mo(e si% w pro"ramie znaleH po lewej stronie operatora przypisania ani w miejscu parametru przekazywane"o przez nazw% Jpomijajc oczywist herezj%, jak jest prba zmiany warto&ci staejL! 5e*inicja staej okre&lajcej maksymaln pojemno& tablicy Ji stosownie zmody*ikowana deklaracja tablicy rekordwL b%dzie wi%c wy"ldaa nast%pujco6 const
*LV(NJLXU+COROPL]^ = 7!'; Aar Catalog : arra3[l..*LV(NJLXU+COROPL]^] of Csia/,a;

1auwa(, (e identy*ikator staej zapisany jest du(ymi literami Jjest to istotne tylko dla pro"ramisty I +urbo ,ascal nie odr(nia du(ych liter od maychL! Nonwencja ta I pozwalajca atwo odr(ni #9AX% od zmiennyc$" jest do& powszechnie stosowana przez pro"ramistw i warto j sobie przyswoi ! Je&li nie chce )i si% przelicza warto&ci naszej staej po ka(dej zmianie struktury rekordu Jcze"o z dru"iej strony nie powiniene& robi zbyt cz%sto, bo dowodzi to ze"o zaprojektowania pro"ramuL, mo(esz u(y nast%pujcej de*inicji6
$onst

NOZ+*ONM(U = %"'''; - ma,s3malna wiel,o56 ,atalogu 1 - w .a:tach 1 *LV(NJLXU+COROPL]^ = NOZ+*ONM(U diA Xi/eLf(Csia/,a);

Jak nietrudno si% domy&li , raz zde*iniowanej staej mo(na u(y w kolejnych de*inicjach! )o jednak znacznie ciekawsze, staa mo(e zosta zde*iniowana za pomoc wyra(enia zawierajce"o inne stae i niektre operatory Jwyra(enie musi da si% obliczy w trakcie kompilacji, nie mo(e wi%c zawiera identy*ikatorw zmiennych i *unkcji bibliotecznychO dokadniejsze in*ormacje na ten temat znajdziesz w systemie pomocyL! 8 naszym przypadku warto& staej zde*iniowana jest jako wynik JcakowityL podzielenia wielko&ci dost%pnej pami%ci Jzde*iniowanej inn staL przez rozmiar rekordu opisujce"o ksi(k%! 8 tym momencie mo(esz przesta przejmowa si% jakimikolwiek liczbami! #tosowanie sta+yc$ symbolicznyc$ i de'inicji typw stanowi jedn z podstaw dobrej praktyki programowania :dpowiednio uyte" mec$anizmy te znacznie poprawiaj czytelno programu i zmniejszaj jego podatno na b+)dy w trakcie pisania i poprawiania )o prawda przed chwil powiedziano, (e staa zde*iniowana sowem kluczowym const nie jest lDwarto&ci, okazuje si% jednak, (e sowa te"o mo(na u(y rwnie( do de*iniowania!!! zmiennych! )hodzi tu o tzw! zmienne z wartoci pocztkow 7zmienne prede'iniowane" an"! typed constani! 1mienna taka jest normaln zmienn I tyle, (e uzyskuje warto& ju( w momencie deklaracji Jde*inicjiL! Skadnia de*inicji zmiennej z warto&ci pocztkow jest nast%pujca6
$onst

na/wa7/mienne: : t3p = warto567poc/Dt,owa


$onst

1mienne prede*iniowane pozwalaj na atwe inicjalizowanie danych w pro"ramie! 3to przykady6


Pic/.a+,sia/e, : word ='; -na poc/Dt,u 1 - ,atalog :est pust3 1 Pic/ni,i : arra3[l..&] of word = (L, L, L, ') ; - inic:ali/ac:a ta.lic3 1

8iadomo&ci przedstawione w tym rozdziale powinny pozwoli nam na napisanie podstawowej wersji nasze"o pro"ramu! +ym jednak zajmiemy si% ju( w nast%pnym rozdziale!

@apami!taj
5eklarowanie parametrw typu strukturalne"o mo(liwe jest wycznie przy u(yciu identy*ikatorw typw! 5o zde*iniowania identy*ikatora typu u(ywane jest sowo kluczowe type! 5e*iniowanie staych symbolicznych, czyli identy*ikatorw przechowujcych warto&ci stae umo(liwia sowo kluczowe const!

Strona numer MA z 82

Sowo const pozwala rwnie( na deklarowanie zmiennych poczone z nadawaniem im warto&ci pocztkowych! S(ywanie de*inicji typw i staych symbolicznych poprawia czytelno& pro"ramu, je"o uniwersalno& i odporno& na b%dy!

Strona numer ME z 82

:o dzie'a;
,o tym nieco przydu"im teoretyzowaniu wi%kszo& )zytelnikw zapewne &wierzbi ju( r%ce, (eby wzi si% do pro"ramowania! 8 niniejszym rozdziale sprbujemy przedstawi podstawowe elementy skadowe nasze"o pro"ramu i powiza je w dziaajc cao& ! 1aczniemy od rzeczy podstawowych, czyli zde*iniowania struktur danych, na ktrych pro"ram b%dzie operowa!
program Bi.liote,a; - *rost3 program do o.s0ugi .i.liote,i 1 uses Urt; - modu0 o.s0ugu:Dc3 ,lawiaturK i monitor 1 type string"' = string["']; - potr/e.ne do pr/e,a/3wania 1 - parametr<w 1 string=! = string[=!]; - t3pu 0a?cuchowego do procedur 1 Csia/,a = record - re,ord opisu:Dc3 ,siD;,K 1 R3tu0 : string"'; Outor : string=!; Q3po/3c/a:ac3 : string=!; Pic/ni, : word; end; const NOZ+*ONM(U = %"'''; - ma,s3malna wiel,o56 ,atalogu 1 - w .a:tach 1 *LV(NJLsc = NOZ+*ONM(U diA Xi/eLf(Csia/,a); Aar Catalog : arra3[l..*o:emnosc] of Csia/,a; - w0a5ciw3 1 - ,atalog 1 P.*o/ : integer; - lic/.a po/3c:i w ,atalogu 1

,odstawowym warunkiem u(yteczno&ci katalo"u jest mo(liwo& wprowadzania do nie"o in*ormacji Jz klawiaturyL i wyprowadzania jej Jna ekranRdrukark%L! ,oniewa( podstawow jednostk or"anizacyjn katalo"u jest rekord, powinni&my zde*iniowa procedury pozwalajce na wprowadzenie i wyprowadzenie je"o zawarto&ci! 8 my&l te"o, co powiedzieli&my poprzednio, procedury te powinny operowa na parametrze odpowiednie"o typu rekordowe"o6
procedur Qprowad/9ane(Aar r : Csia/,a); - wprowad/a po:ed3nc/3 re,ord / ,lawiatur3 1 begin with r do - wprowadG pos/c/eg<lne pola re,ordu 1 begin write (4R3tul: 4); readln(R3tul); write(4Outor: 4); readln(Outor); write(4Q3po/3c/a:ac3: 4); readln(Q3po/3c/a:ac3); end; end; procedure Q3pis/9ane(r : Csia/,a); - w3prowad/a /awarto56 re,ordu na e,ran 1 begin with r do - w3prowadG pos/c/eg<lne pola re,ordu 1 begin write (4R3tul: 4); writeln(R3tul); write(4Outor: 4); writeln(Outor); if Q3po/3c/a:ac3 = 44 then - ni,t nie w3po;3c/30 1 writeln(4Csia/,a /na:du:e sie na polce.4) else - pole /awiera na/wis,o w3po;3c/a:Dcego 1 write(4Q3po/3c/a:ac3: 4); writeln(Q3po/3c/a:ac3); end; writeln; end;

.imochodem przyj%li&my konwencj%, w my&l ktrej ksi(ce nie wypo(yczonej odpowiada puste pole wypo(yczajcy Jco jest do& naturalneL! ,owy(sze de*inicje wykorzystamy do utworzenia kilku dodatkowych procedur pozwalajcych na wprowadzenie opisu nowej ksi(ki do katalo"u oraz wyprowadzenie caej zawarto&ci katalo"u na ekran Jco w przypadku wi%kszej liczby ksi(ek jest raczej mao sensowne, chyba (e zamiast ekranu u(yje si% drukarkiL! ,rzy okazji warto te( zde*iniowa procedur% pozwalajc na usuni%cie ksi(ki z katalo"u, co najpro&ciej zrobi przez przepisanie ostatnie"o elementu katalo"u w miejsce elementu usuwane"o!
procedur 9oda:Csia/,e; - doda:e nowD ,siD;,K do ,atalogu 1 begin Mnc(P.*o/); - doda:em3 nowD ,siD;,K 1 writeln(4Jowa po/3c:a w ,atalogu: 4, P.*o/); Qprowad/9ane(Catalog[P.*o/]); - wprowadG dane 1 - nowe: ,siD;,i 1 Catalog[P.*o/].Pic/ni, := '; - ,siD;,D nie .30D 1 - w3po;3c/anD 1 end; procedure ^sunCsia/,e(Jumer : integer); - usuwa ,siD;,K / ,atalogu 1 begin Catalog[Jumer] := Catalog[P.*o/]; - /ama/u:e danD po/3c:K 1 9ec(P.*o/); - usuniKto ,siD;,K 1 end; procedure Q3pis/Catalog;

Strona numer M8 z 82

- w3pisu:e ca0D /awarto56 ,atalogu na e,ran 1 Aar i : integer; begin for i := l to P.*o/ do begin writeln (4*o/3c:a ,atalogu nr 4, i,4:4); Q3pis/9ane(Catalog[i]); end; end;

,orzdny pro"ram powinien rwnie( zapewnia mo(liwo& zmiany opisu ksi(kiO konstrukcj% odpowiedniej procedury pozostawiam )i jako wiczenie Jzobacz te( poni(ejL! Nolejn spraw jest obsu"a wypo(yczenia i zwrotu ksi(ki! 8 tym celu nale(y po pierwsze odszuka wybran ksi(k% Jwedle wcze&niejszych zao(e4 I wedu" tytuuL, a nast%pnie, w zale(no&ci od potrzeb, wprowadzi , sprawdzi lub usun nazwisko wypo(yczajce"o! Je&li chodzi o wyszukiwanie ksi(ki, to sensownym wydaje si% zaprojektowanie *unkcji, ktrej ar"umentem b%dzie zadany *ra"ment tytuu, a warto&ci zwracan I numer ksi(ki w katalo"u lub Dl, je&li ksi(ki nie znaleziono Jnumery ksi(ek s zawsze dodatnie, a wi%c liczba Dl ni"dy nie b%dzie opisywaa rzeczywi&cie istniejcej w katalo"u ksi(kiL! ,oniewa( katalo" mo(e zawiera kilka ksi(ek o tym samym tytule, musimy zaprojektowa *unkcj% wyszukujc tak, by umo(liwiaa znalezienie wszystkich #podejrzanych$! 8 tym celu wyposa(ymy j w mo(liwo& szukania od zadanej pozycji6
function X/u,a:(Re,st : string; *o/3c:a : integer) : integer; - w3s/u,u:e ,siD;,K o t3tule /awiera:Dc3m Re,st 1 - s/u,a od /adane: po/3c:i ,atalogu 1 Aar i : integer; begin i := *o/3c:a; - s/u,a: od /adane: po/3c:i 1 - sprawdG, c/3 t3tu0 /awiera te,st 1 - i c/3 pr/es/u,ano ca03 ,atalog 184 Tur"o Pasca* A

programowanie

while (*os(Re,st, Catalog[i].R3tu0) = ') and (i W= P.*o/) do Mnc(i); if i W= P.*o/ then - /nale/iono odpowiedniD 1 - po/3c:K ,atalogu 1 X/u,a: := i else - nie /nale/iono po/3c:i w ,atalogu 1 X/u,a: := 7$; end;

1auwa(, (e istota przeszukujcej tablic% p%tli while skupia si% w warunku, za& jej tre&ci jest jedynie zwi%kszenie indeksu tablicy! 5o sprawdzenia, czy tytu zawiera dany ci" znakw u(yli&my *unkcji ,os, zwracajcej pozycj%, na ktrej ci" zosta znaleziony w zadanym a4cuchu Jlub zero, je&li "o nie znalezionoL! ,rzeszukiwanie ko4czy si% w momencie, "dy indeks tablicy zrwna si% z numerem ostatniej ksi(ki w katalo"u! 8yszukanie wszystkich ksi(ek o zadanym tytule Ji wy&wietlenie in*ormacji o nichL jest ju( proste6
procedur Xprawd/Csia/,i(R3tu0 : string%; - w3prowad/a dane ,siD;e, o /adan3m t3tule 1 i : integer; R3tu0 : string;
begin writeJQ,odaj tytu szukanej ksiazki6 QLO readlnJ+ytuLO i 6P 1O repeat i 6P SzukajJ+ytu, iLO c znajdH kolejne d c wystpienie tytuu d i* i o 6l t.en c znaleziono ksi(k% d begin writelnJQ,ozycja katalo"u nr Q, i,Q6QLO 8ypisz5aneJNatalo"XiYLO 0ncJiLO c przejdH do nast%pnej pozycji d endO until i P Dl c nie znaleziono wi%cej ksi(ek d endO

,owy(sza procedura cyklicznie wywouje *unkcj% Szukaj, nakazujc jej za ka(dym razem rozpocz%cie przeszukiwania od ostatnio znalezionej ksi(ki Jdlacze"o2L i wypisujc dane znalezionych pozycji za pomoc procedury 8ypisz5ane! 8 tym momencie atwo ju( ustali , czy ksi(ka zostaa wypo(yczona, a je&li tak I to komu Jw ramach wicze4 su"eruj% )i napisanie podobnych *unkcji, umo(liwiajcych ustalenie, ktre ksi(ki zostay wypo(yczone osobie o podanym nazwiskuL! 8a&ciw obsu" wypo(yczenia lub zwrotu zajmuje si% przedstawiona poni(ej procedura wypo(ycz! Gaznaczenie ksi(ki jako wypo(yczonej odbywa si% przez wpisanie nazwiska wypo(yczajce"o do odpowiednie"o pola rekordu i zwi%kszenie licznika wypo(ycze4! 8 chwili zwrotu pole wypo(yczajcy jest zerowane!
pro$edur 8ypozycz Jear r 6 NsiazkaL O c obsu"uje wypo(yczenieRzwrot ksi(ki d
begin

writelnO writeln J QBiezace dane ksiazki6QLO 8ypisz 5ane JrL O c wypisz in*ormacje o ksi(ce dla kontroli d writelnO writeln JQ 8prowadH nazwisko wypozyczajace"o!QLO writeln JQ8 przypadku zwrotu ksiazki nacisnij >nter!QLO wit. r do c wprowadH nazwisko lub wyczy& pole rekordu d begin readln J8ypozyczajacyL O

Strona numer M@ z 82

i* 8ypozyczajacy o Q Q t.en 0ncJ?b,ozLO c przy wypo(yczeniu d c zwi%ksz licznik wypo(ycze4 d endO end#

,owy(sz procedur% mo(na wywoa np! podczas sprawdzania danych ksi(ek, czyli z procedury SprawdzNsiazki! 8yma"a to niewielkiej mody*ikacji tej ostatniej6 c !!! d
writeln ( 4*o/3c:a ,atalogu nr 4 , i, 4 : 4 ) ; Q3pis/9ane (Catalog [i] ) ; writeln (4 L.s0uga w3po/3c/en: nacisni: _Q_4); writeln (4 JastKpna po/3c:a: nacisni: dowoln3 ,lawis/.4); if ^pUase (BeadCe3) = 4Q4 then Q3po/3c/ (Catalog [i] ) ; Mnc(i); - pr/e:dG do nastKpne: po/3c:i 1

Je&li podczas prze"ldania wybranych pozycji bibliotekarz zechce wypo(yczy ksi(k% lub przyj jej zwrot, powinien nacisn klawisz 8, co wywoa procedur% wypo(ycz! 3bsu" naci&ni%cia klawisza zajmuje si% #importowana$ z moduu )rt Jzobacz str! 121L *unkcja 9eadNey, za& *unkcja Sp)ase uniezale(nia pro"ram od wielko&ci liter Jw lub 8L! Statystyk% wypo(ycze4 obsu"uje do& obszerna, chocia( bardzo prosta procedura staD tystyka! 3blicza ona najmniejsz, najwi%ksz i &redni warto& licznika wypo(ycze4 dla cae"o katalo"u! 8ykorzystana w niej metoda wyszukiwania najmniejszej i najwi%kszej warto&ci w tablicy jest bardzo typowa i szeroko stosowana, a pole"a na badaniu, czy kolejny element tablicy nie jest mniejszy Jwi%kszyL od aktualne"o minimum JmaksimumLO je&li tak, jest on przyjmowany jako nowe minimum JmaksimumL!
procedure Xtat3st3,a; Aar i : integer; - lic/ni, pKtli 1 min, maE, sum : longint; - minimum, ma,simum i suma 1 po/+min, po/+maE : integer; - po/3c:e minimum i ma,simum 1 begin min := $''''''; - inic:ali/u: minimum, ma,simum i sumK 1 maE := '; sum := '; for i := l to P.*o/ do with Catalog[i] do begin if Pic/ni, > maE then - /nale/iono nowe ma,simum 1 begin maE := Pic/ni,; - /apamiKta: nowe ma,simum 1 po/+maE := i; -i numer odpowiednie: po/3c:i 1 end; if Pic/ni, & min then - to samo dla minimum 1 begin min := Pic/ni,; po/+min := i; end; sum := sum ) Pic/ni,; - /wiK,s/ lic/ni, w3po;3c/e? 1 end; writeln(4Xtat3st3,a w3po/3c/en:4); - w3pis/ warto5ci 1 - stat3st3, 1 writeln(4Xrednia w3po/3c/en na :edna ,sia/,e: 4, sumIPic/ni,:%:'); writeln(4Csia/,a na:c/escie: w3po/3c/ana (4, maE, 4 w3po/3c/en):4); Q3pis/9ane(Catalog[po/+maE]); writeln(4Csia/,a na:r/ad/ie: w3po/3c/ana (4, min, 4 w3po/3c/en):4); Q3pis/9ane (Catalog[po/+min]); end;

,ozostaa nam do rozwizania sprawa al*abetyczne"o uporzdkowania zawarto&ci katalo"u! 1adanie to, b%dce jednym z klasycznych zada4 pro"ramowania, nosi nazw% sortowania ?iczba znanych obecnie al"orytmw sortowania jest do& sporaO my zajmiemy si% jednym z najprostszych I tak zwanym sortowaniem przez proste wybieranie Jan"! selection sort!" ktre, chocia( niezbyt e*ektywne, jest atwe do zrozumienia i interpretacji! 1a(my, (e musimy uporzdkowa Jod warto&ci najmniejszej do najwi%kszejL tablic% zawierajc pi% liczb cakowitych! 8 pierwszym kroku wyszukujemy najmniejsz liczb% w tablicy i zamieniamy j miejscami z liczb znajdujc si% na pierwszej pozycji! 8 tym momencie najmniejsza warto& w tablicy jest ju( zlokalizowana i ustawiona na wa&ciwym miejscu, #odcinamy$ wi%c pierwsz pozycj% tablicy i powtarzamy wyszukiwanie minimum dla pozostaych pozycji Jod 2 do ML! ,o znalezieniu minimum zamieniamy je miejscami z liczb na pozycji dru"iej, cze"o e*ektem jest ustalenie dwch pierwszych pozycji uporzdkowanej tabeli! ,o #odci%ciu$ pierwszych dwch pozycji Jju( uporzdkowanychL powtarzamy sortowanie dla pozycji C do M i tak dalej, a( do chwili, kiedy pozostanie nam do przeszukania ostatnia pozycja tablicy Joczywi&cie zawierajca najwi%ksz liczb%, #zepchni%t$ na sam koniecL! / oto przykad6 ,rzed sortowaniem 8 trakcie sortowania Jkrok GL krok 1 krok 2 krok C krok F F 1 C 1 JFL F J1L C 1 2 JFL C 1 2 C JCL 1 2 C

Strona numer AG z 82

,rzed sortowaniem Jkrok GL M

8 trakcie sortowania krok 1 M krok 2 M krok C M krok F F JML

2 2 F J2L F M JFL Nolorem czarnym zaznaczono zakres przeszukiwania tablicy Jjak wida , w kolejnych krokach zmniejsza si% on o 1L, za& w nawiasach umieszczono warto&ci, ktre znajdoway si% na danej pozycji przed zamian, tj! F J1L oznacza" (e na danej pozycji znajdowaa si% liczba l, zamieniona nast%pnie z liczb F! Jak wida , nasz al"orytm jest cakiem prosty, cho okupione jest to e*ektywno&ci Jbardziej ambitnym )zytelnikom polecam przestudiowanie innych al"orytmw sortowania, z ktrych najcz%&ciej stosowanym i chyba naje*ektywniejszym jest tzw! szybkie sortowanie Jan"! uicksor'!" zilustrowane m!in! dostarczanym wraz z +urbo ,ascalem pro"ramem ]S39+!,/SL! 'iestety, spraw% komplikuje nieco wyma"anie sortowania wedu" tytuw lub nazwisk autorw! Jak ju( si% zapewne zorientowae&, wykorzystywane w al"orytmie wyszukiwanie najmniejszej warto&ci pole"a na porwnywaniu zawarto&ci odpowiedniej komrki tablicy z bie(c warto&ci minimum! /by posortowa katalo" wedu" tytuw, nale(y porwnywa pola +ytu odpowiednich rekordwO sortowanie wedu" nazwisk autorw wyma"a porwnywania pl /utor! )zy(by wi%c nale(ao napisa dwie oddzielne procedury sortujce2 'a szcz%&cie nie, chocia( bardzo wielu pocztkujcych pro"ramistw radzi sobie wa&nie w ten sposb Jcze"o absolutnie nie nale(y poleca 7L! 1auwa(, (e w obu przypadkach mechanizm sortowania jest identyczny, za& r(nica sprowadza si% wycznie do porwnywania r(nych pl rekordw! 8ystarczy zatem napisa odpowiednie *unkcje porwnujce dwa rekordy wedu" pl /utor i +ytu, a nast%pnie wywoywa je w zale(no&ci od aktualne"o kryterium sortowania! 1wyczajowo *unkcje takie zwracaj warto& Dl, 3 lub l odpowiednio do te"o, czy pierwszy z porwnywanych obiektw jest mniejszy, rwny lub wi%kszy od dru"ie"o! 8 naszym przypadku I poniewa( sortujemy obiekty rosnco I wystarczy in*ormacja, czy pierwszy rekord jest mniejszy od dru"ie"o, czy te( nie! 3to przykad *unkcji porwnujcej rekordy wedu" zawarto&ci pola +ytu Jdru" *unkcj% napisz samL6 function *orowna:R3tul(rl, r= : CsiD;,a) - por<wnu:e re,ord3 wed0ug pola R3tu0 1: inte"erO begin if rl.R3tul W r=.R3tul then *orowna:R3tul := 7l else *orowna:R3tul := $; end# Sama procedura sortujca powinna wykonywa al"orytm opisany powy(ej, wywoujc odpowiedni *unkcj% porwnujc w zale(no&ci od zadane"o przez u(ytkownika kryterium! 'a obecnym etapie znajomo&ci ,ascala jeste&my w stanie zrealizowa takie wywoanie w oparciu o instrukcj% warunkow, jednak #prawdziwe$ pro"ramy wykorzystuj nieco inne rozwizanie, oparte o tak zwane parametry proceduralne 3mawianie te"o za"adnienia wykracza poza ramy niniejszej ksi(ki, jednak w skrcie metoda ta pole"a na przekazaniu procedurze sortujcej wskaHnika opisujce"o poo(enie *unkcji porwnujcej Jjej adresuL! ,odstawiajc pod parametr adresy r(nych *unkcji jeste&my w stanie ele"ancko zmienia kryteria sortowania! / oto tre& procedury6
procedur Xortu:(Cr3terium : integer); - sortu:e /awarto56 ,atalogu wed0ug /adanego ,r3terium 1 i, : : integer; U/3Qie,s/3 : integer; *omoc : Csia/,a; begin for i := l to P.*o/7$ do - w3,ona: P.*o/7$ pr/e.ieg<w 1 for : := i to P.*o/ do begin if Cr3terium = l then - por<wnanie wg t3tu0uIautora 1 U/3Qie,s/3 := *orowna:R3tul(Catalog[i] , Catalog[:]) else U/3Qie,s/3 := *orowna:Outor(Catalog[i], Catalog[:]); if U/3Qie,s/3 = l then - tr/e.a /amieni6 element3 1 begin *omoc := Catalog[i]; - /achowa: pierws/3 re,ord 1 Catalog[i] := Catalog[:]; - wstaw drugi 1 - do pierws/ego 1 Catalog[:] := *omoc; - wstaw /achowan3 1 - do drugiego 1 end; end; end;

Jak wida , procedura wykonuje cykliczne porwnania i ewentualne zamiany w dwch za"nie(d(onych p%tlach, z ktrych zewn%trzna wyznacza kolejne kroki al"orytmu, za& wewn%trzna obsu"uje prze"ldanie pozostaych jeszcze do uporzdkowania rekordw! Sama zamiana elementw wykorzystuje typowy schemat #podpierajcy si%$ pomocniczym rekordem su(cym do tymczasowe"o przechowania danych! 1auwa( wreszcie, (e aby posortowa rekordy malejco, wystarczy zmody*ikowa warunek
i* )zy8iekszy P l zast%pujc warto& l warto&ciDl!

Jak nietrudno si% domy&li , operacja sortowania powinna poprzedza wyprowadzenie zawarto&ci katalo"u na

Strona numer A1 z 82

ekran lub drukark%! ,rocedura kojarzca obydwie operacje mo(e wy"lda nast%pujco6 pro$edure 8ypiszNatalo"O
3ar Nryterium 6 inte"erO begin writeJQSortowanie wedu" tytulow J1LQ, Q lub nazwisk autorow J2LQLO readlnJNryteriumLO SortujJNryteriumD1LO c parametr powinien by 3 lub l d 8ypiszO c wypisz posortowany katalo" d readlnO "o przeczyta d endO

c i pozwl

8 ten sposb zako4czyli&my budow% zasadniczych klockw, z ktrych skada si% ma nasz pro"ram! ,ozostaje jeszcze napisanie adne"o menu6
function Nenu : integer; Aar c : char; begin UlrXcr; - w3c/356 e,ran 7 w3maga w0Dc/enia modu0u Urt 1 writeln(4*rogram .i.liotec/n3 COROPL], wers:a $.', $##%4); writeln; writeln(4Q3.ier/ fun,c:e:4); writeln (4l: Q3s/u,iwanie po/3c:i wg t3tulu4, 4 i o.s0uga w3po;3c/e?4);

writelnJQ26 8yswietlenie wszystkich pozycjiQLO writelnJQC6 5odanie ksiazki do katalo"uQLO writelnJQM6 Statystyka wypozyczenQLO writeln J Q36 Noniec pracyQLO writelnO writelnO repeat c czytaj klawiatur%, d c 6P 9eadNey c rwnie( wyma"a wczenia moduu )rt d until c in X Q 3 Q ! ! Q M Q Y O c i"noruj pozostae znaki d .enu 6P ordJcLDordJQ3QLO endO

Sama cz%& operacyjna pro"ramu jest rwnie( bardzo typowa! 8ykorzystuje ona p%tl% repeat, cyklicznie wy&wietlajc menu dost%pnych operacji! Nod zwrcony przez *unkcj% .enu jest wykorzystywany do wywoania odpowiedniej operacji w instrukcji case! 1wrcenie przez *unkcj% .enu warto&ci 3 powoduje zako4czenie dziaania p%tli, a tym samym cae"o pro"ramu!
begin c cz%& operacyjna d repeat

Q3.or := Nenu; - w3.ier/ opc:K / menu 1 case Q3.or of $ : Xprawd/Csia/,i; ' : begin Q3pis/Catalog; readln; end; " : 9oda:Csia/,e; ! : Xtat3st3,a; end; until Q3.or ='; - opc:a L = ,oniec prac3 1 end. - program Bi.liote,a 1

Jak zd(ye& zapewne zauwa(y , pro"ram nie umo(liwia usuni%cia ksi(ki z katalo"u! ,rzeznaczona jest do te"o brakujca czwarta pozycja menu, ktrej zapro"ramowanie proponuj% )i w ramach wicze4! ,o poskadaniu opisanych w tym rozdziale *ra"mentw w jedn cao& Jnajlepiej w kolejno&ci, w jakiej byy cytowaneL uzyskujesz "otowy pro"ram! 'iestety, peni% szcz%&cia zakcaj dwa mankamenty, z ktrych co najmniej jeden jest bardzo powa(ny! 3kazuje si% mianowicie, (e nasz katalo" istnieje dopty, dopki u(ytkownik nie wybierze opcji #Noniec pracy$ I kolejne uruchomienie pro"ramu wi(e si% z konieczno&ci wpisania wszystkich ksi(ek od nowa Jco jest niedopuszczalne77L! 'o i sama pojemno& katalo"u te( mo"aby by wi%ksza!!! 9ozwizaniem naszych problemw zajmiemy si% ju( za chwil%, w dwch kolejnych rozdziaach traktujcych o plikach oraz zmiennych dynamicznych!

Strona numer A2 z 82

P*iki5 cz&*i jak uc6roni7 dane przed zgu"0


,ami% operacyjna, wykorzystywana do przechowywania danych przetwarzanych przez pro"ram, ma dwie zasadnicze wady6 o"raniczon pojemno& i ulotno& Jto poetyckie sowo oznacza po prostu, (e zawarto& pami%ci jest tracona w chwili wyczenia zasilaniaL! Nomputer umo(liwiajcy przechowywanie danych wycznie podczas wczenia do sieci byby raczej mao u(yteczny, dlate"o te( projektanci sprz%tu opracowali szere" urzdze4 I tzw! pami)ci masowyc$ I pozwalajcych na trwae przechowywanie danych! 9ol% pami%ci masowej w komputerze osobistym peni dyskietki oraz dyski twarde Joba rozwizania wykorzystuj identyczn metod% zapisu i r(ni si% rozwizaniami technolo"icznymiL! 1 lo"iczne"o punktu widzenia, dane zapisywane na dyskach or"anizowane s w pliki" a te z kolei przechowywane s w katalogac$ )ao&ci zarzdza system operacyjny, z ktre"o usu" korzystaj pro"ramy u(ytkowe! 9zecz jasna, rwnie( i +urbo ,ascal dysponuje mo(liwo&ci korzystania z plikw! 1 trzech dost%pnych w ,ascalu rodzajw plikw I elementowych JjednorodnychL, tekstowych i amor*icznych I omwimy dwa pierwsze, majce najwi%ksze zastosowanie w praktyce! 'a pocztek nieco teorii! Sam plik jest pewn struktur danych zapisan na dysku i identy*ikowan za pomoc nazwy J&ci&lej I &cie(ki dost%puL! 5ane przechowywane w pliku mo" mie reprezentacj% binarn Jtak sam, jak w pami%ci komputeraL lub tekstow Jtak, jaka u(ywana jest do wprowadzania in*ormacji z klawiatury i wyprowadzania jej na ekran monitora lub drukark%L! 9eprezentacjom tym odpowiadaj w ,ascalu pliki elementowe oraz tekstowe! - Pliki ele(entowe przechowuj dane w postaci binarnej, za& pliki tekstowe I w postaci wierszy tekstu zako4czonych znakami ko4ca wiersza! 1awarto& plikw elementowych jest na o" nieczytelna dla u(ytkownika, natomiast tre& pliku tekstowe"o daje si% atwo odczyta i zinterpretowa ! 1 dru"iej strony, binarna reprezentacja danych jest bardziej zwarta i oszcz%dna! - Wszystkie dane prze$.owywane w plikach elementowych musz by te"o same"o typu Jproste"o lub strukturalne"oL! ,liki tekstowe, wykorzystujce znakowe Js*ormatowaneL reprezentacje danych, mo" by u(yte do przechowywania mieszanych typw danych Jnp! tekstw i liczbL, "dy( wszelka in*ormacja przechowywana jest w nich w postaci tekstowej! ,liki tekstowe umo(liwiaj rwnie( *ormatowanie zapisu i korzystanie z procedur readln i writeln, ktre s niedost%pne dla plikw elementowych! - Pliki ele(entowe u(o)liwia7% tzw! dost%p swobodny I w dowolnym momencie mo(na odwoa si% do dowolne"o elementu pliku! ,liki tekstowe s plikami o dost%pie sekwencyjnym, co oznacza" (e aby dosta si% do wybrane"o elementu pliku, nale(y przeczyta wszystkie elementy znajdujce si% przed nim! 3dwoania do pliku Jzapisy, odczyty i inne operacjeL realizowane s przez wywoanie odpowiednich *unkcji systemu operacyjne"o, ktry z kolei posu"uje si% liczbowymi identy*ikatorami plikw Jkorzystanie z nazw byoby niewy"odneL! 9wnie( pro"ram pascalowy nie odwouje si% do plikw #bezpo&rednio$, lecz poprzez tak zwane zmienne plikowe" czyli zo(one struktury danych reprezentujce *izyczne pliki zapisane na dysku! 3"lny schemat operacji plikowej w ,ascalu obejmuje cztery etapy6 - skojarzenie zmiennej plikowej z odpowiednim plikiem Jznajdujcym si% na dysku lub nowo tworzonymLO - otwarcie pliku, przy"otowujce "o do zapisywania lub odczytywania in*ormacjiO - jedna lub wi%cej operacji zapisu lub odczytu danychO - zamkni%cie pliku i przerwanie skojarzenia pomi%dzy zmienn plikow i plikiem! Sam zmienn plikow deklaruje si% w sposb nast%pujcy6
na/wa : file of t3p - dla pli,u elementowego 1 na/wa : teEt - dla pli,u te,stowego 1

"dzie typ okre&la typ elementu skadowe"o pliku i mo(e by dowolnym identy*ikatorem typu proste"o lub strukturalne"o Jz wyjtkiem typu plikowe"o i obiektowe"oL! 1auwa(, (e pojedynczym elementem pliku elementowe"o jest nie bajt, lecz wa&nie obiekt zadane"o typu Jco jest do& lo"iczneL! 5late"o te( do pliku rekordw Jdru"i przykad poni(ejL mo(esz wpisywa wycznie cae rekordy Jzapisywanie lub odczytywanie pojedynczych pl jest niewykonalneL, a je"o du"o& b%dzie zawsze rwna wielokrotno&ci rozmiaru pojedyncze"o rekordu! ,odobnie deklaracja pliku, ktre"o elementami skadowymi s tablice liczb cakowitych, zmusi )i% do zapisywania i odczytywania caych tablic, "dy( odwoanie si% do pojedyncze"o elementu tablicy b%dzie niemo(liwe! +en sam plik mo(na oczywi&cie otworzy jako plik liczb cakowitych, co pozwoli nam na odczytywanie pojedynczych warto&ci! 8 przypadku, "dy plik przechowuje jednorodne dane, deklaracja zmiennej plikowej wykorzystuje na o" elementy skadowe odpowiednie"o typu proste"o! 5la baz danych, zo(onych z rekordw Jprzechowujcych dane r(nych typwL, jedynym wyj&ciem jest deklaracja pliku rekordw! 3to kilka przykadowych deklaracji6

Strona numer AC z 82

ear *r<.,i : file of real; - pli, lic/. r/ec/3wist3ch 1 CatalogJa93s,u : file of Csia/,a; - pli, re,ord<w 1 CatalogRe,stow3 : teEt; - pli, te,stow3 1

5la potrzeb nasze"o pro"ramu biblioteczne"o mo(emy wykorzysta dru"i lub trzeci z powy(szych przykadw! 'ajpopularniejszym rozwizaniem dla baz danych Ja nasz pro"ram jest wa&nie prost baz danychL s I jak ju( powiedziano I pliki rekordw, umo(liwiajce swobodny dost%p do danych i lepsze za"ospodarowanie dysku! Je&li jednak zale(y )i na czytelno&ci pliku z danymi, mo(esz wykorzysta reprezentacj% w postaci pliku tekstowe"o! ,o zadeklarowaniu odpowiedniej zmiennej plikowej mo(na przystpi do wa&ciwych operacji zwizanych z zapisywaniem i odczytywaniem danych! ,rzede wszystkim musimy skojarzy zmienn plikow z *izycznym plikiem znajdujcym si% na dysku! Su(y do te"o procedura assi"n6
assign(/mienna7pli,owa, na/wa7pli,u)

'azwaDpliku okre&la tu plik, do ktre"o chcemy si% odwoywa Jcznie z ewentualn &cie(k dost%pu, czyli nazw dysku, katalo"u i ewentualnych podkatalo"w zawierajcych plikL! ,o wykonaniu procedury assi"n wszelkie odwoania do zmiennej plikowej b%d dotyczyy skojarzone"o z ni pliku Jo nazwie ktre"o mo(emy zapomnie L! Jest to do& istotne, "dy( jednym z b%dw cz%sto popenianych przez pocztkujcych pro"ramistw jest prba odwoywania si% do pliku przez podanie je"o nazwy, co jest rzecz jasna niele"alne! ,rzykadowe skojarzenie zmiennej plikowej z plikiem mo(e mie posta
assign(CatalogJa93s,u, 4c:\.i.lio\dane\,atalog.dat4)

lub JlepiejL

assign(CatalogJa93s,u, Ja/wa*li,u)

8 dru"im przypadku nazwa pliku przekazywana jest jako zmienna, co umo(liwia np! wprowadzenie jej z zewntrz J#zaszycie$ nazwy wewntrz pro"ramu zmniejsza je"o uniwersalno& L! 'ast%pnym krokiem jest otwarcie pliku, czyli przy"otowanie "o do odczytu lub zapisu! Nonieczno& otwarcia Ji pHniejsze"o zamkni%ciaL pliku wynika z metod obsu"i plikw przyj%tych w systemie operacyjnym, ktre"o *unkcje s zreszt w tym celu wykorzystywane! 8ymiana in*ormacji pomi%dzy plikiem a pro"ramem mo(liwa jest dopiero po otwarciu te"o ostatnie"o! 5wiema podstawowymi procedurami u(ywanymi w ,ascalu do otwierania plikw s
reset i rewrite: reset(/mienna7pli,owa) rewrite(/mienna7pli,owa)

,rocedura reset umo(liwia otwarcie ju( istniejce"o pliku, ustawiajc tzw! wska0nik plikowy na je"o pocztku! 8 przypadku, "dy otwierany plik nie istnieje, wywoanie procedury reset ko4czy si% b%dem wykonania! 1 kolei rewrite umo(liwia otwarcie pliku niezale(nie od te"o, czy istnia on poprzednio6 je&li nie I tworzy ona nowy plik G danej nazwie, za& je&li tak I zeruje du"o& istniejce"o pliku i ustawia wskaHnik plikowy na je"o pocztku Jcze"o e*ektem jest utra$enie wszystki$. dany$. zawarty$. w pliku". 8arto pami%ta , (e w przypadku plikw tekstowych procedura reset otwiera plik wycznie do odczytu, za& rewrite I wycznie do zapisu Jnie ma zatem mo(liwo&ci mieszania odczytw i zapisw w jednym cyklu otwarciaL! 1asada ta nie obowizuje dla plikw elementowych, ktre mo(na odczytywa i zapisywa bez o"ranicze4 niezale(nie od te"o, czy zostay otwarte za pomoc procedury reset, czy rewrite Jw tym ostatnim przypadku trzeba najpierw zapisa do pliku jakie& daneL! Sam wskaHnik plikowy jest po prostu kolejnym numerem elementu Jnie bajtu7L w pliku, przy czym numeracja rozpoczyna si% od zera! Na(da operacja odczytu lub zapisu powoduje przesuni%cie wskaHnika o warto& rwn liczbie odczytanych lub zapisanych elementw, przy czym dla plikw o dost%pie swobodnym JelementowychL mo(liwe jest rwnie( je"o dowolne przestawianie Jnawet poza koniec pliku, cho ma to may sens 1 najcz%&ciej powoduje b%dy wykonaniaL! +rzeci procedur otwierajc, dost%pn wycznie dla plikw tekstowych, jest /ppend! ,rocedura ta otwiera plik do dopisywania, tj! otwiera "o do zapisu nie niszczc poprzedniej zawarto&ci i ustawia wskaHnik plikowy na je"o ko4cu! Smo(liwia to dodawanie danych do plikw tekstowych, ktre I jako pliki o dost%pie sekwencyjnym I nie umo(liwiaj pro"ramowe"o przestawiania wskaHnika plikowe"o! 5o wymiany danych pomi%dzy pro"ramem a plikiem su( znane nam ju( procedury read JodczytL i write JzapisL! ,oniewa( w #standardowej$ wersji obsu"uj one ekran monitora i klawiatur%, niezb%dne jest podanie dodatkowe"o ar"umentu okre&lajce"o plik, zRdo ktre"o in*ormacja ma by odczytana lub zapisana! /r"umentem tym jest wa&nie nazwa odpowiedniej zmiennej plikowej6
read(/mienna7pli,owa, lista7element<w) write(/mienna7pli,owa, lista7element<w)

,owy(sze operacje odnosz si% zarwno do plikw elementowych, jak i tekstowych! 5la tych ostatnich mo(liwe jest ponadto u(ycie procedur readln i writeln, odczytujcych lub zapisujcych dane wraz ze znakami ko4ca wiersza! ,oniewa( pliki elementowe przechowuj wycznie dane okre&lone"o typu i nie mo" zawiera znakw ko4ca wiersza, u(ycie procedur readln i writeln jest w ich przypadku niele"alne! 5ru" istotn r(nic jest zawarto& listyDelementw! 8 przypadku plikw tekstowych lista ta mo(e zawiera dowolne zmienne, stae i wyra(enia J"dy( wszystkie zapisywane s w pliku w postaci tekstuL, natomiast dla plikw elementowych jej skadnikami mo" by wycznie zmienne odpowiednie"o typu! 5zieje si% tak dlate"o, (e plik elementowy mo(e zawiera wycznie dane jedne"o typu, za& poszcze"lne elementy listy przekazywane s przez nazw%! ,o

Strona numer AF z 82

wykonaniu (danych operacji zapisu i odczytu danych plik nale(y zamkn +a bardzo wa(na operacja jest i"norowana przez wielu pro"ramistw, co w e*ekcie prowadzi do przykrych niespodzianek w postaci z"ubionych danych! S podo(a cae"o problemu le(y tak zwane bu'orowanie operacji dyskowyc$" czyli technika pole"ajca na odczytywaniu i zapisywaniu danych nie pojedynczo, lecz caymi paczkami, za po&rednictwem specjalne"o obszaru pami%ci I tzw! bu'ora dyskowego 8ykorzystanie bu*ora pozwala na zredukowanie liczby *izycznych odczytw i zapisw na dysku, a przez to zmniejszenie je"o mechaniczne"o obci(enia i popraw% wydajno&ci operacji dyskowych! ,oniewa( jednak podczas zapisu zawarto& bu*ora wysyana jest na dysk dopiero po je"o zapenieniu Jlub w chwili zamkni%cia plikuL, przerwanie wykonywania pro"ramu mo(e spowodowa utrat% danych! 9wnie( poprawne zako4czenie pro"ramu powoduje co prawda automatyczne zamkni%cie otwartych plikw, nie opr(nia jednak bu*orw przechowujcych nie zapisane jeszcze dane, co mo(e spowodowa ich utrat%! 8 przypadku, "dy plik wykorzystywany jest wycznie do odczytu danych, nie zamkni%cie nie powoduje utraty in*ormacji, co nie znaczy, (e mo(na je sobie odpu&ci , bowiem lenistwo takie zwykle m&ci si% w najmniej stosownych okoliczno&ciach! *ami)taj< zamkni)cie pliku jest praktycznie jedynym sposobem na bezpieczne zapisanie w nim wszystkic$ danyc$ 'a szcz%&cie zamkni%cie pliku jest bardzo proste! 9ealizuje je procedura close6 close JzmiennaD plikowaL Jej wywoanie ma t% sam *orm% dla wszystkich rodzajw plikw! +yle teorii! /by wprowadzi j w (ycie, sprbujmy napisa zestaw procedur pozwalajcych na zapisanie nasze"o katalo"u w pliku dyskowym i odczytanie "o z pliku! 1"odnie z tym, co powiedzieli&my wcze&niej, do przechowywania zawarto&ci katalo"u wykorzystamy plik elementowy typu * ile o* record!
procedur Tapis/Ja93s,u(Ja/wa*li,u : string%; var f : file of Csia/,a; i : integer; begin assign(f, Ja/wa*li,u); - s,o:ar/ pli, /e /miennD pli,owD 1 rewrite(f); - otw<r/ (utw<r/) pli, 1 for i := l to P.*o/ do - /apis/ ,ole:ne re,ord3 1 write(f, Catalog[i]); close(f); - /am,ni: pli, 1 end;

,owy(sza procedura ilustruje typow metod% zapisywania w pliku zawarto&ci bazy danych! ,o skojarzeniu pliku z odpowiedni zmienn i otwarciu "o zapisujemy kolejne rekordy znajdujce si% w tablicy Jzwr uwa"%, (e rekordy zapisywane s w cao&ci, a nie polamiL! ,o zapisaniu wa&ciwej liczby rekordw zamykamy plik!!! i to wszystko! .usisz jeszcze zdawa sobie spraw%, (e ka(de otwarcie b%dzie powodowao utrat% poprzedniej zawarto&ci pliku Jrewrite7L, ale poniewa( przed chwil niejawnie zao(yli&my, (e ka(dorazowo zapisujemy cay katalo", jest to do przyj%cia! 3dczytanie zawarto&ci katalo"u z pliku przebie"a wedu" nieco inne"o schematu! ,oniewa( nie wiemy, ile rekordw mamy wa&ciwie odczyta , nie mo(emy zastosowa p%tli *or! 'ajpopularniejszym rozwizaniem jest czytanie kolejnych rekordw do momentu napotkania ko4ca pliku, co wykrywane jest przez procedur% eo* Jan"! endAo'A'ile I koniec plikuL! Jak nietrudno si% domy&li , tym razem zastosujemy p%tl% while Jlub repeatL6
procedure Ldc/3ta:T93s,u(Ja/wa*li,u : string%; var f : file of Csia/,a; i : integer; begin assign(f, Ja/wa*li,u); - s,o:ar/ pli, /e /miennD pli,owD 1 reset(f); - otw<r/ pli, (musi istnie6>) 1 i := '; - w3/eru: lic/ni, re,ord<w 1 while not eof(f) do - c/3ta: a; do ,o?ca pli,u 1 begin Mnc(i); - ,ole:n3 re,ord 1 read(f, Catalog[i]); end; P.*o/ := i; - wc/3tano t3le re,ord<w 1 close(f); end;

,ozostae operacje wykonywane w procedurze s praktycznie takie same, jedynie do otwarcia pliku wykorzystujemy tym razem procedur% reset! 1auwa(, (e konstrukcja procedur 1apisz'a5ysku i odczytajzoysku przewiduje przekazanie nazwy pliku jako parametru, co z kolei pozwala na ich u(ycie bez konieczno&ci ka(dorazowe"o komunikowania si% z u(ytkownikiem Jnazw% mo(na #zaszy $ w pro"ramie jako staL! Jednym z mo(liwych Ji cz%sto stosowanychL rozwiza4 kwestii zapami%tywania danych jest ka(dorazowe zapisywanie caej bazy w chwili zako4czenia pro"ramu i odczytywanie jej zaraz po uruchomieniu! 8 tym celu wystarczy na pocztku cz%&ci operacyjnej Jprzed wywoaniem menuL wstawi instrukcj%
Ldc/3ta:T93s,u(*PMC+COROPL]^);

Strona numer AM z 82

za& przed samym ko4cem pro"ramu dopisa


Tapis/Ja93s,u(*PMC+COROPL]^); *PMC+COROPL]^ = 4Catalog.dat4

przy czym sta ,?0NbN/+/?3:S nale(y wcze&niej zde*iniowa jako np! .etoda ta pozwala na ka(dorazowe zapami%tywanie tre&ci katalo"u po zako4czeniu pro"ramu i jej odtwarzanie na pocztku kolejnej sesji bez konieczno&ci podawania nazwy pliku Juwa"a6 przed pierwszym uruchomieniem pro"ramu musisz utworzy pusty plik o nazwie N/+/?3:!5/+, w przeciwnym przypadku prba otwarcia nie powiedzie si%L! 0nnym sposobem jest uzupenienie menu o polecenia zapisu i odczytu danych, co jednak wi(e si% z konieczno&ci wywoywania odpowiednich polece4! Je&li wreszcie chcesz da u(ytkownikowi mo(liwo& zmiany nazwy pliku z danymi, musisz uzupeni pro"ram o odpowiednie instrukcje wczytujce j z klawiatury! 5o przechowywania danych mo(na rwnie( wykorzysta plik tekstowy, jednak operacje odczytu i zapisu b%d nieco bardziej skomplikowane! 8ymiana danych z plikiem tekstowym odbywa si% tak samo, jak z monitorem i klawiatur, a wi%c poszcze"lne pola rekordw nale(y zapisywa i odczytywa indywidualnie! 8 zamian za to uzyskujemy mo(liwo& atwe"o obejrzenia tre&ci pliku J"dy( zawiera on wycznie tekstL, a tak(e skierowania Jlub odczytaniaL danych do JzL jedne"o ze standardowych urzdze4 wyj&cia Jwej&ciaL obsu"iwanych przez system operacyjny Jnp! drukarkiL! 3to przykad procedury zapisujcej katalo" do pliku tekstowe"o Joperacj% odczytu mo(esz zrealizowa w ramach wicze4L6
procedur Tapis/Ja93s,u(Ja/wa*li,u : string%; var f : teEt; - t3m ra/em pli, te,stow3 1 i : integer; begin assign(f, Ja/wa*li,u); - s,o:ar/ pli, /e /miennD pli,owD 1 rewrite(f); - utw<r/ pli, 1 for i := l to P.*o/ do - /apis/ ,ole:ne re,ord3 1 with Catalog[i] do - w3prowadG pos/c/eg<lne pola re,ordu 1 begin writeln(f, 4*o/3c:a ,atalogu: 4, i); writeln(f, 4R3tul: 4, R3tu0); writeln(f, 4Outor: 4, Outor); if Q3po/3c/a:ac3 = 44 then - ni,t nie w3po;3c/30 1 writeln(f, 4Csia/,a /na:du:e sie na polce.4) else - pole /awiera na/wis,o w3po/3c/a:acego 1 writeln(f, 4Q3po/3c/a:ac3: 4, Q3po/3c/a:ac3); writeln (f); end; close(f); - /am,ni: pli, 1 end;

Sposb zapisania tre&ci rekordu do pliku przypomina procedur% wypisz5ane Jzobacz poprzedni rozdziaL, z tym, (e ka(da instrukcja writeJlnL uzupeniona jest o specy*ikacj% zmiennej plikowej, np!
writelnJ*, Q/utor6 Q, /utorLO

3dczytywanie danych z plikw tekstowych nastr%cza nieco wi%cej kopotw, zwaszcza "dy plik zawiera in*ormacje mieszanych typw Jtekst i liczbyL! )en za #luHny$ *ormat zapisu jest najcz%&ciej konieczno& tworzenia skomplikowanych procedur realizujcych konwersje typw i sprawdzanie poprawno&ci danych! 'a szcz%&cie pliki tekstowe posiadaj rwnie( zalety Jjedn z nich jest wa&nie czytelny *ormatL! ,oniewa( standardowe urzdzenia wyj&ciowe s w systemie 53S obsu"iwane tak samo, jak pliki tekstowe, aby wyprowadzi tre& katalo"u na ekran Jtzw! konsol% operatorskL, wystarczy nast%pujce wywoanie6
Tapis/Ja93s,u(4con4); Tapis/Ja93s,u(4prn4);

za& aby wydrukowa katalo" na drukarce, musisz u(y wywoania "dzie con i prn s nazwami systemowych urzdze4 wyj&cia Jkonsoli i drukarkiL! 'a koniec wrcimy na chwil% do plikw elementowych, by powiedzie kilka sw o metodach realizowania swobodne"o dost%pu do danych! Bie(cy element pliku Jtj! element, ktre"o dotyczya b%dzie kolejna instrukcja read lub writeL wskazywany jest przez wspomniany ju( wskaHnik plikowy! 8ywoanie
Xee,(/mienna7pli,owa, numer7elementu)

powoduje ustawienie wskaHnika plikowe"o tak, by kolejna operacja odczytu lub zapisu rozpocz%a si% od elementu dane"o numeremDelementu Jelementy numerowane s od zeraL! 5odatkowymi *unkcjami wykorzystywanymi podczas manipulowania wskaHnikiem plikowym s ;ile,os, zwracajca je"o bie(c warto& , oraz ;ileSize, zwracajca rozmiar pliku! +ak wi%c I zakadajc, (e * jest plikiem typu *ile o* inte"er I wywoanie
Xee, (f, 8ileXi/e (f));

ustawi wskaHnik plikowy za ostatnim elementem pliku Jczyli przy"otuje plik do dopisywaniaL, za& konstrukcja
for i := l to $' do begin Xee, (f, random(8ileXi/e(f)); read(f, i); writeln (i); end;

odczyta z pliku dziesi% losowo wybranych liczb J*unkcja random JkL zwraca liczb% pseudoprzypadkow z zakresu od zera do kL i wy&wietli je na ekranie! Swobodny dost%p do danych, chocia( bardzo przydatny, nie powinien by nadu(ywany! 8szelkie operacje na plikach s znacznie bardziej czasochonne, ni( operacje na

Strona numer AA z 82

danych umieszczonych w pami%ci, za& operacje w trybie sekwencyjnym s znacznie szybsze, ni( w trybie dost%pu swobodne"o! 'iezale(nie od tych uwa" musisz pami%ta , (e wszelkie manipulacje na zawarto&ci plikw wi( si% z ryzykiem utraty danych w przypadku awarii systemu Jnp! wyczenia zasilaniaL! 5late"o te( pliki nale(y zamyka bezpo&rednio po wykonaniu niezb%dnych czynno&ci!

@apami!taj
5o trwae"o przechowywania in*ormacji w systemie komputerowym su( pliki! +urbo ,ascal umo(liwia obsu"% plikw elementowych, tekstowych oraz amor*icznych! ,liki elementowe skadaj si% z elementw te"o same"o typu Jproste"o lub strukturalne"oL! ?iczba elementw jest zawsze cakowita! ,liki tekstowe zawieraj dane reprezentowane w postaci wierszy tekstu! .o(na ich u(ywa do przechowywania danych r(nych typw! ,liki elementowe umo(liwiaj dost%p swobodny, natomiast pliki tekstowe pozwalaj wycznie na dost%p sekwencyjny! ,lik reprezentowany jest w pro"ramie przez zmienn plikow, ktr nale(y skojarzy z *izycznym plikiem za pomoc procedury assi"n! 3peracje na zawarto&ci pliku musz by poprzedzone je"o otwarciem Jreset lub rewriteL i zako8$zone za(kni$ie( JcloseL! Swobodny dost%p do elementw pliku umo(liwia procedura Seek, ustawiajca wskaHnik plikowy na zadanej pozycji! .echanizmy obsu"i plikw tekstowych umo(liwiaj przesyanie danych nie tylko na dysk, lecz rwnie( z i do standardowych urzdze4 wej&ciaDwyj&cia systemu operacyjne"o!

Strona numer AE z 82

<a=cuc6&
5ane tekstowe maj I obok "ra*iki I najwi%kszy udzia w obj%to&ci in*ormacji przetwarzanej i przechowywanej we wspczesnych systemach komputerowych! 1 te"o te( wz"l%du ka(dy szanujcy si% j%zyk wysokie"o poziomu jest wyposa(ony w mechanizmy pozwalajce na reprezentowanie, przechowywanie i przetwarzanie tekstw! 8 +urbo ,ascalu su(y do te"o typ a4cuchowy Jstrin"L, ktrym zajmiemy si% w tym rozdziale! 5owolny tekst Ja4cuch, an"! string! przechowywany jest w pro"ramie w postaci ci"u znakw, ktry mo(e by interpretowany jako specy*iczna tablica
arrayXG!!2MMY o* char

,rzykadowa deklaracja zmiennej a4cuchowej ma posta


var Japis : string;

Stae a4cuchowe zapisuje si% natomiast w postaci ci"w znakw uj%tych w apostro*y Jpodobnie jak stae znakoweL6
$onst

XROPS+JO*MX = 4Rur.o *ascal4;

1erowy element a4cucha przechowuje je"o aktualn du"o& Jtzw! d+ugo dynamiczn!; b%dc typu znakowe"o mo(e on przyjmowa warto&ci od 3 do 2MM! Std wa&nie wynika o"raniczenie du"o&ci a4cucha do 2MM znakw, co zreszt w wi%kszo&ci przypadkw wystarcza a( nadto! /by #skrci $ a4cuch Jdana typu strin" zajmuje zawsze 2MA bajtw, niezale(nie od rzeczywistej du"o&ci tekstuL, mo(na wykorzysta deklaracj%
na/wa7/mienne: : string[d0ugo56]

.o(liwo& ta jest szcze"lnie cenna, je&li w pro"ramie wykorzystujesz np! tablic% a4cuchw6 deklarujc element skadowy tablicy jako strin"X2GY oszcz%dzasz 2CM bajtw, co przy stu elementach daje zysk ponad 2G kB! 8arto zauwa(y , (e prba zapisania do #skrcone"o$ a4cucha tekstu du(sze"o ni( pozwala deklaracja nie spowoduje b%du, a jedynie obci%cie nadmiarowych znakw! 3peracje na a4cuchach w zasadzie nie r(ni si% zapisem od operacji na zmiennych typu proste"o i nie wyma"aj stosowania (adnych specjalnych sztuczek! 5o wprowadzania, wyprowadzania i przypisywania a4cuchw wykorzystuje si% I podobnie jak dla zmiennych typw prostych I procedury readJlnL, writeJlnL oraz operator przypisania! 9wnie( porwnanie dwch a4cuchw zapisywane jest identycznie, przy czym #wewn%trznie$ odbywa si% ono przez porwnanie kodw odpowiadajcych sobie znakw! +ak wi%c6 Q)Q [ Q,ascalQ Jkod /S)00 znakuQ) jest mniejszy od koduQ,QL QcQ V Q,ascalQ Jkod /S)00 znakuQcQjest wi%kszy od koduQ,QL Q cQ V Q Q Jdowolny a4cuch jest wi%kszy od a4cucha puste"oL 1 rzeczy prostych pozostao jeszcze dodawanie a4cuchw, pole"ajce na ich zwykym #sklejaniu$ Jniestety, a4cuchw nie da si% odejmowa , mno(y ani dzieli L! Je(eli zmienna lancuch1 zawiera tekst Q+urboQ, za& lancuch2 I tekst Q,ascalQ, to wynikiem sklejenia obu zmiennych6
wynik 6P lancuchl T 0ancuch2O b%dzie oczywi&cie tekst Q +urbo,ascalQ!

9wnie( odwoania do poszcze"lnych znakw a4cucha realizuje si% w sposb elementarny! ,oniewa( mo(e on by traktowany jako tablica znakw, instrukcja sXMY 6P QKQ wstawi znak K na pit pozycj% w a4cuchu s! Bardziej wymy&lne operacje na a4cuchach wyma"aj u(ycia specjalnie do te"o celu przeznaczonych *unkcji, z ktrych najwa(niejsze opisano poni(ej6 ?en"th JsL I zwraca bie(c du"o& a4cucha sO )oncat Js1, s-! I skleja a4cuchy sl i s2 Jpodobnie, jak operator TL )opy Js, m, nL I zwraca poda4cuch o du"o&ci m znakw wyci%ty z a4cucha s poczynajc od pozycji nO ,3S Jch, sL I zwraca numer pozycji, na ktrej w a4cuchu s znajduje si% znak chO 5eleteJs, m, nL Iusuwa n znakw z a4cucha s poczynajc od pozycji m! Jak powiedziano wy(ej, aktualn du"o& a4cucha mo(na odczyta *unkcj ?en"th Jlub przez bezpo&rednie odwoanie do zerowej komrki a4cuchaL! /by zmieni du"o& dynamiczn a4cucha, musisz u(y konstrukcji
sXGY 6P chrXnY

"dzie n jest (dan du"o&ci Jponiewa( a4cuch skada si% ze znakw, musimy przeksztaci liczb% n na odpowiadajcy jej znak *unkcj chrL! ,oniewa( operacja ta czasem przynosi niezbyt po(dane e*ekty, lepiej jej unika ! ,rzytoczony poni(ej pro"ram pa4cuchy demonstruje niektre mo(liwo&ci obrbki a4cuchw i w zasadzie nie wyma"a dodatkowe"o komentarza! ,oza wywoaniami opisanych wy(ej procedur znalaza si% w nim rwnie( *unkcja up)ase, przeksztacajca ma liter% al*abetu na du(! 3peruje ona co prawda na typie znakowym, jednak typowe jej zastosowanie sprowadza si% do konwersji caych a4cuchw, jak pokazano ni(ej!
program `ancuch3;

Strona numer A8 z 82

- 9emonstrac:a operac:i na 0a?cuchach 1

const R* = 4Rur.o *ascal to .om.a4; var sl, s' : string; i : integer; begin sl := R*; - pr/3pisanie 1 s= := 44; - :.w., 0a?cuch pust3 1 for i := l to Pength(sl) do s= := s= ) 4 4; - dodawanie 0a?cuch<wI/na,<w 1 writeln(sl); i := 8os(4a4, sl); - w3s/u,anie /na,u 1 s=[i] := MOM; - wstawienie /na,u 1 writeln(s=); i co / tego w3ni,0oY 1 9elete(sl, l, %); - usuniKcie c/K5ci 0a?cucha 1 writeln(sl); for i := Pength(sl) downto l do - w3pisanie 0a?cucha 1 - od t30u 1 write(sl[i]); writeln; for i := l to Pength(sl) do - /amiana na du;e /na,i 1 write(^pUase(sl[i])); writeln; sl := Uop3(R*, l, $"); - w3ciKcie pod0a?cucha 1 for i := Pength(sl) downto l do begin writeln (sl);

9ec(sl[']); - s,racanie 0a?cucha 1 end; end.

'a zako4czenie te"o rozdziau wspomnimy o alternatywnej metodzie reprezentowania danych tekstowych I tak zwanych +aMcuc$ac$ zakoMczonyc$ zerem Jan"! nullAterminated string!" zwanych te( /S)001! pa4cuch /S)001 Jpodobnie jak strin"L jest zwyk tablic znakw, jednak nie posiada pola przechowujce"o du"o& O w zamian za to je"o koniec sy"nalizowany jest znakiem o kodzie 3 Jnie myli ze znakiem #3$L! >*ektywna pojemno& a4cucha /S)001 o"raniczona jest wielko&ci dost%pnej pami%ci Jw praktyce do AF kBL a wi%c jest znacznie wi%ksza, ni( dla typu strin"! pa4cuchy /S)001 Jdost%pne poczwszy od wersji E!G +urbo ,ascalaL deklarowane s jako zwyke tablice znakw indeksowane od zera, np!6
ear Bard/o9lugiPancuch : arra3[L..$''''] of char;

>lementarna obsu"a a4cuchw /S)001 Jwczytywanie, wyprowadzanie, przypisywanieL realizowana jest tak samo, jak dla zwykych a4cuchw, pod warunkiem wczenia tzw! rozszerzonej skadni dyrektyw kompilatora cgKTd )Options4Compiler4E*tended S#nta*&' Bardziej zo(one operacje na a4cuchach /S)001 Jkopiowanie, porwnywanie, przeszukiwanie, konwersja do typu strin" i eice eersaL realizowane s przez procedury zawarte w module bibliotecznym strin"s Jo moduach wkrtceL i nie b%d tu omawiane! 8arto wreszcie wspomnie o typie wskaHnikowym ,)har, umo(liwiajcym manipulowanie na dynamicznie tworzonych i usuwanych a4cuchach /S)001! ,oniewa( w wi%kszo&ci przypadkw typ strin" znakomicie spenia swoje zadanie, poprzestaniemy na powy(szych wzmiankach, odsyajc zainteresowanych )zytelnikw do systemu pomocy i literatury X2, CY! 8 nast%pnym rozdziale zajmiemy si% problemem braku pami%ci, czyli wspomnianym przed chwil dynamicznym tworzeniem i usuwaniem zmiennych!

@apami!taj
5o przechowywania danych tekstowych JnapiswL su(y w +urbo ,ascalu typ strin"! pa4cuch typu strin" jest specy*iczn tablic o pojemno&ci do 2MM znakw, przy czym bie(ca du"o& a4cucha przechowywana jest w zerowej komrce tablicy! 1akres podstawowych operacji na a4cuchach obejmuje wprowadzanie, wyprowadzanie, przypisywanie i porwnywanie Jrealizowane za pomoc #standardowych$ procedur i operatorwL! Bardziej zaawansowane operacje na a4cuchach to kopiowanie, przeszukiwanie, wycinanie i skracanie! 3peracje te realizowane s za pomoc specjalnych *unkcji i procedur! +urbo ,ascal E!G umo(liwia rwnie( korzystanie z a4cuchw zako4czonych zerem J/S)001L!

Strona numer A@ z 82

+i!cej pami!ci;
Jak by mo(e jeszcze pami%tasz, przyst%pujc do pisania nasze"o pro"ramu biblioteczne"o okre&lili&my maksymaln liczb% pozycji JrekordwL na okoo EMG! 3"raniczenie to wynikao z wielko&ci dost%pnej pami%ci, ktr z kolei oszacowali&my na z "rubsza AF kB! 5lacze"o jednak tylko tyle2 8 chwili obecnej trudno jest znale0 komputer ,) posiadajcy mniej ni( l .B pami%ci, za& standardem jest 8 lub 1A .B! )o prawda system operacyjny 53S, pod nadzorem ktre"o pracuj pro"ramy pascalowe, umo(liwia dost%p tylko do AFG kB, ale i tak pro"ram
progra( 0le,amieciO begin writeln(4Nas/ w te: chwili 4, NemOAail, 4 .a:t<w wolne: pamieci.4); end.

poka(e zapewne liczb% wi%ksz od AF kB! Jak zatem dobra si% do pozostaej pami%ci2 1aczniemy od maej dawki teorii! 8szystkie zmienne, ktrymi posu"iwae& si% do tej pory, nale(ay do klasy zmiennych "lobalnych Jje&li zde*iniowae& je na pocztku pro"ramuL lub lokalnych Jje(eli zostay zde*iniowane w procedurachL! 1mienne "lobalne umieszczane s w tzw! segmencie danyc$" ktre"o wielko& wynosi AF kB i jest staaO zmienne lokalne przechowywane s w segmencie stosu" ktre"o wielko& mo(na zmienia w "ranicach od l do AF kB! 1mienne "lobalne s statyczne" tj! istniej przez cay czas wykonywania pro"ramu, natomiast zmienne lokalne #(yj$ tylko tak du"o, jak du"o wykonuj si% posiadajce je procedury lub *unkcje! Noniec ko4cw, na zmienne mo(emy przeznaczy co najwy(ej 128 kilobajtw, z cze"o AF kB dost%pne jest #warunkowo$! Skoro jednak pro"ram 0le,amieci pokaza Jmam nadziej%!!!L, (e pami%ci masz nieco wi%cej, musimy znaleH sposb na jej wykorzystanie! Sposobem tym s tak zwane zmienne wskazywane 8 odr(nieniu od #zwykych$ zmiennych, zmienne wskazywane mo" by umieszczane w dowolnym miejscu pami%ci, z czym wi(e si% nieco inny sposb odwoywania do nich, wykorzystujcy tzw! wska0niki 8skaHnik do zmiennej jest po prostu jej adresem, czyli liczb opisujc jej poo(enie w pami%ci! 9(nic% pomi%dzy zmienn statyczn a wskazywan ilustruje poni(szy rysunek6
aL bL adres C)/A;h KfP12CF

Se"ment danych

,ro"ram

KP12CF

Se"ment danych KPC)/A;h 2

,ami%

,ami%

Rysunek 19. #posb obs+ugi zmiennyc$ statycznyc$ 7a! i wskazywanyc$ 7b! Jak wida , dost%p do zmiennej wskazywanej odbywa si% dwuetapowo, za po&rednictwem wskaHnika6 pro"ram odczytuje warto& te"o ostatnie"o Jczyli adres zmiennejL i na jej podstawie odwouje si% do wa&ciwej zmiennej, poo(onej w pami%ci w miejscu opisanym adresem Jw naszym przypadku C)/A; szesnastkowoL! .etoda ta powoduje nieznaczne wydu(enie czasu dost%pu do zmiennej, ale pozwala za to umie&ci j praktycznie w dowolnym miejscu pami%ci Jdokadnie, zmienne wskazywane umieszczane s na tzw! stercie Jan"! $eap! I wydzielonym obszarze pami%ci zarzdzanym przez specjalne proceduryL! 5eklaracja wskaHnika do zmiennej okre&lone"o typu jest bardzo podobna do #zwykej$ deklaracji zmiennej i r(ni si% od niej jedynie symbolem wskaHnika JfL6
zmienna 6 ftyp

przy czym typ musi by identy*ikatorem typu proste"o lub zde*iniowane"o wcze&niej w sekcji type! 3dwoanie do same"o wskaHnika wy"lda dokadnie tak samo, jak dla ka(dej innej zmiennej, natomiast odwoanie do wskazywanej przez nie"o zmiennej zawiera dodatkowo znaczek /, tym razem poo(ony za nazw wskaHnika6

Strona numer EG z 82

,ro"ram

zmiennaf

/ oto kilka przykadw6 type

Ra.Beal = arra3[l..=''] of real; - ta.lica $'' lic/. real 1 *Ra.Beal = 4_Ra.Beal; - ws,aGni, do ta.lic3 1 stringlLL = string[$'']; - s,r<con3 0a?cuch 1 Aar Ra.Ra.Beal : arra3[l..=''] of *ta.Beal; - ta.lica ws,aGni,<w 1 *stringlLL : FstringlLL; - ws,aGni, do 0a?cucha 1 pi : 4_integer; - ws,aGni, do lic/.3 integer 1
Ra.Ra.Beal[$'] O ["'] := $=."&!; *stringlLLF := 4Pancuch d3namic/n34; writeln (*XtringlLLF) ;

'a szcze"ln uwa"% zasu"uje tu zmienna +ab+ab9eal, b%dca tablic wskaHnikw do tablic liczb rzeczywistych! Struktura te"o typu pozwala na e*ektywne przechowanie dwuwymiarowej tablicy skadajcej si% z 2GG wierszy Jwskazywanych wskaHnikamiL zawierajcych po 2GG liczb ka(dy, czyli w sumie FG tysi%cy liczb o obj%to&ci okoo 2FG kB 7 Smieszczon nieco ni(ej instrukcj% + ab + ab9e a l X l o Y / X C o Y 6 P 12!CFM mo(na wytumaczy jako odwoanie do trzydziestej komrki w dziesitym wierszu, czyli tablicy wskazywanej przez dziesity wskaHnik w tablicy +ab+ab9eal! Jak nietrudno si% ju( domy&li , "wnym zastosowaniem wskaHnikw jest obsu"a du(ych struktur danych Jnp! tablic rekordw, czyli katalo"w bibliotecznych!!!L! 1 te"o te( wz"l%du may sens ma deklaracja zmiennej pi, "dy( liczba typu inte"er zajmuje dwa bajty, za& wskaHnik I cztery! 8arto tu jeszcze wspomnie , (e oprcz wskaHnikw do obiektw konkretne"o typu +urbo ,ascal udost%pnia rwnie( wskaHniki amor*iczne, tj! wskazujce na obszar pami%ci i nie zwizane z (adnym konkretnym typem! 8skaHnik taki deklarowany jest sowem pointer 7wska0nik! i jest z"odny pod wz"l%dem przypisania z innymi typami wskaHnikowymi! +yp pointer i zwizane z nim operacje wykorzystywane s przez bardziej zaawansowanych pro"ramistw do bezpo&rednie"o, #niskopoziomowe"o$ manipulowania zawarto&ci pami%ci! 5ru" bardzo wa(n i po(yteczn cech zmiennych wskazywanych jest mo(liwo& ich tworzenia i niszczenia w zale(no&ci od potrzeb! 8yma"a to co prawda u(ycia specjalnych procedur, pozwala jednak na znacznie bardziej e*ektywn "ospodark% pami%ci! 8 odr(nieniu od statycznych zmiennych "lobalnych, istniejcych przez cay czas wykonywania pro"ramu, zmienne wskazywane nale( do klasy zmiennych dynamicznyc$ Jczyli istniej dokadnie wtedy, "dy (yczy sobie te"o pro"ramistaL! Sam proces utworzenia zmiennej dynamicznej pole"a na zarezerwowaniu odpowiednie"o obszaru pami%ci i zapami%taniu adresu te"o obszaru we wskaHniku wskazujcym na zmienn! 1 kolei usuni%cie zmiennej powoduje #zwolnienie rezerwacji$ Jzawarto&ci zmiennej oraz wskaHnika nie s *izycznie niszczone, ale lepiej si% ju( do nich nie odwoywa L! )en za mo(liwo& swobodne"o przydzielania i zwalniania pami%ci jest konieczno& bezwz"l%dne"o inicjalizowania wskaHnikw, ktre przed utworzeniem wskazywanej zmiennej maj warto& nieokre&lon Jzwykle zero, co odpowiada wskaHnikowi nil, nie wskazujcemu na (aden obiektL! ,rba odczytu zmiennej wskazywanej przez taki wskaHnik dostarczy #tylko$ bezsensowne"o wyniku, natomiast prba zapisu Jw przypadkowe miejsce pami%ci77L mo(e sko4czy si% zawieszeniem komputera lub zupenie nieprzewidzianym je"o zachowaniem! *ami)taj o inicjalizacji wska0nikwU +urbo ,ascal o*eruje kilka metod tworzenia i usuwania zmiennych dynamicznych, z ktrych najpopularniejsz realizuje para procedur new i dispose6
new(ws,aGni,7do7/mienne:) dispose(ws,aGni,7do7/mienne:)

,rocedura new wykonuje czynno&ci zwizane z utworzeniem zmiennej wskazywanej, natomiast dispose I operacje zwizane z jej usuni%ciem! 5ru" par% zarzdzajc dynamicznym przydziaem pami%ci tworz procedury :et.em i ;ree.em6
GetMem(wskanik,

8 odr(nieniu od pary newDdispose, procedury te wykorzystuj wskaHniki amor*iczne Jtypu point e rL i su( do bardziej #wewn%trzne"o$ manipulowania pami%ci, tj! przydzielania i zwalniania blokw bajtw Ja nie zmiennych wskazywanych jakie"o& konkretne"o typuL! 8ielko& przydzielane"o lub zwalniane"o bloku Jw bajtachL okre&la parametr rozmiarDbloku! Norzystajc z obu "rup procedur musisz pami%ta , (e pami% przydzielona przez :et.em nie mo(e by zwolniona procedur dispose i odwrotnie! 3statni, chyba najrzadziej stosowan par% tworz procedury mark i release6
mar,(ws,aGni,) release(ws,aGni,)

rozmiar-bloku) FreeMem(wskanik,

rozmiar-bloku)

8ykonanie procedury mark nie powoduje przydzielenia pami%ci ani utworzenia zmiennej, a jedynie zapami%tanie bie(cej #wysoko&ci$ sterty w zmiennej wskaHnik! 1wolnienia cae"o obszaru sterty le(ce"o powy(ej wskaHnika dokonuje si% za pomoc procedury release! 3bydwie procedury stosowane s I podobnie jak :et.em i ;ree.em I "wnie w pro"ramowaniu niskie"o poziomu, do #masowe"o$ zwalniania pami%ci przydzielonej na stercie! Norzystajc ze zmiennych dynamicznych musisz pami%ta , (e sterta nie jest automatycznie porzdkowana, tote( kolejne operacje przydzielenia i zwolnienia blokw pami%ci Jdowoln

Strona numer E1 z 82

metodL mo" doprowadzi do tzw! 'ragmentacji" czyli rozbicia wolne"o jeszcze obszaru pami%ci na mniejsze, rozczne bloki! ,oniewa( rozmiar tworzonej zmiennej dynamicznej nie mo(e by wi%kszy od rozmiaru najwi%ksze"o wolne"o bloku pami%ci, mo(e si% okaza , (e prba utworzenia zmiennej sko4czy si% niepowodzeniem, mimo i( wielko& dost%pnej pami%ci b%dzie wystarczajca! 5late"o te( wa&ciw miar mo(liwo&ci utworzenia wi%kszej struktury danych na stercie jest nie *unkcja .em/eail Jzwracajca sumaryczny rozmiar wolnej pami%ciL, lecz .aK/eail Jzwracajca rozmiar najwi%ksze"o wolne"o blokuL! ,ora na przykady! 'a pocztek przedstawimy #zbiorcz$ demonstracj% mo(liwo&ci obsu"i zmiennych dynamicznych!
program Tmienne93namic/ne; type
Ra.Beal = arra3[l..!'''] of real; - ta.lica lic/. 1 - r/ec/3wist3ch 1 *Xtring = (string; - ws,aGni, do 0a?cucha 1 Aar s : *Xtring; - /mienna t3pu ws,aGni, do 0a?cucha 1 Ra.Ra.Beal : arra3[l..$''] of O Ra.Beal; - ta.lica 1 - ws,aGni,<w 1 Xterta : pointer; - ws,aGni, w3so,o5ci stert3 1 i : integer; - pomocnic/3 lic/ni, 1 procedur Mle*amieci; begin writeln(4Qolne: 4, NemOAail, 4 maE. .lo,: 4, NaEOAail, 4 .a:tow.4); end; begin writeln(XF); - /mienna nie utwor/ona 1 new(s); - wiKc :D twor/3m3 1 writeln(XF); - utwor/ona, lec/ nie /ainic:ali/owana 1 XF := 4Jo wres/cie>4; - inic:ali/u:em3 1 writeln(XF); - tera/ :est LC 1 dispose(s); - usuwam3 1 writeln (XF); - /mienna nie /osta0a ca0,owicie /nis/c/ona> 1 mar,(Xterta); - /a/nac/am3 4po/iom4 stert3 1 i := $; - twor/3m3 ta.licK ta.lic d3namic/n3ch 1 while NemOAail a Xi/eLf(Ra.Beal) do - t3le wiers/3 ) ) ile siK da * begin Mle*amieci; - ile mam3 pamiKciY 1 new(Ra.Ra.Beal[i]); - twor/3m3 now3 wiers/ 1 Mnc(i); - /wiK,s/am3 inde,s wiers/a 1 end; dispose(Ra.Ra.Beal["]); - usuwam3 :eden wiers/ ta.lic3 1 Mle*amieci; release (Xterta); - /walniam3 hurtem ca0D pamiK6 1 Mle*amieci; end.

,ierwsza cz%& pro"ramu demonstruje etapy tworzenia, wykorzystania i usuni%cia zmiennej wskazywanej Jw naszym przypadku a4cuchaL za pomoc procedur new i dispose! 1auwa(, (e utworzenie zmiennej wskazywanej nie jest rwnoznaczne z jej inicjalizacj, a po wykonaniu procedury dispose tre& a4cucha nie jest niszczona, chocia( mo(e by niekompletna! 5ru"a cz%& tworzy typow struktur% wielkiej tablicy, przydzielajc pami% dla poszcze"lnych wierszy, dopki to jest mo(liwe! 1auwa(, (e po usuni%ciu trzecie"o wiersza tablicy na o" okazuje si%, (e rozmiar najwi%ksze"o dost%pne"o bloku jest mniejszy od cakowite"o rozmiaru wolne"o obszaru sterty, co uniemo(liwia tworzenie wi%kszych struktur dynamicznych! 8reszcie instrukcja release zwalnia ca stert% QwzwyR poczwszy od miejsca zarejestrowane"o w zmiennej sterta! 'a zako4czenie te"o rozdziau sprbujemy wykorzysta mechanizmy zmiennych dynamicznych do lepsze"o za"ospodarowania pami%ci w pro"ramie obsu"i biblioteki! ,odane ni(ej in*ormacje b%d miay z konieczno&ci charakter wskazwek, powinny jednak umo(liwi )i skuteczne wprowadzenie zmian do pro"ramu! ,rzede wszystkim nale(y zadeklarowa odpowiednie struktury danych6
type

- ... 1

*Csia/,a = FCsia/,a; var Catalog : arra3[l. . ='''] of *Csia/,a;

i usun zb%dne ju( de*inicje staych okre&lajcych o"raniczenia pami%ciowe! ?iczba 2GGG w deklaracji tablicy Natalo" zostaa wybrana arbitralnie J2GGG pozycji to okoo 1EG kBL! Nolejnym krokiem jest zmody*ikowanie wszystkich procedur korzystajcych z parametrw typu Nsi(ka przez zmian% typu parametru na ,Nsiazka, np!6
procedur Qprowad/9ane$var r : *Csia/,a);

co umo(liwi im operowanie na zmiennych wskazywanych parametrem! 3czywi&cie w tre&ci tak zmody*ikowanej procedury nale(y wszystkie odwoania do #zwyke"o$ parametru zastpi odwoaniami wykorzystujcymi wskaHnik, np!6
with rf do c!!! d

.ody*ikacja procedury sortujcej jest zb%dna, a nawet niepo(dana! 8 nowym pro"ramie zamiana rekordw przyjmie *orm% zamiany wskaHnikw, co oczywi&cie b%dzie szybsze i bardziej e*ektywne ni( kopiowanie caych

Strona numer E2 z 82

rekordw! 8szelkie wywoania procedur pozostan niezmienione, chocia( *aktycznie zamiast rekordu zawsze przekazywany b%dzie wskaHnik do rekordu! 'atomiast wszystkie bezpo&rednie odwoania do pl rekordw zapisanych w tablicy Natalo" nale(y zastpi odwoaniami wykorzystujcymi wskaHniki6
Catalog[P.*o/]O.Pic/ni, := ';

'ie wolno rwnie( zapomnie o uzupenieniu procedur tworzcych i usuwajcych rekordy o wywoania procedur new i dispose, ktrych brak spowoduje najpewniej byskawiczne zawieszenie komputera6
procedur 9oda:Csia/,e; - ... 1 writeln(4Jowa po/3c:a w ,atalogu: 4, Pic/ni,); new (Catalog[Pic/ni,]); - utw<r/ now3 re,ord w ,atalogu 1
procedur ^sunCsia/,e(Jumer : integer); begin dispose(Catalog[Jumer]); - . . . 1

,odobnie musisz postpi z procedur odczytaj15ysku Jw procedurze zapisu usuwanie rekordw nie jest konieczne, ale przydzielona pami% powinna zosta zwolniona przed zako4czeniem dziaania pro"ramuL! ,owy(sze wskazwki nie obejmuj operacji pomocniczych, jak np! sprawdzanie mo(liwo&ci utworzenia kolejne"o rekordu! ,owinny one jednak wystarczy )i do skuteczne"o zmody*ikowania pro"ramu!

@apami!taj
5o przechowywania wi%kszych ilo&ci danych mo(esz w ,ascalu wykorzysta zmienne wskazywane JdynamiczneL! 1mienne wskazywane s umieszczane na tzw! stercie Jteoretycznie w dowolnym miejscu pami%ciL! .o" one by tworzone i niszczone dynamicznie, w zale(no&ci od potrzeb! 1mienna wskazywana lokalizowana jest za pomoc wskaHnika, ktry zawiera jej adres Jmiejsce w pami%ciL! 8skaHniki mo" wskazywa na zmienne konkretne"o typu, mo" te( by wskaHnikami amor*icznymi JpointerL! ,rzed wykorzystaniem zmiennej dynamicznej nale(y j utworzy Jprocedur new!" a po wykorzystaniu I usun Jprocedur disposeL! 5o przydzielania i zwalniania blokw pami%ci na stercie su( rwnie( procedury :et.em, ;ree.em, mark i release!

Strona numer EC z 82

Po,&teczne dro"iazgi5 cz&*i modu'& "i"*ioteczne


0le razy zastanawiae& si%, jak wyczy&ci ekran, zmieni kolor tekstu czy wprowadzi znak z klawiatury bez naciskania klawisza >'+>92 8ykonanie tych czynno&ci nie wyma"a zachodu6 wystarczy wywoa odpowiedni procedur% biblioteczn! Jak sama nazwa wskazuje, procedura taka nie jest na stae #wbudowana$ w j%zyk pro"ramowania, lecz pobierana z oddzielne"o pliku JbibliotekiL i doczana do pro"ramu w trakcie tzw! konsolidacji Jnast%pujcej po kompilacjiL! ,ascalowe pliki biblioteczne nosz nazw% moduw Jan"! uni'! 8ersja E!G o*eruje pro"rami&cie dziesi% moduw standardowych6 System I wszystkie procedury standardoweO )rt I obsu"a monitora, klawiatury i "o&nikaO 53S I obsu"a *unkcji systemowych Jwywoania *unkcji systemu .SD53SLO :raph I obsu"a "ra*ikiO strin"s I obsu"a a4cuchw /S)001O 8in5os I odpowiednik moduu 53S wykorzystujcy a4cuchy /S)001O ,rinter Iobsu"a drukarkiO 3eerlay I obsu"a tzw! nakadekO +urboC I modu #uz"adniajcy$ z +urbo ,ascalem C!GO :raphC I obsu"a tzw! "ra*iki (wia Ju(ywanej w +urbo ,ascalu C!GL! 3ddzielna, obszerna "rupa moduw tworzy bibliotek% +urbo qision, ktr nie b%dziemy si% tutaj zajmowa ! Jak nietrudno zauwa(y , ka(dy modu #specjalizuje si%$ w okre&lonych operacjach Jwyjtkiem jest modu System, zawierajcy wszystkie procedury i *unkcje standardoweL! 'ajcz%&ciej u(ywane moduy JSystem, )rt, 5os, ,rinter i 3eerlayL umieszczono w specjalnym pliku +S9B3!+,?, adowanym do pami%ci wraz z 05> +urbo ,ascala, dzi%ki czemu ich zawarto& dost%pna jest natychmiast! Nod pozostaych moduw zapisany jest w odpowiednich plikach z rozszerzeniem !+,S! 'iezale(nie od te"o, czy kod moduu znajduje si% na dysku, czy jest adowany do pami%ci, aby wykorzysta dowolny je"o element, za na"wkiem pro"ramu musisz umie&ci deklaracj% uses nazwaDmoduuO Je&li wykorzystujesz kilka r(nych moduw, musisz rozdzieli ich nazwy przecinkami! )hocia( moduy traktowane s najcz%&ciej jako biblioteki procedur, zawieraj one rwnie( dane w postaci staych Jnp! de*iniujcych kolory, jak 9edP2L, zmiennych Jnp! ustalajcych sposb otwierania plikw I ;ile.ode, czy te( obsu"i monitora I 5irecteideoL i typw Jnp! 5ate+ime I typ rekordowy przeznaczony do przechowywania czasu i daty, ,oint+ype I typ opisujcy punkt na paszczyHnieL! 1arwno procedury, jak i dane mo(esz wykorzystywa bez o"ranicze4, a tak(e przysania wasnymi de*inicjami! ,ami%taj jednak, (e cen za dost%p do zawartych w module obiektw jest powi%kszenie obj%to&ci "otowe"o pro"ramu, wynikajce z doczenia #importowane"o$ kodu i danych! Je&li zale(y )i na minimalizacji wielko&ci kodu wynikowe"o, zastanw si%, czy koniecznie musisz u(ywa np! moduu )rt! :eneralnie jednak nale(y zaleci u(ywanie moduw bibliotecznych, "dy( daj one pro"rami&cie mo(liwo& skorzystania ze sprawdzonych rozwiza4 wielu problemw, zwalniajc od konieczno&ci wymy&lania ich na wasn r%k%! #tosuj modu+y biblioteczne Spo&rd wymienionych wy(ej moduw najcz%&ciej stosowane s6 )rt, umo(liwiajcy e*ektywn Ji e*ektownL obsu"% komunikacji z u(ytkownikiem, :raph, realizujcy operacje w trybie "ra*icznym, oraz 53S, umo(liwiajcy wykonywanie *unkcji systemowych! ,oniewa( omawianie tre&ci poszcze"lnych moduw jest kwesti dru"orz%dn Jnasza ksi(ka ma przede wszystkim uczy pro"ramowania, a nie su(y jako leksykon j%zykaL, a tak(e ze wz"l%du na szczupo& miejsca, o"raniczymy si% do omwienia kilku najpopularniejszych elementw moduw )rt i 53S wraz z prostymi przykadami! 1 tych samych przyczyn zrezy"nujemy z omawiania bardzo obszernej zawarto&ci moduu :raph, odsyajc zainteresowanych )zytelnikw do literatury X2Y! 1aczniemy od moduu )rt, wspoma"ajce"o operacje wej&cia i wyj&cia z u(yciem konsoli! 1 procedur #ulepszajcych$ obsu"% ekranu i klawiatury chyba najcz%&ciej wykorzystywana jest bezparametrowa procedura )lrScr, powodujca wyczyszczenie ekranu! ,rzykad jej u(ycia znajdziesz w *unkcji .enu nasze"o pro"ramu biblioteczne"o! Je&li dodatkowo przy okazji czyszczenia ekranu chciaby zmieni kolory, mo(esz wykorzysta procedury +eKt)olor i +eKtBack"round6 +eKt)olorJkolorDtekstuL
ReEtBac,ground(,olor7t0a)

zmieniajce odpowiednio kolor znakw oraz ta! 3czywi&cie zamiast liczbowych warto&ci kolorw Jkto by je pami%ta!!!L najlepiej stosowa stae symboliczne Jnp! BluePl dla koloru niebieskie"oL! >*ekt dziaania obu procedur widoczny jest dopiero po wykonaniu kolejnych operacji wyj&cia Jlub wyczyszczenia ekranuL, za&

Strona numer EF z 82

bie(ce warto&ci kolorw przechowywane s w zmiennej +eKt/ttr! ,rocedura :otoW^ su(y do wyprowadzania tekstu na zadanych wsprz%dnych Jekran tekstowy liczy sobie 2M wierszy po 8G znakwO wiersze i znaki numerowane s od 1L! ,rzykadowe wywoanie
*or i 41 l to 2F do begin :otoW^Ji,iLO writeJQ`QLO endO

wy&wietli na ekranie uko&n lini% zo(on z "wiazdek! 1bli(one zastosowanie ma procedura window6
8indowJKl, yl, K2, y2L

umo(liwiajca wyznaczenie na ekranie okienka o"raniczajce"o obszar wypisywania tekstu do prostokta o wsprz%dnych Kl, yl Jlewy "rny r"L i K2, y2 Jprawy dolny r"L! 5ziaanie procedury window najlepiej ilustruje poni(szy przykad6
Qindow($', $', =', ='); - o,ien,o $'E$' 1 write(4Q t3m o,ien,u w3pisu:e sie .ard/o dlugi te,st4);

3bydwie procedury umo(liwiaj skuteczne tworzenie adnych menu czy #*ormularzy$ niewielkim nakadem kosztw, chocia( cz%sto okazuje si%, (e lepiej w tym celu wykorzysta np! bibliotek% +urbo qision! /by wprowadzi z klawiatury pojedynczy znak bez naciskania klawisza >'+>9 warto wykorzysta *unkcj% 9eadNey! 1wraca ona kod /S)00 znaku odpowiadajce"o klawiszowi albo I w przypadku naci&ni%cia klawisza *unkcyjne"o lub specjalne"o I tzw! rozszerzony kod klawisza poprzedzony znakiem o kodzie 3 Jw tym przypadku konieczne s dwa wywoaniaL! ;unkcja 9eadNey jest stosowana "wnie do realizacji menu 7yide pro"ram Natalo"L i innych wymy&lniej szych operacji wykorzystujcych klawiatur%! Spokrewniona z ni *unkcja Ney,ressed su(y do badania stanu bu*ora klawiatury6 je&li przed jej wywoaniem naci&ni%to jaki& klawisz, zwrci ona warto& true 8arto pami%ta , (e Ney,ressed nie opr(nia bu*ora klawiatury, tote( kolejne wywoania b%d zwracay true a( do chwili, kiedy znak zostanie odczytany np! wywoaniem *unkcji 9eadNey! 1 te"o te( wz"l%du *unkcji Ney,ressed nale(y u(ywa bardzo ostro(nie, zast%pujc j w miar% mo(liwo&ci wywoaniem 9eadNey! 9ealizacj% e*ektw dHwi%kowych umo(liwiaj procedury Sound, 'oSound i 5elay! ,ierwsze dwie odpowiednio wczaj i wyczaj wewn%trzny "o&niczek komputera, powodujc "enerowanie dHwi%ku o cz%stotliwo&ci okre&lonej parametrem! ,rocedura 5elay umo(liwia ustalenie du"o&ci trwania dHwi%ku! ,oniewa( "o&nik komputera ,) obsu"iwany jest sprz%towo, musisz pami%ta o wyczeniu dHwi%ku procedur '3DSound, w przeciwnym przypadku mo(e on by "enerowany nawet po zako4czeniu pro"ramu! Nrtk demonstracj% e*ektw dHwi%kowych pokazano poni(ej6
*or i 41 l to : do begin

SoundJ1GGGLO c dHwi%k o cz%stotliwo&ci l k=z d 5elayJl33LO c opHnienie 1GG milisekund d 'oSoundO c wycz dHwi%k d 5elayJl33LO c jeszcze jedno opHnienie d endO

,rocedury i dane zawarte w module 53S wykorzystywane s znacznie rzadziej, "wnie przez bardziej do&wiadczonych pro"ramistw! ,ozwalaj one na wykonywanie operacji na systemie plikw, obsu"% ze"ara systemowe"o oraz zarzdzanie procesami Jpro"ramamiL i tzw! przerwaniami Jco jest zabaw nie zawsze bezpiecznL! >lementarne in*ormacje o systemie plikw mo(esz uzyska za pomoc *unkcji JprocedurL 5iskSize, 5isk;ree, :et5ir, ;ind;irst i ;ind'eKt! ,ierwsze dwie *unkcje zwracaj cakowit pojemno& oraz ilo& wolne"o miejsca dla zadane"o dysku Jw bajtachL, za& procedura :et5ir umo(liwia okre&lenie nazwy bie(ce"o katalo"u6
]et9ir(', s); -L o/nac/a d3s, .ie;Dc3 1 writeln(4Bie/ac3 ,atalog: 4, s); -s :est t3pu string 1 writeln(4*o:emnosc d3s,u: 4, 9is,Xi/e('), 4 .a:t<w.4); writeln(4Qolne mie:sce: 4, 9is,8ree ('), 4 .a:t<w. 4);

8arto wiedzie , (e dyski w systemie 53S numerowane s od jedynki Jktra odpowiada dyskowi /6L, za& warto& 3 oznacza zawsze dysk bie(cy! ,rocedury ;ind;irst i ;ind'eKt wykorzystywane s na o" do sprawdzania obecno&ci pliku na dysku i odczytu listy plikw zawartych w katalo"u! ,oni(ej przedstawiono typow konstrukcj% wy&wietlajc list% plikw zawartych w katalo"u "wnym dysku )6
;ind;irstJQc6U`!`Q, /ny;ile, 3pis,likuLO c znajdH pierwszy d c plik d w.ile 5os>rror P 3 do c szukaj a( do wyczerpania plikw d begin ;ind'eKt J3pis,likuLO c znajdH kolejny plik d writelnJ3pis,liku!'ameLO endO

,rocedura ;ind;irst znajduje pierwszy plik o nazwie zadanej pierwszym parametrem i tworzy tzw! rekord opisu pliku Jzmienna 3pis,liku typu Search9ecL, wykorzystywany nast%pnie przez ;ind'eKt do wyszukiwania kolejnych plikw! 1mienna 5os>rror przechowuje wynik ostatnio wykonanej *unkcji systemu operacyjne"o Jw naszym przypadku I *unkcji wyszukania plikuL, przy czym warto& 3 odpowiada wykonaniu bezb%dnemu, natomiast pozostae warto&ci s kodami odpowiednich b%dw zwracanymi przez 53S! 'a tym zako4czymy nasze krtkie spotkanie z moduami bibliotecznymi! 1 konieczno&ci omwili&my w nim za"adnienia najbardziej

Strona numer EM z 82

podstawowe, pomijajc szcze"owy opis zawarto&ci moduw! Je&li oka(e si%, (e jest )i potrzebna jaka& *unkcja lub struktura danych, najlepiej zrobisz prze"ldajc odpowiednie tematy systemu pomocy, ewentualnie odwoujc si% do literatury! 8 kolejnym rozdziale poka(emy, jak tworzy wasne moduy i jakie z te"o pyn korzy&ci!

@apami!taj
,ascalowe moduy biblioteczne zawieraj wiele u(ytecznych procedur i struktur danych! /by odwoa si% do zawarto&ci moduu, musisz umie&ci na pocztku pro"ramu deklaracj% uses! 8ykorzystanie moduw powoduje powi%kszenie obj%to&ci skompilowane"o pro"ramu! 'ajcz%&ciej wykorzystywanymi moduami s )rt Jobsu"a monitora i klawiaturyL, :raph Jobsu"a "ra*ikiL oraz 53S Jobsu"a wywoa4 *unkcji systemowychL!

Strona numer EA z 82

Modu'& w'asne
8 miar% rozwoju +woich umiej%tno&ci b%dziesz rozwizywa coraz bardziej zo(one problemy i pisa coraz bardziej zo(one pro"ramy! ,r%dzej czy pHniej staniesz te( przed konieczno&ci rozbicia pro"ramu na kilka prostszych *ra"mentw, czyli podzielenia "o na modu+y .oduowo& , b%dca jedn z podstawowych zasad dobre"o pro"ramowania, jest rozszerzeniem podej&cia proceduralne"o! Struktura modularna zakada wydzielenie *unkcji zajmujcych si% dan dziedzin Jnp! operacjami wej&ciaDwyj&ciaL i z"rupowanie ich w oddzielnych plikach! 9(nic% pomi%dzy pro"ramem #liniowym$ a pro"ramem moduowym realizujcym to samo zadanie przedstawia poni(szy rysunek!

Rysunek 13. #truktura programu Q liniowego R 7a! i modu+owego 7b! )o daje zastosowanie struktury moduowej2 Jak nietrudno zauwa(y , pro"ram #liniowy$ "rupuje wszystkie elementy w jednym pliku Hrdowym! ,rzy wi%kszych pro"ramach liczba wierszy kodu Hrdowe"o idzie w tysice, co z kolei drastycznie wydu(a czas potrzebny na znalezienie (dane"o *ra"mentu pro"ramu, po"arsza je"o czytelno& i utrudnia interpretacj% i uruchamianie! 3dpowiedni pro"ram o strukturze moduowej skada si% z kilku krtszych Ja wi%c atwiejszych do czytaniaL plikw zawierajcych *unkcje po"rupowane tematycznie Jco z kolei uatwia wyszukiwanie odpowiednich *ra"mentw pro"ramu i je"o uruchamianieL! *ierwsz korzyci z zastosowania struktury modu+owej jest poprawa czytelnoci kodu 0rd+owego oraz u+atwienie interpretacji i uruc$amiania programu 'ie do& te"o, raz napisane i przetestowane *unkcje i struktury danych mo" przyda )i si% w przyszo&ci! 3czywi&cie podczas pisania kolejne"o pro"ramu mo(esz wrci do odpowiednie"o tekstu Hrdowe"o i #potraktowa "o$ edytorem, kopiujc odpowiednie *ra"menty, jednak znacznie lepiej jest zamkn raz napisany kod w module! 5lacze"o2 ,o pierwsze, unikasz w ten sposb #przekopywania si%$ przez stare pro"ramy, wyszukiwania odpowiednich *ra"mentw i zo(onych nieraz operacji w edytorze, zast%pujc to wszystko zwykym doczeniem moduu! ,o dru"ie, pro"ramowanie z u(yciem bibliotek przypomina ukadanie klockw Jbez konieczno&ci zastanawiania si%, z cze"o zostay one zrobione i jak dziaaj I *achowo nazywa si% to ukrywaniem szczeg+w implementacyjnyc$! ,o trzecie, wykorzystanie wcze&niej napisanych i przetestowanych procedur i *unkcji uatwia uruchamianie pro"ramu Jzakadajc, (e klocki zostay zrobione solidnieL! ,odej&cie moduowe wymusza rwnie( na pro"rami&cie poprawne projektowanie elementw pro"ramu, co bez wtpienia przyniesie pro*ity w przyszo&ci! 'ie bez znaczenia jest te( kwestia czasowa Jraz skompilowany modu nie kompiluje si% ponownieL! 8ykorzystanie moduw daje wreszcie pro"ramistom mo(liwo& rozpowszechniania kodu w postaci skompilowanych bibliotek, bez konieczno&ci ujawniania tekstw Hrdowych! Crug korzyci z zastosowania struktury modu+owej jest moliwo +atwego wykorzystania wczeniej stworzonyc$ i przetestowanyc$ 'unkcji i struktur danyc$ 7ang reusability! oraz u+atwienie ic$ dystrybucji Jak ju( powiedzieli&my, konieczno& pro"ramowania moduowe"o przyjdzie z czasem I pro"ramy pisane przez )iebie obecnie s nieco za krtkie! 5late"o te( na razie o"raniczymy si% do przedstawienia o"lnych re"u

Strona numer EE z 82

tworzenia moduw i ich wykorzystania! 1a przykad posu(y nam krtki modu +est6
unit Rest; interface - se,c:a pu.lic/na 1 type float = real; function *ow(E, 3 : float) : float; - podnosi lic/.K E do potKgi 3 1 function MleQ3wolan : word; - /wraca lic/.K w3wo0a? fun,c:i *ow 1 implementation - se,c:a pr3watna 1

Aar Pic/ni, : word; - lic/ni, w3wo0a? fun,c:i 1


function *ow(E, 3 : float) : float; begin Mnc (Pic/ni,); *ow := eEp(32ln(E)); end; function MleQ3wolan : word; begin MleQ3wolan := Pic/ni,; end; begin - se,c:a inic:ali/ac:i 1 Pic/ni, := '; end.

.odu ten zawiera trzy zasadnicze sekcje6 publiczn Jinter* aceL, prywatn JimplementationL oraz inicjalizacyjn! Sekcja publiczna, otwierana sowem inter* ace, de*iniuje obiekty, ktre b%d #eksportowane$ z moduu na zewntrz! 1awiera on de*inicje staych i typw oraz deklaracje zmiennych, a tak(e tzw! deklaracje zapowiadajce procedur i *unkcji Jczyli po prostu ich na"wkiL! Sekcja publiczna stanowi jedyn bram%, przez ktr pro"ram korzystajcy z moduu mo(e dosta si% do je"o zawarto&ci6 wszelkie obiekty zde*iniowane wewntrz moduu lecz nie zadeklarowane w sekcji publicznej, b%d niewidoczne na zewntrz! 8arto rwnie( pami%ta , (e komunikacja z moduem jest wycznie jednostronna, tj! obiekty zde*iniowane w module nie mo" odwoywa si% do obiektw wykorzystujce"o "o pro"ramu! .o(liwe jest natomiast wykorzystanie w module inne"o moduu Jw tym celu po na"wku moduu nale(y umie&ci odpowiedni deklaracj% usesL! 5e*inicje obiektw zapowiedzianych w sekcji publicznej zawiera sekcja prywatna, otwierana sowem implementation! Jej zawarto& jest niewidoczna na zewntrz, co pozostaje w z"odzie z ide ukrywania szcze"w implementacyjnych6 obiekty prywatne wykorzystywane s najcz%&ciej do wewn%trznych potrzeb moduu, tak wi%c nie ma sensu ujawnianie ich na zewntrz! .o(liwe jest co prawda odwoywanie si% do *unkcji i procedur zadeklarowanych w sekcji inter* ace, ale #widoczno& $ sprowadza si% tutaj wycznie do znajomo&ci posu(enia si% dan *unkcj I wywoujcy pro"ram musi zna jej na"wek Jokre&lajcy sposb przekazania parametrw i odebrania wynikuL, natomiast znajomo& tre&ci nie jest mu do nicze"o potrzebna! 3statni sekcj moduu jest nieobowizkowa sekcja inicjalizacji, rozpoczynajca si% Jpodobnie, jak w zwykym pro"ramieL sowem kluczowym be"in! 0nstrukcje zawarte w sekcji inicjalizacji s wykonywane w chwili uruchomienia pro"ramu i zwykle wykoD rzystywane s Jjak sama nazwa wskazujeL do automatyczne"o ustalania je"o stanu pocztkowe"o Jnp! zapami%tywania kolorw ekranu w celu ich pHniejsze"o odtworzenia, inicjalizacji drukarki, automatyczne"o adowania plikw kon*i"uracyjnychL! )ao& moduu rozpoczyna si% na"wkiem o postaci unit nazwa Jan"! unit I moduL i ko4czy sowem kluczowym end Jz kropkL! +u uwa"a6 tre& moduu Jkod Hrdowy i wynikowyL zapami%tywana jest w oddzielnych plikach, ktrych nazwy musz by takie same, jak nazwa u(yta w na"wku Jw naszym przypadku tekst Hrdowy moduu nale(y umie&ci w pliku +>S+!,/S, za& kod wynikowy zostanie zapisany do pliku +>S+!+,SL! 8ymienione wy(ej sekcje powinny wyst%powa w takiej kolejno&ci, w jakiej zostay opisane, chocia( ka(d z nich mo(na pomin ! ,ospolitym zjawiskiem jest pomini%cie cz%&ci inicjalizacyjnej Jw chwili uruchomienia pro"ramu modu nie wykonuje (adnych operacjiL! ,omini%cie cz%&ci prywatnej spotykane jest "wnie w moduach deklarujcych wycznie stae, zmienne i typy! Brak cz%&ci publicznej automatycznie uniemo(liwia komunikacj% z moduem, tote( sytuacja taka spotykana jest niezwykle rzadko! 8r my do nasze"o przykadu! .odu +est zawiera w cz%&ci publicznej deklaracj% dwch *unkcji6 ,38, podnoszcej liczb% rzeczywist do pot%"i rzeczywistej, oraz Jznacznie mniej u(ytecznejL ile8ywolan, zwracajcej liczb% wywoa4 *unkcji ,38! Sekcja publiczna zawiera rwnie( de*inicj% proste"o typu zmiennoprzecinkowe"o
*loat!

Sekcja prywatna zawiera oczywi&cie de*inicje *unkcji zapowiedzianych w sekcji publicznej, jak rwnie( deklaracj% prywatnej zmiennej ?icznik! 1mienna ta przechowuje liczb% wywoa4 *unkcji ,38! ,oniewa( ?icznik jest niedost%pny z zewntrz Jsprbuj7L, je"o warto& zwracana jest przez *unkcj% ile8ywolan! 8arto tu wspomnie , (e wszelkie "lobalne zmienne prywatne moduu s statyczne, tj! przechowuj swoj warto& przez cay czas wykonywania pro"ramu! )z%& inicjalizacyjna zawiera jedn instrukcj%, inicjalizujc warto& zmiennej ?icznik na zero! 3 sensowno&ci te"o rozwizania nie trzeba chyba niko"o przekonywa ! 5o sprawdzenia dziaania nasze"o moduu wykorzystamy krtki pro"ram +est.odulu! ,ro"ram ten jest na tyle banalny, (e nie wyma"a komentarza!

Strona numer E8 z 82

program RestNodulu; uses Rest; Aar E : float; - w3,or/3stanie /definiowanego t3pu 1 begin writeln(4= do potegi = 4, *ow (=, ) : : &); E := $.!; writeln(4*i do potegi $.! = 4, *ow(*i, E): :&); writeln(48un,c:e *ow w3wo0ano 4, MleQ3wolan, 4 ra/3.4); end.

Jak wida , wykorzystanie wasne"o moduu odbywa si% dokadnie tak samo, jak standardowe"o moduu biblioteczne"o! Je&li przyjrzysz si% uwa(nie raportowi z kompilacji zauwa(ysz, (e przed skompilowaniem same"o pro"ramu +urbo ,ascal wy&wietli in*ormacj% o kompilacji moduu! ,o skompilowaniu pro"ramu na dysku powinien pojawi si% plik o nazwie +>S+!+,S, zawierajcy skompilowany kod wynikowy moduu! 3dpowiednie *ra"menty kodu s pobierane z pliku i doczane do kodu wynikowe"o pro"ramu w procesie konsolidacji! ,o utworzeniu pliku !+,S modu nie b%dzie kompilowany ponownie, o ile nie wprowadzisz zmian do kodu Hrdowe"o lub nie wydasz polecenia 8uild( wymuszajce"o bezwarunkowe skompilowanie wszystkich elementw skadowych pro"ramu! Jak powiedzieli&my na pocztku te"o rozdziau, za"adnienie moduw jest raczej #przyszo&ciowe$, tote( nie b%dziemy si% nim szerzej zajmowa ! 3d samej strony technicznej Jktrej opis mo(esz znaleH w literaturzeL wa(niejsza wydaje si% idea pro"ramowania Ji projektowaniaL moduowe"o, pozwalajca na szybkie i skuteczne tworzenie e*ektownych, e*ektywnych i bezb%dnych pro"ramw!

@apami!taj
- 1asada modularno&ci jest jedn z podstawowych zasad dobre"o pro"ramowania! Stosowana jest ona przede wszystkim podczas realizacji bardziej zo(onych zada4! - 9ealizacj% tej zasady umo(liwiaj w +urbo ,ascalu moduy! - .odu zawiera de*inicje i deklaracje obiektw zawarte w trzech sekcjach! Sekcja publiczna Jinter* aceL okre&la, ktre obiekty b%d widoczne na zewntrz, sekcja prywatna JimplementationL de*iniuje ich tre& Ja tak(e de*iniuje obiekty prywatne moduuL, natomiast sekcja inicjalizacyjna przeznaczona jest do automatyczne"o wykonywania zadanych czynno&ci w chwili rozpocz%cia pro"ramu! - 3biekty zde*iniowane w sekcji prywatnej s niewidoczne na zewntrz moduu, o ile nie zostan zadeklarowane w sekcji publicznej! - Skompilowana tre& moduw jest przechowywana w plikach o rozszerzeniu !+,S i doczana do wa&ciwe"o pro"ramu w procesie konsolidacji! - ,odzia pro"ramu na moduy oraz "rupowanie *unkcji, procedur i struktur danych w biblioteki "otowych elementw umo(liwia szybkie i skuteczne tworzenie e*ektywnych i bezb%dnych pro"ramw!

Strona numer E@ z 82

ak uruc6amia7 oporne program&


0m bardziej zo(ony pro"ram, tym mniejsza szansa, (e uda )i si% od razu napisa "o bezb%dnie! 8yapanie wszystkich b%dw kompilacji to dopiero pocztek6 zawsze mo(e )i si% przytra*i dzielenie przez zero czy prba otwarcia nieistniejce"o pliku! B%dy te, zwane b%dami wykonania Jan"! runtime errors!" s znacznie mniej przyjemne i trudniejsze do usuni%cia od b%dw kompilacji! 0ch lokalizacja wyma"a na o" u(ycia specjalne"o narz%dzia uruchomieniowe"o, zwane"o z an"ielska debuggerem Jczyli odpluskwiaczemL! System uruchomieniowy +urbo ,ascala b%dzie tematem ostatnie"o ju( rozdziau po&wi%cone"o temu kompilatorowi! ,olecenia systemu uruchomieniowe"o z"rupowane s w menu Run oraz Debug( przy czym wi%kszo&ci z nich odpowiadaj klawisze skrtu! 5o eksperymentw z debu""erem mo(na wykorzysta praktycznie dowolny pro"ram, chocia( warto, by zawiera on de*inicje procedur i zmiennych lokalnych! 5la naszych potrzeb odpowiedni b%dzie przedstawiony na stronie A2 pro"ram Bisekcja! Jak ju( wiesz, wystpienie b%du wykonania powoduje przerwanie dziaania pro"ramu i wskazanie kursorem instrukcji, ktra ten bd spowodowaa! 'iestety, na o" in*ormacja taka jest niewystarczajca, "dy( do skutecznej lokalizacji b%du wyma"ane jest prze&ledzenie zachowania pro"ramu na co najmniej kilka instrukcji przed je"o wystpieniem! .o(liwo& tak daje w nowoczesnych narz%dziach uruchomieniowych tzw! tryb krokowy" pozwalajcy na wykonywanie pro"ramu instrukcja po instrukcji! +urbo ,ascal pozwala na krokowe wykonywanie pro"ramu na dwa sposoby, realizowane odpowiednio poleceniami Trac$ 9nto i Step O1er z menu Run Jlub odpowiadajcymi im klawiszami ;E i ;8L! 9(nica pomi%dzy obydwoma trybami sprowadza si% do inne"o sposobu traktowania procedur i *unkcji6 polecenie Trac$ 9nto pozwala na #wej&cie$ do wn%trza procedury, za& Step O1er wykonuje j jako jedn instrukcj%! 8 obu przypadkach aktualnie wykonywana instrukcja zostaje wyr(niona w tek&cie pro"ramu kolorowym paskiem! /by wyprbowa dziaanie trybu krokowe"o, skompiluj pro"ram Bisekcja J;@L i wykonaj "o w obu trybach! 1auwa( te(, (e wydanie polecenia Program Reset J)+9?D;2L pozwala na zrestartowanie pro"ramu, co mo(e si% przyda "dy si% oka(e, (e dalsze je"o wykonywanie nie ma sensu! ,owy(sza wprawka nie przyniosa chyba (adnych niespodzianek i!!! niewiele in*ormacji! +ryb krokowy, pozwalajcy na ustalenie dro"i, jak #przebywa$ wykonanie pro"ramu, nie daje (adnych wskazwek na temat warto&ci przyjmowanych przez zmienne, ktre w wi%kszo&ci przypadkw s odpowiedzialne za sterowanie prac pro"ramu, a wi%c i ewentualne kolizje! 'a szcz%&cie podejrzenie zawarto&ci wybranej zmiennej jest bardzo atwe6 wystarczy do te"o polecenie E1aluate:modi"# J)+9?D;FL z menu Debug' Je"o wydanie powoduje wy&wietlenie okienka zawierajce"o in*ormacj% o warto&ci zmiennej oraz pozwalajce"o na jej zmian% Jtak7L!

Rysunek 14. *ole dialogowe E1aluate and .odi"#

8 pole E*pression wpisujemy wyra(enie Jnp! nazw% zmiennej, w naszym przypadku epsL, ktre"o warto& chcemy obejrze ! 8arto& wy&wietlana jest w polu Result( za& pole New 1alue umo(liwia jej zmian% Jz czym jednak nale(y nieco uwa(a L! )zasami okazuje si%, (e podejrzan zmienn nale(y &ledzi cay czas! 8 takiej sytuacji zamiast mao wy"odne"o pod"ldania poleceniem E1aluate lepiej jest u(y polecenia Watch J)+9?D ;EL! ,o je"o wydaniu Ji wpisaniu nazwy odpowiedniej zmiennej lub wyra(enia w okienku 2dd Watch& na dole ekranu pojawi si% okienko Watches( zawierajce warto&ci &ledzonych zmiennych Jw naszym przypadku zmiennej a, czyli lewej "ranicy przedziau poszukiwa4 pierwiastkaL!

Strona numer 8G z 82

Rysunek 1!. :kienko Batc$es

,oniewa( powrt do okienka edytora zwykle powoduje przysoni%cie okienka Watches( warto uporzdkowa ukad okienek na ekranie, np! przesuwajc je za pomoc myszki lub wydajc polecenie Tile z menu Window' 5ysponujc tymi wiadomo&ciami mo(esz ju( wykorzysta tryb krokowy i polecenia pod"ldania zmiennych do prze&ledzenia zachowania zmiennej c, b%dcej bie(c warto&ci pierwiastka! 8 przypadku wi%kszych pro"ramw mo(e si% okaza , (e dotarcie do *atalnej instrukcji z wykorzystaniem trybu krokowe"o jest zbyt czasochonne! 8 takich sytuacjach z pomoc przychodzi polecenie ;o to cursor J;FL, powodujce wykonanie wszystkich instrukcji a( do miejsca wskazane"o kursorem, a nast%pnie przej&cie do pracy krokowej! 8ykorzystujc je mo(esz atwo #wskoczy $ np! do wn%trza *unkcji *J&! bez konieczno&ci wykonywania instrukcji poprzedzajcych jej wywoanie! Je&li powy(sze czynno&ci masz wykonywa wielokrotnie, znacznie bardziej u(yteczne od *unkcji ;o to cursor okazuje si% polecenie 2dd brea point z menu Debug J)+9?D;8L! Je"o wydanie pozwala na ustawienie w miejscu wskazanym kursorem tzw! punktu wstrzymania" powodujce"o zatrzymanie pro"ramu po ka(dorazowym je"o osi"ni%ciu! 'ie do& te"o, dodatkowe parametry punktu wstrzymania )Condition i Pass coun"& umo(liwiaj je"o warunkowe wykonywanie lub zi"norowanie okre&lonej liczby przej& ! 3pcje te u(ywane s rzadko i nie b%dziemy ich tu omawia O w wi%kszo&ci przypadkw u(ycie punktw wstrzymania sprowadza si% do ich ustawiania i usuwania za pomoc klawiszy )+9?D;8 Jodpowiednia instrukcja zostanie wyr(niona w tre&ci pro"ramu kolorowym paskiemL! ,o doj&ciu pro"ramu do punktu wstrzymania na o" wystarczy sprawdzi zawarto& podejrzanej zmiennej poleceniem E1aluate lub Add Watch' Skrtowe omwienie polece4 systemu uruchomieniowe"o ko4czy nasze wprowadzenie do pro"ramowania i +urbo ,ascala! 5alsze wiadomo&ci zdob%dziesz korzystajc z bardziej zaawansowanej literatury, a przede wszystkim na drodze praktycznej I piszc pro"ramy! ,ami%taj6 Iorzystanie z komputera nie zwalnia od mylenia 0m wi%kszy nacisk poo(ysz na wa&ciwe zaprojektowanie rozwizania, tym mniej czasu b%dziesz musia po&wi%ci na je"o zapro"ramowanie i tym mniejsze szans%, (e b%dziesz musia odwoywa si% do pomocy &rodkw uruchomieniowych!!! ,owodzenia7

Strona numer 81 z 82

?iteratura
1! /! .arciniak6 9urbo *ascal 4 6" '/N3., ,ozna4, 1@@M 2! +omasz .! Sadowski6 *raktyczny kurs 9urbo *ascala" =elion, :liwice 1@@1, 1@@C! C! J! 1ahorski6 9urbo *ascal 4 6" =elion, :liwice 1@@M! ,S! Dten plik jest zlepkiem or"inalne"o e bookQa z ksi%"arni internetowej =elion ktry zajmuje ok 2E,M.b Jzkd taka wielko& L i dlacze"o zamiast 1CA mam tylko 82 Jczy(by kto& obciL r pewnie zastanawiasz si%! 'a pierwsze pytanie odpowiedH jest prosta oprcz skryptw i szy*rowania wydawnictwo =elion zamie&cio mas% reklamwek ktre powinny by linkowane w jednym pliku s wsadzone kopie w kazdym pliku czasami nawet dwa razy! ,od"ie obj%te& ksi(ki byataka wielka z powodu wykorzystania wi%kszych czcionek ni( to jest wyma"ane Jcho niektrzy napewno dostaj spazmy jakwidz te moje 1G,ML! 5odatkowo cz%& shematw bya tak oszpecona przez kompresj% (e sam miaem wielkie problemy z przeczytaniem sw! 8i%c oszcz%dzajc wzrok przysze"o urzytkownika stworzyem schematy Jtych ktre o to krzyczayL na nowo domy&lajc si%

znaczenia &laczkw z kontekstu, tym ko4cz% te post scriptum!

Strona numer 82 z 82

You might also like