Turbo Pascal - Programowanie Autor: Tomasz M. Sadowski ISBN: 83-86718-40-4 Format: B5, 136 strony Data wydania: 08/1996 ...
69 downloads
1142 Views
1MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Turbo Pascal - Programowanie Autor: Tomasz M. Sadowski ISBN: 83-86718-40-4 Format: B5, 136 strony Data wydania: 08/1996 WWW.PROGRAMOWANIE.TK
Jak wiesz, sam komputer jest jedynie zbiorem doœæ skomplikowanych uk³adów elektronicznych, które same z siebie nie s¹ w stanie wykonaæ jakiejkolwiek znacz¹cej operacji. Jego "inteligencja" bierze siê w ca³oœci z wiedzy, któr¹ przekazali mu programiœci w postaci odpowiedniego oprogramowania. Niniejsza ksi¹¿ka wprowadzi Ciê w fascynuj¹cy œwiat programowania w Turbo Pascalu. - Co to jest Problem, Metoda, Algorytm, Implementacja, Zdrowy rozs¹dek...? - Jak korzystaæ z edytora Turbo Pascala? - Od czego zacz¹æ, czyli jak obliczyæ pole ko³a za pomoc¹ komputera? - Czym siê ró¿ni ³añcuch od liczby rzeczywistej? - Do czego s³u¿y instrukcja warunkowa? - Jak rozwi¹zaæ dowolne równanie? - Co siê kryje pod tajemniczymi nazwami: funkcje i procedury? - Do czego s³u¿¹ tablice, a do czego pêtle? - Jak zapisywaæ dane w pliku na dysku? - Jak tworzyæ i korzystaæ z modu³ów bibliotecznych? - Jak uruchamiaæ "oporne" programy? Odpowiedzi na te i inne pytania znajdziesz w tej ksi¹¿ce! Wszystko opisane ¿ywym i barwnym jêzykiem, zilustrowane krótkimi, przejrzystymi i praktycznymi programami. Szkoda czasu, ¿eby przegryzaæ siê przez opas³e tomiska, aby nauczyæ siê podstaw programowania. Rozpocznij od tej krótkiej, ale niezwykle treœciwej ksi¹¿ki, dziêki której programowanie stanie siê szybkie, ³atwe i przyjemne...
Jak wiesz, komputer jest jedynie zbiorem skompliNRZDQ\FKXNáDGyZHOHNWURnicznych, które same ]VLHELHQLHVZVWDQLHZ\NRQDüMDNLHjNROZLHN]QDF]FHMRSHUDFML-HJRÄLQWHOLJHQFMD´ELHU]HVL z ZLHG]\NWyUSU]HND]DOLPXSURJUDPLFLZSRVWDFLRGSRZLHGQLHJRRSURJramowania. Niniejsza NVL*NDZSURZDG]L&L ZIDVF\QXMF\ZLDWSURJUDPRZDQLDZ7XUER3DVFDOX • &RWRMHVW3UREOHP0HWRGD$OJRU\WP,PSOHPHQWDFMD=GURZ\UR]VGHN" • -DNNRU]\VWDü]HG\WRUD7XUER3DVFDOD" • 2GF]HJR]DF]üF]\OLMDNREOLF]\üSROHNRáD]DSRPRFNRPSXWHUD" • &]\PUy*QLVL áDFXFKRGOLF]E\U]HF]\ZLVWHM" • 'RF]HJRVáX*\LQVWUXNFMDZDUXQNRZD" • -DNUR]ZL]DüGRZROQHUyZQDQLH" • &RNU\MHVL SRGWDMHPQLF]\PLQD]ZDPLÄIXQNFMHi procedury? • 'RF]HJRVáX*WDEOLFHDGRF]HJRS WOH" • -DN]DSLV\ZDüGDQHZSOLNXQDG\VNX" • -DNWZRU]\üLNRU]\VWDü]PRGXáyZELEOLWHF]Q\FK" • -DNXUXFKDPLDüÄRSRUQH´SURJUDP\" 2GSRZLHG]L QD WH L LQQH S\WDQLD ]QDMG]LHV] Z WHM NVL*FH :V]\VWNR RSLVDQH *\Z\P L EDUZQ\P M ]\NLHP]LOXVWURZDQHNUyWNLPLSU]HMU]\VW\PLLSUDNW\F]Q\PLSURJUDPDPL 6]NRGDF]DVX*HE\SU]HJU\]DüVL SU]H]RSDVáHWRPLVNDDE\QDXF]\üVL SRGVWDZSURJUDPRZDQLD 5R]SRF]QLMRGWHMNUyWNLHMDOHQLH]Z\NOHWUHFLZHMNVL*NLG]L NLNWyUHMSURJUDPRZDQLHVWDQLHVL V]\ENLHáDWZHLSU]\MHPQH
3URMHNWRNáDGNL0DFLHM3DVHN„ARTGRAF”
© HELION, 1996 ISBN: 83-86718-40-4 :V]HONLHSUDZD]DVWU]H*RQH 1LHDXWRU\]RZDQHUR]SRZV]HFKQLDQLHFDáRFLOXEIUDJPHQWXQLQLHMszej publikacji w jakiejkolwiek SRVWDFLMHVW]DEURQLRQH:\NRQ\ZDQLHNRSLLPHWRGNVHURJUDILF]QIRWRJUDILF]QDWDN*HNRSLRZDQLHNVL*NLQDQRQLNXILOPRZ\PPDJQHW\F]Q\POXELQQ\PSRZRGXMHQDUXV]HQLHSUDZDXtorskich niniejszej publikacji. :\VW SXMFHZWHNFLH]QDNLV]DVWU]H*RQ\PL]QDNDPLILUPRZ\PLEG(WRZDURZ\PLLFKSRVLDdaczy. $XWRURUD]:\GDZQLFWZR+HOLRQGRáR*\OLZV]HONLFKVWDUDE\]DZDUWHZWHMNVL*FHLQIRUPDFMH E\á\ NRPSOHWQH L U]HWHOQH 1LH ELRU MHGQDN *DGQHM RGSRZLHG]LDOQRFL DQL ]D LFK Z\korzystanie, DQL]D]ZL]DQH]W\PHZHQWXDOQHQDUXV]HQLHSUDZSDWHQWRZ\FKOXEDXWRUVNLFK Printed in Poland
6SLVWUHFL
3
Spis treci Po co mi programowanie? ....................................................................... 5 Co to jest programowanie?...................................................................... 8 -DNWRVL URELQDSUDZG " ...................................................................... 10 Problem........................................................................................................................ 10 Metoda ......................................................................................................................... 11 Algorytm....................................................................................................................... 11 Projekt..........................................................................................................................14 Implementacja..............................................................................................................15 Uruchomienie...............................................................................................................15 =GURZ\UR]VGHN .........................................................................................................16
1DU] G]LH ................................................................................................. 17 Zaawansowane funkcje edytora ..................................................................................22 =DSDPL WDM ...................................................................................................................25
Pierwszy program ................................................................................... 26 =DSDPL WDM ...................................................................................................................31
1LFQLHMHVWGRVNRQDáH ......................................................................... 32 =DSDPL WDM ...................................................................................................................36
Ulepszamy dalej ...................................................................................... 37 =DSDPL WDM ...................................................................................................................40
:\UD*HQLD ................................................................................................ 41
=DSDPL WDM ...................................................................................................................47
Instrukcja warunkowa ............................................................................ 48 =DSDPL WDM ...................................................................................................................51
5R]ZL]XMHP\GRZROQHUyZQDQLH ......................................................... 52 =DSDPL WDM ...................................................................................................................57
Funkcje i procedury ................................................................................ 59
4
Turbo Pascal — programowanie =DSDPL WDM ...................................................................................................................64
-DNSURJUDPSRUR]XPLHZDVL ]IXQNFM" .......................................... 66 =DSDPL WDM ...................................................................................................................73
Programowanie na SRZD*QLH................................................................. 75 7\S\VWUXNWXUDOQHF]\OLMDNSU]HFKRZDüZL FHMGDQ\FK ..................... 77 ZaSDPL WDM ...................................................................................................................84
Struktura programu ................................................................................ 85 7\S\LVWDáH .............................................................................................. 87
=DSDPL WDM ...................................................................................................................90
'RG]LHáD ................................................................................................. 91 3OLNLF]\OLMDNXFKURQLüGDQHSU]HG]JXE ......................................... 101 =DSDPL WDM .................................................................................................................109
àDFXFK\ ............................................................................................... 110
=DSDPL WDM .................................................................................................................113
:L FHMSDPL FL ..................................................................................... 114 =DSDPL WDM .................................................................................................................120
3R*\WHF]QHGURELD]JLF]\OL PRGXá\ELEOLRWHF]QH .............................. 121 =DSDPL WDM .................................................................................................................125
0RGXá\ZáDVQH ...................................................................................... 126 =DSDPL WDM .................................................................................................................130
-DNXUXFKDPLDüRSRUQH programy ...................................................... 131 Literatura ............................................................................................... 134
Po co mi programowanie?
5
Po co mi programowanie? =DQLP ]DJá ELP\ VL Z G\VNXVM R WDMQLNDFK SURJUDPRZDQLD Z\SDGDáRE\ RGSRZLHG]LHüQDSRGVWDZRZHS\WDQLHczy w ogóle jest Ci ono potrzebne? W zasadzie — QLH %UDN XPLHM WQRFL SURJUDPRZDQLD QLH SU]HV]NRG]L &L Z ]GDQLX PDWXU\QDSLVDQLXOLVWX]URELHQLX]DNXSyZF]\SURZDG]HQLXVDPRFKRGX1RPR*HRG F]DVXGRF]DVXE G]LHV]PXVLDá]DSURJUDPRZDüPDJQHWRZLGDOHF]\QQRüWD] „prawG]LZ\P´ SURJUDPRZDQLHP PD UDF]HM PDáR ZVSyOQHJR 7\P QLHPQLHM — skoro VL JQáHSRW NVL*N —PR*QD]DáR*\ü*HPDV]]DPLDU]DZU]HüEOL*V]]QDMRPRü z NRPSXWHUDPL$WRMX*]XSHáQLHLQQDVSUDZD -DNZLHV]VDPNRPSXWHUMHVWMHG\QLH]ELRUHPGRüVNRPSOiNRZDQ\FKXNáDGyZHOHNWURQLF]Q\FKNWyUHVDPH]VLHELHQLHVZVWDQLHZ\NRQDüMDNLHjNROZLHN]QDF]FHMRSHUDFML -HJR ÄLQWHOLJHQFMD´ ELHU]H VL Z FDáRFL ] ZLHG]\ NWyU SU]HND]DOL PX SURJUDPLFL w postaci odpowiedniego oprogramowania. Nawet tak trywialna operacja, jak wprowaG]HQLH SRMHG\QF]HJR ]QDNX ] NODZLDWXU\ ]ZL]DQD MHVW ] Z\Nonaniem sporej liczby operacji zakodowanych w oprogramowaniu systemowym. A co dopiero wyliczenie bilansu firmy czy wycieniowanie skomplikowanego rysunku... $]DWHPQLHPDPRZ\RIXQNFMRQRZDQLXNRPSXWHUDEH]RSURJUDPRZDQLD2F]\ZLFLH QLH R]QDF]D WR *H DE\ ZSURZDG]Lü ] NODZLDWXU\ VZRMH QD]ZLVNR PXVLV] FRNROZLHN prograPRZDüRGSRZLHGQLHIXQNFMH]RVWDá\MX*GDZQRXWZRU]RQHLSU]HND]DQHGRG\VSR]\FML X*\WNRZQLNyZ SRG SRVWDFL V\VWHPX RSHUDF\MQHJR L RSURJUDPRZDQLD X*\WNRZHJR 2 LOH QLH PDV] ]DPLDUX ]DMü VL WZRU]HQLHP SRGREQHJR RSURJUDPRZDQLD QLH PXVLV] QDZHW ZLHG]LHü MDN WDNLH IXQNFMH G]LDáDM FKRFLD* F]DVHP SU]\GDMH VL WR Z Uy*nych kryzysoZ\FK V\WXDFMDFK 7DN ZL F ]QDMRPRü SURJUDPRZDQLD QLH MHVW NRQLHF]QDGRREVáXJLNRPSXWHUD 0R*H Z WDNLP UD]LHSURJUDPRZDQLHMHVWSRWU]HEQHGRNRU]\VWDQLD]SURJUDPyZX*\WkoZ\FK" 2ND]XMH VL *H WH* QLH 1RZRF]HVQH HG\WRU\ WHNVWyZ DUNXV]H NDONXODF\MQH i LQQH SRZV]HFKQLH X*\ZDQH DSOLNDFMH ELXURZH SR]ZDODM QD Z\NRQ\ZDQLH Z\P\OQ\FK RSHUDFML SU]H] QDFLQL FLH NLONX NODZLV]\ OXE NOLNQL FLH P\V]N 7\SRZD
6
Turbo Pascal — programowanie NVL JRZD X*\ZDMFD ([FHOD SLVDU] SLV]F\ Z :RUG]LH F]\ JUDILN NRU]\VWDMF\ ] &RUHOD QLH PDM ]Z\NOH SRM FLD R SURJUDPRZDQLX — bo do niczego nie jest im ono potrzebne. No to o czym my w ogóle mówimy? —PyJáE\]DS\WDü2Wy*VSUDZDZFDOHQLHMHVW przesG]RQD 3U]HGH ZV]\VWNLP LVWQLHMH VSRUD JUXSD F]\WHOQLNyZ NWyU]\ ]DPLHU]DM SR]QDüVSoVRE\SU]\PXV]HQLDNRPSXWHUDGRZ\NRQ\ZDQLDGRNáDGQLHWHJRF]HJRVRELH ]D*\F] — F]\OL ZáDQLH PHWRG\ SURJUDPRZDQLD &] ü ] QLFK ]DSHZQH ]RVWDQLH w SU]\V]áRFL SURJUDPLVWDPL L ]DMPLH VL WZRU]HQLHP RSURJUDPRZDQLD V\VWHPRZHJR i u*\WNRZHJRG]LDáDOQRüWRZFDOHLQWUDWQD ,QQLSRGFKRG]F\GR]DJDGQLHQLDEDUG]LHM SR DPDWRUVNX ]DGRZRO VL VDW\sIDNFM LQWHOHNWXDOQ Sá\QF ]H ]UR]XPLHQLD ]DVDG G]LDáDQLD SURJUDPyZ L XPLHM WQRFL ]DSDQRZDQLD QDG VNRPSOLNRZDQ\P QDU] G]LHP MDNLPMHVWQRZRF]HVQ\NRPSXWHU-HV]F]HLQQLW\FKE G]LH]DSHZQHQDMZL FHM E GSR SURVWX Z\NRU]\VW\ZDü ]GRE\WH XPLHM WQRFL GR UR]ZL]\ZDQLD SUREOHPyZ VSRW\NDQ\FKZFRG]LHQQHMSUDF\QLHSUHWHQGXMFE\QDMmQLHMGRPLDQDSURJUDPLVWyZFKRüE\ nawet amatorów. Ale przHFLH*UyZQLHGREU]HPRJVNRU]\VWDü]MDNLHJRSURJUDPXX*\WNRZHJR. Zgoda, z SHZQ\P GUREQ\P ]DVWU]H*HQLHP 1RZRF]HVQH RSURJUDPRZDQLH MHVW Z VWDQLH ]URELü praZLHZV]\VWNR]DMHGQ\PQDFLQL FLHPNODZLV]DF]\NOLNQL FLHPP\V]N1LH]QDF]\ WRMHGQDN*HVSHáQLRQRZV]\VWNLHQDV]H*GDQLDDQLWH**HVSHáQLMHGRNáDGQLHWDNMDN E\P\ FKFLHOL 3R]D W\P GX*H ZV]\VWNR-ZLHG]FH-i-PRJFH SDNLHW\ X*\WNRZH V QD RJyá WDN VNRPSOLNRZDQH *H REP\OHQLH PHWRG\ UHDOL]DFML ]DGDQLD F] VWR ]DMPXMH ZL FHM F]DVX QL* ]DSURJUDPRZDQLH JR RG SRGVWDZ :UHV]FLH PR*H VL SR SURVWX ]GDU]\ü L QDMF] FLHM VL ]GDU]D *H RGSRZLHGQLHJR RSURJUDPRZDQLD QLH E G]LH SRG U NDOERWH**HFRSUDwGDE G]LHDOH]HZ]JO GXQDZ\VRNLHZ\PDJDQLDVSU] WRZH GRW\F]\ WR ]ZáDV]F]D QRZHM JHQHUDFML SURJUDPyZ GOD :LQGRZV MHJR XUXFKRPLHQLH E G]LHPQLHMOXEEDUG]LHMNáRSotliwe. &]\GREDQDOQHJRREOLF]HQLDUHGQLHMRFHQSRWU]HEQ\&LE G]LHRGUD]X]DDZDQVRZDQ\ pakiet matematyczny, jak Statgraphics, czy arkusz kalkulacyjny, jak Excel? Czy Twój ulubiony ed\WRU SRWUDIL ]OLF]\ü ZV]\VWNLH ]QDNL Z WHNFLH NWyU\ ZáDQLH QDSLVDáH" A MHOLWDNWRF]\MHVWZVWDQLHRNUHOLüUHGQLGáXJRü]GDQLD":V]\VWNLHWHRSHUDFMH PR*QD ]UHDOL]RZDü ]D SRPRF SURVW\FK SURJUDPLNyZ Z 3DVFDOX OXE %DVLFX NWyU\FK QDSLVDQLH L XUXFKRPLHQLH QDZHW QLH]E\W ZSUDZQHPX X*\WNRZQLNRZL ]DMPXMH NLONDQDFLHPLQXW 1DZHWMHOLMHVWHZ\áF]QLHX*\WNRZQLNLHPMDNLHJRNRQNUHWQHJRSURJUDPXQSHG\WRUD WHNVWyZ L QLH PDV] ]DPLDUX ]DZLHUDü ]QDMRPRFL ] 3DVFDOHP F]\ %DVLFHP ]DSR]QDQLH VL ] SRGVWDZDPL V]WXNL SURJUDPRZDQLD E G]LH QLH RG U]HF]\ 'ODF]HJR" :\REUD( VRELH *H Z GRNXPHQFLH QDG NWyU\P SUDFXMHV] ]QDMGXMH VL NLONDQDFLH WDEHOHN D Z ND*GHM ] QLFK PXVLV] ]DPLHQLü PLHMVFDPL SLHUZV]\ ZLHUV] ] GUXJLP 3UDNW\F]QLH *DGHQ HG\WRU QLH uPR*OLZLD ]DPLDQ\ GZyFK ZLHUV]\ WDEHOL Z MHGQ\P kroku, a tym bardziej zrobienia tego dla wszystkich tabelek w dokumencie. Tak jednak VL VNáDGD *H ZL NV]Rü QRZRF]HVQ\FK HG\WRUyZ :RUG3HUIHFW :RUG GOD :LQGRZV XPR*OLZLD X*\WNRZQLNRZL WZRU]HQLH WDN ]ZDQ\FK makrodefinicji E GF\FK QLF]\P innym, jak tylko programamiQDSLVDQ\PLZVSHFMDOQ\PM ]\NX=DPLDVWZL F*PXGQLH Z\V]XNLZDüNROHMQHWDEHOHL]DPLHQLDüZLHUV]HPLHMVFDPLPR*HV]QDSLVDüRGSRZLHGQL
Po co mi programowanie?
7
SURJUDPPDNURGHILQLFM NWyUD]URELWRDXWRPaW\F]QLH5]HF]MDVQDQLHE G]LHP\VL WXWDM ]DMPRZDü M ]\NDPL PDNURGHILQLFML E G]LHV] MHGQDN PLDá RND]M ]DSR]QDü VL z elementarnymi koncepcjami programowania — MDN LQVWUXNFMD ZDUXQNRZD S WOD F]\ procedura — NWyU\FK ]QDMRPRü Z ]QDF]F\ VSRVyE XáDWZL SRVáXJLZDQLH VL WDkimi M ]\NDPL 3RFRZL FSRWU]HEQHMHVWSURJUDPRZDQLH"1DMRJyOQLHMPyZLFSRWRE\PyF]UHDOL]RZDü]DGDQLDNáRSRWOLZHOXEQLHPR*OLZHGRZ\NRQDQLDÄU F]QLH´3URJUDPQLH]DOH*QLH RG WHJR MDNLP QDU] G]LHP XWZRU]RQ\ L MDNLHPX FHORZL VáX*F\ XPR*OLZLD DXWRPDW\]DFM SRZWaU]DMF\FK VL UXW\QRZ\FK F]\QQRFL NWyU\FK Z\NRQ\ZDQLH E\áRE\ ]E\W QX*FHOXESoFKáDQLDáR]DGX*RF]DVX2F]\ZLFLHZV]\VWNRPR*QD]URELüU F]QLH— SR FR MHGQDN SU]HU]XFDü GZLH WRQ\ SLDVNX áRSDW VNRUR RERN VWRL JRWRZ\ GR X*\FLD spychacz... SpróEXMP\QDXF]\üVL JRREVáXJLZDü
8
Turbo Pascal — programowanie
Co to jest programowanie? 3RZLHP\ REHFQLH NLOND VáyZ QD WHPDW VDPHJR SURFHVX SURJUDPRZDQLD $E\ &L ]D EDUG]R QLH ]QXG]Lü RJUDQLF]\P\ VL WXWDM GR NUyWNLHJR RPyZLHQLD MHJR QDMZD*niejV]\FK HOHPHQWyZ UH]\JQXMF ] IRUPDOL]PyZ L ]E GQHM WHRULL -HOL FKFHV] GRZLHG]LHü VL QD WHQ WHPDW F]HJR ZL FHM PR*HV] DOH QLH PXVLV] SU]HF]\WDü NROHMQ\ UR]G]LDá ]DW\WXáRZDQ\-DNWRVL URELQDSUDZG "-HOLQLHPDV]RFKRW\PR*HV]ZUyFLüGRQLHJR Sy(QLHM 1D UR]ZL]DQLH GRZROQHJR ]DGDQLD SRSU]H] SURJUDPRZDQLH VNáDGD VL NLOND HWDSyZ 3U]HGH ZV]\VWNLP PXVLV] ZLHG]LHü FR ZáDFLZLH FKFHV] ]URELü F]\OL PLHü NRQNUHWQ\ problemGRUR]ZL]DQLD5]HF]MDVQDSUREOHPPXVLQDGDZDüVL GRUR]ZLD]DQLD]DSRPRFNRPSXWHUDVNGPDV]RW\PZLHG]LHü"1DREHFQ\PHWDSLHQDMOHSLHM]DVWRVRZDü ]GURZ\UR]VGHN $QDOL]XMFSUREOHPPXVLV]VSUHF\]RZDüMDNLHLQIRUPDFMHPasz do G\VSR]\FMLLFRFKFHV]X]\VNDüZZ\QLNXMHJRUR]ZL]DQLD1DVW SQLHPXVLV]]GHF\GRZDüVL MDNUR]ZL]Dü]DGDQLHF]\OLZ\EUDüRGSRZLHGQLPHWRG . Kolejnym krokiem MHVW SU]\M FLH RNUHORQHJR VSRVREX SRVW SRZDQLD F]\OL VFKHPDWX F]\QQRFL NURNyZ SURZDG]F\FKGRUR]ZL]DQLD6FKHPDWWDNLRNUHODQ\MHVWPLDQHPalgorytmu. DodatNRZF]\QQRFLNWyUQDOH*\Z\NRQDüQDW\PHWDSLHMHVWGobór struktur danych, czyli VSRVREyZZMDNLHSU]HWZDU]DQDSU]H]QDV]SURJUDPLQIRUPDFMDE G]LHUHSUH]HQWRZDQD ZHZQWU] NRPSXWHUD &]\QQRü WD MHVW QD RJyá Z\NRQ\ZDQD PHFKaQLF]QLH LVWQLHM MHGQDNSUREOHP\GODNWyU\FKPR*OLZHMHVWSU]\M FLHNLONu wariantów reprezentowania LQIRUPDFML]Uy*QLFRZDQ\FKZ]DOH*QRFLRGNRQNUHWQHMV\WXDFML 5]HF]\ZLVWH SUREOHP\ V Z ZL NV]RFL ]E\W VNRPSOLNRZDQH E\ GDá\ VL VNXWHF]QLH rozZL]Dü ]D SRPRF SRMHG\QF]HJR DOJRU\WPX 6NXWHF]QH ]UHDOL]RZDQLH DOJRU\WPX Z\PDJD SRQDGWR Z\NRQDQLD SHZQ\FK F]\QQRFL SRPRFQLF]\FK MDN FKRüE\ ZSURZDG]HQLD F]\ Z\SURZDG]HQLD GDQ\FK 7DN ZL F ]Z\NOH PXVLV] SRG]LHOLü ]DGDQLH QD SHZQHIUDJPHQW\GDMFHVL UR]ZL]Dü]DSRPRFRGSRZLHGQLFKDOJRU\WPyZDFDáRü REXGRZDü RGSowiednim zestawem operacji „administracyjnych”. W ten sposób tworzysz projekt programu.
Co to jest programowanie?
9
'RSLHURWHUD]ZFKRG]LGRDNFMLNRPSXWHU:\NRU]\VWXMFRGSRZLHGQLSURJUDPX*\Wkowy zapisujemy nasz projekt w postaci wykonywalnej przez komputer. Operacja ta nosi miano kodowania lub implementacjiDMHMZ\QLNLHPSRZLQLHQE\üG]LDáDMF\SURJUDP 3RQLHZD* MHGQDN QLH MHVW SRZLeG]LDQH *H SURJUDP PXVL E\ü RG UD]X EH]Eá GQ\ RVtatnim etapem naszej pracy jest jego testowanie, czyli inaczej uruchamianie1DGREU VSUDZ L WR QLH MHVW NRQLHF ÄSRZD*QH´ SURJUDP\ PXV] E\ü SU]H] FDá\ RNUHV VZRMHM eksploatacji konserwowane 2NUHOHQLH WR R]QDF]D VSUDZRZDQLH SU]H] DXWRUD QDG]RUX QDG G]LDáDQLHP SURJUDPX L NRUHNW HZHQWXDlQ\FK Eá GyZ = NRQVHUZDFM SURJUDPyZ ZL*HVL ZUHV]FLH]DJDGQLHQLHRSUDFRZDQLDLFKGRNXPHQWDFML'ZLHRVWDWQLHF]\QQRFL ]ZL]DQH V JáyZQLH ] SURJUDPRZDQLHP SURIHVMoQDOQ\P WRWH* QLH E G]LHP\ VL QLPL V]F]HJyáRZR]DMPRZDü 7DNPQLHMZL FHMZ\JOGDFDáDSURFHGXUDSURJUDPRZDQLDL—MDNQLHWUXGQR]DXZD*\ü — samo pisanie i uruchamiDQLH SURJUDPX ZFDOH QLH MHVW Z QLHM QDMZD*QLHMV]H3RQLHZD*MHGQDNQDV]\PFHOHPMHVWSRND]DQLH&LSRGVWDZU]HPLRVáDQLH]DG\VNXVMDRDOJRU\WPDFK L WHRULL LQIRUPDW\NL QD WHQ WHPDW QDSLVDQR ZLHOH PGU]HMV]\FK NVL*HN w NROHMQ\FK UR]G]LDáDFK VNXSLP\ VL JáyZQLH QD Z\NáDG]LH M ]\ND SURJUDPRZDQLD i RPyZLHQLX MHJR NRQVWUXNFML RG VWURQ\ SUDNW\F]QHM -HOL FKFHV] UR]V]HU]\ü VZRMH ZLDGRPRFL GRW\F]FH ÄSRGáR*D´ SURJUDPRZDQLD ]DFK FDP &L GR SU]HF]\WDQLD QDVW SQHJR UR]G]LDáX -HOL QLH PDV] RFKRW\ SU]HMG( GR UR]G]LDáX ]DW\WXáRZDQHJR 1DU] G]LHZNWyU\PSR]QDV]JáyZQHJRERKDWHUDWHMNVL*NL
10
Turbo Pascal — programowanie
-DNWRVL UREL QDSUDZG " 5R]G]LDáWHQVWDQRZLUR]V]HU]HQLHSRSU]HGQLHJRLZFDOHQLHPXVLV]JRF]\WDüFKRFLD* PR*H&LVL WRSU]\GDü'RZLHV]VL ]QLHJRMDNZ\JOGDMSRV]F]HJyOQHNURNLSURFHVX SURJUDPRZDQLDLFRR]QDF]DMWDNLHSRM FLDMDNDOJRU\WPVFKHPDWEORNRZ\F]\SURMHNW 3R]QDV] UyZQLH* NLOND PHWRG L ZVND]yZHN SR]ZDODMF\FK QD XV\VWHPDW\]RZDQLH i uproszczenie pracy.
Problem Programowanie nie istnieje samo dla sLHELHDE\ZRJyOHPLDáRRQRVHQVPXVLVáX*\ü NRQNUHWQHPX FHORZL 3U]\F]\Q XWZRU]HQLD SURJUDPX PXVL E\ü SUREOHP NWyU\ PDV] UR]ZL]Dü2F]\ZLFLHQLHND*G\SUREOHPGDVL UR]ZL]DüZWHQVSRVyEQLHND*G\WH* Z\PDJD]DVWRVRZDQLDNRPSXWHUD&RZL FNZDOLILNXMHSUREOHPGR]DSURJramowania? • =DVWRVRZDQLH NRPSXWHUD GR UR]ZL]DQLD SUREOHPX SRZLQQR E\ü X]DVDGQLRQH i RSáaFDOQH3LVDQLHQDX*\WHNGRPRZ\SURJUDPXSR]ZDODMFHJRQD]DSDPL W\wanie adreVyZ ]QDMRP\FK MHVW VWUDW F]DVX — SURFLHM WR ]URELü ]D SRPRF QRWHVX,QDF]HMZ\JOGDVSUDZDZEDQNXZNWyU\PREVáXJXMHVL VHWNLNOLHQWyZ D RG F]DVX GR F]DVX WU]HED Z\VáDü GR ZV]\VWNLFK QS ]DZLDGRPLHQLH R VWDQLH rachunku. • 6]F]HJyOQLHSRGDWQHQD]DSURJUDPRZDQLHV]DGDQLDZ\NRQ\ZDQHZLHORNURWQLH OXE ]áR*RQH ] FLJX SRZWDU]DMF\FK VL F]\QQRFL 3LVDQLH ÄGR MHGQRUD]RZHJR X*\WNX´ SURJUDPX Z\NRQXMFHJR ]HVWDZ VNRPSOLNRZDQ\FK REOLF]H QD RJyá PLMDVL ]FHOHPJG\*PR*QDMHZ\NRQDüQDNDONXODWRU]H&RLQQHJRJG\SU]HZLGXMHV]PR*OLZRüZLHORNURWQego wykorzystania takiego programu. • 3UREOHP SRZLQLHQ E\ü GREU]H RNUHORQ\ 2]QDF]D WR *H PXVLV] GRNáDGQLH ZLHG]LHü MDNLH LQIRUPDFMH PDV] GR G\VSR]\FML L FR FKFHV] X]\VNDü D WDN*H SRWUDILü ]DSLVDü WR Z IRUPLH GDMFHM VL ÄZ\WáXPDF]\ü´ NRPSXWHURZL 3U]\NáDGHPSUREOHPX(OHRNUHORQHJRPR*HE\üÄUR]ZL]DQLH]DGDQLD]IL]\NL´JG\* QLH ZLDGRPR DQL MDNLPL LQIRUPDFMDPL G\VSRQXMHP\ DQL FR FKFHP\ ZáDFLZLH
Jak to sie robi naprawde?
11
REOLF]\ü3UDZLGáRZHRNUHOHQLH]DGDQLDPLDáRE\SRVWDüQSÄZ\]QDF]HQLHGURJL SU]HE\WHMSU]H]FLDáRZVSDGNXVZRERGQ\PZSLHUZV]\FKVHNXQGDFKUXFKX´ 3U]\ RND]ML PDP\ WX QDZL]DQLH GR SRSU]HGQLHJR SXQNWX WH VDPH REOLF]HQLD WU]HEDZ\NRQDüG]LHVL FLRNURWQLHGODVHNXQG 3UREOHPSU]H]QDF]RQ\GRUR]ZL]DQLDSRZLQLHQE\üMDVQR]GHILQLRZDQ\ i Z\VWDUF]DMFR]áR*RQ\E\WUXGZáR*RQ\ZSURJUDPRZDQLHPyJáVL RSáDFLü
Metoda 3RXVWDOHQLXFRFKFHV]RVLJQüLMDNLPLLQIRUPDFMDPLG\VSRQXMHV]PXVLV]XVWDOLüVSRVyE UR]ZL]DQLD SUREOHPX 1LHNLHG\ MDN Z SU]\SDGNX VSDGNX swobodnego) sytuacja MHVW RF]\ZLVWD QDOH*\ ]DVWRVRZDü Z]yU NWyU\ NWR NLHG\ Z\P\OLá .LHG\ LQG]LHM WU]HED Z\P\OLü UR]ZL]DQLH VDPHPX :DUWR UyZQLH* ]DVWDQRZLü VL QDG SU]\M FLHP ]DáR*HXSUDV]F]DMF\FKNWyUHPRJ]PQLHMV]\üQDNáDGSUDF\SRWU]HEQ\QDstworzenie SURJUDPX]QLHZLHONLPXV]F]HUENLHPQDGRNáDGQRFL 3U]\NáDGHP QLHFK E G]LH ZVSRPQLDQD Z SRSU]HGQLP UR]G]LDOH NZHVWLD Z\]QDF]HQLD UHGQLHMGáXJRFL]GDQLDZWHNFLH3UREOHPQLHMHVWZFDOHZ]L W\Ä]VXILWX´]DUyZQR ]E\WNUyWNLHMDNL]E\WGáXJLH]GDQLD]PQLHMV]DMF]\WHOQRüWHNVWXDE\ZL FQLH]QXG]Lü F]\WHOQLND PXVLV] WU]\PDü VL SHZQHJR RSWLPXP Z\QRV]FHJR QS ]QDNyZ 2WRNLONDNRQNXUHQF\MQ\FKUR]ZL]DWHJRSUREOHPX • XVWDODP\OLF]E ]QDNyZ]DZDUW\FKZND*G\P]GDQLXZWHNFLHSRF]\PuzysNDQHZDUWRFLXUHGQLDP\0HWRGDWDMHVWGRüRF]\ZLVWDMHGQDNZ\PDJDRNUHOHQLDFLVáHMGHILQLFML]GDQLDFRPR*HE\üNáRSRWOLZH • SU]\MPXMHP\ XSUDV]F]DMFH ]DáR*HQLH *H ND*GH ]GDQLH NRF]\ VL NURSN W W\P PRPHQFLH OLF]ED ]GD Z WHNFLH UyZQD E Gzie liczbie kropek (co dla WHNVWyZOLWHUDFNLFKMHVWZ]DVDG]LHSUDZG]LZH =DWHPZ\VWDUF]\]OLF]\üZV]\VWNLH]QDNLZWHNFLHXVWDOLüLOHMHVWZUyGQLFKNURSHNSRG]LHOLüSLHUZV]ZDUWRüSU]H]GUXJLZ\QLNJRWRZ\ 1DMOHSV]PHWRGQD]QDOH]LHQLHPHWRG\MHVWVSUDZG]HQLHF]\NWRMHMMX*QLH Z\P\OLá3RXVWDOHQLXPHWRG\ZDUWRWH*]DVWDQRZLüVL QDGMHMXSURV]F]HQLHP
Algorytm 6NRURMX*PDP\PHWRG PXVLP\]DSLVDüMZVSRVyEIRUPDOQ\LV]F]HJyáRZ\3RFR" Komputer nie jest niestety na tyle inteligeQWQ\E\]UR]XPLHüSROHFHQLHÄ]OLF]ZV]\VWNLH ]QDNLZWHNFLH´1WRWH*PXVLP\QDV]H]DGDQLHSU]HGVWDZLüZVSRVyEEDUG]LHMHOHPHQWDUQ\-DN":áDQLH]DSRPRFDOJRU\WPX 1
Co prawda niektóre SURJUDP\ MDN QS :RUG GOD :LQGRZV XGRVW SQLDM SROHFHQLH ]OLF]DQLD]QDNyZZWHNFLHMHGQDNMHVWRQRZáDFLZRFLSURJUDPXQLH]DNRPSXWHUD i PXVLDáR]RVWDüZF]HQLHM]DSURJUDPRZDQHSU]H]WZyUFyZHG\WRUD
12
Turbo Pascal — programowanie =JRGQLH]GHILQLFMDOJRU\WPWRÄ]ELyURNUHORQ\FKUHJXáSRVW SRZDQLDNWyUHUHDlizowaQH]JRGQLH]XVWDORQ\PSRU]GNLHPXPR*OLZLDMUR]ZL]DQLHRNUHORQHJR]DGDQLD´ 3U]HNáDGDMFWRQDEDUG]LHMOXG]NLM ]\NPR*HP\SRZLHG]LHü*HDOJRU\WPMHVW]DSLVHP F]\QQRFL NWyUH QDOH*\ NURN SR NURNX Z\NRQDü Z FHOX X]\VNDQLD Z\QLNX =DSiVXMF DOJRU\WPPXVLV]ZL FXVWDOLüMDNLHHOHPHQWDUQHRSHUDFMHE G]LHWU]HEDZ\NRQDüZWUDNFLHUHDOL]DFML]DGDQLDLMDNDSRZLQQDE\üLFKNROHMQRü'RGDWNRZRPXVLV]RNUHOLüWDN zwane kryterium stopuF]\OLZDUXQHNNWyUHJRVSHáQLHQLHSRZRGXMH]DNRF]HQLHZykoQ\ZDQLDRSHUDFMLQLHFKFHV]FK\EDF]HNDüQDZ\QLNZQLHVNRF]RQRü -DN]DSLVDüDOJRU\WP"1DMSURVWV]\PVSRVREHPMHVWVáRZQHZ\UD*HQLHSRV]F]HJyOQ\FK operacji w postaci punktów, np. tak: 1. otwórz plik z tekstem do odczytu 2. wyzeruj licznik znaków 3. wyzeruj licznik kropek 4. MHOLNRQLHFSOLNXWRLG(GRSXQNWX 5. wczytaj kolejny znak z pliku 6. MHOL]QDNMHVWNURSN]ZL NV]OLF]QLNNURSHNR 7. ]ZL NV]OLF]QLN]QDNyZ 8. LG(GRSXQNWX 9. MHOLOLF]QLNNURSHNZ\QRVL]HURLG(GRSXQNWX 10. wypisz (licznik znaków/(licznik kropek)) 11. STOP 7R VDPR PR*QD SU]HGVWDZLü Z SRVWDFL JUDILF]QHM ]ZDQHM VFKHPDWHP EORNRZ\P OXE z angielska flowchart. 6FKHPDW SRVW SRZDQLD PR*QD ZUHV]FLH ]DSLVDü Z SRVWDFL WDN ]ZDQHJR pseudokodu, F]\OLLPLWDFMLÄSUDZG]LZHJR´M ]\NDSURJUDPRZDQLD start otwórz(plik); znaki := 0; kropki := 0; dopóki nie koniec_pliku(plik) start czytaj (plik,znak) MH*HOL]QDN µ¶ kropki := kropki+1; znaki := znaki+1; stop; wypisz(znaki/kropki); stop.
-DNWRVL URELQDSUDZG "
13
Start
Otwórz plik do odczytu
Licznik znaków := 0 Licznik kropek := 0
Tak
Czy koniec pliku? Nie Czytaj znak
Czy znak jest kropk¹?
Tak
Zwiêksz licznik kropek
Nie Zwiêksz licznik znaków
Czy licznik kropek = 0?
Tak
Nie Wypisz (licznik znaków / licznik kropek)
Stop
Rysunek 1. 6FKHPDWEORNRZ\REOLF]DQLDUHGQLHMOLF]E\]QDNyZZ]GDQLX .D*GD ] SRZ\*V]\FK PHWRG PD VZRMH ZDG\ L ]DOHW\ =DSLV SRV]F]HJyOQ\FK NURNyZ w poVWDFL SXQNWyZ MHVW SURVW\ DOH SU]\ EDUG]LHM ]áR*RQ\FK ]DGDQLDFK VWDMH VL PDáR F]\WHOQ\=DSLVZSRVWDFLVFKHPDWXEORNRZHJRMHVWEDUG]RF]\WHOQ\DOHSUDFRFKáRQQ\ w wykoQDQLX:UHV]FLH]DSLVZSVHXGRNRG]LHPDW ]DOHW *HSRSU]HWáXPDF]HQLXQD M ]\NDQJLHOVNLVWDMHVL SUDNW\F]QLHJRWRZ\PWHNVWHPSURJUDPX : P\O WHJR FR SRZLHG]LHOLP\ QD ]DNRF]HQLH SRSU]HGQLHJR SXQNWX QLH PXVLV] D naZHW QLH SRZLQLHQH Z\P\ODü DOJRU\WPX VDPRG]LHOQLH -HVW WR FR SUDZGD ]DM FLH
14
Turbo Pascal — programowanie EDUG]R NV]WDáFFH L SU]\QRV]FH GX*R VDW\VIDNFML LQWHOHNWXDOQHM MHGQDN F] VWR RND]XMH VL *HNRU]\VWDMF]JRWRZ\FKUR]ZL]DPR*QD]URELüWRVDPR]QDF]QLHHIHNW\ZQLHM i V]\EFLHM 1LHNWyUH SUREOHP\ V QDWRPLDVW QD W\OH QLHW\SRZH L* PHWRG LFK UR]ZL]DQLDWU]HEDZ\P\OLüRGSRGVWDZ 2PDZLDMF DOJRU\WP\ QLH VSRVyE SRPLQü NZHVWLL VWUXNWXU GDQ\FK -HVW RF]\ZLVWH L* UR]ZL]DQLH MDNLHJRNROZLHN SUREOHPX ZL*H VL ] SU]HWZDU]DQLHP LQIRUPDFML 7 ] NROHL WU]HED MDNR SU]HFKRZDü QLH PyZLF MX* R ZSURZDG]HQLX MHM GR NRPSXWHUD L Sy(QLHMV]\P Z\SURZDG]HQLX .RPSXWHURZH VSRVRE\ UHSUH]HQWRZDQLD LQIRUPDFML V ]QDF]QLH FLOHM RNUHORQH D MHGQRF]HQLH ]QDF]QLH PQLHM Uy*QRURGQH QL* WH NWyU\FK X*\ZDP\QDFRG]LH:ZL NV]RFLSU]\SDGNyZGREyURGSRZLHGQLHMVWUXNWXU\GDQ\FK jest automaW\F]Q\JG\*DOERQDU]XFDVL VDPQSUR]ZL]XMF]DGDQLHPDWHPDW\F]QH QLH E G]LHV] SU]HdVWDZLDá OLF]E Z SRVWDFL ]QDNRZHM DOER MHVW Z\PXV]RQ\ SU]H] DOJRU\WP &]DVHP MHGQDN VSUDZD QLH MHVW WDN RF]\ZLVWD 3U]\NáDGRZR NRQVWUXXMF SURJUDP ]DMPXMF\ VL SU]HWZaU]DQLHP GDQ\FK RVRERZ\FK SUDFRZQLNyZ PR*HV] ]GHF\GRZDüVL QDSU]HFKRZ\ZDQLHW\FK*HGDQ\FKZWDN]ZDQ\FKWDEOLFDFKOXEOLVWDFK 2E\GZDUR]ZL]DQLDPDMVZRMH]DOeW\LZDG\MDNUyZQLH*ZL*VL ]]DVWRVRZDQLHP RGSRZLHGQLFKPHWRGSU]HWZDU]DQLDGDQ\FKF]\OLZáDQLHDOJRU\WPyZ
Projekt -DNMX*SRZLHG]LHOLP\DOJRU\WPSU]H]QDF]RQ\MHVWGRUR]ZL]DQLD]DVDGQLF]HMF] FL ]DGDQLD L ÄQLH SU]HMPXMH VL ´ WDNLPL GHWDODPL MDN ZSURZDG]HQLH L Z\SURZDG]HQLH GDQ\FKF]\XWZRU]HQLHVWUXNWXUGDQ\FK1DGRGDWHNZL NV]RüSUREOHPyZMHVWQDW\OH skomplikoZDQD L* QLH GDMH VL UR]ZL]Dü ]D MHGQ\P ]DPDFKHP : WDNLHM V\WXDFML PXVLV] UR]ELü VZRMH ]DGDQLH QD PQLHMV]H IUDJPHQW\ GDMFH VL Z\UD]Lü ]D SRPRF proVW\FKDOJRU\WPyZLX]XSHáQLüWHQ]HVWDZSU]H]RSLVRSHUDFMLSRPRFQLF]\FK:V]\VWNRWRQDOH*\SRZL]DüZVSyMQFDáRü]ZDQprojektem programu. 3URMHNW\ PRJ E\ü WZRU]RQH GZLHPD SU]HFLZVWDZQ\PL PHWRGDPL ]QDQ\PL MDNR SURjektoZDQLH ZVW SXMFH DQJ bottom-up design RUD] SURMHNWRZDQLH ]VW SXMFH DQJ top-down design 3LHUZV]D ] QLFK MHVW UHDOL]DFM ]DVDG\ ÄRG V]F]HJyáX GR RJyáX´ QD samym poF]WNX RNUHODP\ ]HVWDZ HOHPHQWDUQ\FK ]DGD NWyU\FK Z\NRQDQLH E G]LH NRQLHF]QH GR UHDOL]DFML JáyZQHJR SUREOHPX np. wprowadzanie danych, wyprowadzanie wyników, obliF]DQLH ZDUWRFL SRUHGQLFK 3R VNRQVWUXRZDQLX WDNLFK FHJLHáHN EXGXMHP\ ] QLFK ZL NV]H VWUXNWXU\ ]DMPXMFH VL SU]HWZDU]DQLHP RGSRZLHGQLR ZL NV]\FK IUDJPHQWyZ ]DGDQLD ] W\FK — struktury jeszcze bardziej RJyOQH D* Z NRFX GRFKRG]LP\ GR JáyZQHJR VFKHPDWX G]LDáDQLD NWyU\ ]DU]G]D SRV]F]HJyOQ\PLPRGXáDPL 3URMHNWRZDQLH]VW SXMFHMDNQLHWUXGQRVL GRP\ODüZ\JOGDRGZURWQLH3RF]WNLHP SURFHVXMHVWRJyOQHVIRUPXáRZDQLH]DGDQLDNWyUHQDVW SQLHSRGGDMHVL DQDOL]LHLUR]biFLX QD ZVSyáG]LDáDMFH ]H VRE F] FL WH ]D G]LHOL VL GDOHM D* GR X]\VNDQLD HOHPHQWDUQ\FK IUDJPHQWyZ NWyU\FK ]DSURJUDPRZDQLH MHVW MX* áDWZH D QDZHW W\SRZH -HGQRF]HQLH QD ND*G\P HWDSLH SRG]LDáX XOHJDM XFLOHQLX NRPSHWHQFMH SRV]F]HJyOQ\FKIUDJPHQWyZSURJUDPXDUDF]HMSURMHNWX F]\OL]DNUHVSU]HWZDU]DQ\FKSU]H]H GDQ\FKLSRVWDü]ZUacanych wyników.
Jak to sie robi naprawde?
15
1LH]DOH*QLH RG WHJR MDN PHWRG ]DVWRVXMHV] HIHNWHP SURMHNWRZDQLD SRZLQQR E\ü XFLOHQLH Z\EUDQHM PHWRG\ UR]ZL]DQLD ]DGDQLD L GRVWRVRZDQLH MHM GR NRQNUHWQ\FK RNROLF]QRFL L PR*OLZRFL 2VLJD VL WR UR]ELMDMF ]DGDQLH QD HOHPHQWDUQH VNáDGQLNL NWyU\FKUR]ZL]DQLH]RVWDáRMX*RSLVDQHOXEMHVWáDWZHGRVDPRG]LHOQHJRRSUDFRZDQLD Gotowy projektPR*HSU]\MüSRVWDüSRGREQGRRPDZLDQ\FKSU]\RND]MLDOJRU\WPyZ ]DSLVX VáRZQHJR OXE JUDILF]QHM UHSUH]HQWDFML FLJX F]\QQRFL 2GSRwiednie zapisanie SRV]F]HJyOQ\FKHOHPHQWyZSURMHNWX]QDF]QLHXáDWZL&LMHJRLPSOHPHQWDFM RUD]SU]\V]áHZSURZDG]DQLH]PLDQLXOHSV]H
Implementacja 8II 3U]\QDMPQLHM Z WHRULL ZV]\VWNR SRZLQQR MX* G]LDáDü '\VSRQXMF RGSRZLHGQLR UR]SLVDQ\PSURMHNWHPPR*QDSU]\VWSLüGRPHFKDQLF]QHMZ]DVDG]LHF]\QQRFLSURJramowania. 7DN WR QLH SRP\áND SUDNW\F]QLH FDáRü SUDF\ XP\VáRZHM SRZL FDQHM QD UR]ZL]DQLH GDQHJR ]DGDQLD SRSU]H] SURJUDPRZDQLH VNXSLD VL Z HWDSDFK RSLVDQ\FK SRSU]HGQLR 6DPR SURJUDPRZDQLH NRGRZDQLH MHVW MHG\QLH F]\QQRFL SROHJDMF QD SU]HWáXPDF]HQLX ]DSLVX SURMHNWX QD RGSRZLHGQL ]DSLV V\PEROLF]Q\ F]\OL WDN ]ZDQy M ]\NSURJUDPRZDQLDQDMF] FLHMZ\VRNLHJRSR]LRPX =DQLPGRWHJRGRMG]LHPR*HV]MHV]F]HVWDQüSU]HGNRQLHF]QRFLZ\ERUXRGSRwiedQLHJRM ]\NDF]\OLQDU] G]LDSUDF\]DNáDGDMF*HPDV]]F]HJRZ\ELHUDüWMSRWUDILV] VL SRVáXJLZDüNLONRPDM ]\NDPi).
Uruchomienie 8UXFKDPLDQLH ZLH*R QDSLVDQ\FK SURJUDPyZ QDOH*\ GR EDUG]LHM HNVF\WXMF\FK momenWyZZ*\FLXSURJUDPLVW\3HáQ\SURFHVXUXFKDPLDQLDVNáDGDVL ]NLONXHWDSyZ NWyUHNUyWNRRSLV]HP\SRQL*HM 1DSLVDQ\ SURJUDP QDOH*\ SR SLHUZV]H SU]HWáXPDF]\ü QD SRVWDü Z\NRQ\ZDOQ SU]H] NRPSXWHUF]\OLQDRJyá VNRPSLORZDüJR:L NV]RüQDU] G]LSURJUDPLVW\F]Q\FKVNXWHF]QLH Z\áDSLH SU]\ WHM RND]ML ZV]HONLH Eá G\ OLWHURZH L VNáDGQLRZH NWyUH PLDáH RND]M SRSHáQLüSRGF]DVZSLV\ZDQLDSURJUDPXEá G\WDNLH]ZDQHVRJyOQLHEá GDPL kompilacji). 3R Z\HOLPLQRZDQLX ZV]\VWNLFK Eá GyZ NRPSLODFML PR*HV] VSUyERZDü Z\NRQDü SURJram. Przedtem jednak EH]Z]JO GQLH]DSLV]JRQDG\VNX. W przypadku bardziej skomSOLNRZDQ\FKSURJUDPyZHIHNW\SLHUZV]HJRXUXFKRPLHQLDPRJE\üGRü]DVNDNXMFH ] ]DZLHV]HQLHP NRPSXWHUD ZáF]QLH OHSLHM ]DSDPL WDü SURJUDP QL* QDUD*Dü VL QD NRQLHF]QRü RGWZDU]DQLD F] FL OXE FDáRFL Z\QLNyZ SUDF\ :V]HONLH Eá G\ NWyUH SRMDZLDMVL ZWUDNFLHSUDF\MX*XUXFKRPLRQHJRSURJUDPXQRV]QD]Z Eá GyZZykonania%á G\WHPRJSRZRGRZDüSU]HUZDQLHG]LDáDQLDSURJUDPXDQDZHW]DZLHV]HQLH lub restart komputera) lub jego zachowanie niezgodne z oczekiwaniami (np. brak UHDNFML QD G]LDáDQLD X*\WNRZQLND ]ZUDFDQLH Eá GQ\FK Z\QLNyZ -HOL SURJUDP SR uruchomieniX]DFKRZXMHVL ZPLDU SRSUDZQLHWMQLH]DZLHVLáVL UHDJXMHQDSUyE\
16
Turbo Pascal — programowanie komuQLNRZDQLD VL ] QLP ]ZUDFD Z PLDU SRSUDZQH Z\QLNL L GDMH VL ]DNRF]\ü PR*HV]SU]HMüGRMHJRWHVWRZDQLD 7HVWRZDQLH SURJUDPX SROHJD ] JUXEV]D QD EDGDQLX MHJR UHDNFML QD Uy*ne zachowania X*\WNRZQLND 3U]HGH ZV]\VWNLP QDOH*\ VSUDZG]Lü F]\ Z\QLN SUDF\ SURJUDPX MHVW zgodQ\ ] QDV]\PL RF]HNLZDQLDPL -HOL WDN ZDUWR VSUyERZDü SRGU]XFLü PX GR przetwoU]HQLD LQQH GDQH GOD NWyU\FK Z\QLN ]QDP\ OXE SRWUDILP\ REOLF]\ü 'REyU danych dR WHVWRZDQLD QLH SRZLQLHQ E\ü SU]\SDGNRZ\ OHF] ZLQLHQ RSLHUDü VL QD SU]HZLG\ZDQLX PR*OLZ\FK VáDE\FK SXQNWyZ SURJUDPX 3U]\NáDGRZR MHOL SURJUDP ]DMPXMH VL REVáXJ NDUWRWHNL SUDFRZQLNyZ ZDUWR VSUDZG]Lü MHJR ]DFKRZDQLH Z SU]\SDGNX QLHSRGDQLD *DGQHJR QD]ZLVND SRGDQLD QD]ZLVND GáX*V]HJR QL* SU]\M WH PDNVLPXPLWS'REUPHWRGMHVWUyZQLH*WHVWRZDQLHSURJUDPyZSU]H]X*\WNRZQLNyZ NWyU]\]Z\NOHQLHPDMSRM FLDR]DVDGDFKIDLUSOD\RERZL]XMF\FKZSURJUDPRZDQLX L SRWUDIL EDUG]R VNXWHF]QLH ÄUR]áR*\ü´ SURJUDP\ XZD*DQH SU]H] LFK WZyUFyZ ]D FDáNRZLFLH EH]Eá GQH : SU]\SDGNX XUXFKDPLDQLD EDUG]R RSRUQ\FK SURJUDPyZ QLHRFHQLRQHXVáXJLRGGDMZUHV]FLHW]ZQDU] G]LDXUXFKRPLHQLRZH*DUJRQRZR]ZDQH debuggerami 3R]ZDODM RQH QD OHG]HQLH L DQDOL] ]DFKRZDQLD SURJUDPów instrukcja SRLQVWUXNFMLFRXPR*OLZLDORNDOL]DFM QDZHWEDUG]RZ\UDILQRZDQ\FKEá GyZ
Zdrowy rozsadek -HVW RQ QDMZD*QLHMV]\P HOHPHQWHP SURFHVX SURJUDPRZDQLD D GRNáDGQLHM MDNLHMNROZLHN G]LDáDOQRFL SUDNW\F]QHM SRGHMPRZDQHM Z *\FLX =DVWRVRZDQLH zdroZHJRUR]VGNXZ SURJUDPRZDQLXVSURZDG]DVL SU]HGHZV]\VWNLPGR]DFKRZDQLD odpowiedniej proSRUFMLSRPL G]\WUHFLLIRUPRUD]GRERUXPHWRGRGSRZLHGQLFKGR UHDOL]RZDQ\FK]DGD$E\UR]ZL]DüUyZQDQLHNZDGUDWRZHPR*HV]RF]\ZLFLHQDSLVDü w Borland C++ 5.0 RGSRZLHGQL SURJUDP GOD :LQGRZV Z\NRQXMF XSU]HGQLR VROLGQH przygotowanie w postaci schematu blokowego, listy zmiennych i spisu literatury. 0R*HV] UyZQLH* QLF QLH SLVDü D MHG\QLH VL JQü SR NDONXODWRU : ZL NV]RFL SU]\SDGNyZ QDMOHSV]H MHVW UR]ZL]DQLH kompromisowe, tj. napisanie krótkiego programiku w Turbo Pascalu. 6DPRSU]\JRWRZDQLHWHRUHW\F]QHUyZQLH*SRZLQQRE\üWUDNWRZDQH]XPLDUHP'REyU DOJRU\WPXF]\RSUDFRZDQLHSURMHNWXEDUG]RF] VWRZ\NRQ\ZDQHVDXWRPDW\F]QLH]D ich rozpisywanie ma na celu MHG\QLH XáDWZLHQLH LFK ]UR]XPLHQLD L QLH SRZLQQR E\ü FHOHPVDP\PZVRELH3U]HZD*DMFDF] ü]DGDNWyUHE G]LHV]UR]ZL]\ZDáMHVWQD W\OHSURVWDL*QLHZ\PDJDVSHFMDOQ\FKSU]\JRWRZD3RZ\*V]HXZDJLSRZLQLHQHZL F WUDNWRZDü UDF]HM MDNR VSRVRE\ XáDWZLHQLD VRELH UR]ZL]\ZDQLD EDUG]LHM ]áR*RQ\FK probOHPyZ HZHQWXDOQLH RUJDQL]RZDQLD SUDF\ ]HVSRáRZHM R LOH PDV] ]DPLDU ]RVWDü zawoGRZ\PSURJUDPLVW '\VSRQXMFW\PLZLDGRPRFLDPLPR*HV]MX*VSRNRMQLHSU]HMüGRG]LHáD:NROHMQ\P UR]G]LDOH]DSR]QDV]VL ]QDU] G]LHP]DSRPRFNWyUHJRE G]LHV]WZRU]\áSURJUDP\
Narzedzie
17
1DU] dzie 6NRUR SRZLHG]LHOLP\ MX* NLOND VáyZ QD WHPDW WHRULL F]DV RPyZLü SRGVWDZ G]LDáDOQRFLSUDNW\F]QHM—M ]\NSURJUDPRZDQLDF]\OLQDU] G]LH]DSRPRFNWyUHJRWZRU]\ VL SURJUDP\- ]\NSURJUDPRZDQLDXPR*OLZLD]DSLVDQLHZ]UR]XPLDáHMGODF]áRZLHND SRVWDFL F]\QQRFL NWyUH PDM ]RVWDü ]UHDOL]RZDQH SU]H] NRPSXWHU 2GSRZLHGQLH QDU] G]LH ]ZDQH translatorem F]\OL WáXPDF]HP SU]HNáDGD WDNL ]DSLV QD LQVWUXNFMH ]UR]XPLDáH GOD NRPSXWHUD 1RZRF]HVQH QDU] G]LD GR WZRU]HQLD SURJUDPyZ ]Z\NOH ]DZLHUDM RSUyF] WUDQVODWRUD UyZQLH* edytor SR]ZDODMF\ QD ZSURZDG]DQLD L SRSUDwianie tekstu programu, konsolidator XPR*OLZLDMF\ HIHNW\ZQH WZRU]HQLH ZL NV]\FK programów, program uruchomieniowy (ang. debugger) XáDWZLDMF\ ORNDOL]DFM L XVXZDQLHEá GyZZSURJUDPDFKRUD]Uy*QHQDU] G]LDSRPRFQLF]H /LF]ED M ]\NyZ SURJUDPRZDQLD X*\ZDQ\FK REHFQLH QD ZLHFLH VL JD VHWHN MHGQDN W\ONRNLOND]\VNDáRVRELHSRSXODUQRüQDW\OHGX*E\]DVWDQDZLDüVL QDGLFKZ\EranieP 6 WR EH] ZWSLHQLD M ]\NL %DVLF & L 3DVFDO .WyU\ ] QLFK Z\EUDü" %DVLF MHVW M ]\NLHPSURVW\PLSRSXODUQ\PMHGQDNQLHSURPXMHQDZ\NyZHOHJDQFNLHJRSURJramoZDQLD - ]\N & ]\VNDá VRELH RVWDWQLR RJURPQ SRSXODUQRü L ]GRPLQRZDá URGRwisko zawodowych pURJUDPLVWyZ -HGQDN L RQ QLH QDGDMH VL ]E\WQLR GR QDXNL SRGVWDZ SURJUDPRZDQLD ]H Z]JO GX QD Z\VRNL SR]LRP NRPSOLNDFML L PDáR F]\WHOQ VNáDGQL 7U]HFL ] NDQG\GDWyZ 3DVFDO XVW SXMH QLHFR SRSXODUQRFL M ]\NRZL & MHVW MHGQDN znacznie czytelniejszy i prze]WRQDMF] FLHMX*\ZDQ\GRFHOyZG\GDNW\F]Q\FK : GDOV]\P FLJX QDV]HJR Z\NáDGX E G]LHP\ ZL F X*\ZDOL M ]\ND 3DVFDO -HGQ ] ZFL*QDMSRpularniejszych wersji Pascala przeznaczonych dla komputerów PC jest bez ZWSLHQLD 7XUER 3DVFDO VWDQRZLF\ ZU F] LGHDOQH QDU] G]LH GR QDXNL L WZRU]HQLD PQLHMVNRPSOLNRZDQ\FKSURJUDPyZ-HJRWH*Z\ELHU]HP\MDNRQDU] G]LHQDV]HMSUDF\ SRGVWDZRP SRVáXJLZDQLD VL URGRZLVNLHP 7XUER 3DVFDOD SRZL FLP\ UHV]W WHJR UR]G]LDáX =DF]QLMP\ RG XUXFKRPLHQLD QDV]HJR QDU] G]LD 1D SRF]WHN U]HF] MDVQD PXVLV] ZáF]\üNRPSXWHUDSRZ\ZLHWOHQLX]QDNXJRWRZRFLV\VWHPXRSHUDF\MQHJR]Z\NOH C:\> QDSLVDü turbo↵
18
Turbo Pascal — programowanie -HOLX*\ZDV]V\VWHPX:LQGRZVPXVLV]ZF]HQLHMSU]HMüGR'26-u (w tym celu ]QDMG(LNOLNQLMGZXNURWQLHLNRQ 06-'263URPSW -HOL7XUER3DVFDOMHVW GRVW SQ\SRGSRVWDFLLNRQ\PR*HV]JRXUXFKRPLüNOLNDMFQDQLHMGZXNURWQLH 0R*H VL MHGQDN RND]Dü *H SR Z\GDQLX SRZ\*V]HJR SROHFHQLD XMU]\V] QD HNUDQLH komunikat Bad command or file name
R]QDF]DMF\*HZ\ZRá\ZDQ\SURJUDPQLHMHVWGRVW SQ\]SR]LRPXELH*FHJRNDWDORJX OXEZRJyOHQLH]RVWDá]DLQVWDORZDQ\:WDNLHMV\WXDFMLPXVLV]RGV]XNDüNDWDORJ]DZLHUDMF\ NRPSLODWRU 7XUER 3DVFDOD R QD]ZLH TURBO.EXE (zwykle jest to katalog C:\TP\BIN lub C:\TP7\BIN L GRáF]\ü MHJR QD]Z GR W]Z V\VWHPRZHM FLH*NL GRVW SX, XPR*OLZLDMFHM Z\ZRá\ZDQLH SURJUDPyZ ]QDMGXMF\FK VL Z NDWDORJDFK LQQ\FK QL* ELH*F\ : W\P FHOX GR ]QDMGXMFHJR VL Z SOLNX C:\AUTOEXEC.BAT polecenia PATH GRSLV]QDNRFXUHGQLNDSRQLPQD]Z NDWDORJX]DZLHUDMFHJR7XUER3DVFDODQS path=c:\dos;c:\windows;c:\norton;c:\tp7
-H*HOLQLHXGD&LVL RGV]XNDü7XUER3DVFDODE G]LHV]PXVLDáJR]DLQVWDORZDü:W\P FHOXZH(SLHUZV]]G\VNLHWHNLQVWDODF\MQ\FKSURJUDPXRSLVDQÄ,QVWDOO´ Záy*MGR QDS GXA: (lub B:) i napisz install↵
Uruchomiony w ten sposób program instalacyjny dostarczy Ci dalszych wskazówek RGQRQLHLQVWDODFML:L FHMLQIRUPDFMLQDWHPDWLQVWDODFMLLZ\ZRá\ZDQLD7XUER3DVFDOD ]QDMG]LHV]ZOLWHUDWXU]H>@PR*HV]UyZQLH*]DVL JQüSRPRF\ORNDOQHJRVSHFMDOLVW\RG komputerów. -HOL XGDáR &L VL EH]NROL]\MQLH Z\ZRáDü 7XUER 3DVFDOD QD HNUDQLH PRQLWRUD SRZLQLHQH]REDF]\üZLGRNSU]HGVWDZLRQ\QDVVLHGQLPU\VXQNX URGNRZF] üHNUDQX]DMPXMHREV]HUQHRNQRZNWyU\P]QDMGXMHVL PLJDMF\NXUVRU Okno to, zwane okienkiem edytora E G]LH VáX*\áR QDP GR ZSLV\ZDQLD L poprawiania SURJUDPyZ1DVDPHMJyU]HHNUDQX]QDMGXMHVL PHQXJáyZQH]DZLHUDMFHJUXS\SROHFH VáX*F\FK GR ]DU]G]DQLD SURJUDPHP :UHV]FLH QDMQL*V]\ ZLHUV] HNUDQX — tak zwany wiersz statusowy —]DZLHUDLQIRUPDFMHQDWHPDWQDMF] FLHMZ\NRU]\VW\ZDQ\FK NRPELQDFMLNODZLV]\OXEDNWXDOQHJRVWDQXSURJUDPX:V]\VWNLHHOHPHQW\GRVW SQHSRSU]H] RNQR HG\WRUD PHQX JáyZQH RUD] NRPELQDFMH NODZLV]\ WZRU] UD]HP zintegroZDQH URGRZLVNR URERF]H 7XUER 3DVFDOD RNUHODQH UyZQLH* DQJLHOVNLP VNUyWHP ,'( (Integrated Development Environment). -HOLSRZ\ZRáDQLX7XUER3DVFDOD]REDF]\V]QDHNUDQLHMHG\QLHMDVQHWáR E G]LHV]PXVLDáRWZRU]\üRNLHQNRHG\WRUDSROHFHQLHPNew (Nowy) z menu File 3OLN 6SRVyESRVáXJLZDQLDVL PHQXSR]QDV]]DFKZLO
1DU] G]LH
19
PHQXJáyZQH
wiersz statusowy
Rysunek 2. =LQWHJURZDQHURGRZLVNRURERF]H,'( 7XUER3DVFDOD Omawianie poszczególnych elementów IDE zaczniemy od góry ekranu, czyli od menu JáyZQHJR0HQX7XUER3DVFDOD]DZLHUDG]LHVL üSR]\FML File
(Plik) —]DZLHUDSROHFHQLDXPR*OLZLDMFHRGF]\Wywanie, zapisywanie i GUXNRZDQLHWHNVWyZSURJUDPyZDWDN*H]DNRF]HQLHSUDF\
Edit
(Edycja) — ]DZLHUD SROHFHQLD SR]ZDODMFH QD PRG\ILNDFM WHNVWX prograPXLSU]HQRV]HQLHIUDJPHQWyZWHNVWXSRPL G]\SURJramami;
Search
(Wyszukiwanie) — ]DZLHUD SROHFHQLD VáX*FH GR Z\V]XNLZDQLD L ]DmiaQ\IUDJPHQWyZWHNVWXSURJUDPXRUD]ORNDOL]DFMLEá GyZ
Run
(Uruchomienie) — ]DZLHUD SROHFHQLD VWHUXMFH Z\NRQDQLHP JRWRwego programu;
Compile (Kompilacja) — ]DZLHUD SROHFHQLD XPR*OLZLDMFH NRPSLODFM F]\OL przeWáXPDF]HQLHWHNVWX(UyGáRZHJRSURJUDPXQDSRVWDüZ\QLNRZ— Z\NRQ\ZDOQSU]H]NRPSXWHU Debug
(8VXZDQLH Eá GyZ) — ]DZLHUD SROHFHQLD XáDWZLDMFH XVXZDQLH Eá dów z SURJUDPyZLZVSRPDJDMFHLFKXUXFKDPLDQLH
Tools
(1DU] G]LD) —]DZLHUDSROHFHQLDXPR*OLZLDMFHZ\ZRáDQLHSRPRFQLF]\FKSURJUDPyZ]HZQ WU]Q\FK
Options
(Opcje) —]DZLHUDSROHFHQLDSR]ZDODMFHQDNRQILJXURZDQLHHOHmentów IDE (kompilatora, edytora, programu uruchomieniowego), czyli dosWRVRZDQLHLFKGRZ\PRJyZLSRWU]HEX*\WNRZQLND
Window (Okno) — zawiera pROHFHQLDVWHUXMFHXNáDGHPRNLHQHNQDHNUDQLH Help
(Pomoc) — ]DZLHUD SROHFHQLD XPR*OLZLDMFH GRVW S GR REV]HUQHJR systemu pomocy (suflera) Turbo Pascala.
20
Turbo Pascal — programowanie -DN GRVWDü VL GR SROHFH ]DZDUW\FK Z PHQX" 0HWRG MHVW NLOND 0R*HV] QS QDFLVQü klawisz F10 D QDVW SQLH Z\EUDü *GDQ SR]\FM RSFM PHQX JáyZQHJR X*\ZDMF NODZLV]\ NXUVRUD VWU]DáHN ← oraz → L ÄUR]ZLQü´ M QDFLVNDMF ENTER. Znacznie SURFLHM MHVW MHGQDN Z\NRU]\VWDü NRPELQDFM NODZLV]D ALT ] Z\Uy*QLRQ Z QD]ZLH RSFML OLWHU QD SU]\NáDG GOD PHQX File E G]LH PXVLV] MHGQRF]HQLH QDFLVQü NODZLV]H ALT i F 7U]HFL PR*OLZRFL MHVW X*\FLH P\V]NL — Z W\P FHOX PXVLV] NOLNQü MHM OHZ\PSU]\FLVNLHPSRZVND]DQLXZ\EUDQHMSR]\FMLPHQXJáyZQHJR 1LH]DOH*QLHRGWHJRNWyUHMPHWRG\X*\MHV]Z\EUDQLHGRZROQHMSR]\FML]PHQXJáyZQHJRVSRZRGXMHSRMDZLHQLHVL NROHMQHJRPHQXW]Z menu rozwijanego lub z angielska pull-down menu ]DZLHUDMFHJREDUG]LHMV]F]HJyáRZ\Z\ND]SROHFH]ZL]DQ\FK z GDQ\P WHPDWHP $E\ Z\EUDü *GDQH SROHFHQLH PXVLV] W\P UD]HP X*\ü NODZLV]\ ↑ lub ↓ L RF]\ZLFLH ENTER QDFLVQü NODZLV] RGSRZLDGDMF\ Z\Uy*QLRQHM OLWHU]H (uwaga: tym razem bez klawisza ALT HZHQWXDOQLH NOLNQü Z RGSRZLHGQLP PLHMVFX P\V]N=DXZD*SU]\WHMRND]ML*HQLHNWyU\PSROHFHQLRPWRZDU]\V]QD]Z\NODZLV]\ IXQNF\MQ\FKVSHFMDOQ\FKOXELFKNRPELQDFMLZ\ZLHWORQHZPHQX]SUDZHMVWURQ\6 to tak zwane klawisze skrótu (shortcut keys XPR*OLZLDMFHZ\ZRáDQLHGDQHJRSROHceQLDEH]UR]ZLMDQLDPHQX8*\FLHNODZLV]\VNUyWX]QDF]QLHXSUDV]F]DNRU]\VWDQLH],'( WRWH*ZDUWR]DSDPL WDüNLOND]QLFKQSF2 — zapisanie programu na dysku, CTRL-F9 — uruchomienie programu itd.). 2WRSU]\NáDGDE\RWZRU]\üQRZHRNLHQNRHG\WRUDPXVLV]Z\GDüSROHFHQLHFile-New, F]\OLZ\EUDü]PHQXJáyZQHJRF10 SR]\FM File (F D]UR]ZLQL WHJRPHQXSROHcenie New (Nowy). Menu File PR*HV] UyZQLH* UR]ZLQü ]D SRPRF P\V]NL OXE QDFLVNDMF MHGQRF]HQLH NODZLV]H ALT i F (ALT-F $E\ ZUHV]FLH ]DNRF]\ü SUDF Z ,'( Z\VWDUF]\ QDFLVQü NODZLV] VNUyWX ALT-X PR*QD ]URELü WR VDPR ]D SRPRF PHQX FKRFLD*MHVWWRQLHFREDUG]LHMF]DVRFKáRQQH wybranaopcja
Rysunek 3. 5R]ZLQL WHPHQXFile
1DU] G]LH
21
=DXZD*SU]\RND]ML*HUR]ZLQL FLHPHQXZL*HVL ]H]PLDQ]DZDUWRFLZLHUV]DVWDWXVRZHJRZNWyU\PE G]LHVL REHFQLH]QDMGRZDáNUyWNLRSLVZ\EUDQHJRSROHFHQLDOXE opcji. 6NRURSRWUDILP\MX*RWZRU]\üRNLHQNRHG\WRUDPR*HP\Z\SUyERZDüMHJRPR*OLZRFL 7UHüZSLV\ZDQHJRWHNVWXQLHPDQDUD]LH]QDF]HQLDDOHMHOLFKFHV]PR*HV]RGUD]X ]DMU]HüGRQDVW SQHJRUR]G]LDáXLZSLVDü]QDMGXMF\VL WDPSURJUDPSU]\Náadowy. Jak MX* SUDZGRSRGREQLH ZLHV] GR ZSURZDG]DQLD WHNVWX VáX* W]Z klawisze alfanumeryczneF]\OLJáyZQ\EORNNODZLV]\]DZLHUDMF\OLWHU\4:(57<LF\IU\%ORNWHQ ]DZLHUDUyZQLH*NLONDGRGDWNRZ\FKNODZLV]\]DZLHUDMF\FKV\PEROHQSF]\! RUD] NODZLV]HVSHFMDOQHNWyU\PL]DMPLHP\VL QL*HM=DXZD**HSRGF]DVZSLV\ZDQLDNXUVRU PLJDMF\]QDNSRGNUHOHQLD SU]HVXZDVL WDNE\]DZV]HZVND]\ZDüQDSR]\FM NROHMQHJR ZSURZDG]DQHJR ]QDNX ]D SR SU]HNURF]HQLX SUDZHJR EU]HJX RNLHQND WHNVW QLH jest autRPDW\F]QLHáDPDQ\MDNZZL NV]RFLHG\WRUyZWHNVWX -HOLU]XFLV]RNLHPQD UDPN RWDF]DMF RNLHQNR HG\WRUD WR Z RNROLF\ OHZHJR GROQHJR URJX ]DXZD*\V] gwiazGN LGZLHOLF]E\UR]G]LHORQHGZXNURSNLHP*ZLD]GNDV\JQDOL]XMH*H]DZDUWRü okienND HG\WRUD ]RVWDáD ]PRG\ILNRZDQD SU]H] GRSLVDQLD OXE XVXQL FLH WHNVWX ]D OLF]E\ R]QDF]DM QXPHU ZLHUV]D L NROXPQ\ Z NWyU\FK ]QDMGXMH VL NXUVRU 2NLHQNR HG\WRUD PD V]HURNRü FR QDMZ\*HM ]QDNyZ PR*QD MH SRPQLHMV]\ü L GREU\P zwyczajem jest nieprzekraczanie teMZáDQLHGáXJRFLZLHUV]D =QDMGXMFH VL QD NODZLDWXU]H NODZLV]H VSHFMDOQH L IXQNF\MQH QLH VáX* GR EH]SRUHGQLHJR ZSURZDG]DQLD WHNVWX XPR*OLZLDM MHGQDN MHJR SRSUDZLDQLH L VWHURZDQLH G]LDáDQLHP,'(']LDáDQLHPNODZLV]\VWHUXMF\FKQLHE G]LHP\VL QDUD]LH]DMPRZDüQD REHFQ\PHWDSLH]QDMRPRFL7XUER3DVFDODZ\VWDUF]\&L]QDMRPRüNRPELQDFMLALT-X ]DNRF]HQLH SUDF\ L NODZLV]D F1 Z\ZRáDQLH SRPRF\ 3RQL*HM RPyZLP\ NUyWNR G]LDáDQLHNODZLV]\HG\F\MQ\FK Klawisz ENTER MDN MX* ]DSHZQH ZLHV] VáX*\ GR SU]HMFLD GR QRZHJR ZLHUV]D -HJR QDFLQL FLH SRZRGXMH SU]HPLHV]F]HQLH NXUVRUD GR SRF]WNX NROHMQHJR ZLHUV]D ]QDMGXMF\ VL SRG VSRGHP WHNVW MHVW SU]HVXZDQ\ZGyá ]DMHOLZáF]RQ\MHVWW]ZWU\E automatycznego wcinania (ang. autoindent mode NXUVRU ORNXMH VL QLH Z SLHUZV]HM NROXPQLHOHF]QDZ\VRNRFLSRF]WNXSRSU]HGQLHJRZLHUV]D Klawisze BACKSPACESRáR*RQ\QDGENTER) i DELETE]QDMGXMF\VL ]SUDZHMVWURQ\ NODZLDWXU\ZEORNXNODZLV]\QXPHU\F]Q\FKLVWHURZDQLDNXUVRUHP SR]ZDODMQDXVXwanie tHNVWX1DFLQL FLHNODZLV]DBACKSPACEXVXZD]QDNSRáR*RQ\QDOHZRRGNXUVRUDLSU]HVXZDNXUVRUZOHZR ]DNODZLV]DELETEXVXZD]QDN]QDMGXMF\VL ÄSRG´ NXUVRUHP QLH SU]HVXZDMF WHJR RVWDWQLHJR $E\ XVXQü ZLHUV] ZVND]DQ\ NXUVRUHP Z\VWDUF]\QDFLVQüNODZLV]HCTRL-Y:DUWRUyZQLH*ZLHG]LHü*HRP\áNRZRXVXQL W\ WHNVW PR*QD RGWZRU]\ü QDFLVNDMF NODZLV]H ALT-BACKSPACE RGSRZLDGDM RQH SROHceniu Undo z menu Edit 0R*OLZRüWDSU]\GDMHVL ]ZáDV]F]DRVRERPUR]WDUJQLRQ\P Klawisz TAB (tabulator) powodujeSU]HVXQL FLHNXUVRUDRNLONDNROXPQGRSU]RGXFR XPR*OLZLD wcinanie tekstu 8*\ZDQLH ZFL ü SRGF]DV SLVDQLD SURJUDPyZ MHVW VSUDZ EDUG]R ZD*Q SR]ZDOD ERZLHP QD ]DFKRZDQLH SU]HMU]\VWRFL L F]\WHOQHJR XNáDGX WHNVWX'RVSUDZ\ZFLQDQLDZUyFLP\MHV]F]HZNROHMQ\FKUR]G]LDáDFK
22
Turbo Pascal — programowanie .ROHMQD JUXSD NODZLV]\ Z ZL NV]RFL NODZLDWXU XORNRZDQD SRPL G]\ EORNLHP DOIDQXPHU\F]Q\P D QXPHU\F]Q\P VáX*\ GR SRUXV]DQLD VL SR WHNFLH 6 WR NODZLV]H VWU]DáHN SU]HVXZDMFH NXUVRU R MHGQ SR]\FM OXE ZLHUV] RUD] NODZLV]H HOME, END, PAGEUP i PAGEDOWNXPR*OLZLDMFHSU]HPLHV]F]HQLHNXUVRUDGRSRF]WNXOXENRFD ZLHUV]DRUD]Z\ZLHWOHQLHSRSU]HGQLHJROXEQDVW SQHJRHNUDQXVWURQ\ WHNVWX 1DFLQL FLH NODZLV]D INS SR]ZDOD QD Z\EyU SRPL G]\ W]Z trybem wstawiania (ang. insert mode —ZSLV\ZDQH]QDNLVZVWDZLDQHZMX*LVWQLHMF\WHNVWLÄUR]S\FKDM´JR i WU\EHP ]DVW SRZDQLD (ang. overwrite mode — QRZR ZSLV\ZDQH ]QDNL ]DVW SXM MX* LVWQLHMFH ']LDáDQLHREXWU\EyZPR*HV]VSUDZG]LüXVWDZLDMFNXUVRUÄZHZQWU]´MX* napisanego wierszaWHNVWXLZSLVXMFQRZ\WHNVW]NODZLDWXU\=ZUyüUyZQLH*XZDJ QD NV]WDáWNXUVRUDRUD]G]LDáDQLHNODZLV]\ENTER i TAB. 2VWDWQLPZD*Q\PNODZLV]HPMHVWESCAPE (ESC 6áX*\RQMDNVDPDQD]ZDVXJHUXMH GR Z\FRI\ZDQLD VL ] SRF]\QLRQ\FK G]LDáD ]DP\NDQLD SyO GLDORJRZ\FK Ä]ZLjania” PHQX LWS -HOL SU]H] SU]\SDGHN WUDILV] Z MDNLH QLH]QDQH &L RNROLFH PR*HV] VSUyERZDüSU]\ZUyFLüSRSU]HGQLVWDQ,'(ZáDQLHQDFLVNDMFESC. Funkcji tego klawisza QLH SRZLQLHQH MHGQDN P\OLü ] SROHFHQLHP 8QGR ALT-BACKSPACE), NWyUH XPR*OLZLD DQXORZDQLH]PLDQGRNRQDQ\FKZWUHFLZSLV\ZDQHJRSURJUDPX 3U]HGVWDZLRQHZ\*HMZLDGRPRFLSRZLQQ\Z\VWDUF]\ü&LGRUR]SRF] FLDSUDF\] prosW\PLSURJUDPDPL-HOLFKFHV]PR*HV]SRPLQüNROHMQ\SRGUR]G]LDáLRGUD]XSU]HMü GR QDVW SQHJR UR]G]LDáX ] NWyUHJR GRZLHV] VL MDN QDSLVDü L XUXFKRPLü QDMSURVWV]\ SURJUDP Z 3DVFDOX -H*HOL LQWHUHVXM &L GRGDWNRZH IXQNFMH L PR*OLZRFL HG\WRUD zapraszam do dalszej lektury.
Zaawansowane funkcje edytora 2PyZLP\REHFQLHQDMF] FLHMX*\ZDQH]GRGDWNRZ\ch funkcji edytora Turbo Pascala, DPLDQRZLFLHRSHUDFMHEORNRZHRUD]Z\V]XNLZDQLHL]DVW SRZDQLHIUDJPHQWyZWHNVWX 3RGF]DVSLVDQLDZL NV]\FKSURJUDPyZF] VWR]DFKRG]LNRQLHF]QRüSRZLHOHQLDSU]HQLHVLHQLD OXE XVXQL FLD ZL NV]\FK IUDJPHQWyZ WHNVWX — ]DUyZQR ZHZQWU] SRMHG\QF]HJRRNLHQNDHG\WRUDZREU ELHMHGQHJRSOLNX MDNLSRPL G]\RNLHQNDPLSOLNDPL =DPLDVW SU]HSLV\ZDü WHNVW U F]QLH PR*QD Z\NRU]\VWDü WDN ]ZDQH operacje blokowe, XPR*OLZLDMFHPDQLSXORZDQLHFDá\PLMHJRIUDJPHQWDPL 3LHUZV]F]\QQRFLMHVW]D]QDF]HQLHIUDJPHQWXWHNVWXFRQDMáDWZLHM]URELüQDFLVNDMF NODZLV]HVWHUXMFHNXUVRUHPUyZQLH*HOME, END, PAGEUP i PAGEDOWN SU]\ZFLQL W\P NODZLV]X SHIFT =D]QDF]DQ\ IUDJPHQW ]RVWDMH QD RJyá Z\ZLHWORQ\ Z QHJDW\ZLH%ORNPR*QDUyZQLH*]D]QDF]\ü]DSRPRFP\V]NLSU]HVXZDMFMHMNXUVRUSU]\ ZFLQL W\POHZ\PSU]\FLVNXMHVWWRW]ZFLJQL FLH — ang. dragging)2. 2
7U]HFL PR*OLZRFL MHVW X*\FLH NODZLV]\ VNUyWX CTRL-K, B i CTRL-K, H E GF\FK ]DV]áRFL]SRSU]HGQLFKZHUVML7XUER3DVFDODLHG\WRUD:RUG6WDU'RNáDGQLHMV]HLQIRUmacje na ten temat znajdziesz w literaturze i systemie pomocy.
Narzedzie
23
3R]D]QDF]HQLXRGSRZLHGQLHJRIUDJPHQWXPR*HP\JRSU]HQRVLüLSRZLHODüZ\NRU]\VWXMFW]Zschowek (ang. clipboard). W celu skopiowania zaznaczonego fragmentu do VFKRZND PXVLV] QDFLVQü NODZLV]H CTRL-INS (kombinacja SHIFT-DEL przeniesie IUDJPHQWGRVFKRZNDXVXZDMFJR]WHNVWX $E\ZVWDZLüWHNVW]HVFKRZNDZZ\EUDQH PLHMVFHZVND*MHNXUVRUHPLQDFLQLMNODZLV]HSHIFT-INS. 2SLVDQHRSHUDFMHXPR*OLZL &L QLH W\ONR SRZLHODQLH L SU]HQRV]HQLH IUDJPHQWyZ ]DZDUWRFL DNW\ZQHJR RNLHQND HG\WRUDOHF]UyZQLH*SU]HQRV]HQLHWHNVWXGRLQQ\FKRNLHQHN0R*HV]UyZQLH*]DSLVDü zaznaczony blok na dysku (CTRL-K, W L RGF]\WDü JR ] G\VNX CTRL-K, R). Aby XVXQüZ\Uy*QLHQLHX*\MNRPELQDFMLCTRL-K, H$NWXDOQ]DZDUWRüVFKRZNDPR*HV] ZUHV]FLH SRGHMU]Hü SROHFHQLHP Show clipboard z menu Edit (powoduje ono Z\ZLHWOHQLHRNLHQND]DW\WXáRZDQHJRClipboardNWyUHPR*HV]]DPNQüQDFLQL FLHP klawiszy ALT-F3). 'UXJF] VWRZ\NRU]\VW\ZDQZáDVQRFLHG\WRUDMHVWZ\V]XNLZDQLHL]DPLDQDWHNVWX 3R]ZDODWRQDV]\ENLH]QDOH]LHQLHZSURJUDPLH*GDQHJRIUDJPHQWXWHNVWXOXE]DVWpieQLHJRLQQ\PWHNVWHP)XQNFMHWHZ\ZRá\ZDQHVRGSRZLHGQLRNRPELQDFMDPLNODZLV]\ CTRL-Q, F i CTRL-Q, A QDFLQL FLH NODZLV]\CTRL-L powoduje wyszukanie lub zamiaQ NROHMQHJR Z\VWSLHQLD GDQHJR IUDJPHQWX 3RQLHZD* RSHUDFMD Z\V]XNDQLD OXE ]DPLDQ\ Z\PDJD XVWDOHQLD NLONX SDUDPHWUyZ MDN FKRüE\ SRV]XNLZDQ\ WHNVW Z\ZRáDQLH MHGQHM ] RPDZLDQ\FK IXQNFML SRZRGXMH Z\ZLHWOHQLH W]ZRkna dialogowego. 3RQL*HMSRND]DQRRNQRGLDORJRZHZ\ZLHWODQHGODRSHUDFML]DPLDQ\WHNVWX
Rysunek 4. ONQRGLDORJRZHZ\ZLHWODQHGODRSHUDFML]DPLDQ\WHNVWX =QDMGXMFHVL XJyU\RNLHQNDGZDpola tekstoweVáX*GRZSURZDG]HQLDWHNVWXNWyU\ PDE\ü]DVWSLRQ\Text to find LWHNVWX]DVW SXMFHJRNew text 3RQL*HMSRáR*RQHV cztery grupy]DZLHUDMFHVSRNUHZQLRQH]HVRERSFMH*UXSDOptionsXPR*OLZLDXVWDOHQLH SDUDPHWUyZ SU]HV]XNLZDQLD UR]Uy*QLDQLH PDá\FK L GX*\FK OLWHU Z\V]XNLZDQLH W\ONR FDá\FK VáyZ L W]Z Z\UD*H UHJXODUQ\FK ]DPLDQD ] SRWZLHUG]HQLHP *UXSD DirectionSR]ZDODQDRNUHOHQLHNLHUXQNXZ\V]XNLZDQLDZSU]yGOXEZVWHF] *UXSD Scope SR]ZDOD QD ]DZ *HQLH]DNUHVXG]LDáDQLDIXQNFML do zaznaczonego bloku tekstu, ]DJUXSDOriginXPR*OLZLDUR]SRF] FLHZ\V]XNLZDQLDRGELH*FHMSR]\FMLNXUVRUDOXE RG SRF]WNX WHNVWX 1D VDP\P GROH RNLHQND ]QDMGXM VL F]WHU\ przyciski VáX*FH GR EH]SRUHGQLHJR XUXFKRPLHQLD Z\ZRáDQLD OXE DQXORZDQLD Z\EUDQHM F]\QQRFL 3U]\cisk OKSRZRGXMHUR]SRF] FLHRSHUDFML]XVWDORQ\PLZF]HQLHMSDUDPHWUDPLChange
24
Turbo Pascal — programowanie all SR]ZDOD QD ]DPLDQ ZV]\VWNLFK Z\VWSLH SRV]XNLZDQHJR WHNVWX Cancel XPR*OLZLDUH]\JQDFM ]Z\NRQ\ZDQLDRSHUDFML]DHelpZ\ZRáXMHV\VWHPSRPRF\ JHOLMX*Z\SUyERZDáHG]LDáDQLHIXQNFMLReplace (funkcja wyszukiwania, FindG]LDáD podobnie, nie powoduje jednak zamiany znalezionego tekstu, a jedynie wskazuje go NXUVRUHP VSUyEXMHP\REHFQLHRPyZLüNRQVWUXNFM LG]LDáDQLHSRODGLDORJRZHJR3ROD GLDORJRZH V SRZV]HFKQLH Z\NRU]\VW\ZDQH SU]H] ,'( GR NRPXQLNDFML ] X*\WNRZQLNLHPWRWH*ZDUWRRGUD]X]D]QDMRPLüVL ]LFKHOHPHQWDPL :\ERUXHOHPHQWXSRODGLDORJRZHJRGRNRQXMHV]NOLNQL FLHPP\V]NOXEQDFLQL FLHP klawisza TAB (albo SHIFT-TAB — wybór elementu pRSU]HGQLHJR =ZUyü XZDJ *H w SU]\SDGNXJUXS\QDFLQL FLHTABXGRVW SQLDMHMSLHUZV]\HOHPHQW—DE\GRVWDüVL GRSR]RVWDá\FKPXVLV]X*\üNODZLV]\NXUVRUD:\EUDQLHHOHPHQWXV\JQDlizowane jest SU]H]MHJRZ\Uy*QLHQLHQDRJyáNRORUHP LXPR*OLZLD]PLDQ MHJRVWDQX:SU]\SDGNX SRODWHNVWRZHJR]PLDQVWDQXMHVWSRSURVWXZSURZDG]HQLHWHNVWX']LDáDQLHHOHPHQWyZ JUXS Z\PDJD QLHFR V]HUV]HJR RPyZLHQLD -DN ]DSHZQH ]DXZD*\áH JUXS\ ]DZDUWH w polu Replace]DZLHUDMGZDURG]DMHÄHOHPHQWyZPDQLSXODF\MQ\FK´WDk zwane pola wyboru (ang. check box), oznaczone nawiasami kwadratowymi, oraz przyciski opcji (ang. radio button R]QDF]RQHQDZLDVDPLRNUJá\PL3RODZ\ERUXXPR*OLZLDMQLH]DOH*QHZáF]HQLHOXEZ\áF]HQLHGDQHMIXQNFMLMDNáDWZRVSUDZG]LüRSFMHXPLHV]F]RQH w grupie Options QLH Z\NOXF]DM VL Z]DMHPQLH L PRJ E\ü ZáF]DQH QLH]DOH*QLH RG VLHELH=NROHLSU]\FLVNLRSFMLSR]ZDODMQDZ\EyUMHGQHM]NLONXZ]DMHPQLHZ\NOXF]DMF\FK VL PR*OLZRFL QS SU]HV]XNLZDQLH WHNVWX PR*H RGE\ZDü VL DOER GR SU]RGX aOER GR W\áX WRWH* ZáF]HQLH MHGQHJR ] QLFK SRZRGXMH DXWRPDW\F]QH Z\áczenie SR]RVWDá\FK6WDQZáF]HQLDV\JQDOL]RZDQ\MHVWGODSRODZ\ERUXV\PEROHP>;@]DGOD przycisku opcji — symbolem (•). 2VWDWQL JUXS HOHPHQWyZ SROD GLDORJRZHJR VWDQRZL przyciski (ang. button). Ä1DFLQL FLH´ SU]\FLVNX WM Z\Uy*QLHQLH JR ]D SRPRF NODZLV]D TAB L QDFLQL FLH spacji lub klawisza ENTERHZHQWXDOQLHNOLNQL FLHP\V]N SRZRGXMHQDW\FKPLDVWRZH Z\NRQDQLH RGSRZLDGDMFHM PX F]\QQRFL L QD RJyá ]DPNQL FLH SROD GLDORJRZHJR. 7U]\ VSRUyG ]QDMGXMF\FK VL Z SROX Replace przycisków — OK, Cancel i Help — ]QDMG]LHV] SUDNW\F]QLH Z ND*G\P LQQ\P SROX GLDORJRZ\P -DN áDWZR VL GRP\OLü ÄQDFLQL FLH´ SU]\FLVNX OK powoduje zaakceptowanie informacji wprowadzonej do SRODGLDORJRZHJRMHJR]DPNQL FLHLZ\NRQDQLHGDQHMRSHUDFMLQS]DPLDQ\]QDNyZ Przycisk Cancel SR]ZDOD QD UH]\JQDFM ] Z\NRQ\ZDQLD RSHUDFML ZSURZDG]RQH GR SROD LQIRUPDFMH V WUDFRQH ]D SU]\FLVN Help Z\ZRáXMH RNLHQNR V\VWHPX SRPRF\ ]DZLHUDMFH RGSRZLHGQL GR NRQWHNVWX LQIRUPDFM :DUWR ]DSDPL WDü *H RPyZLRQH Z\*HM SU]\FLVNL PDM VZRMH RGSRZLHGQLNL QD NODZLDWXU]H V WR PLDQRZLFLH ENTER RGSRZLDGDMF\SU]\FLVNRZLOKRLOHWHQ]RVWDáZ\Uy*QLRQ\W]QMHVWW]ZSU]\FLVNLHP GRP\OQ\P ESCAPE RGSRZLDGDMF\ SU]\FLVNRZ Cancel) oraz F1 RGSRZLDGDMF\ przyciskowi Help). :DUWRMHV]F]HSRZLHG]LHüNLONDVáyZQDWHPDWV\VWHPXSRPRF\F]\OLZáDQLHIXQNFML Help Ä3RGU F]QD FLJDZND´ GRVW SQD Z ,'( RIHUXMH RSUyF] EDUG]R V]HURNLHJR ]HVtawu informacji, kilka nader przydatnych funkcji. Przede wszystkim system pomocy Turbo Pascala jest tzw. systemem kontekstowym2]QDF]DWR*HSRQDFLQL FLXNODZLV]D F1 X]\VNDV] LQIRUPDFM FLOH ]ZL]DQ ] V\WXDFM Z MDNLHM VL ]QDMGXMHV] QS SR
Narzedzie
25
otwarciu okna dialogowego Replace V\VWHP SRPRF\ Z\ZLHWOL RSLV WHJR* SROD L MHJR HOHPHQWyZ .RQWHNVWRZRüR]QDF]DUyZQLH*PR*OLZRüáDWZHJRX]\VNDQLDLQIRUPDFML QDWHPDWEá GyZV\JQDOL]RZDQ\FKSU]H]NRPSLODWRU 'UXJ FLHNDZ FHFK V\VWHPX SRPRF\ MHVW PR*OLZRü X]\VNDQLD LQIRUPDFML R Z\Eranym elemencie pURJUDPX R LOH MHJR QD]ZD ]RVWDáD ]GHILQLRZDQD Z UDPDFK 7XUER 3DVFDOD )XQNFMDWDZ\ZRá\ZDQDMHVWQDFLQL FLHPNODZLV]\CTRL-F1, po uprzednim wska]DQLXLQWHUHVXMFHJRQDVVáRZDNXUVRUHP7DNZL FDE\GRZLHG]LHüVL F]HJRQD temat procedury write E G]LHV] ] QLHM NRU]\VWDá Z QDVW SQ\P UR]G]LDOH PXVLV] QDSLVDü write L QDFLVQü CTRL-F1 SDPL WDMF E\ NXUVRU ]QDMGRZDá VL Z REU ELH QDSLVDQHJR VáRZD : SRGREQ\ VSRVyE PR*HV] X]\VNDü LQIRUPDFM QD WHPDW LQQ\FK obiektów. 'RVW SGRVNRURZLG]DKDVHáRSLVDQ\FKZV\VWHPLHSRPRF\PR*HV]X]\VNDüQDFLVNDMF klawisze SHIFT-F1$E\Z\EUDüKDVáR]HVNRURZLG]DZ\VWDUF]\ZVND]DüMHNXUVRUHP i QDFLVQü ENTER HZHQWXDOQLH NOLNQü P\V]N 3RGF]DV NRU]\VWDQLD ] V\VWHPX SRPRF\LVWQLHMHUyZQLH*PR*OLZRüSRZURWXGRSRSU]HGQLRZ\ZLHWODQ\FKRSLVyZSU]H] QDFLQL FLH NODZLV]\ ALT-F1 3R]RVWDáH U]DG]LHM X*\ZDQH SROHFHQLD ]JUXSRZDQH V w menu Help. :WHQVSRVyE]DNRF]\OLP\SU]HJOGSRGVWDZRZ\FKLQIRUPDFMLQDWHPDWURGRZLVND 7XUER 3DVFDOD 0R*HV] WHUD] SRüZLF]\ü SRVáXJLZDQLH VL HG\WRUHP L SR]QDQ\PL IXQNFMDPL]DNRF]\üSUDF QDFLVNDMFNODZLV]HALT-XOXERGUD]XSU]HMüGRQDVW SQHJR UR]G]LDáXZNWyU\P]DGHPRQVWUXMHP\SLHUZV]\SURJUDPZ3DVFDOX
Zapamietaj • $E\XUXFKRPLü7XUER3DVFDODZ\GDMSROHFHQLHturbo. • &KFF]DNRF]\üSUDF ]7XUER3DVFDOHPQDFLQLMNODZLV]HALT-X. • :V]\VWNLH SROHFHQLD ,'( 7XUER 3DVFDOD GRVW SQH V SRSU]H] PHQX JáyZQH Z\ZRá\ZDQH NODZLV]HP F10 OXE ]D SRPRF P\V]NL &] ü SROHFH PR*QD UyZQLH*Z\ZRáDüQDFLVNDMFNODZLV]HVNUyWX • Do wprowadzania i poprawiDQLDWHNVWyZSURJUDPyZVáX*\RNLHQNRHG\WRUD • .RQZHUVDFMD],'(SURZDG]RQDMHVW]DSRPRFSyOGLDORJRZ\FK • Klawisz ESCAPEXPR*OLZLD&LUH]\JQDFM ]Z\NRQ\ZDQLDUR]SRF] WHMRSHUDFML • -HOLSRWU]HEXMHV]SRPRF\QDFLQLMNODZLV]F1.
26
Turbo Pascal — programowanie
Pierwszy program 1DMZ\*V]DSRUDQDQDSLVDQLHMDNLHJRSURJUDPX%\QLHE\áRQFDáNRZLFLHQLHSUDNtyczQ\ VSUyEXMP\ ]D SRPRF NRPSXWHUD REOLF]\ü SROH NRáD R SURPLHQLX FHQW\PHWUyZ -DNZLDGRPRSROHNRáDZ\UD*DVL Z]RUHP S = πr2 gdzie rR]QDF]DSURPLH]DπMHVW]QDQRGGRüGDZQDVWDáZ\QRV]FRNRáR 6DPSURJUDPSRZLQLHQMHG\QLHZ\SLV\ZDüREOLF]RQZDUWRüQDHNUDQLHF]\OLG]LDáDü z grubsza tak: SRF]WHN wypisz pi razy r do kwadratu koniec 2. 3RPLMDMF QLHMDVQH QD UD]LH NZHVWLH PQR*HQLD SRGQRV]HQLD OLF]E\ GR NZDGUDWX i ZDUWRFLπPR*HV]ZáF]\üNRPSXWHULXUXFKRPLü7XUER3DVFDODSLV]F turbo
3RSRMDZLHQLXVL QDHNUDQLHRNLHQNDHG\WRUDMHOLWDNRZHVL QLHSRMDZL]PHQXFile wybierz polecenie New, czyli Nowy VSUyEXM SU]HWáXPDF]\ü QDV] VFKHPDFLN QD M ]\N DQJLHOVNLLZSURZDG]LüJRGRNRPSXWHUD3RZLQQRWRZ\JOGDüPQLHMZL FHMWDN begin write(Pi*5*5); end.
=DXZD* *H SRZ\*V]\ SURJUDP MHVW SUDZLH GRVáRZQ\P WáXPDF]HQLHP WHJRFRQDSLVDOLP\ SRSU]HGQLR 7D ZáDQLH ÄGRVáRZQRü´ VWDQRZL MHGQ ] QDMSRZD*QLHMV]\FK ]DOHW 7XUER 3DVFDOD WZRU]HQLH SURVW\FK SURJUDPyZ PR*QD Z GX*HM F] FL VSURZDG]Lü GR WáXPDF]HQLDRGSRZLHGQLHJRDOJRU\WPXQDM ]\NDQJLHOVNLZDUWRMHV]F]H]QDüSRGVWDZ\ DQJLHOVNLHJRDOHQDSUDZG Z\VWDUF]SRGVWDZ\ 6DP SURJUDP FK\ED QLH PR*H E\ü SURVWV]\ 6NáDGD VL RQ ] MHGQHM MHG\QHM LQVWUXNFML Z\SLVXMFHMZDUWRüZ\UD*HQLD „pi razy r do kwadratu”, przy czym podnoszenie liczby GRNZDGUDWX]RVWDáR]DVWSLRQHZ\PQR*HQLHPMHMSU]H]VLHELH6DPRPQR*HQLHV\PERlizowane jest operatorem JZLD]GND ]D VWDáD π to po prostu Pi 2 Z\UD*HQLDFK
Pierwszy program
27
RSHUDWRUDFKLVWDá\FKSRZLHP\QLHFRZL FHMMX*ZNUyWFHQDUD]LH]DZ\MDQLMP\URO SR]RVWDá\FKVNáDGQLNyZSURJUDPX .D*G\ SURJUDP Z 3DVFDOX UR]SRF]\QD VL VáRZHP NOXF]RZ\P begin (SRF]WHN) i NRF]\ VáRZHP NOXF]RZ\P end. (koniec — ] NURSN 6áRZD NOXF]RZH VWDQRZL SRGVWDZRZ\ÄDOIDEHW´M ]\NDVáX*F\GRWZRU]HQLDEDUG]LHM]áR*RQ\FKVWUXNWXU7XUER 3DVFDODXWRPDW\F]QLHZ\Uy*QLDVáRZDNOXF]RZHZWUHFLSURJUDPXSU]H]Z\ZLHWODQLH LFKZLQQ\PNRORU]HQDWRPLDVWZNVL*FHE G]LHP\]D]QDF]DOLMH F]FLRQNSRJUXELRQ. 3RPL G]\ VáRZDPL NOXF]RZ\PL R]QDF]DMF\PL SRF]WHN L NRQLHF SURJUDPX ]QDMGXMH VL MHJR ]DVDGQLF]D WUHü F]\OL WDN ]ZDQD F] ü RSHUDF\MQD 6NáDGDM VL QD QL instrukcje RSLVXMFH NROHMQH F]\QQRFL Z\NRQ\ZDQH przez komputer. W naszym przypadku progUDP ]DZLHUD W\ONR MHGQ LQVWUXNFM D PLDQRZLFLH Z\ZRáDQLH W]Z procedury bibliotecznej write (wypisz Z\SLVXMFHM QD HNUDQLH XSU]HGQLR REOLF]RQ ZDUWRüZ\UD*HQLD-DNVL ZNUyWFHSU]HNRQDV]LQVWUXNFMHPRJUyZLH*]DZLHUDü]DSLV G]LDáD DU\WPHW\F]Q\FK Z\ZRáDQLD IXQNFML V\VWHPRZ\FK L ZLHOH LQQ\FK RSHUDFML .D*GD LQVWUXNFMD ] wyMWNLHP LQVWUXNFML ]QDMGXMFHM VL EH]SRUHGQLR SU]HG VáRZHP end PXVL E\ü ]DNRF]RQD UHGQLNLHP ;), który w Pascalu jest tzw. separatorem instrukcji. Aby procedura writeZLHG]LDáDFRZáDFLZLHPDZ\SLVDüPXVLV]SU]HND]DüMHMRGSRwiednie informacje w postaci tzw. argumentów. W naszym przypadku argumentem procedury writelnMHVWZ\UD*HQLH Pi*5*5NWyUH]NROHLVNáDGDVL ]LGHQW\ILNDWRUyZ VWDá\FK L RSHUDWRUyZ R W\P ]D FKZLO -HOL SURFHGXUD Z\PDJD NLONX DUJXPHQWyZ QDOH*\ UR]G]LHOLü MH SU]HFLQNDPL ]D FDáD OLVWD DUJXPHQWyZ PXVL E\ü ]DZV]H XM WD w QDZLDV\RNUJáH7DNZL FVNáDGQLDF]\OLV\PEROLF]Q\RSLVVSRVREXZ\NRU]\VWDQLD naszej procedury writeMHVWQDVW SXMFD write[(argument, argument...)]
: SRZ\*V]\P ]DSLVLH QDZLDV\ NZDGUDWRZH R]QDF]DM HOHPHQW\ QLHRERZL]NRZH PR*OLZHMHVWX*\FLHSURFHGXU\ writeEH]DUJXPHQWyZ ]DZLHORNURSHNV\JQDOL]XMH PR*OLZRüX*\FLDGDOV]\FKDUJXPHQWyZZEOL*HMQLHRNUHORQHMOLF]ELH3RSUDZQHE G ZL FQDVW SXMFHZ\ZRáDQLDSURFHGXU\write: • write(5);
Z\SLV]HOLF]E
• write(1, 2, 3, 4); wypisze liczby 1, 2, 3 i 4 (jako „1234”) • write;
nic nie wypisze
3R]RVWDáR QDP MHV]F]H Z\WáXPDF]\ü SRM FLD VWDáHM RSHUatora i identyfikatora. 6WDáD to SRSURVWXVWDáDF]\OLSHZQDVWDáDZDUWRü]DSLVDQDMDZQLHQDSU]\NáDGOLF]EDF]\ nazwa 'Warszawa'). O tak zwanych VWDá\FK V\PEROLF]Q\FK SRZLHP\ QLHFR Sy(QLHM OperatoremQD]\ZDP\V\PEROUHSUH]HQWXMF\SHZQHG]LDáDQLHQSGRGDZDQLH F]\ SRUyZQDQLH 2SHUDWRU\E GFHVáRZDPL]DVWU]H*RQ\PLVWDQRZLMHGHQ]SRGVWDwowych elementów Z\UD*HRNWyU\FKSRZLHP\ZL FHMZQDVW SQ\PUR]G]LDOH:UHV]FLH identyfikator MHVW SR SURVWX QD]Z RELHNWX QS VWDáHM π) lub operaFML QD SU]\NáDG
28
Turbo Pascal — programowanie Z\SLV\ZDQLD ZDUWRFL — write 0R*H RQ ]DZLHUDü OLWHU\ GX*H OLWHU\ QLH V RGUy*QLDQH RG PDá\FK ]DWHP Write i write to ten sam identyfikator), cyfry i znaki SRGNUHOHQLD OHF] QLH PR*H ]DF]\QDü VL RG F\IU\ 0XVLV] UyZQLH* SDPL WDü *H WZRU]HQLH LGHQW\ILNDWRUyZ EU]PLF\FK WDN VDPR MDN VáRZD NOXF]RZH L RSHUDWRU\ E GFH VáRZDPL ]DVWU]H*RQ\PL MHVW QLHGR]ZRORQH WDN ZL F QLH PR*HV] XWZRU]\ü RELHNWX o nazwie End czy =. 7\OHWHRULL)HE\SU]HNRQDüVL *HSURJUDPQDSUDZG G]LDáDVSUyEXMJRVNRPSLORZDü QDFLVNDMFNODZLV]F9 — Make 2LOHQLFQLHSRSVXáHSU]\SU]HSLV\ZDQLXZ\QLNLHP NRPSLODFMLSRZLQQRE\üSU]HGVWDZLRQHQL*HMRNLHQNR
Rysunek 5. 2NLHQNRZ\ZLHWODQHSRSUDZLGáRZHMNRPSLODFMLSURJUDPX 1D]ZDSOLNXUR]PLDUZROQHMSDPL FLLLQQHV]F]HJyá\PRJE\üX&LHELHQLHFRLQQH— QDMZD*QLHMV]\MHVWNRPXQLNDWCompile successful: Press any keyZ\ZLHWODQ\ XGRáXRNLHQND -HOLXGDáR&LVL SRSHáQLüMDNLEáGNRPSLODWRU]DV\JQDOL]XMHWRRGSRZLHGQLPNRPXnikatem, wVND]XMFMHGQRF]HQLHNXUVRUHPSRGHMU]DQHPLHMVFHZSURJUDPLH
Rysunek 6. .RPSLODWRUV\JQDOL]XMHEáGNRPSLODFML 3RZ\*HM]LOXVWURZDQRUHDNFM NRPSLODWRUDQDEUDNNURSNLSRNRF]F\PSURJUDPVáRwie end-DNZLGDüNXUVRU]QDOD]áVL ZZLHUV]X]DZLHUDMF\PEáG]DZ\ZLHWORQ\ QDHNUDQLHNRPXQLNDWR]QDF]D*HWUHüSURJUDPXQLH]RVWDáDSUDZLGáRZR]DNRF]RQD 'RGDWNRZHZ\MDQLHQLDGRW\F]FHEá GXPR*HV]X]\VNDüQDFLVNDMFNODZLV]F1 (Help).
Pierwszy program
29
-HOLZSURJUDPLH]QDMGXMHVL NLONDEá GyZNRPSLODWRUZ\NU\MHW\lko pierwszy z nich (po jego poprawieniu —QDVW SQ\LWDNGDOHM :FKDUDNWHU]HüZLF]HQLDPR*HV]ZSURZDG]LüNLONDEá GyZGRSURJUDPXQSSU]HVWDZLüOLWHU\ZVáRZLH write LSU]HNRQDü VL MDNUHDJXMHQDQLHNRPSLODWRU 0XVLV]]GDZDüVRELHVSUDZ *HEH]Eá GQDNRPSLODFMDQLH]DZV]HJZDUDQWXMH SRSUDZQHZ\NRQDQLHSURJUDPX%á G\RNWyU\FKSRZLHG]LDQRSU]HGFKZLO QD]\ZDQHVEá GDPLNRPSLODFML (ang. compile-WLPHHUURU LZ\QLNDMJáyZQLH z SRP\áHNSRGF]DVZSLV\ZDQLDSURJUDPXQSEá GQLHZSLVDQ\FKVáyZ NOXF]RZ\FK 'UXJ]QDF]QLHPQLHMSU]\MHPQNDWHJRUL WZRU]Eá G\ wykonaniaDQJUXQWLPHHUURU Z\QLNDMFH]QLHZáDFLZHMNRQVWUXNFML SURJUDPXOXEX*\FLDQLHSUDZLGáRZ\FKGDQ\FK%á G\WHQLHVZ\NU\ZDQHSU]H] NRPSLODWRULXMDZQLDMVL GRSLHURZWUDNFLHSUDF\SURJUDPXSURZDG]F QDMF] FLHMGRMHMSU]HUZDQLD7\SRZ\PSU]\NáDGHPMHVWSUyEDG]LHOHQLDOLF]E\ SU]H]]HUROXERGF]\WDQLDGDQ\FK]QLHLVWQLHMFHJRSOLNXNRPSLODWRUQLHPR*H ZLHG]LHüF]\SOLNRGDQHMQD]ZLHE G]LHLVWQLDáZFKZLOLZ\NRQDQLDSURgramu). 1DV]F] FLHSURJUDP\NWyU\PLE G]LHP\VL ]DMPRZDüZQDMEOL*V]\PF]DVLH V QDW\OHSURVWH*HWUXGQRZQLFKREá G\Z\NRQDQLD 7\OH QD WHPDW Eá GyZ NWyU\FK RF]\ZLFLH *\F] &L MDN QDMPQLHM -HOL MX* VNRPSLORZDáHSURJUDPPR*HV]JRZ\NRQDüQDFLVNDMFNODZLV]HCTRL-F9. -X*",MDNLMHVWZ\QLN"+PDZáDFLZLHgdzie on jest? 1LHPDVL F]HJRREDZLDü2EOLF]RQHZSURJUDPLHSROHNRáD]RVWDáRZ\SLVDQHQDHNUDQLH OHF] MHVW SU]HVáRQL WH SU]H] RNLHQNR HG\WRUD $E\ VL R W\P SU]HNRQDü QDFLQLM klawisze ALT-F5SRZLQLHQH]REDF]\ü]QDMGXMF\VL ÄSRGVSRGHP´HNUDQ'26-owy, ]DZLHUDMF\RSUyF]LQQ\FKU]HF]\ OLF]E
7.8539816340E+01
F]\OL ] JUXEV]D FHQW\PHWUyZ NZDGUDWRZ\FK $E\ ZUyFLü GR RNLHQND HG\WRUD Z\VWDUF]\QDFLVQüENTER. 8II 1D SLHUZV]\ UD] WR FK\ED Z\VWDUF]\ $E\ QLH XWUDFLü VZRMHJR SLHUZV]HJR SURJUDPXPXVLV]JRMHV]FH]DSDPL WDüF]\OL]DSLVDüQDG\VNX:W\PFHOXZ\ELHU]SROHcenie Save (=DSDPL WDM) z menu FileOXESRSURVWXQDFLQLMNODZLV]F2-HOLZF]HQLHM QLH QDGDáH SURJUDPRZL QD]Z\ QD]ZD Z\ZLHWODQD MHVW QD JyUQHM NUDZ G]L UDPNL RNLHQND HG\WRUD MHOL ]QDMGXMH VL WDP QDSLV NONAME00.PAS SURJUDP QLH ]RVWDá MHV]F]HQD]ZDQ\ QDHNUDQLHSRMDZLVL SROHGLDORJRZHSave File As. $E\]DSLVDüSURJUDPSRGSU]\NáDGRZQD]ZPROGRAM1.PASZ\VWDUF]\ZSLVDüMZSRle Save file asLQDFLVQüENTER3RQLHZD*UR]V]HU]HQLH.PAS jest dla programów pascaORZ\FKSU]\MPRZDQHGRP\OQLHQLHPXVLV]JRSRGDZDü =DXZD**HSRZ\NRQDQLXWHMRSHUDFMLQD]ZDSURJUDPXZ\ZLHWODQDZUDPFHRNLHQND edyWRUD ]PLHQLáD VL ] NONAME00.PAS na PROGRAM1.PAS -HOL WHUD] SRQRZQLH QDFLQLHV] F2 SURJUDP ]RVWDQLH ]DFKRZDQ\ SRG W VDP QD]Z EH] Z\ZLHWODQLD SROD GLDlogowego.
30
Turbo Pascal — programowanie
Rysunek 7. Okno dialogowe Save File As Tworzenie nowego programu poleceniem File-New L Sy(QLHMV]D zmiana nazwy poleceniem File-Save/Save asQLHV]E\WZ\JRGQH2WRGZLHPHWRG\XWZRU]HQLDSURJUDPX QLHZ\PDJDMFHSy(QLHMV]HM]PLDQ\QD]Z\ Zamiast polecenia New PR*HV] Z\NRU]\VWDü SROHFHQLH Open (Otwórz) z menu File. Pozwala ono na odczytanie z dysku zaSLVDQHJR ZF]HQLHM WHNVWX SURJUDPX Z\ZLHWODMFRNQRGLDORJRZHOpen a FileSRND]DQHSRQL*HM
Rysunek 8. Okno dialogowe Open a File 1D]Z *GDQHJR SURJUDPX PR*HV] ZSLVDü Z SROH Name OXE Z\EUDü ] OLVW\ Files, ]DZLHUDMFHM]DZDUWRüNDWDORJXURERF]HJRQDVW SQLHQDOH*\QDFLVQüENTER-HOLSOLN RSRGDQHMQD]ZLHQLHLVWQLHMH7XUER3DVFDOXWZRU]\QRZHRGSRZLHGQLR]DW\WXáRZDQH RNLHQNRHG\WRUDNWyUHJR]DZDUWRüE G]LHPR*QDZGRZROQ\PPRPHQFLH]DSLVDüEH] NRQLHF]QRFLSRGDZDQLDQD]Z\ Druga PHWRGD SROHJD QD RGSRZLHGQLP Z\ZRáDQLX 7XUER 3DVFDOD ] SR]LRPX '26-u. $E\RWZRU]\üLVWQLHMF\SOLN]SURJUDPHPOXEXWZRU]\üQRZ\SOLNZ\VWDUF]\QDSLVDü turbo nazwa↵
Po uruchomieniu system automatycznie odczyta plik o zadanej nazwie (i rozszerzeniu .PAS; pRGREQLHMDNSRSU]HGQLRUR]V]HU]HQLDQLHWU]HEDSRGDZDü OXEMHOLWDNLSOLNQLH istnieje, otworzy puste okienko edytora o odpowiednim tytule.
Pierwszy program
31
: WHQ VSRVyE SR]QDáH DEVROXWQH SRGVWDZ\ SRVáXJLZDQLD VL URGRZLVNLHP 7XUER Pascala i urucKRPLáH VZyM SLHUZV]\ SURJUDP $ RWR NLOND üZLF]H NWyUH SRPRJ &L QDEUDüZSUDZ\L]GRE\üGRGDWNRZHZLDGRPRFL • Z\NRU]\VWDM V\VWHP SRPRF\ GR Z\ZLHWOHQLD LQIRUPDFML R SRV]F]HJyOQ\FK HOHPHQWDFKSURJUDPXVáRZDFKNOXF]RZ\FKLGHQW\ILNDWRUDFKRSHUDWRUDFK • VSUyEXMZSURZDG]LüGRSURJUDPXNLONDEá GyZ-DNDMHVWUHDNFMDNRPSLODWRUD" • SRSUDZSURJUDPWDNE\GDáRVL ]DMHJRSRPRFREOLF]\üSROHNRáDRSURPLHQLX FP FP LWG 6SUyEXM QDSLVDü SURJUDP REOLF]DMF\ SROH WUyMNWD R ]QDQHM GáXJRFLSRGVWDZ\LZ\VRNRFL • ]DVWDQyZ VL FR QDOH*DáRE\ ]PLHQLü Z SU]HGVWDZLRQ\P SURJUDPLH E\ XF]\QLü JR OHSV]\P EDUG]LHM F]\WHOQ\P XQLZHUVDOQ\P SUDNW\F]Q\P áDWZLHMV]\P Z obVáXG]H
=DSDPL WDM • 3URJUDPSDVFDORZ\VNáDGDVL ]FLJXUR]G]LHORQ\FKUHGQLNDPLLQVWUXNFMLSRáR*RQ\FKSRPL G]\VáRZDPLNOXF]RZ\PLbegin i end. • ,QVWUXNFMHVWDQRZLV\PEROLF]Q\]DSLVRSHUDFMLNWyUHPDZ\NRQDüNRPSXWHU • ,QVWUXNFMHPRJ]DZLHUDüZ\UD*HQLDRUD]Z\ZRáDQLDIXQNFMLLSURFHGXU • :\UD*HQLDVNáDGDMVL ]HVWDá\FKRSHUDWRUyZLLGHQW\ILNDWRUyZ • ,GHQW\ILNDWRU\ V QD]ZDPL RELHNWyZ VNáDGDMF\FK VL QD SURJUDP 0RJ RQH ]DZLHUDü OLWHU\ F\IU\ L ]QDNL SRGNUHOHQLD QLH PRJ MHGQDN ]DF]\QDü VL RG cyfr. • $E\VNRPSLORZDüSURJUDPPXVLV]X*\üSROHFHQLDMake (F9). Ewentualne Eá G\NRPSLODFMLVRGSRZLHGQLRV\JQDOL]RZDQH • &KFF XUXFKRPLü SURJUDP PXVLV] Z\GDü SROHFHQLH Run (CTRL-F9). Do obejU]HQLDZ\QLNyZG]LDáDQLDSURJUDPXPR*HRND]DüVL QLH]E GQHSROHFHQLHUser Screen (ALT-F5). • $E\]DSLVDüSURJUDPX*\MSROHFHQLDSave (F2). Do odczytania zapisanego progUDPX]G\VNXVáX*\SROHFHQLHOpen (F3).
32
Turbo Pascal — programowanie
Nic nie jest GRVNRQDáH D]ZáDV]F]DSLHUZV]\Z*\FLXSURJUDPZ3DVFDOX-H*HOLSUyERZDáH]DVWDQRZLüVL QDGS\WDQLHP]DP\NDMF\PSRSU]HGQLUR]G]LDáQDMSUDZGRSRGREQLHMZLG]LV]MX*PR*liZRFL XOHSV]HQLD VZHJR G]LHáD 1D SRF]WHN VSUyEXMHP\ ]DMü VL F]\WHOQRFL SURJUDPXDQDVW SQLH]DVWDQRZLP\VL MDNXF]\QLüJREDUG]LHMSUDNW\F]Q\P &RZáDFLZLHURELQDV]SURJUDP"Ä2EOLF]DSROHNRáD´—RGSRZLHV]6NGWRZLDGRPR" Ä7DNE\áRQDSLVDQHZNVL*FH´$MHOLNWRQLHF]\WDáNVL*NL"Ä0R*HVL GRP\OLüSR przeczytaniu programu”. $OH SR FR PD F]\WDü SURJUDP" &R SUDZGD ]UR]XPLHQLH MHGQHM LQVWUXNFML WR *DGHQ SUREOHPDOHMHOLLQVWUXNFMLE G]LHVWR"=QDF]QLHOHSLHME\áRE\XPLHFLüZSURJUDPLH LQIRUPDFM RSLVXMF MHJR SU]H]QDF]HQLH L HZHQWXDOQLH PHWRG UHDOL]DFML ]DGDQLD 0R*QD WR ]URELü QD NLOND VSRVREyZ XPLHV]F]DMF RGSRZLHGQLH ]DSLV\ Z SURJUDPLH RUD]X*\ZDMFVWRVRZQHMQD]Z\SOLNX=UyEP\WRRGUD]X program Pole_kola; ^3URJUDPREOLF]DSROHNRáDRSURPLeniu 5 } begin ZULWH3L REOLF]LZ\SLV]SROHNRáD end.
:SRUyZQDQLXGRSRSU]HGQLHMZHUVMLSURJUDPXSRMDZLá\VL ZQLPWU]\QRZHHOHPHQW\ QDJáyZHN, komentarze oraz ZFL FLD. 1DJáyZHN program Pole_kola SHáQL Z\áF]QLH IXQNFM LQIRUPDF\MQ L QLH PD ZSá\ZXQDG]LDáDQLHSURJUDPXFRQLH]PLHQLDIDNWX *HX*\ZDQLHJR—FKRFLD*QLHRERZL]NRZH—QDOH*\GRGREUHMSUDNW\NLXáDWZLDERZLHPF]\WDQLHRVRERPWU]HFLP 6NáDGQLDQDJáyZNDWR program nazwa;
1LFQLHMHVWGRVNRQDáH
33
=DXZD* SU]\ RND]ML *H Ä3ROH NRáD´ WR GZD RGG]LHOQH Z\UD]\ SRQLHZD* nazwa jako LGHQW\ILNDWRUQLHPR*H]DZLHUDü]QDNXVSDFML]DVW SXMHVL JRSRGNUHOHQLHP_). =QDF]QLHZD*QLHMV]HGODF]\WHOQRFLSURJUDPXVNRPHQWDU]H.RPHQWDU]HPZ3DVFDOX MHVWGRZROQ\FLJ]QDNyZXM W\ZQDZLDV\NODPURZH { i }=RF]\ZLVW\FKZ]JO GyZ FLJWDNLQLHPR*H]DZLHUDüQDZLDVyZNODPURZ\FKQDWRPLDVWZV]\VWNLHLQQH]QDNLV GR]ZRORQH -H*HOL NRQLHF]QLH FKFHV] XPLHFLü QDZLDV\ NODPURZH Z NRPHQWDU]X PXVLV] X*\ü MDNR RJUDQLF]QLNL GZX]QDNRZ\FK V\PEROL (* i *) FR ZLGDü Z GUugim komenWDU]X 3RGREQLHMDNZSU]\SDGNXQDJáyZNDNRPHQWRZDQLHSURJUDPyZQLHMHVW oboZL]NRZH QDOH*\ MHGQDN GR GREUHM SUDNW\NL SURJUDPRZDQLD 2F]\ZLFLH NRPHQWDU]H SRZLQQ\ E\ü X*\ZDQH UR]VGQLH QLH PD VHQVX LFK QDGX*\ZDQLH F]\ NRPHQWRZDQLH U]HF]\ RF]\ZLVW\FK MDN QS VáRZD begin :DUWR MHGQDN ]GDZDü VRELH VSUDZ *H NRPHQWDU]H QLF QLH NRV]WXM WM QLH PDM ZSá\ZX QD ZLHONRü skompilowanego progUDPX DMHGQRF]HQLHZ]QDF]F\VSRVyESRSUDZLDMF]\WHOQRü programu. .RPHQWDU]HE\ZDMUyZQLH*F] VWRVWRVRZDQHGRFKZLORZHJRZ\áF]HQLD IUDJPHQWXSURJUDPX]NRPSLODFML3R]ZDODWRXQLNQüXVXZDQLDLSRZWyUQHJR ZSLV\ZDQLDWHNVWX]DPLDVWWHJRZ\VWDUF]\XMüÄQLHFKFLDQ\´IUDJPHQW SURJUDPXZ]QDNLNRPHQWDU]DNWyUHSRWHPPR*QDáDWZRXVXQü 2VWDWQLPÄNRVPHW\F]Q\P´HOHPHQWHPQDV]HJRSURJUDPXVZFL FLD. Nasz program jest FR SUDZGD WDN PDá\ *H X*\ZDQLH ZFL ü MHVW QLHFR G\VNXV\MQH MHGQDN Z ZL NV]\FK SURJUDPDFK NWyU\PL ]DMPLHP\ VL MX* ZNUyWFH ZFL FLD SR]ZDODM QD V]\ENLH ]ORNDOL]RZDQLH IUDJPHQWyZ WZRU]F\FK ORJLF]Q FDáRü L ]QDMGXMF\FK VL QD W\P VDP\P SR]LRPLH Z VWUXNWXU]H SURJUDPX:FLQDQLHSRGREQLHMDNLQQHUHJXá\SLVDQLDáDGQ\FK i F]\WHOQ\FKSURJUDPyZMHVWZGX*HMPLHU]HNZHVWLVW\OX]Z\NOHSRMHG\QF]HZFL FLH PDJá ERNRü÷]QDNyZ ZDUWRMHGQDNSU]\MU]HüVL VSUDZG]RQ\PZ]RUFRPQS SURJUDPRPSU]\NáDGRZ\PILUP\%RUODQG DQDVW SQLHZ\SUDFRZDüZáDVQ\VW\OLVWRsoZDüJRNRQVHNZHQWQLH 7\OH VSUDZ ÄIRUPDOQ\FK´ QLH E G]LHP\ VL QDG QLPL ZL FHM UR]ZRG]Lü ]RVWDZLDMF UHV]W SUDNW\FH 3U]HMG]LHP\ REHFQLH GR ]QDF]QLH EDUG]LHM LQWHUHVXMFHM F] FL WHJR UR]G]LDáXFR]URELü*HE\QDV]SURJUDPVWDáVL EDUG]LHMSUDNW\F]Q\" 0R*H LQDF]HM FR SURJUDP UREL REHFQLH" 2EOLF]D L Z\ZLHWOD SROH NRáD R SURPLHQX FP%DDOHVNGZLDGRPR*HWRSROHNRáDDQLHQSUHGQLDRSDGyZ]XELHJáHJRSyáURF]D" )HE\ VL R W\P SU]HNRQDü PXVLV] ]DMU]Hü GR NVL*NL JG]LH MHVW WR QDSLVDQH ZSURVW OXEGRSURJUDPXQDGNWyU\PPXVLV]WURFK SRP\OHüRLOHQLHZSLVDáHMHV]cze odpoZLHGQLFKNRPHQWDU]\ 1DGRGDWHNZ\ZLHWOana liczba ma cokolwiek niestrawQ\IRUPDWLQLH]E\WFK WQLHQDPVL SRND]XMH &KZLOHF]N QLH ZV]\VWNR QDUD] 1D SRF]WHN VSUyEXMP\ VIRUPXáRZDü OLVW *\F]H F]\OL ]DSLVDü Z XSRU]GNRZDQ\ VSRVyE WR FR QDP VL Z SURJUDPLH QLH SRGRED L FR FKFLHOLE\P\]PLHQLü$]DWHP • SURJUDPSRZLQLHQLQIRUPRZDüX*\WNRZQLNDRW\PFRUREL
34
Turbo Pascal — programowanie • Z\QLNG]LDáDQLDSURJUDPXQLHSRZLQLHQ]QLNDüOHF]]RVWDZDüQDHNUDQLHWDN GáXJRMDN*\F]\VRELHX*\WNRZQLN • Z\ZLHWODQDOLF]EDSRZLQQDáDGQLHMZ\JOGDü 3LHUZV]\ SUREOHP PR*QD UR]ZL]Dü Z\SURZDG]DMF QD HNUDQ GRGDWNRZ LQIRUPDFM w SRVWDFLWHNVWX6áX*\GRWHJR]QDQD&LMX*SURFHGXUD writeNWyUDW\PUD]HPE G]LH Z\SLV\ZDáD QD HNUDQLH QLH Z\UD*HQLH OLF]ERZH OHF] áDFXFK D FLOHM U]HF] ELRUF W]Z VWDá áDFXFKRZ F]\OL FLJ ]QDNyZ 6WDá áDFXFKRZ MHVW Z 3DVFDOX GRZROQ\ FLJ]QDNyZXMHW\ZDSRVWURI\', nie " &LJWDNLPR*H]DZLHUDüGRZROQH]QDNL]QDN DSRVWURIX QRUPDOQLH NRF]F\ áDFXFK ]DSLVXMH VL MDNR GZD DSRVWURI\ WM GZD oddzielne znaki 'DQLH]QDNFXG]\VáRZX"). CDáRüE G]LHZ\JOGDáDQDVW SXMFR write('Program oblicza pole kola o promieniu 5 cm.')
6SUyEXMWHUD]SU]\MU]HüVL RSLVRZLSURFHGXU\ write]SRSU]HGQLHJRUR]G]LDáXL]DVWDQRZLüVL MDNSRZLQQDZ\JOGDüLQVWUXNFMDZ\SLVXMFDQDHNUDQLHWHNVW Pole kola = .....
ZPLHMVFXNURSHNSRZLQQD]QDOH(üVL REOLF]RQDSU]H]QDV]SURJUDPOLF]ED -HOLQLH ZLHV]MDNWR]URELüU]XüRNLHPQDWHNVWQDVW SQHJRSURJUDPX=DXZD*SU]\RND]ML*H SRMDZLáD VL Z QLP GUREQD QRZLQND PLDQRZLFLH SURFHGXUD writeln Uy*QLFD VL od writeW\ONRW\P*HSRMHMZ\NRQDQLXNXUVRUSU]HFKRG]LGRQRZHJRZLHUV]DLWDPWH* Z\SLV\ZDQHVNROHMQHLQIRUPDFMH $E\SU]HNRQDüVL RUy*QLF\ZG]LDáDQLXREXSURFHGXU]DPLHSLHUZV]LQVWUXNFM writeln na write i wykonaj program. 6SUDZDGUXJDF]\OL]DWU]\PDQLHZ\QLNXQDHNUDQLHPRQLWRUDUyZQLH*GDMHVL SURVWR UR]ZL]Dü:\VWDUF]\PLDQRZLFLHQDNRFXSURJUDPXGRSLVDüLQVWUXNFM
readln;
i gotowe. Co to takiego readln —WRMX*LQQDVSUDZDSURFHGXU readlnLSRNUHZQ jej read ]DMPLHP\ VL ZNUyWFH QD UD]LH ]D Z\VWDUF]\ &L ZLHG]LHü W\OH *H readln RGF]\WXMH ] NODZLDWXU\ GRZROQ\ FLJ ]QDNyZ ]DNRF]RQ\ ]QDNLHP QRZHJR ZLHUV]D (kodem klawisza ENTER WRWH* MHM Z\ZRáDQLH SRZRGXMH ]DWU]\PDQLH G]LDáDQLD SURJUDPXGRPRPHQWXQDFLQL FLDWHJR*NODZLV]D 3R]RVWDáDVSUDZDRVWDWQLDWM]URELHQLHSRU]GNX]PDáRF]\WHOQUHSUH]HQWDFMZ\SURZDG]DQHJRSROD1DSRF]WHNUR]V]\IUXMP\]DSLV 7.8539816340E+01
Jest to nic innego, jak 7.8539816340· 101F]\OLRNRáR=DSLV x.xxxxEnn oznacza ZL FOLF]E x.xxxx pomno*RQSU]H]GRSRW JLnn i zwany jest zapisem naukowym. =DXZD* SU]\ RND]ML *H F] ü XáDPNRZD OLF]E\ RGG]LHORQD MHVW RG F] FL U]HF]\ZLVWHM QLHSU]HFLQNLHPOHF]NURSNEDUG]RZD*QH :\NáDGQLNnn jest zawsze dobierany tak, E\]QDMGXMFDVL ÄSU]HGQLP´OLF]EDPLDáDW\ONRMHGQF\IU SU]HGNURSNWM]DZLHUDáD VL ZSU]HG]LDOHRGGR:LHONRüOLWHU\(V\PEROL]XMFHMZ\NáDGQLNQLHPD]QDF]HQLD]D]QDNPR*QDSRPLQü2WRNLONDSU]\NáDGyZ 3.14E+00 = 3.14 2.78E–3 = 0.00278
1.2345e4 = 12345 1,35E12 = EáG (jaki?)
1LFQLHMHVWGRVNRQDáH
35
=DSLV QDXNRZ\ SR]ZDOD QD áDWZH L MHGQROLWH UHSUH]HQWRZDQLH EDUG]R PDá\FK L EDUG]R GX*\FKOLF]EMHVWMHGQDNQLH]E\WF]\WHOQ\$E\XF]\QLüJREDUG]LHMVWUDZQ\PPR*QD X*\ü W]Z formatowania SROHJDMFHJR QD SU]HND]DQLX SURFHGXU]H write (writeln) GRGDWNRZ\FKLQIRUPDFMLRSLVXMF\FKVSRVyEZ\SURZDG]HQLDOLF]E\:SU]\SDGNXOLF]E U]HF]\ZLVW\FK LQIRUPDFMH WH RNUHODM FDáNRZLW V]HURNRü SROD ]DZLHUDMFHJR OLF]E RUD]LORüSR]\FMLSRNURSFHG]LHVL WQHMLPRJE\üV\PEROLF]QLH]DSLVDQHMDNR ZDUWRüV]HURNRü-pola:liczba-cyfr-po-kropce
/LF]ED]DZLHUDMFDPQLHMF\IUQL*RNUHORQRZV]HURNRFLSRODMHVWÄGRVXZDQD´GRSUDZHM VWURQ\ L X]XSHáQLDQD ] OHZHM ]QDNDPL VSDFML 8VWDODMF V]HURNRü SROD PXVLV] UyZQLH*XZ]JO GQLüPLHMVFHQDNURSN G]LHVL WQLHZHQWXDOQ\]QDNOLF]E\ :WHQVSRVyEGRWDUOLP\GRNROHMQHMZHUVMLSURJUDPXREOLF]DMFHJRSROHNRáD program Pole_kola; ^3URJUDPREOLF]DSROHNRáDRSURPLHQLX` begin writeln('Program oblicza pole kola'); write('Pole = '; Pi*5*5:8:3); (* oblicz i wypisz *) (* pole kola *) readln; end.
6NRUR MX* PyZLP\ R IRUPDWRZDQLX ZDUWR MHV]F]H ZVSRPQLHü *H GOD OLF]E FDáNRZLW\FK QLH SRVLDGDMF\FK F] FL XáDPNRZHM Z\VWDUF]\ RNUHOHQLH V]HURNRFL pola, czyli zapis ZDUWRüV]HURNRü-pola
: LGHQW\F]Q\ VSRVyE PR*QD UyZQLH* IRUPDWRZDü QS áDFXFK\ FR MHGQDN VWRVRZDQH MHVWU]DGNR=DSU]\NáDGQLHFKSRVáX*\NROHMQ\SURJUDP program Formatowanie; ^'HPRQVWUDFMDPR*OLZRFLIRUPDWRZDQLDZ\GUXNyZ` begin writeln(1.23 ^]DPDáRPLHMVFDSRNURSFH` ZULWHOQ ^]DPDáRPLHMVFDZRJyOH` ZULWHOQ ^RNUHODP\W\ONRV]HURNRüSROD` ZULWHOQ ^IRUPDWRZDQLHOLF]E\FDáNRZLWHM` ZULWHOQ ^IRUPDWRZDQLHáDFXFKD` end.
:WHQVSRVyERPyZLOLP\SRGVWDZRZH]DELHJLNRVPHW\F]QHNWyU\PPR*HP\SRGGDü QDV]SURJUDP3UH]HQWXMHVL RQMX*QLHFRáDGQLHMMHGQDN]PLDQ\NWyU\FKGRNRQDOLP\ PDM FKDUDNWHU SRZLHU]FKRZQ\ &R ERZLHP ]URELV] *HE\ REOLF]\ü SROH NRáD o proPLHQLXFP"3RSUDZLV]SURJUDPLVNRPSLOXMHV]JRMHV]F]HUD]"&K\EDMHGQDNSURFLHM Z]LüNDONXODWRUDPR*HQLH
36
Turbo Pascal — programowanie
=DSDPL WDM • 3URJUDP\QDOH*\SLVDüF]\WHOQLHJG\*XáDWZLDWRLFK]UR]XPLHQLHLHZHQWXDOQH ZSURZDG]DQLHSy(QLHMV]\FK]PLDQ • 3URJUDP PR*QD RSLVDü QDJáyZNLHP ]DF]\QDMF\P VL RG VáRZD NOXF]RZHJR program. • %DUG]R ZD*QH GOD F]\WHOQRFL SURJUDPX V NRPHQWDU]H ]DSLV\ZDQH Z nawiasach klamrowych, oraz odpowiednie wcinanie poszczególnych instrukcji. • $E\ Z\SURZDG]Dü LQIRUPDFMH Z NROHMQR QDVW SXMF\FK SR VRELH ZLHUV]DFK SRZLQLHQHX*\üSURFHGXU\writeln. • &KFFZVWU]\PDüG]LDáDQLHSURJUDPXPR*HV]X*\üSURFHGXU\readln. • $E\XF]\QLüZ\GUXNEDUG]LHMF]\WHOQ\P]DVWRVXMIRUPDWRZDQLHZ\MFLD
Ulepszamy dalej
37
Ulepszamy dalej 1LHWU]HEDFK\EDQLNRJRSU]HNRQ\ZDü*HSRU]GQ\SURJUDPSRZLQLHQXPLHüVDP]DS\WDü X*\WNRZQLND R ZDUWRü SURPLHQLD L REOLF]\ü SROH EH] NRQLHF]QRFL XFL*OLZHJR SRSUDZLDQLDLNRPSLORZDQLDWHNVWX:W\PFHOXQDOH*DáRE\Z\SLVDüQDHNUDQLHRGSRZLHGQLHS\WDQLHFRMX*SRWUDILV]]URELü DQDVW SQLHZSURZDG]Lü]NODZLDWXU\ZDUWRü SURPLHQLD L Z\NRU]\VWDü M GR REOLF]HQLD SROD NRáD ]H Z]RUX 6 πr2 %D áDWZR SRZLHG]LHüDOHMDNZSURZDG]LüMDNZDUWRüGRSURJUDPXLJG]LHMSU]HFKRZDü" 5R]ZL]DQLHPWHJRSUREOHPXMHVWX*\FLHzmiennej. Podobnie jak w matematyce, zmienQDV\PEROL]XMHSHZQZDUWRüF]\OLPR*HE\üWUDNWRZDQDMDNRVZHJRURG]DMXSRMHPQLNGRNWyUHJRZNáDGDP\QSOLF]E ZDUWRüSURPLHQLD Ä)L]\F]QLH´ZDUWRü]PLHQQHM XPLHV]F]DQD MHVW JG]LH Z SDPL FL NRPSXWHUD L PR*H E\ü ]ORNDlizowana poprzez adres F]\OL QXPHU RGSRZLHGQLHM NRPyUNL SDPL FL 3RQLHZD* SRVáXJLZDQLH VL DGUHVDPL MHVW QLH]E\W Z\JRGQH 3DVFDO XPR*OLZLD RGZRá\ZDQLH VL GR ]PLHQnej za SRPRFnazwyE GFHM]Z\Ná\PLGHQW\ILNDWRUHPLQIRUPDFMHQDWHPDWLGHQtyfikatorów znajG]LHV] QD VWURQLH 'RGDWNRZ LQIRUPDFM QLH]E GQ GR XVWDlenia sposobu SRVáXJLZDQLDVL ]PLHQQLMHMUHSUH]HQWDFMLZSDPL FLMHVWtyp — w naszym przypadku E G]LHWRW\S]PLHQQRSU]HFLQNRZ\RGSRZLDGDMF\ZDUWRFLU]HF]\ZLVWHMreal). 3RQLHZD* NRPSLODWRU WáXPDF]\ WHNVW (UyGáRZ\ SURJUDPX QD EH]SRUHGQLR Z\NRQ\ZDOQSU]H]NRPSXWHUSRVWDüZ\QLNRZPXVLZLHG]LHüMDNUHSUH]HQWRZDüGDQ ]PLHQQ Z SDPL FL L MDN VL ] QL REFKRG]Lü 1LH]E GQH MHVW ]DWHP zadeklarowanie ND*GHMX*\ZDQHMZSURJUDPLH]PLHQQHMF]\OLSU]HND]DQLHNRPSLODWRURZLLQIRUPDFMLR MHM QD]ZLH L W\SLH 'R GHNODURZDQLD ]PLHQQ\FK VáX*\ VSHFMDOQH VáRZR NOXF]RZH var (ang. variable —]PLHQQD ]DVNáDGQLDGHNODUDFMLPDSRVWDü var lista-nazw : typ-1; lista-nazw : typ-2 ...
przy czym lista-nazw WRFLJQD]Z]PLHQQ\FKWHJRVDPHJRW\SXUR]G]LHORQ\FKSU]HFLQNDPL$E\]DGHNODURZDüNROHMQJUXS ]PLHQQ\FKLQQHJRW\SX QLHPXVLV]SRQRZQLH X*\ZDüVáRZDvarZ\VWDUF]\GRSLVDüSRGVSRGHPQRZOLVW LSRGDüQD]Z W\SX
38
Turbo Pascal — programowanie 2VWDWQLPZ\PDJDQLHPRNWyU\PPXVLV]SDPL WDüMHVWXPLHV]F]DQLHZV]\VWNLFKGHNODUDFML SU]HG F] FL RSHUDF\MQ SURJUDPX SRQLHZD* EH]SRUHGQLR Z\NRU]\VWXMH RQD ]DGHNODURZDQHRELHNW\PXV]RQH]RVWDüRSLVDQHSU]HGMHMUR]SRF] FLHP 3R ]DGHNODURZDQLX PR*QD MX* ÄQRUPDOQLH´ NRU]\VWDü ]H ]PLHQQHM F]\OL QDGDZDü MHM ZDUWRü Z\NRU]\VW\ZDü Z Z\UD*HQLDFK OXE Z\SURZDG]Dü QD HNUDQ PRQLWRUD 0XVLV] MHGQDNSDPL WDü*HVDPDGHNODUDFMDQLHQDGDMH]PLHQQHMVHQVRZQHMZDUWRFLDMHG\QLH LQIRUPXMHNRPSLODWRURMHMLVWQLHQLXLZáDFLZRFLDFK3U]HGX*\FLHP]PLHQQHMPXVLV] koniecznie QDGDü MHM ZDUWRü ]DLQLFMDOL]RZDü M SU]H] ZSURZDG]HQLH MHM ZDUWRFL z NODZLDWXU\OXE]DSRPRFW]Zinstrukcji przypisania. )HE\GáX*HMQLHWHRUHW\]RZDü]DGHPRQVWUXMP\QRZZHUVM QDV]HJRSURJUDPX program Pole_kola; { PrRJUDPREOLF]DSROHNRáDRSURPLHQLX` ^3URPLHZSURZDG]DQ\MHVW]NODZLDWXU\` var { deklaracja zmiennych } UUHDO^SURPLHNRáD– zmienna rzeczywista } begin writeln('Program oblicza pole kola'); write('Podaj promien kola: '); UHDGOQU ^RGF]\WDM]PLHQQ` { z klawiatury } write('Pole = '; Pi*r*r:8:3); { oblicz i wypisz } ^SROHNRáD` readln; end.
=DSHZQH ]DXZD*\áH MX* Z SURJUDPLH ]QDQ &L ] SRSU]HGQLHJR UR]G]LDáX SURFHGXU readln7XWDMSHáQLRQDLQQZáDFLZLHVZRM]DVDGQLF] IXQNFM DPLDQRZLFLHRGczyWXMHZDUWRü]PLHQQHMr]NODZLDWXU\6NáDGQLDSURFHGXU\readlnMHVWQDVW SXMFD readln[(zmienna, zmienna...)];
L Z\JOGD SRGREQLH MDN GOD ÄRGZURWQHM´ SURFHGXU\ writeln ] W GUREQ Uy*QLF *H argumentami readlnPRJE\üMHG\QLH]PLHQQH'ODF]HJR"3URFHGXUD readln pobieUD]NODZLDWXU\DFLOHMU]HF]ELRUF]W]ZZHMFLDSURJUDPX SHZQZDUWRüLPXVL MJG]LHXPLHFLü:DUWRüPR*H]RVWDüXPLHV]F]RQDZ]PLHQQHMF]\OLJG]LHZSDPL FLQLHPR*HMHGQDN]RVWDü]DSLVDQDZZ\UD*HQLXNWyUHMHVWMHG\QLH]DSLVHPSHZQHM RSHUDFML L QLH SRVLDGD ORNDOL]DFML Z SDPL FL NRPSXWHUD 3RGREQLH QLHGRSXV]F]DOQH E G]LHX*\FLHMDNRDUJXPHQWXVWDáHMOXER]JUR]R RSHUDWRUD Pokrewna procedura read VWRVRZDQD MHVW ]QDF]QLH U]DG]LHM Uy*QLFD PL G]\ QL a readln VSURZDG]D VL SRGREQLH MDN GOD write i writeln GR WHJR L* SR RGF]\taniu swoich argumentów readlnSU]HFKRG]LGRQDVW SQHJRZLHUV]DGDQ\FKZHMFLRwych, a read nie. Procedura readX*\ZDQDMHVWJáyZQLHGRF]\WDQLDGDQ\FK]SOLNyZ R NWyU\FK Sy(QLHM ]D MHM X*\FLH GR ZSURZDG]DQLD GDQ\FK ] NODZLDWXU\ PR*H GRSURZDG]LüGRQLHVSRG]LHZDQ\FKHIHNWyZGODWHJRWH*QDUD]LHOHSLHMMHMXQLNDü
Ulepszamy dalej
39
3RUD SRZLHG]LHü FR ZL FHM QD WHPDW W\SyZ 7\S ]PLHQQHM RNUHOD MHM ZHZQ WU]Q UHSUH]HQWDFM ZSDPL FLNRPSXWHUDOLF]E EDMWyZ]DMPRZDQ\FKSU]H]]PLHQQ]DNUHV GRSXV]F]DOQ\FKZDUWRFLLGRNáDGQRüUHSUH]HQWDFML RUD]]HVWDZRSHUDFMLNWyUHPR*QD QD QLHM Z\NRQ\ZDü .LONDQDFLH VWDQGDUGRZ\FK W\SyZ GRVW SQ\FK Z 7XUER 3DVFDOX RSLV]HP\ZSRQL*V]HMWDEHOL=Z\MWNLHPW\SX stringZV]\VWNLHRQHQDOH*GRW]Z typów prostychQLHGDMF\FKVL UR]ELüQDSURVWV]HW\S\ Tablica 1. 1DMZD*QLHMV]HW\S\GRVW SQHZ7XUER3DVFDOX Nazwa integer real char string boolean word byte shortint longint single double extended comp pointer
Znaczenie
=DNUHVZDUWRFL
OLF]EDFDáNRZLWD]H]QDNLHP –32768..+32767 liczba rzeczywista 2.9· 10–39..1.7· 1038 znak znaki o kodach 0..255 QDSLVáDFXFKFLJ]QDNyZ FLJGR]QDNyZ ZDUWRüORJLF]QD prawda (true OXEIDáV]false) s³owo 0..65535 bajt 0..255 NUyWNDOLF]EDFDáNRZLWD]H]QDNLHP –128..+127 GáXJDOLF]EDFDáNRZLWD]H]QDNLHP –2147483648..+2147483647 krótka liczba rzeczywista 1.5· 10–45..3.4· 1037 GáXJDOLF]EDU]HF]\ZLVWD 5.0· 10–324..1.7· 10308 EDUG]RGáXJDOLF]EDU]HF]\ZLVWD 3.4· 10–4932..1.1· 104932 EDUG]RGáXJDOLF]EDFDáNRZLWD –9.2· 1018..9.2· 1018 ZVND(QLN 0000h:0000h..FFFFh:FFFFh
3U]\NáDG –14574 1.23245e17 'a' 'Napis' false 56412 127 –13 –1986734234 3.14e01 –1.8e+234 4.5e2345 6e12 $1234:ABCD
&]WHU\ SLHUZV]H W\S\ Z\PLHQLRQH Z WDEHOL VWDQRZL SRGVWDZRZ\ ]HVWDZ NWyU\P E G]LHV]SRVáXJLZDáVL SRGF]DVSLVDQLDSURJUDPyZ7\S\FDáNRZLWHinteger, word, shortint, byte, longint), typ znakowy (char) oraz logiczny (boolean WZRU] z NROHLJUXS W]ZW\SyZSRU]GNRZ\FK (ang. ordinal types ZUDPDFKNWyU\FKRNUHORQDMHVWUHODFMDSRU]GNXF]\OLNWRSU]HGNLPDNWRSRNLP 7\S\FDáNRZLWHX*\ZDQHVZSURJUDPDFKGRUHSUH]HQWDFMLOLF]QLNyZDGresów i indeNVyZWDEOLFRUD]]DZDUWRFLNRPyUHNSDPL FLbyte i word 3DPL WDM*H]HZ]JO GX QD VSHF\ILF]Q UHSUH]HQWDFM ZHZQ WU]Q OLF]E FDáNRZLW\FK SU]HNURF]HQLH ]DNUHVX dopuszczalnego dla danego typu powoduje „przeskoczenie” na drugi koniec zakresu (np. dodanie 1 do 32767 da w wyniku –32768). Efekt ten zwykle nie jest V\JQDOL]RZDQ\ SU]H] NRPSLODWRU L PR*H SURZDG]Lü GR GRü G]LZDF]QHJR ]DFKRZDQLD SURJUDPyZ$E\JRXQLNQüPR*HV]]DVWRVRZDüSRMHPQLHMV]\W\SQSlongint). 'UXJ REV]HUQ JUXS WZRU] W\S\ Uzeczywiste, przeznaczone do przechowywania ZDUWRFL QLHFDáNRZLW\FK L UHDOL]DFML ZL NV]RFL EDUG]LHM ]áR*RQ\FK REOLF]H PDWHPDW\F]Q\FK : ZL NV]RFL SU]\SDGNyZ ]DGRZDODMFH UH]XOWDW\ RVLJD VL SU]\ X*\FLX liczb typu real MHGQDN GOD SRSUDZ\ GRNáDGQRFL SRZL NV]HQLD ]DNUHVX ZDUWRFL i SU]\VSLHV]HQLD REOLF]H ZDUWR RGZRáDü VL GR MHGQHJR ] SR]RVWDá\FK W\SyZ ,FK Z\NRU]\VWDQLH Z\PDJD ]DGHNODURZDQLD X*\FLD Z SURJUDPLH W]Z koprocesora arytmetycznego VSHFMDOQHJR XNáDGX SU]H]QDF]RQHJR GR RSHURZDQLD QD OLF]EDch rzeczy-
40
Turbo Pascal — programowanie ZLVW\FK GRVW SQHJR MDNR RGG]LHOQ\ XNáDG OXE ZEXGRZDQHJR Z SURFHVRU\ '; i „lepsze”) albo tzw. emulatora F]\OL VSHFMDOQHJR SRGSURJUDPX ÄXGDMFHJR´ NRSURFHVRU$E\E\áRPR*OLZHRGZRáDQLHVL GRNRSURFHVRUDQDOH*\ZáF]\üRSFM Numeric Processing — 8087/80287 w polu dialogowym Options-Compiler ]D ZáF]HQLH HPXODFML UHDOL]XMH ]QDMGXMFD VL SRQL*HM RSFMD Emulation $OWHUQDW\Z MHVW XPLHV]czenie w programie tzw. dyrektyw kompilatora PDMF\FK RGSRZLHGQLR SRVWDü {$N+} i {$E+}. 7\S\]QDNRZ\LáDFXFKRZ\Z\NRU]\VW\ZDQHVGRUHSUH]HQWRZDQLDQDSLVyZLZV]HONLHMLQIRUPDFMLÄVáRZQHM´7\S booleanSR]ZDODQDSU]HFKRZ\ZDQLHZDUWRFLORJLF]Q\FK Z\NRU]\VW\ZDQ\FK GR VWHURZDQLD G]LDáDQLHP SURJUDPX ]D W\S ZVND(QLNRZ\ (pointer X*\ZDQ\MHVWZRSHUDFMDFKQD]DZDUWRFLSDPL FLNRPSXWHUDQLHFRG]LZQ\ ]DSLV $%&' R]QDF]D DGUHV NRPyUNL SDPL FL Z SRVWDFL V]HVQDVWNRZHM V\JQDlizowanej znakiem $). 1D W\P ]DNRF]\P\ WHQ NUyWNL UR]G]LDá 1D NROHMQ\FK NLONX VWURQDFK ]DMPLHP\ VL Z\UD*HQLDPLLLFKHOHPHQWDPLVNáDGRZ\PL]DZFKDUDNWHU]HüZLF]HQLDSURSRQXM &L ]PRG\ILNRZDQLH QDV]HJR SURJUDPX WDN E\ REOLF]Dá RQ SROH WUyMNWD QD SRGVWDZLH ZSURZDG]RQHM]NODZLDWXU\GáXJRFLSRGVWDZ\LZ\VRNRFL
=DSDPL WDM • 'RSU]HFKRZ\ZDQLDZDUWRFLVáX*ZSURJUDPLH]PLHQQH • &HFKDPL FKDUDNWHU\VW\F]Q\PL ]PLHQQHM V QD]ZD L W\S 1D]ZD SR]ZDOD QD ]LGHQW\ILNRZDQLH]PLHQQHM]DW\SRNUHODMHMZHZQ WU]QUHSUH]HQWDFM L]DNUHV ZDUWRFLRUD]GRSXV]F]DOQ\FKRSHUDFML • 3U]HG X*\FLHP ]PLHQQD PXVL ]RVWDü ]DGHNODURZDQD ]D SRPRF VáRZD NOXczowego var) oraz zaincjalizowana (przez przypisanie lub wprowadzenie warWRFL z ]HZQWU]QS]NODZLDWXU\ • 'R ZSURZDG]DQLD ZDUWRFL ]PLHQQ\FK ] NODZLDWXU\ VáX* SURFHGXU\ readln i read. • 7XUER 3DVFDO RIHUXMH NLONDQDFLH VWDQGDUGRZ\FK W\SyZ VSRUyG NWyU\FK QDMF] FLHM VWRVRZDQ\PL V W\S FDáNRZLW\ integer), rzeczywisty (real), znakowy (char LáDFXFKRZ\string). • 7\S\ FDáNRZLWROLF]ERZH ]QDNRZH RUD] W\S boolean WZRU] JUXS W\SyZ SRU]GNRZ\FK
:\UD*HQLD
41
:\UD*HQLD 7HPDW Z\UD*HQLD ]RVWDá ÄSU]HP\FRQ\´GRNVL*NLMX*GRüGDZQRWHPXLZ\SDGDáRE\ w NRFX W NZHVWL Z\MDQLü : QLQLHMV]\P UR]G]LDOH VSUyEXMHP\ Z\MDQLü F]\P V Z\UD*HQLDGRF]HJRVáX*RUD]MDNLHVLFKVNáDGQLNLLUHJXá\WZRU]HQLD :\UD*HQLD SR]ZDODM QD SU]HNV]WDáFDQLH LQIRUPDFML Z FHOX X]\VNDQLD RGSRZLHGQLFK Z\QLNyZLVWDQRZLMHGHQ]SRGVWDZRZ\FKVNáDGQLNyZSURJUDPyZ.D*GHZ\UD*HQLH stanowi symboliczny zapis pewnej operacji na danych reprezentowanych przez zmienne RSLVDQHLGHQW\ILNDWRUDPL LVWDáH]DSLVDQHMDZQLH 6DPDRSHUDFMDUHDOL]RZDQDMHVW za SRPRFoperatorów oraz funkcji3RM FLHZ\UD*HQLDQDMáDWZLHME G]LHQDP]LOXVWURZDü QD SU]\NáDG]LH PDWHPDW\F]Q\P MDN ZLDGRPR GáXJRü SU]HFLZSURVWRNWQHM c WUyMNWD SURVWRNWQHJRZ\UD*DVL Z]RUHP c = a 2 + b2 3U]HNáDGDMFWRQD3DVFDORWU]\PDP\ c := sqrt(a*a + b*b)
=DSLV]QDMGXMF\VL SRSUDZHMVWURQLH]QDNX := (tak zwanego operatora przypisania) MHVW ZáDQLH Z\UD*HQLHP : MHJR VNáDG ZFKRG] F]WHU\ LGHQW\ILNDWRU\ a i b) symboOL]XMFH ]PLHQQH SU]HFKRZXMFH GáXJRFL SU]\SURVWRNWQ\FK WU]y operatory (* i +) V\PEROL]XMFH RSHUDFMH PQR*HQLD L GRGDZDQLD RUD] LGHQW\ILNDWRU sqrtUHSUH]HQWXMF\ IXQNFM — SLHUZLDVWHN NZDGUDWRZ\ 3RQLHZD* R ]PLHQQ\FK L VWDá\FK MX* PyZLOLP\ ]DMPLHP\VL REHFQLHRSHUDWRUDPL 2SHUDWRU MHVW ]DVWU]H*RQ\P VáRZHP M ]\ND VWDQRZLF\P V\PEROLF]Q UHSUH]HQWDFM SHZQHJR G]LDáDQLD QD GDQ\FK UHSUH]HQWRZDQ\FK SU]H] argumenty RSHUDWRUD : ZL NV]RFLSU]\SDGNyZRSHUDWRU\SRVLDGDMGZDDUJXPHQW\LVWQLHMMHGQDNUyZQLH*RSHUDtory jednoargumentowe. W Pascalu zdefiniowano kilka grup operatorów, z których QDMF] FLHMZ\NRU]\VW\ZDQ\PLV]DSHZQHoperatory arytmetyczne:
42
Turbo Pascal — programowanie Tablica 2. Operatory arytmetyczne Operator
3U]\NáDG
Znaczenie
*
PQR*HQLH
2*2 = 4
/
dzielenie
2/3 = 0.66666...
div
G]LHOHQLHFDáNRZLWH
2 div 3 = 0
mod
reszta z dzielenia
3 mod 2 = 1
+
dodawanie
2+3=5
–
odejmowanie
2 – 3 = –1
– (jednoargumentowy) zmiana znaku
– 1 = –1
=Z\MWNLHPRSHUDWRUyZ div i modSU]H]QDF]RQ\FKZ\áF]QLHGRG]LDáDQDOLF]EDFK FDáNRZLW\FKZV]\VWNLHSR]RVWDáHRSHUDWRU\ÄZVSyáSUDFXM´]DUyZQR]OLF]EDPLFDáNRZLW\PLMDNLU]HF]\ZLVW\PL:SU]\SDGNXZ\NRQ\ZDQLDNLONXG]LDáDZREU ELHMHGQHJR Z\UD*HQLD LVWRWQ\ MHVW W]Z priorytet operatorów RNUHODMF\ SLHUZV]HVWZR SHZQ\FK G]LDáD SU]HG LQQ\PL 'OD RSHUDWRUyZ DU\WPHW\F]Q\FK SULRU\WHW\ Z\JOGDM PQLHM ZL FHM WDN MDN Z Ä]Z\NáHM´ PDWHPDW\FH SLHUZV]HVWZR PDM RSHUDWRU\ PQR*HQLDLG]LHOHQLD*, /, div i mod), wykonywane zawsze przed dodawaniem i odejmoZDQLHP']LDáDQLDUHSUH]HQWRZDQHSU]H]RSHUDWRU\RW\PVDP\PSULRU\WHFLHZ\NRQ\wane VZNROHMQRFLRGOHZHMGRSUDZHM 3DPL WDQLH R SULRU\WHWDFK RSHUDWRUyZ MHVW VSUDZ EDUG]R LVWRWQ JG\* QLHZáDFLZD NROHMQRüZ\NRQ\ZDQLDG]LDáDSURZDG]LF] VWRGRX]\VNDQLD]XSHáQLHLQQHJRZ\QLNX QL*VL VSRG]LHZDOLP\3U]\NáDGRZRLORUD] 1+ 2 3
QLH]RVWDQLHSRSUDZQLHREOLF]RQ\MHOL]DSLV]HV]JRZSRVWDFL 1 + 2 / 3
ERZLHP]DPLDVWZDUWRFLRWU]\PDV]SOXVF]\OL:áDFLZNROHMQRü Z\NRQ\ZDQLD G]LDáD PR*HV] MHGQDN Z\PXVLü ]D SRPRF QDZLDVyZ ]DSLVXMF QDV] iloraz jako (1 + 2) / 3
)UDJPHQW\ Z\UD*HQLD XM WH Z QDZLDV\ V ]DZV]H REOLF]DQH SU]HG Z\NRQDQLHP ZV]\VWNLFK SR]RVWDá\FK G]LDáD 1DZLDVyZ ZDUWR D QDZHW QDOH*\ X*\ZDü UyZQLH* ZyZF]DVJG\QLHMHVWVL SHZQ\PFRGRNROHMQRFLZ\NRQ\ZDQLDG]LDáD3DPL WDM*H QDZLDV\ QLH SRZRGXM JHQHURZDQLD GRGDWNRZHJR NRGX Z\QLNRZHJR D MHG\QLH ]PLHQLDMNROHMQRüRSHUDFMLDZL FÄQLFQLHNRV]WXM´RSUyF]NRQLHF]QRFLZSLVDQLDNLONX GRGDWNRZ\FK ]QDNyZ FR MHGQDN MHVW OHSV]H RG QDUD*DQLD VL QD WUXGQR Z\NU\ZDOQH Eá G\ OperatRU\ DU\WPHW\F]QH QLH Z\F]HUSXM RF]\ZLFLH DUVHQDáX GRVW SQHJR Z 7XUER 3DVFDOX .ROHMQ JUXS WZRU] operatory bitowe i logiczne QD]ZDQH WDN GODWHJR L*
:\UD*HQLD
43
SU]H]QDF]RQH V GR Z\NRQ\ZDQLD G]LDáD QD ELWDFK OLF]E FDáNRZLW\FK OXE GR SU]HNV]WDáFDQLDZDUWRFLORJLF]Q\FK$RWRRQH Tablica 3. Operatory bitowe i logiczne Operator
3U]\NáDG
Znaczenie logiczny
bitowy
not
negacja
not true = false
and
iloczyn logiczny
true and false = false
shl
SU]HVXQL FLHELWyZZOHZR
shr
SU]HVXQL FLHELWyZZSUDZR
or
suma logiczna
true or false = true
xor
suma modulo 2
true xor true = false 7 xor 15 = 8
not 15 = 240 7 and 15 = 7 7 shl 2 = 28 128 shr 4 = 8 7 or 128 = 135
=UR]XPLHQLH G]LDáDQLD RSHUDWRUyZ ORJLF]Q\FK QLH SRZLQQR QDVWU F]Dü WUXGQRFL -HOL FKRG]LRRSHUDWRU\ELWRZHWRLFKG]LDáDQLHVSURZDG]DVL GRPDQLSXORZDQLDSRV]F]HgólQ\PLELWDPLPRJF\PLSU]\MPRZDüZDUWRFLOXE ZNRPyUNDFKSDPL FL]DMPRwaQ\FK SU]H] OLF]E -HGQRDUJXPHQWRZ\ RSHUDWRU not neguje poszczególne bity ]PLHQLDLFKZDUWRFLQDSU]HFLZQe), operator and ustawia dany bit wyniku na 1 tylko ZWHG\ JG\ RGSRZLDGDMFH VRELH ELW\ REX DUJXPHQWyZ PDM ZDUWRü or — gdy co QDMPQLHM MHGHQ ] QLFK PD ZDUWRü ]D xor ustawia bit na 1 tylko wtedy, gdy jeden z ELWyZPDZDUWRüDGUXJL2SHUDWRU\ shl i shrPDMFKDUDNWHUZ\áF]QLHELWRZ\ GODOLF]EFDáNRZLW\FKZSHZQ\PXSURV]F]HQLX SU]HVXQL FLHELWyZRn pozycji w lewo lub w SUDZR RGSRZLDGD SRPQR*HQLX OXE SRG]LHOHQLX SU]H] n : UDPDFK üZLF]H SURSRQXM &LVSUDZG]LüSRSUDZQRüSRGDQ\FKZ\*HMSU]\NáDGyZSRWU]HEQD&LE G]LH ]QDMRPRüV\VWHPXGZyMNRZHJRZNWyU\PQSFDáNRZLWDOLF]ED]DSLV\ZDQDMHVWMDNR F]\OLVHNZHQFMDRPLXELWyZ]NWyU\FKWU]\QDMPQLHM]QDF]FHPDMZDUWRü 1). 2VWDWQL ZD*Q JUXS RSHUDWRUyZ VWDQRZL operatory relacyjne VáX*FH GR SRUyZQ\ZDQLD RELHNWyZ QLH W\ONR OLF]E DOH UyZQLH* ]QDNyZ F]\ áDFXFKyZ :V]\VWNLH RSHUDWRU\UHODF\MQHVGZXDUJXPHQWRZHRF]\ZLFLHW\S\REXDUJXPHQWyZPXV]E\ü ]JRGQH WM QLH PR*QD SRUyZQ\ZDü áDFXFKD ] OLF]E L GDM Z Z\QLNX ZDUWRü ORJLF]Q Tablica 4. Operatory relacyjne Operator
Znaczenie
3U]\NáDG
=
równy...
3 = 3.14 (false)
<>
Uy*Q\RG
3 <> 3.14 (true)
<
mniejszy od...
3 < 3.14 (true)
<=
mniejszy lub równy... 3 <= 3.14 (false)
>
ZL NV]\RG
3 > 3.14 (false)
>=
ZL NV]\OXEUyZQ\
3 >= 3 (true)
44
Turbo Pascal — programowanie 0XVLP\MHV]F]HXVWRVXQNRZDüVL GRZ\UD*HÄPLHV]DQ\FK´]DZLHUDMF\FKRSHUDWRU\ QDOH*FH GR NLONX JUXS 3U]\NáDGRZR REOLF]DMF Z\VRNRü VW\SHQGLXP VWXGHQFNLHJR QDOH*\ RNUHOLü F]\ UHGQLD RFHQ GHOLNZHQWD MHVW Z\VWDUF]DMFR Zysoka, a dochód na MHGQHJR F]áRQND URG]LQ\ Z\VWDUF]DMFR QLVNL $E\ ]DWHP XVWDOLü F]\ .RZDOVNLHPX QDOH*\VL VW\SHQGLXPX*\MHP\SU]\NáDGRZHJRZ\UD*HQLD (Dochod/LiczbaOsob < 150) and (Srednia > 3.75)
:\UD*HQLH WR ]DZLHUD GRVNRQDá PLHV]DQN RSHUDWRUyZ DU\WPHW\F]Q\FK ORJLF]Q\FK i UHODF\MQ\FK:WDNLFKV\WXDFMDFKNROHMQRüZ\NRQ\ZDQLDG]LDáDMHVWQDVW SXMFD Tablica 5. Priorytety operatorów Operatory
Priorytet
not * / div mod and shl shr + – or xor = <> < <= > >=
QDMZ\*V]\ QL*V]\ MHV]F]HQL*V]\ QDMQL*V]\
2F]\ZLFLH MHOL Z\UD*HQLH ]DZLHUD QDZLDV\ LFK ]DZDUWRü ]RVWDQLH Z\OLF]RQD SU]HG Z\NRQDQLHPSR]RVWDá\FKG]LDáD3RND]DQ\Z\*HMSU]\NáDGLOXVWUXMHMHGQRF]HQLHGRü W\SRZ V\WXDFM Z NWyUHM PXVLP\ SRáF]\ü ]H VRE NLOND ZDUXQNyZ Z\UD*RQ\FK QLHUyZQRFLDPLF]\OLRSHUDWRUDPLUHODF\MQ\PL 3RQLHZD*GRáF]HQLDZDUXQNyZVáX* operatory logiczne (zwykle or lub and PDMFHZ\*V]\SULRU\WHWQLH]E GQHMHVWX*\FLH QDZLDVyZLFKSRPLQL FLHMHVWEDUG]RSRVSROLW\PEá GHPRUHDNFMLNRPSLODWRra najleSLHMSU]HNRQDMVL VDP -DN MX* SRZLHG]LHOLP\ Z\UD*HQLD PRJ ]DZLHUDü HOHPHQW\ QDMUy*QLHMV]\FK W\SyZ OLF]E\ ]QDNL áDFXFK\ LWS MHGQDN QDMF] FLHM E G]LHV] VSRW\NDá VL ] Z\UD*HQLDPL UHSUH]HQWXMF\PLRSHUDFMHDU\WPHW\F]QH$E\UR]G]LDáWHQQLHRJUDQLF]DáVL GRSXVWHJR WHURUHW\]RZDQLDVSUyEXMHP\]DVWRVRZDüZ\UD*HQLDZSUDNW\FHWZRU]FSURJUDPUR]ZL]XMF\UyZQDQLHNZDGUDWRZH]QDQ&L]DSHZQHPHWRGZ\]QDF]QLNyZ =DSLVXMFQDV]HUyZQDQLHZSRVWDFL a ⋅ x2 + b⋅ x + c
PR*HP\ REOLF]\ü SLHUZLDVWNL WM ZDUWRFL x GOD NWyU\FK UyZQDQLH SU]\MPXMH ZDUWRü zero) jako −b ± ∆ 2a gdzie ' jest tzw. wyznacznikiem równania, obliczanym jako ∆ = b2 − 4⋅ a ⋅ c
:\UD*HQLD
45
Znak ZSRSU]HGQLPZ]RU]HR]QDF]D*HUyZQDQLHPDZRJyOQRFLGZDSLHUZLDVWNL z NWyU\FK MHGHQ REOLF]D VL SU]H] GRGDQLH ZDUWRFL Z OLF]QLNX XáDPND ]D GUXJL — SU]H]LFKRGM FLH 6DPSURJUDPSRZLQLHQZ\JOGDüQDVW SXMFR SRF]WHN RGF]\WDMZDUWRFLZVSyáF]\QQLNyZDELF REOLF]ZDUWRüZ\]QDF]QLND oblicz pierwiastki i wypisz je na ekranie koniec :SRVWDFLSDVFDORZHME G]LHWRQLHFREDUG]LHMVNRPSOLNRZDQH program Rownanie_Kwadratowe; ^3URJUDPUR]ZL]XMHUyZQDQLHNZDGUDWRZHPHWRGZ\]QDF]QLNyZ` var DEFUHDO^ZVSyáF]\QQLNL` delta : real; { wyznacznik } x1, x2 : real; { pierwiastki } begin writeln('Program rozwiazuje rownanie kwadratowe') writeln('a*x^2 + b*x + c'); ZULWH 3RGDMZVSROF]\QQLND ^ZSURZDG(ZVSyáF]\QQLNL` readln(a); write('Podaj wspolczynnik b: '); readln(b); write('Podaj wspolczynnik c: '); readln(c); delta := sqr(b) - 4*a*c; { oblicz wyznacznik } x1 := (-b + sqrt(delta))/(2*a); { oblicz pierwiastki } x2 := (-b - sqrt(delta))/(2*a); { znaczek := to tzw. } { przypisanie } ZULWHOQ 3LHUZLDVWNL ^Z\ZLHWOSLHUZLDVWNL` writeln('x1 = ', x1:12:4); writeln('x2 = ', x2:12:4); readln; end.
:\UD*HQLDZ\NRU]\VW\ZDQHGRREOLF]DQLDSRV]F]HJyOQ\FKZDUWRFLVWXQLHFREDUG]LHM skompliNRZDQH DOH QDGDO QLH SRZLQLHQH PLHü SUREOHPyZ ] LFK DQDOL] 'ZRPD nowyPLQRQLHGRNRFD HOHPHQWDPLVoperator przypisania oraz funkcje. Operator przypisania jest jednym z najpospoliciej wykorzystywanych operatorów pascalowych. Znaczek := GZXNURSHN L ]QDN UyZQRFL F]\WD VL ÄVWDMH VL ´ OXE ÄSU]\SLV]´]DMHJRHIHNWVSURZDG]DVL GRXPLHV]F]HQLDZRELHNFLH]QDMGXMF\PVL SR OHZHM VWURQLH ZDUWRFL ]QDMGXMFHM VL SR SUDZHM VWURQLH Ä2ELHNW´ XPLHV]F]RQ\ SR OHZHMVWURQLHRSHUDWRUDSU]\SLVDQLDRNUHlany jest mianem l-ZDUWRFLDQJlvalue). Jest WRQDRJyá]PLHQQDPR*OLZHMHVWMHGQDNSU]\SLVDQLHZDUWRFLGRLGHQW\ILNDWRUDIXQNFML R W\P E G]LHP\ MHV]F]H PyZLü 3RQLHZD* SU]\SLVDQLH SROHJD QD XPLHV]F]HQLX
46
Turbo Pascal — programowanie ZDUWRFLJG]LHZSDPL FLNRPSXWHUDZPLHMVFXRNUHORQ\PSU]H]QD]Z RELHNWX nie PR*HV]SROHZHMVWURQLHRSHUDWRUDSU]\SLVDQLDXPLHFLüVWDáHMF]\Z\UD*HQLD3RSUDZHM VWURQLH RSHUDWRUD SU]\SLVDQLD SDQXMH ]QDF]QLH ZL NV]D GHPRNUDFMD GRSXV]F]DOQH V WDPSUDNW\F]QLHGRZROQHZ\UD*HQLDDZL FZV]F]HJyOQRFLUyZQLH*SRMHG\QF]HVWDáH i ]PLHQQH E\OHE\W\SZDUWRFLX]\VNDQHMZZ\QLNXREOLF]HQLDZ\UD*HQLDE\á]JRGQ\ z W\SHPRELHNWX]QDMGXMFHJRVL SRGUXJLHMVWURQLHRSHUDWRUD:=. =DJDGQLHQLH]JRGQRFLW\SyZZVHQVLHSU]\SLVDQLDDQJassignment compatibility) jest W\OH* LVWRWQH FR ]áR*RQH = GRü GREU\P SU]\EOL*HQLHP PR*QD SRZLHG]LHü *H W\S wyra*HQLD]QDMGXMFHJRVL SRSUDZHMVWURQLHRSHUDWRUD :=SRZLQLHQE\üLGHQW\F]Q\] W\SHP RELHNWX ]QDMGXMFHJR VL SR OHZHM VWURQLH ] NLONRPD Z\MWNDPL 'R najwD*QLHMV]\FKZ\MWNyZQDOH*SU]\SLVDQLD • ZDUWRFLW\SXFDáNRZLWHJRGRRELHNWXW\SXU]HF]\ZLVWHJRDOHQLHRGZURWQLH • ZDUWRFLW\SXU]HF]\ZLVWHJRGRRELHNWXLQQHJRW\SXU]HF]\ZLVWHJRZGRZROQ VWURQ • ZDUWRFLW\SX]QDNRZHJRGRRELHNWXW\SXáDFXFKRZHJR • ZDUWRFLW\SXÄZVND(QLNGRW\SX´GRRELHNWXW\SXpointer. 3U]\ WHM RND]ML ZDUWR UyZQLH* ZVSRPQLHü *H QLHNWyUH SU]\SLVDQLD SRPL G]\ W\SDPL U]HF]\ZLVW\PL PRJ VSRZRGRZDü XWUDW GRNáDGQRFL OXE SU]HNURF]HQLH ]DNUHVX QS SUyEDÄZFLQL FLD´ZDUWRFLW\SXextended do zmiennej typu single). -HOLLG]LHRGUXJQRZRüF]\OLIXQNFMHWRZQDV]\PSURJUDPLHSRMDZLá\VL Z\ZRáDQLD GZyFK W]Z ELEOLRWHF]Q\FK IXQNFML DU\WPHW\F]Q\FK sqr i sqrt. Temat funkcji E G]LH G\VNXWRZDQ\ QLHFR Sy(QLHM QD UD]LH Z\VWDUF]\ &L ZLHG]LHü *H IXQNFMD L SRNUHZQD MHM SURFHGXUD MHVW SHZQ\P QDU] G]LHP SR]ZDODMF\P QD SU]HNV]WDáFHQLH SRGDQ\FKMHMZDUWRFLW]Zargumentów GR*GDQHMSRVWDFL3UDNW\F]QLHND*G\M ]\N SURJUDPRZDQLD G\VSRQXMH PQLHMV]\P OXE ZL NV]\P ]HVWDZHP ELEOLRWHN Iunkcji UHDOL]XMF\FK RSHUDFMH DU\WPHW\F]QH ]QDNRZH JUDILF]QH L LQQH %LEOLRWHND IXQNFML i SURFHGXU GRVW SQ\FK Z 7XUER 3DVFDOX MHVW RJURPQD L RPDZLDQLH MHM PLMDáRE\ VL z FHOHP ZUyG F] VWR Z\NRU]\VW\ZDQ\FK IXQNFML DU\WPHW\F]Q\FK RSUyF] QLHU]DGNR myloQ\FK ]H VRE sqr (podniesienie do kwadratu) i sqrt (pierwiastek kwadratowy), ]QDMGXM VL UyZQLH* IXQNFMH WU\JRQRPHWU\F]QH sin, cos, arctan), logarytmiczne (ln, exp) i wiele innych. :WHQVSRVyERPyZLOLP\]DVDGQLF]HWHPDW\]ZL]DQH]Z\UD*HQLDPLLUHDOL]DFMREOLF]HDU\WPHW\F]Q\FK:\NRU]\VWXMFSR]QDQHZLDGRPRFLPR*HV]SRNXVLüVL RQDSLVDQLHSURJUDPXREOLF]DMFHJRZDUWRFLEDUG]LHMVNRPSOLNRZDQ\FKZ]RUyZMDNLFK"WR MX*SHZQLHVDPZLHV]QDMOHSLHM 1LHVWHW\RF]\PE\üPR*HMX*VL SU]HNRQDáH7XUER 3DVFDO QLH MHVW QD W\OH LQWHOLJHQWQ\ E\ REURQLü VL SU]HG SUyE Z\NRQDQLD RSHUDFML QLHOHJDOQHM]PDWHPDW\F]QHJRSXQNWXZLG]HQLDQSG]LHOHQLDSU]H]]HUR -HOLMHV]F]H QLH PLDáH RND]ML SRWNQü VL R WHQ SUREOHP VSUyEXM ]D SRPRF QDV]HJR SURJUDPLNX znDOH(üPLHMVFD]HURZHIXQNFML x 2 + 2x + 3
:\UD*HQLD
47
1DV]HUyZQDQLHQLHPDSLHUZLDVWNyZU]HF]\ZLVW\FKZDUWRüZ\]QDF]QLNDZ\QRVL–8, a ]DWHP MHJR SLHUZLDVWHN NZDGUDWRZ\ QLH GDMH VL REOLF]\ü 3RQLHZD* MHGQDN 7XUER PasFDO R W\P QLH ZLH HIHNWHP SRGM WHM SUyE\ MHVW EáG Z\NRQDQLD Invalid floating point operation — nielegalna operacja zmiennoprzecinkowa) i przerwanie realizacji progUDPX &R SUDZGD *DGQD WR WUDJHGLD ER IXQNFMD L WDN QLH PD SLHUZLDVWNyZ DOH SURJUDP PyJáE\ ]DFKRZ\ZDü VL SU]\]ZRLFLHM WM ]DPLDVW ÄSDGDü´ — Z\ZLHWODü RGSRZLHGQLLQIRUPDFM 1LHPDSUREOHPXDOHWRMX*PR*HZQDVW SQ\PUR]G]LDOH
=DSDPL WDM • 'RSU]HNV]WDáFDQLDLQIRUPDFMLZSURJUDPLHVáX*Z\UD*HQLD • :VNáDGZ\UD*HZFKRG]VWDáHL]PLHQQHUHSUH]HQWXMFHGDQH RUD]RSHUDWRU\ i IXQNFMHUHSUH]HQWXMFHVSRVRE\SU]HNV]WDáFDQLDLQIRUPDFML • 1DMZD*QLHMV]H JUXS\ RSHUDWRUyZ SDVFDORZ\FK WR RSHUDWRU\ DU\WPHW\F]QH ELWRwe, logiczne oraz relacyjne (operatory porównania). • .RQVWUXXMF Z\UD*HQLD PXVLV] SDPL WDü R NROHMQRFL Z\NRQ\ZDQLD G]LDáD czyli priorytetach operatorów. • 'R]PLDQ\NROHMQRFLG]LDáDVáX*QDZLDV\ • )XQNFMH UHSUH]HQWXM EDUG]LHM ]áR*RQ\ VSRVyE SU]HNV]WDáFDQLD LQIRUPDFML QL* operatory. • 'RQDGDZDQLDZDUWRFL]PLHQQ\PVáX*\RSHUDWRUSU]\SLVDQLD:=. • 3R OHZHM VWURQLH RSHUDWRUD SU]\SLVDQLD PXVL ]QDMGRZDü VL l-ZDUWRü 3R MHJR SUDZHMVWURQLHPR*H]QDMGRZDüVL GRZROQHZ\UD*HQLH
48
Turbo Pascal — programowanie
Instrukcja warunkowa $E\XQLNQüEá GXZ\QLNDMFHJR]SUyE\SLHUZLDVWNRZDQLDOLF]E\XMHPQHMZ\SDdaáRE\XPLHFLüZQDV]\PSURJUDPLH]DVWU]H*HQLHZSRVWDFLÄMH*HOLZ\]QDF]QLNMHVWZL Nszy od zera to wykonaj dalsze obliczenia, w przeciwnym przypadku wypisz odpowiedni NRPXQLNDW´3U]HNáDGDMFWRQDM ]\NDQJLHOVNLLQLHFRXRJyOQLDMFRWU]\PXMHP\VWUXNWXU instrukcji warunkowej: if warunek then instrukcja-1 else instrukcja-2
: SRZ\*V]\P ]DSLVLH warunek MHVW QLF]\P LQQ\P MDN Z\UD*HQLHP GDMF\P Z Z\QLNX ZDUWRü true lub false QD RJyá Z\NRU]\VWXMF\P ]QDQH &L MX* RSHUDWRU\ UHODF\MQH PyZLF SR OXG]NX MHVW WR ]Z\NáH SRUyZQDQLH Instrukcje RSLVXM czynnRFLNWyUHSRZLQQ\E\üZ\NRQDQHSRVSHáQLHQLXOXEQLHVSHáQLHQLXZDUXQNXSU]\ F]\P F] ü ]DF]\QDMFD VL RG VáRZD NOXF]RZHJR else QLH MHVW RERZL]NRZD WM QLH PXVLV]RNUHODüÄZDULDQWXDZDU\MQHJR´ ,QVWUXNFMDZDUXQNRZDGRVW SQDSUDNW\F]QLHZND*G\PM ]\NXSURJUDPRZDQLDVWDQRZL SRGVWDZRZH QDU] G]LH XPR*OLZLDMFH SRGHMPRZDQLH GHF\]ML Z ]DOH*QRFL RG DNWXDOQ\FK ZDUXQNyZ F]\OL ZEXGRZ\ZDQLH Z SURJUDP ÄLQWHOLJHQFML´ SR]ZDODMFHM PX ]DFKRZDü VL RGSRZLHGQLR GR V\WXDFML 6SUyEXMP\ ZNRPSRQRZDü LQVWUXNFM ZDUunNRZZQDV]SRSU]HGQLSURJUDP program Nowe_Rownanie_Kwadratowe; ^3URJUDPUR]ZL]XMHUyZQDQLHNZDGUDWRZHPHWRGZ\]QDF]QLNyZ` ^XZ]JO GQLDMFPR*OLZRüXMHPQHJR]QDNXZ\]QDF]QLND` var DEFUHDO^ZVSyáF]\QQLNL` delta : real; { wyznacznik } x1, x2 : real; { pierwiastki } begin writeln('Program rozwiazuje rownanie kwadratowe') writeln('a*x^2 + b*x + c'); ZULWH 3RGDMZVSROF]\QQLND ^ZSURZDG(ZVSyáF]\QQLNL` readln(a);
Instrukcja warunkowa
49
write('Podaj wspolczynnik b: '); readln(b); write('Podaj wspolczynnik c: '); readln(c); delta := sqr(b) - 4*a*c; { oblicz wyznacznik } if delta >= 0 then { wyznacznik OK } begin { wykonujemy obliczenia} x1 := (-b + sqrt(delta))/(2*a); { oblicz pierwiastki } x2 := (-b - sqrt(delta))/(2*a); ZULWHOQ 3LHUZLDVWNL ^Z\ZLHWOSLHUZLDVWNL` writeln('x1 = ', x1:12:4); writeln('x2 = ', x2:12:4); end { tu 1,(0$UHGQLND` else { wyznacznik ujemny } writeln('Rownanie nie ma pierwiastkow rzeczywistych.'); readln; end.
3RVWDüZDUXQNXMHVWZQDV]\PSU]\SDGNXRF]\ZLVWD if delta >=0
F]\OL ÄMH*HOL Z\]QDF]QLN QLH MHVW PQLHMV]\ RG ]HUD´ =DXZD* *H MHOL ZDUXQHN MHVW VSHáQLRQ\ QDOH*\ Z\NRQDü ZL FHM QL* MHGQ LQVWUXNFM D ]DWHP FDáD JUXSD LQVWUXNFML ]DMPXMF\FK VL REOLF]DQLHP L Z\ZLHWODQLHP SLHUZLDVWNyZ PXVL ]RVWDü RWRF]RQD VáRZDPLNOXF]RZ\PLbegin i endR]QDF]DMF\PLtzw. LQVWUXNFM ]áR*RQ, czyli zestaw LQVWUXNFML Z\NRQ\ZDQ\FK MDNR MHGQD FDáRü =DSRPLQDQLH R W\P Z\PDJDQLX MHVW MHGQ\P]SRVSROLWV]\FKEá GyZSRSHáQLDQ\FKSU]H]SURJUDPLVWyZSDVFDORZ\FKQLHW\ONR SRF]WNXMF\FK L PR*H SURZDG]Lü GR QLH]E\W SU]\MHPQ\FK Eá GyZ Z\NRQDQLD 2WR SU]\NáDG if n <> 0 then LiczbaProbek := n; srednia := suma/LiczbaProbek;
3RZ\*V]\IUDJPHQWSRZLQLHQSU]\SLV\ZDü]PLHQQHM LiczbaProbekZDUWRü n, a nasW SQLHREOLF]Dü srednia jako suma podzielona przez LiczbaProbekJZDUDQWXMF*H w przypadku n UyZQHJR ]HUR G]LHOHQLH QLH E G]LH Z\NRQ\ZDQH 3RQLHZD* MHGQDN SU]\SLVDQLD QLH ]RVWDá\ SRáF]RQH Z LQVWUXNFM ]áR*RQ GOD n równego zeru pierwsze SU]\SLVDQLH QLH Z\NRQD VL D ]DWHP ]PLHQQD LiczbaProbek E G]LH PLDáD ZDUWRü QLHRNUHORQ 0R*H WR E\ü ]HUR ZyZF]DV Z\NRQDQLH SURJUDPX ]RVWDQLH SU]HUZDQH OXE GRZROQD ZDUWRü FR RF]\ZLFLH GRSURZDG]L GR ]XSHáQLH EH]VHQVRZQHJR Z\QLNX 3UDZLGáRZDSRVWDüSRZ\*V]HMLQVWUXNFMLE G]LHZ\JOGDáDQDVW SXMFR if n <> 0 then begin LiczbaProbek := n; srednia := suma/LiczbaProbek; end;
50
Turbo Pascal — programowanie :UyüP\GRQDV]HJRUyZQDQLD=DXZD**HZSHZQ\PV]F]HJyOQ\PSU]\SDGNX— gdy wyznacznik jest równy zeru — ma ono tylko jeden pierwiastek: jest tak dla równania x 2 + 2x + 1
którego podwójnym pierwiastkiem jest liczba –1. W tym przypadku musimy XZ]JO GQLüWU]\PR*OLZRFLZ]DOH*QRFLRGZDUWRFLZ\]QDF]QLND Wyznacznik ZL NV]\RG]HUD równy zeru mniejszy od zera
Pierwiastki
−b + ∆ −b − ∆ i 2a 2a b − 2a brak pierwiastków rzeczywistych
3RQLHZD*SRMHG\QF]DLQVWUXNFMDZDUXQNRZDSRWUDILREVáX*\üW\ONRGZLHZ]DMHPQLHVL Z\NOXF]DMFH V\WXDFMH DE\ XZ]JO GQLü ZV]\VWNLH ZDULDQW\ QLH]E GQH MHVW ]DJQLH*G*HQLHGZyFKWDNLFKLQVWUXNFML6FKHPDWSRVW SRZDQLDSRND]DQ\MHVWSRQL*HMZUDPDFK üZLF]HSURSRQXM &LVDPRG]LHOQHGRNRQDQLHRGSRZLHGQLFKPRG\ILNDFMLZSURJUDPLH if delta < 0 then { brak pierwiastków rzeczywistych } else if delta = 0 then { oblicz i wypisz pojedynczy pierwiastek } else^RGQRVLVL GRdrugiego if-a } { oblicz i wypisz obydwa pierwiastki }
: SU]\SDGNX ZL NV]HM OLF]E\ ZDULDQWyZ WDNLH ÄSL WURZH´ NRQVWUXNFMH VWDM VL QLHSRU F]QH WUXGQH Z LQWHUSUHWDFML L SRGDWQH QD Eá G\ =DVWDQyZ VL QD SU]\NáDG MDN Z\JOGDáDE\LQVWUXNFMDZDUXQNRZDZ\SLVXMFDQDHNUDQLHQD]Z GQLDW\JRGQLDGDQHJR QXPHUHPQLHFKR]QDF]DSRQLHG]LDáHN 0R*HWDN if dzien = 1 then writeln('Poniedzialek') else if dzien = 2 then writeln('Wtorek') else if ...
&RSUDZGDX*\ZDQLHSHáQHMIRUP\LQVWUXNFMLZDUXQNRZHMif-then-else) nie jest tu NRQLHF]QH L VáRZD else PR*QD XVXQü SDPL WDMF R UHGQLNDFK MHGQDN Z GDOV]\P FLJXSRZ\*V]\WZyUE G]LHFRQDMPQLHMQLHHOHJDQFNL6NXWHF]Q\PVSRVREHPREVáXJL wyborów wielowariantowych jest instrukcja wyboru case RGSRZLDGDMFD ] JUXEV]D ÄVWHUFLH´]DJQLH*G*RQ\FKLQVWUXNFMLZDUXQNRZ\FK caseSU]HáF]QLNof ZDUWRü-1 : akcja-1; ZDUWRü-2 : akcja-2; ... else akcja-GRP\OQD end;
Instrukcja warunkowa
51
3RZ\*V]DVWUXNWXUDMHVWVZRLVWWDEOLFDNFMLRGSRZLDGDMF\FKSRV]F]HJyOQ\PZDUWRciom zmiennej SU]HáF]nik L GRVNRQDOH QDGDMH VL GR UHDOL]DFML ZLHORZDULDQWRZ\FK Z\ERUyZ NWyU\FK NODV\F]Q\P SU]\NáDGHP MHVW PHQX =DXZD* *H RSUyF] DNFML VNRMDU]RQ\FK ] SRV]F]HJyOQ\PL ZDUWRFLDPL SU]HáF]QLND PDV] PR*OLZRü RNUHOHQLD DNFML GRP\OQHMUHDOL]RZDQHMZSU]\SDGNXZ\VWSLHQLDZDUWRFLQLH]QDMGXMFHMVL ZQDV]HM ÄWDEOLF\´ 2GSRZLDGD ]D QL VáRZR NOXF]RZH else XPLHV]F]RQH QD NRFX LQVWUXNFML 3HZQ\P RJUDQLF]HQLHP QDU]XFDQ\P SU]H] LQVWUXNFM case jest wymaganie, by zmienna SU]HáF]QLN E\áD W\SX SRU]GNRZHJR WDN ZL F QLH E G]LHP\ PRJOL ]DVWRVRZDü MHM Z QDV]\P SURJUDPLH Z NWyU\P Z\]QDF]QLN MHVW OLF]E U]HF]\ZLVW 8áDWZLHQLHP QDWRPLDVW MHVW PR*OLZRü ÄJUXSRZHJR´ GHILQLRZDQLD ZDUWRFL RGSRZLDGDMF\FKSRV]czególnym akcjom, np.: case liczba_interesantow of 0 : mozna_wyjsc_do_fryzjera; 1, 2 : niech_czekaja; 3..6 : trzeba_obsluzyc; else wypisz('INWENTARYZACJA') end;
:DUWRFLRGSRZLDGDMFHSRV]F]HJyOQ\PDNFMRPPRJE\üZ\OLF]DQHMDZQLHOXESRGDZDQH Z SRVWDFL ]DNUHVyZ RGGR R LOH W\ONR WZRU] FLJá JUXS 0XVLV] UyZQLH* SDPL WDü *H — Z RGUy*QLHQLX RG LQVWUXNFML ZDUXQNRZHM — SU]HG VáRZHP else PR*HV]SRVWDZLüUHGQLN ,WRE\E\áRQDW\OHFRRF]\ZLFLHQLH]QDF]\*HPR*HV]VSRF]üQDODXUDFK0LáRMHVW PLHü SURJUDP SRWUDILF\ UR]ZL]Dü UyZQDQLH NZDGUDWRZH MHGQDN ]QDF]QLH SU]\MHPQLHMV]H E\áRE\ SRVLDGDQLH QDU] G]LD GR UR]ZL]\ZDQLD EDUG]LHM VNRPSOLNRZDQ\FK UyZQD$OHF]\WRDE\QLH]DWUXGQH"%\QDMPQLHM
=DSDPL WDM • 'R ZDUXQNRZHJR Z\NRQ\ZDQLD RSHUDFML VáX*\ Z SURJUDPDFK SDVFDORZ\FK instrukcja warunkowa if-then-else. • 8*\ZDMF LQVWUXNFML ZDUXQNRZ\FK PXVLV] SDPL WDü R ZáDFLZ\P VWRVRZDQLX LQVWUXNFML]áR*RQHMRUD]REUDNXUHGQLNDSU]HGVáRZHPelse. • $E\REVáX*\üZL FHMQL*GZDZDULDQW\PR*HV]X*\ü]DJQLH*G*RQ\FKLQVWUXNFML warunkowych. • -HOL Z\ERUHP VWHUXMH ZDUWRü W\SX SRU]GNRZHJR OHSV]\P UR]ZL]DQLHP MHVW X*\FLHLQVWUXNFMLZ\ERUXcase.
52
Turbo Pascal — programowanie
5R]ZL]XMHP\ dowolne równanie 3UREOHP UR]ZL]DQLD GRZROQHJR UyZQDQLD QLH QDOH*\ E\QDMPQLHM GR ]DGD W\SX kamienia filozoficznego czy uniwersalnego rozpuszczalnika. Chocia*GODSHZQ\FKNODV UyZQDLVWQLHMGDZQRRSUDFRZDQHZ]RU\LPHWRG\VSRUDJUXSDUyZQDQLHOLQLRZ\FK QLHGDMHVL UR]ZL]DüÄQDSDSLHU]H´ZVSRVyEGRNáDGQ\1LHR]QDF]DWRMHGQDN*HQLH PR*QD LFK Z RJyOH UR]ZL]Dü NZHVWLL SU]\EOL*RQHJR UR]ZL]\ZDQLD UyZQD QLHOLQLRZ\FK SRZL FRQR ] QLH]á\P VNXWNLHP VSRU\ G]LDá PDWHPDW\NL ]QDQ\ MDNR metody numeryczne : QLQLHMV]\P UR]G]LDOH VSUyEXMHP\ ]DGHPRQVWURZDü MHGQ ] QDMSURVWV]\FK PHWRG UR]ZL]\ZDQLD UyZQD QLHOLQLRZ\FK — WDN ]ZDQ PHWRG ELVHNFML. Jest ona na tyleSURVWD*HSUDNW\F]QLHQLHZ\PDJD]QDMRPRFLVNRPSOLNRZDQHMPDWHPDW\NL DMHG\QLHORJLF]QHJRP\OHQLD DMHGQRF]HQLHFDáNLHPVNXWHF]QD f(x)
c4 c3 a
c1
b
x
c2 c
Rysunek 9. =DVDGDG]LDáDQLDPHWRG\ELVHNFML =Dáy*P\ *H FKFHP\ ]QDOH(ü PLHMVFH ]HURZH IXQNFML f(x) SU]HGVWDZLRQHM SRZ\*HM 6]XNDP\ZL FWDNLHJRSXQNWXc na osi x, dla którego f(c) :\ELHUDMFQDRVLx dwa punkty a i bWDNLHE\ZDUWRFLf(a) i f(b)PLDá\SU]HFLZQH]QDNLPR*HP\]SHZQRFL VWZLHUG]Lü*HIXQNFMDPDSRPL G]\a i b co najmniHMMHGQRPLHMVFH]HURZHJG\*PXVL JG]LHSU]HFLüRx 3RG]LHOP\SU]HG]LDáSRPL G]\a i bQDGZLHUyZQHF] FL:DUWRüIXQNFMLZQRZRX]\VNDQ\PSXQNFLHc1 ma nadal znak przeciwny do f(a), a zatem PLHMVFH ]HURZH OH*\ JG]LH SRPL G]\ a i c1 3RG]LHOP\ QRZR X]\VNDQ\ SU]HG]LDá QD SRáRZ\W\PUD]HPRND]XMHVL *HZDUWRüIXQNFMLZSXQNFLHc2 ma znak przeciwny do
5R]ZL]XMHP\GRZROQHUyZQDQLH
53
f(c1) D ZL F PLHMVFH ]HURZH OH*\ SRPL G]\ c1 a c2 :\NRQXMF NROHMQH SRG]LDá\ GRMG]LHP\ZNRFXGRSXQNWXQRZáDQLH=DXZD**H]ND*G\PNROHMQ\PSRG]LDáHP ]EOL*DP\VL GRPLHMVFD]HURZHJRFRUD]ZROQLHM]DND*G\PUD]HPSU]HG]LDáSRV]XNLZDQLD ]DZ *DQ\ MHVW GZXNURWQLH WDN ZL F WHRUHW\F]QLH GRNáDGQH SRáR*HQLH PLHMVFD ]HURZHJR RGSRZLDGDMFH SU]HG]LDáRZL R ]HURZHM V]HURNRFL F]\OL SRMHG\QF]HPX SXQNWRZL RVLJQLHP\ SR QLHVNRF]RQHM OLF]ELH SRG]LDáyZ &K\ED QLH PDV] ]DPLDUX F]HNDüD*WDNGáXJR 5R]ZL]DQLHPWHJRSUREOHPXMHVWZáDFLZHVIRUPXáRZDQLHW]ZNU\WHULXP]DNRF]HQLD REOLF]H lub kryterium stopu : QDV]\P SU]\SDGNX NROHMQH F\NOH SRG]LDáów (zwane fachowo iteracjami E G]LHP\ SURZDG]LOL WDN GáXJR D* EH]Z]JO GQD ZDUWRü IXQNFML w punkcie cn]PDOHMHSRQL*HM]DGDQHJRSURJX 6SUyEXMP\]DSLVDüZEDUG]LHMIRUPDOQ\VSRVyESRMHG\QF]\SRG]LDá SRF]WHN Z\]QDF]SXQNWFZSRáRZLHRGOHJáRFLSRPL G]\DLE MH*HOLID PD]QDNUy*Q\RGIF WRSU]HQLHSXQNWEGRSXQNWXF ZSU]HFLZQ\PSU]\SDGNXSU]HQLHSXQNWDGRSXQNWXF koniec $OHMDN]DEUDüVL ]DZ\NRQ\ZDQLHNROHMQ\FKSRG]LDáyZ"2F]\ZLFLHQLHE G]LHV]PXVLDáZLHORNURWQLHZSLV\ZDüRdpowiednich instrukcji: zamiast tego wykorzystasz do ich cyklicznego wykonywania LQVWUXNFM S WOL. 6SRUyG WU]HFK GRVW SQ\FK Z 3DVFDOX VWUXNWXU S WOL GR UHDOL]DFML QDV]HJR ]DGDQLD RGSRZLHGQLH V GZLH — while i repeat WU]HFL S WO for ]DMPLHP\ VL QLHFR Sy(QLHM . 1DOH*RQHGRJUXS\S WOLVWHURZDQ\FKZDUXQNLHPFRR]QDF]D*HZ\NRQXM VL WDNGáXJRMDNGáXJRVSHáQLRQHE G]LHRGSRZLHGQLHNU\WHULXPwhile — powtarzaj, GRSyNL OXEGRPRPHQWXNLHG\]RVWDQLHRQRVSHáQLRQHrepeat —SRZWDU]DMD* NiHWU]HEDFK\EDGRGDZDü*HRZ\PNU\WHULXPE G]LHZáDQLHQDV]HNU\WHULXPVWRSX ]DNRF]LWHUDFMHMHOLZDUWRüEH]Z]JO GQDIF MHVWPQLHMV]DRG]DGDQHJRSURJX .WyUHM LQVWUXNFML X*\ü" : ]DVDG]LH Z QDV]\P SU]\SDGNX MHVW WR RERM WQH ']LDáDQLH S WOL while i repeat MHVW EDUG]R ]EOL*RQH ]D Uy*QLFD VSURZDG]D VL GR IDNWX *H w SLHUZV]HM]QLFKZDUXQHNSU]HUZDQLDS WOLVSUDZG]DQ\MHVWQDSRF]WNX while warunek do instrukcja
]DZGUXJLHM—QDNRFXS WOL repeat instrukcja until warunek
W konsekwencji instruNFMH WZRU]FH ]DZDUWRü S WOL repeat PXV] Z\NRQDü VL FR QDMPQLHMUD]]DZSU]\SDGNXS WOL whilePRJQLHZ\NRQDüVL DQLUD]XMHOL warunek E G]LH RG UD]X VSHáQLRQ\ 3RQDGWR PXVLV] SDPL WDü *H VIRUPXáRZDQLH ZDUXQNX MHVWGODREXS WOLGRNáDGQLHSU]HFLZQHS WOD whileZ\NRQXMHVL WDNGáXJRMDNGáXJR
54
Turbo Pascal — programowanie warunekMHVWVSHáQLRQ\ repeat —WDNGáXJRMDNGáXJRMHVWQLHVSHáQLRQ\ =DSDPL WDM UyZQLH**HXPLHV]F]DMFNLONDLQVWUXNFMLZS WOLwhilePXVLV]SRáF]\üMHZLQVWUXNFM ]áR*RQ VáRZDPL begin i end, zD Z SU]\SDGNX S WOL repeat NRQLHF]QRü WD QLH Z\VW SXMHRJUDQLF]QLNDPLLQVWUXNFML]áR*RQHMVWXVáRZDrepeat i until).
6SUyEXMP\]DSLVDüQDV]DOJRU\WP]Z\NRU]\VWDQLHPS WOL repeat% G]LHRQZ\JOGDá PQLHMZL FHMWDN SRF]WHN ZSURZDG(ZDUWRFLNUDFyZSU]HG]LDáXLGRNáDGQRFL powtarzaj Z\]QDF]SXQNWFZSRáRZLHRGOHJáRFLSRPL G]\DLE MH*HOLID PD]QDNUy*Q\RGIF WRSU]HQLHSXQNWEGRSXQNWXF ZSU]HFLZQ\PSU]\SDGNXSU]HQLHSXQNWDGRSXQNWXF D*GRPRPHQWX, gdyZDUWRüEH]Z]JO GQDIF MHVWPQLHMV]DRG]DGDQHJRSURJX wypisz znalezione miejsce zerowe koniec =Dáy*P\*HFKFHP\UR]ZL]DüUyZQDQLH 1 − e sin x⋅cos x = 0
SRVLDGDMFHMDNQLHWUXGQRREOLF]\üQDNDUWFH SLHUZLDVWHNZSXQNFLHx 7áXPDF]F SRZ\*V]\VFKHPDWQDDQJLHOVNLL3DVFDO RWU]\PDP\QDVW SXMF\SURJUDP program Bisekcja; ^3URJUDPUR]ZL]XMHUyZQDQLDQLHOLQLRZHPHWRGELVHNFML` var DEFUHDO^JUDQLFHSU]HG]LDáXLSXQNWSRG]LDáX` HSVUHDO^GRNáDGQRü` begin writeln('Program znajduje miejsce zerowe funkcji') writeln('w przedziale [a;b]'); ZULWH 3RGDMZDUWRVFD ^ZSURZDG(JUDQLFHSU]HG]LDáX` readln(a); write('Podaj wartosc b: '); readln(b); write('Podaj dokladnosc: '); readln(eps); repeat F DE ^SRG]LHOSU]HG]LDáQDSyá` if (1 - exp(sin(a)*cos(a)))*(1 - exp(sin(c)*cos(c))) < 0 then b := c { funkcja ma przeciwne znaki w a i c } else a := c; { funkcja ma przeciwne znaki w b i c } writeln(c); until abs(1 - exp(sin(c)*cos(c))) < eps; ^EDGDP\ZDUWRüEH]Z]JO GQ` writeln('Miejsce zerowe: c = ',c:12:8); readln;
5R]ZL]XMHP\GRZROQHUyZQDQLH
55
end.
1DV]SURJUDPGRüGRNáDGQLHRGSRZLDGDVFKHPDWRZLSRGDQHPXSRZ\*HMLZ]DVDG]LH QLH Z\PDJD GRGDWNRZ\FK NRPHQWDU]\ PLPRFKRGHP SR]QDáH NLOND QRZ\FK IXQNFML arytmetycznych — exp, sin, cos i abs :DUWR MHGQDN ]ZUyFLü XZDJ QD NU\WHULXP stopu: until abs(1 - exp(sin(c)*cos(c))) < eps;
-DN ZVSRPQLHOLP\ ]DSLV WHQ SR]ZDOD XQLNQü QLHVNRF]HQLH GáXJLHJR GRFKRG]HQLD NROHMQ\FK SRG]LDáyZ GR SXQNWX VWDQRZLFHJR ZáDFLZH UR]ZL]DQLH $OH F]\ W\ONR" 6SUyEXMZ\NRQDüSRQL*V]\SURJUDP program Dodawanie; ^LOXVWUDFMDNXPXODFMLEá GyZ]DRNUJOH` { zmiennoprzecinkowych } var x : real; begin x := 0.0 repeat x := x + 0.1; ^SRGRGDZDQLDFKSRZLQQLP\` writeln(x:16:12); until[ ^RWU]\PDüGRNáDGQLH` end.
-DNáDWZRVSUDZG]LüQDV]DS WODZFDOHQLHPD]DPLDUX]DNRF]\üG]LDáDQLDSRRVLJQL FLX ZDUWRFL &]\*E\ ZL F G]LHVL FLRNURWQH GRGDQLH GR QLH GDZDáR " ,VWRWQLH OLF]E\ U]HF]\ZLVWH UHSUH]HQWRZDQH V Z NRPSXWHU]H ]H VNRF]RQ GRNáDGQRFL L RSHUDFMH QD ZL NV]RFL ] QLFK REDUF]RQHVSHZQ\PEá GHPNWyU\NXPXOXMH VL Z SU]\SDGNX Z\NRQ\ZDQLD ZL NV]HM LORFL REOLF]H 'ODWHJR WH* SRUyZQDQLD ]PLHQQRSU]HFLQNRZH Z\NRU]\VWXMFH RSHUDWRU = VSUDZG]DMF\ GRNáDGQ UyZQRü ]Z\NOHRND]XMVL QLHVNXWHF]QH5R]ZL]DQLHPMHVWX*\FLHRSHUDWRUyZ >= i <=, czyli QLHUyZQRFLQLHRVWU\FK3RSUDZQHNU\WHULXP]DNRF]HQLDS WOLPLDáRE\XQDVSRVWDü until x >= 10.0;
WLHOXSRF]WNXMF\FKSURJUDPLVWyZ]DSRPLQDRQLHGRVNRQDáRFLNRPSXWHUDSUyEXMF SU]HáR*\üÄLGHDOQ\´]DSLVPDWHPDW\F]Q\ZSURVWQDM ]\NSURJUDPRZDQLD(IHNW\PRJ E\ü QLH]E\W SU]\MHPQH ]ZáDV]F]D Z SU]\SDGNX Z\NRU]\VWDQLD WDNLFK ]DSLVyZ Z S WODFKGRGDWNRZRZ\VW SXMHZyZF]DVNXPXODFMDEá GyZ LLQVWUXNFMDFKZDUXQNRZ\FK 3URJUDPXMFRSHUDFMHQDOLF]EDFKU]HF]\ZLVW\FKQDOH*\]DZV]HSDPL WDüRLFK QLHGRNáDGQHMUHSUH]HQWDFML 2PyZLRQHZ\*HMS WOHwhile i repeatQDOH*GRJUXS\S WOLVWHURZDQ\FKZDUXQNLHP FR R]QDF]D *H OLF]ED SU]HELHJyZ S WOL QLH MHVW ] JyU\ RNUHORQD 7\SRZ\P ]DVWRVRZDQLHP S WOL while i repeat MHVW Z\NRQ\ZDQLH REOLF]H OXE LQQ\FK G]LDáD D* GR VSHáQLHQLDRNUHORQHJRNU\WHULXPZSURZDG]DQLHGDQ\FK]NODZLDWXU\OXESOLNXLZV]HO-
56
Turbo Pascal — programowanie NLH LQQH RSHUDFMH Z NWyU\FK QLH MHVWHP\ Z VWDQLH ZF]HQLHM XVWDOLü MDN ZLHOH F\NOL WU]HED E G]LH Z\NRQDü &]DVHP MHGQDN RND]XMH VL *H PXVLP\ ]UHDOL]RZDü FLOH RNUHORQOLF]E RSHUDFMLQSZ\SLVDüQDHNUDQLHZV]\VWNLHOLWHU\RGÄ$´GRÄ=´ZUD] z ich kodami $6&,,2F]\ZLFLHLWRPR*QD]URELü]DSRPRFS WOLwhile lub repeat, MHGQDN]QDF]QLHSRU F]QLHMV]DRND]XMHVL WXS WOD for, sterowana nie warunkiem, lecz licznikiem. A oto i sam program: program ASCII; { wyprowadza znaki ASCII od 'A' do 'Z' i ich kody } var c : char;
{ wypisywany znak }
begin for c := 'A' to 'Z' do write(c:4, ord(c):4) end.
-DNZLGDüVNáDGQLDS WOLforMHVWQDVW SXMFD forOLF]QLN SRF]WHNto koniec do instrukcja
FR WáXPDF]\ VL ÄQD QDV]H´ MDNR ÄGOD licznika SU]HELHJDMFHJR ZDUWRFL RG SRF]WHN do koniec wykonuj LQVWUXNFM ´ 3 WO ÄZ Gyá´ ZDUWRü NRFRZD licznikaMHVWPQLHMV]DRGSRF]WNRZHM ]DSLVXMHVL QLHFRLQDF]HM forOLF]QLN SRF]WHNdownto koniec do instrukcja
:DUWR R W\P SDPL WDü JG\* X*\FLH GR WHJR FHOX SRSU]HGQLHM SRVWDFL VSRZRGXMH *H S WODQLHZ\NRQDVL DQLUD]X-HOLZUHV]FLHZDUWRüSRF]WNRZD licznika jest równa NRFRZHMS WODZ\NRQDVL GRNáDGQLHMHGHQUD]FRPDQLHZLHONLVHQV QLH]DOH*QLHRG WHJRNWyUHM]SRZ\*V]\FKIRUPX*\MHP\ 3URJUDPXMFS WO forPXVLV]GRNáDGQLHZLHG]LHüLOHUD]\E G]LHVL RQDZ\NRQ\ZDáD F]\OL]QDüZDUWRüSRF]WNRZLNRFRZlicznika1LHMHVWRF]\ZLFLHSRZLHG]LDQH *HZDUWRFLWHPXVLV]SRGDüZSRVWDFLVWDá\FKUyZQLHGREU]HPR*HV]X*\üGRWHJRFHOX ]PLHQQ\FKOXEZ\UD*HE\OHW\ONRGDZDá\RQHZZ\QLNXZDUWRFLW\SXSRU]GNRZHJR np: for i := 1 to MaxIndex div 2 do { ... }
Sam licznik UyZQLH* PXVL E\ü ]PLHQQ W\SX SRU]GNRZHJR ]Z\NOH integer lub char LZWUDNFLHZ\NRQ\ZDQLDS WOL]PLHQLDVL ]NURNLHPRGZDUWRFLSRF]WHN do koniecZáF]QLH=DSURJUDPRZDQLHZ3DVFDOXS WOL]NURNLHPUy*Q\PRGZV]F]HJyOQRFLQLHFDáNRZLW\P MHVWQLHFREDUG]LHMVNRPSOLNRZDQH]Z\NOHOHSLHMZW\PFHOX X*\üS WOLwhile lub repeatFKRFLD*PR*QDWR]URELüWDN for i := 1 to 20 do begin writeln(i); Inc(i) { dodaj 1 do licznika } end;
5R]ZL]XMHP\GRZROQHUyZQDQLH
57
3RZ\*V]DNRQVWUXNFMDZ\SLV]HQDHNUDQLHZV]\VWNLHOLF]E\QLHSDU]\VWH]DZDUWHPL G]\ D6]WXF]NDNWyUHMWXX*\OLP\SROHJDQD]PLDQLHOLF]QLNDZWUDNFLHZ\NRQ\ZDQLD S WOLQRUPDOQLH]DMPXMHVL W\PVDPDS WODDP\QLHSRZLQQLP\VL GRWHJRZWUFDü i — FKRFLD* OHJDOQD L SRSUDZQD — MHVW QLH]E\W EH]SLHF]QD 6SUyEXM QS ]PLHQLü ZDUWRü NRFRZ OLF]QLND QD SURJUDP ÄSU]HVNRF]\´ ]DNRF]HQLH S WOL OXE LQVWUXNFM Inc(i) na Dec(i)]PQLHMV]HQLHOLF]QLNDR]DPLDVW]ZL NV]HQLD—S WOD Ä]DS WOLVL ´QDZDUWRFL 3URJUDPXMFS WO forQDOH*\VWDQRZF]RXQLNDüMDZQHJRPRG\ILNRZDQLD OLF]QLNDZHZQWU]S WOL$E\]DSURJUDPRZDüS WO ]NURNLHPUy*Q\PRG lepiej X*\üNRQVWUXNFMLwhile lub repeat. :]PLDQNRZDQH Z\*HM LQVWUXNFMH Inc i Dec SR]ZDODM RGSRZLHGQLR QD ]ZL NV]HQLH (inNUHPHQWDFM OXE ]PQLHMV]HQLH GHNUHPHQWDFM ZDUWRFL DUJXPHQWX W\SX SRU]GNRZHJR R ]DGDQ ZDUWRü UyZQLH* W\SX SRU]GNRZHJR L RGSRZLDGDM LQVWUXNFMRPGRGDQLDOXERGM FLDZDUWRFLQS Dec(k, 30);
{ to samo, co k := k - 30; }
1DW\P]DNRF]\P\UR]ZD*DQLDQDWHPDWS WOLZ3DVFDOXLNLONXGUREQ\FKGRGDWNyZ FKRüGR]DVWRVRZDS WOLE G]LHP\ZUDFDüMHV]F]HZLHORNURWQLH:NROHMQ\PUR]G]LDOH ]DMPLHP\VL SHZQQLHGRJRGQRFLSURJUDPX BisekcjaSROHJDMFQDNáRSRWOLZ\P ]DGDZDQLXSRVWDFLUR]ZL]\ZDQHJRUyZQDQLD=DXZD**HQDV]DIXQNFMDQLHOLQLRZD f ( x ) = 1 − e sin x⋅cos x MHVW Z SURJUDPLH Z\NRU]\VW\ZDQD GZD UD]\ UD] SRGF]DV ZáDFLZHM LWHUDFML GUXJL UD] w NU\WHULXP VWRSX -HVW WR QLHZ\JRGQH L QLHHOHJDQFNLH JG\* FKFF ]QDOH(ü PLHMVFH ]HURZH LQQHM IXQNFML PXVLP\ ZSLV\ZDü M GZD UD]\ -HGQRF]HQLH VDP DOJRU\WP SR]ZDODQDP]QDOH(üPLHMVFH]HURZHGRZROQHMIXQNFMLf(x)&]\]DWHPQLHGDáRE\VL ]DPNQü QDV]HM IXQNFML Z MDNLH SXGHáNR GR NWyUHJR ZNáDGDOLE\P\ W\ONR ZDUWRü DUJXPHQWXLRGELHUDOLZ\QLN"2F]\ZLFLH*HWDN :UDPDFKüZLF]HSUDNW\F]Q\FKSURSRQXM &LQDVW SXMFH]DGDQLD • zmodyfikuj program BisekcjaWDNE\Z\NRU]\VW\ZDáS WO while; • QDSLV]SURJUDPZ\SLVXMF\ZDUWRFLIXQNFML f ( x ) = 1 − e sin x⋅cos x w przedziale od x = 0 do x = 360 stopni (2π ]NURNLHPVWRSQL3DPL WDM*HDUJXPHQW\IXQNFML WU\JRQRPHWU\F]Q\FKSRGDZDQHVZUDGLDQDFK6SUyEXMZ\NRU]\VWDüZV]\VWNLH SR]QDQHS WOH
=DSDPL WDM • Do cyklicznego (iteracyjnHJR Z\NRQ\ZDQLDLQVWUXNFMLVáX*Z3DVFDOXS WOH • ,QVWUXNFMH S WOL PRJ E\ü VWHURZDQH ZDUXQNLHP while-do, repeat-until) lub licznikiem (for-to/downto).
58
Turbo Pascal — programowanie • 3 WOH while i repeatX*\ZDQHVZyZF]DVJG\QLH]QDP\]JyU\OLF]E\SU]HELHJyZS WOLPR*HP\QDWRPLDVWRNUHOLüZDUXQHNMHM]DNRF]HQLD • 3URJUDPXMF NU\WHULXP ]DNRF]HQLD S WOL while i repeat L QLH W\ONR QDOH*\ SDPL WDüRQLHGRNáDGQRFLUHSUH]HQWDFMLOLF]EU]HF]\ZLVW\FKLNXPXODFMLEá GyZ REOLF]H • 3 WOD for Z\NRU]\VW\ZDQD MHVW Z V\WXDFMDFK JG\ PR*HP\ GRNáDGQLH RNUHOLü OLF]E SU]HELHJyZ • /LF]QLNS WOLforMHVW]DZV]HW\SXSRU]GNRZHJRL]PLHQLDVL ]NURNLHP
1.
• 0RG\ILNDFMDOLF]QLNDZHZQWU]S WOLforMHVWGRSXV]F]DOQDDOHPR*HSURZDG]Lü GRWUXGQ\FKGRZ\NU\FLDEá GyZLQDOH*\MHMXQLNDü • 'R LQNUHPHQWDFML OXE GHNUHPHQWDFML ]PLHQQ\FK W\SX SRU]GNRZHJR PR*QD Z\NRU]\VWDüLQVWUXNFMHInc i Dec.
Funkcje i procedury
59
Funkcje i procedury -DN Z *\FLX WDN L Z SURJUDPRZDQLX RERZL]XMH ]DVDGD *H QLH QDOH*\ URELü WHJR VDPHJR ZL FHM QL* UD] -HOL QS PXVLV] NLONDNURWQLH REOLF]\ü Z SURJUDPLH ZDUWRü MDNLHJRVNRPSOLNRZDQHJRZ\UD*HQLDWRRF]\ZLFLHPR*HV]WR]URELüSU]HSLVXMFOXE SRZLHODMF]DSRPRFRSHUDFMLEORNRZ\FK RGSRZLHGQLHIUDJPHQW\SURJUDPXDOHWUXGQRSRZLHG]LHüE\E\áRWRQDMOHSV]HUR]ZL]DQLH3RSLHUZV]HZ\PDJDWRWURFK SUDF\ 3RGUXJLHSURJUDPURELVL GáX*V]\PQLHMHODVW\F]Q\LPQLHMF]\WHOQ\RHOHJDQFMLQLH PyZLF 3R WU]HFLH MDNDNROZLHN SRSUDZND Z WUHFL Z\UD*HQLD PXVL ]RVWDü ZSURZDG]RQD GR ZV]\VWNLFK SRZLHORQ\FK IUDJPHQWyZ MHOL ]DSRPQLV] FKRüE\ R MHGQ\m, Z\QLNLPRJE\üRSáDNDQH 3RZ\*V]H DUJXPHQW\ Z Z\VWDUF]DMF\P VWRSQLX X]DVDGQLDM SRWU]HE ZSURZDG]HQLD UR]ZL]DQLD XPR*OLZLDMFHJR ÄXNU\FLH´ Z\EUDQHM RSHUDFML OXE JUXS\ RSHUDFML Z SRMHPQLNX GR NWyUHJR GRVWDUF]DOLE\P\ GDQH L RGELHUDOL Z\QLN EH] SU]HMPRZDQLD VL VSRVREHPSU]HWZDU]DQLDLQIRUPDFMLZHZQWU]5R]ZL]DQLHPWDNLPVfunkcje i procedury 2E\GZD SRM FLD V &L MX* ]QDQH — ZLHORNURWQLH Z\NRU]\VW\ZDáH SURFHGXU\ i funkcje biblioteczne Pascala (np. writeln czy exp EH]]DVWDQDZLDQLDVL QDG]DVDG LFK G]LDáDQLD 2ND]XMH VL MHGQDN *H Z QLHVNRPSOLNRZDQ\ VSRVyE PR*HV] UyZQLH* WZRU]\üZáDVQHSURFHGXU\LIXQNFMHFRSR]ZROL&LXQLNQüSURZL]RUNLMDN]DSUH]HQWRZDOLP\ZSRSU]HGQLPUR]G]LDOH &]\PMHVWIXQNFMD"=SXQNWXZLG]HQLDSURJUDPXNWyU\MZ\NRU]\VWXMHMHVWWRURG]DM ÄF]DUQHM VNU]\QNL´ SU]HWZDU]DMFHM ZáR*RQH GR QLHM LQIRUPDFMH L ]ZUDFDMFHM RGSRwiedni wynik. Z punktu widzenia programisty natomiast funkcja jest swoistym „miniprogramem” —]HVWDZHP]DPNQL W\FKZORJLF]QFDáRüLQVWUXNFML,QVWUXNFMHWHPRJ ]DMPRZDü VL Z\NRQ\ZDQLHP GRZROQ\FK RSHUDFML FKRFLD* QD RJyá LFK FHOHP MHVW SU]HNV]WDáFHQLH ZSURZDG]RQ\FK GR IXQNFML LQIRUPDFML W]Z parametrów GR *GDQHM SRVWDFL ]ZUDFDQHM QDVW SQLH SRSU]H] QD]Z IXQNFML 3URFHGXUD Uy*QL VL RG IXQNFML MHG\QLHVSRVREHP]ZUDFDQLDZ\QLNXRF]\PSRZLHP\]DFKZLO &RQDOH*\]URELü*HE\Z\NRU]\VWDüZSURJUDPLHIXQNFM OXESURFHGXU "3RSLHUZV]H WU]HED M ]GHILQLRZDü D QDVW SQLH Z\ZRáDü =DMPLMP\ VL QD SRF]WHN GHILQLFM NWyUD polega na: • RNUHOHQLX VSRVREX NRQWDNWRZDQLD VL MHM ] RWRF]HQLHP XVWDOHQLX QD]Z\ zestawu parametrów i typu zwracanego wyniku), oraz
60
Turbo Pascal — programowanie • RNUHOHQLXMHM]DZDUWRFLF]\OL]HVWDZXWZRU]F\FKMLQVWUXNFMLLSRPRFQLF]\FK RELHNWyZORNDOQ\FKRNWyU\FKSy(QLHM $RWRVNáDGQLDGHILQLFMLIXQNFML3: function nazwa-funkcji(lista-parametrów):typ-wyniku; deklaracje-i-definicje-obiektów lokalnych begin instrukcje-UHDOL]XMFH-WUHüIXQNFML end; procedure nazwa-procedury(lista-parametrów); deklaracje-i-definicje-obiektów-lokalnych begin instrukcje-UHDOL]XMFH-WUHü-procedury end;
'HILQLFMD UR]SRF]\QD VL WDN ]ZDQ\P QDJáyZNLHP V\JQDOL]RZDQ\P VáRZHP NOXF]Rwym function lub procedure SR NWyU\P QDVW SXMH XPLHV]F]RQD Z QDZLDVDFK RNUJá\FK OLVWD parametrów (argumentów) formalnych 3DUDPHWU\ WH V\PEROL]XM ZDUWRFLNWyUH]RVWDQSU]HND]DQHGRIXQNFMLLSU]HWZRU]RQH]DVDPDOLVWDPDSRVWDü lista-nazw : typ; lista-nazw : typ; ...
F]\OL ]DZLHUD ]HVWDZ\ QD]Z SDUDPHWUyZ WHJR VDPHJR W\SX UR]G]LHORQH UHGQLNDPL (w REU ELH]HVWDZXQD]Z\SDUDPHWUyZUR]G]LHORQHVSU]HFLQNDPL :DUWR]DXZD*\ü *HOLVWDSDUDPHWUyZQLHMHVWRERZL]NRZ\PHOHPHQWHPGHILQLFMLWDNZL FLVWQLHMHPR*OLZRü]GHILQLRZDQLDIXQNFMLEH]SDUDPHWURZHMQLHSRELHUDMFHMLQIRUPDFML]RWRF]HQLD 2VWDWQLP HOHPHQWHP QDJáyZND MHVW RNUHOHQLH W\SX ]ZUDFDQHJR Z\QLNX Z\PDJDQH Z\áF]QLHGODIXQNFML 6DPD WUHü IXQNFML ]GHILQLRZDQD MHVW SRPL G]\ VáRZDPL NOXF]RZ\PL begin i end i PR*H E\ü SRSU]HG]RQD GHNODUDFMDPL L GHILQLFMDPL WDN ]ZDQ\FK RELHNWyZ ORNDOQ\FK Z\NRU]\VW\ZDQ\FK SU]H] IXQNFM GR X*\WNX ZHZQ WU]QHJR 2ELHNWDPL ORNDOQ\PL ]DMPLHP\ VL V]HU]HM Z GDOV]HM F] FL NVL*NL 6DPH LQVWUXNFMH VNáDGDMFH VL QD WUHü GHILQLFMLIXQNFMLQLHUy*QLVL QLF]\PRGX*\ZDQ\FKZÄ]Z\Ná\P´SURJUDPLH]Z\MWNLHPWHJR*HZSU]\SDGNXIXQNFMLQDOH*\XPLHFLüZGHILQLFMLLQVWUXNFM SU]\SLVDQLD nazwa-IXQNFML ZDUWRü-wyniku
XPR*OLZLDMF SU]HND]DQLH REOLF]RQHJR Z\QLNX ÄQD ]HZQWU]´&RFLHNDZHREHFQRü WHMLQVWUXNFMLZWUHFLIXQNFMLQLHMHVWVSUDZG]DQDSU]H]NRPSLODWRUMDNPDWRPLHMVFH np. dla kompilatRUyZM ]\ND& WRWH*]DSRPLQDOVNLPSURJUDPLVWRPPR*HVL SU]\WUDILü ]GHILQLRZDQLHIXQNFMLNRPSOHWQLHQLHSRWUDILFHMVNRPXQLNRZDüVL ]RWRF]HQLHPQLH SRELHUDMFHM *DGQ\FK SDUDPHWUyZ L QLH ]ZUDFDMFHM Z\QLNX D ZL F SUDNW\F]QLH EH]X*\WHF]QHM :DUWR ]GDZDü VRELH VSUDZ *H Z\ZRáDQLH IXQNFML SR]EDZLRQHM LQVWUXNFML ]ZUyFHQLD Z\QLNX GD Z UH]XOWDFLH ZDUWRü QLHRNUHORQ SU]\SDGNRZ FR UDF]HM QLH PR*HE\üX]QDQH]DHIHNWSR]\W\ZQ\ 3
'ODXSURV]F]HQLDZGDOV]\PFLJXQDV]\FKUR]ZD*DE G]LHP\X*\ZDOLVáRZDÄIXQNFMD´ ]DUyZQR QD RNUHOHQLH IXQNFML MDN L SURFHGXU\ (ZHQWXDOQH Uy*QLFH E G Z\UD(nie zaznaczane.
Funkcje i procedury
61
-DN ZLGDü ] SRZ\*V]\FK ]DSLVyZ GHILQLFMD IXQNFML OXE SURFHGXU\ SU]\SRPLQD PDá\ program. Definicje wszystkich funkcji i procedur wykorzystywanych w programie PXV] E\ü XPLHV]F]RQH SU]HG PLHMVFHP LFK Z\ZRáDQLD 7R RVWDWQLH PR*H QDVWSLü w F] FL RSHUDF\MQHM SURJUDPX D ]DWHP GHILQLFMH PXV] SRSU]HG]Dü UR]SRF]\QDMFH ZáDFLZ\SURJUDPVáRZRbegin OXEZWUHFLLQQHMIXQNFMLOXESURFHGXU\FRZ\PXV]D RGSRZLHGQLH XáR*HQLH GHILQLFML Z]JO GHP VLHELH4). Struktura programu wykorzysWXMFHJRIXQNFMHLSURFHGXU\SRZLQQDZL FZ\JOGDüQDVW SXMFR QDJáyZHN-programu deklaracje-i-definicje-obiektów-globalnych definicje-funkcji-i-procedur begin F] ü-operacyjna-programu end.
8PLHV]F]DQLH GHNODUDFML L GHILQLFML RELHNWyZ JOREDOQ\FK R NWyU\FK UyZQLH* SRZLHP\ Sy(QLHM SU]HGGHILQLFMDPLIXQNFMLQLHMHVWFRSUDZGDRERZL]NRZHFK\ED*HRELHNW\ WHVZ\NRU]\VW\ZDQHZIXQNFMDFK VWDQRZLMHGQDNHOHPHQWGREUHMSUDNW\NLSURJramisW\F]QHM 1DWRPLDVW MHGQ\P ] SRVSROLW\FK Eá GyZ SRSHáQLDQ\FK SU]H] SRF]WNXMF\FK SURJUDPLVWyZMHVWSUyEDXPLHV]F]DQLDGHILQLFMLIXQNFMLLSURFHGXUZF] FLRSHUDF\MQHM prograPXFRMHVWRF]\ZLFLHQLHOHJDOQH 6DPR ]GHILQLRZDQLH IXQNFML QLF QDP MHV]F]H QLH GDMH MHJR HIHNWHP MHVW Z\áF]QLH utworzenie odpowiedniego fragmentu kodu wynikowego). Dopiero Z\ZRáDQLH funkcji SRZRGXMH Z\NRQDQLH VNáDGDMF\FK VL QD MHM WUHü LQVWUXNFML L U]HF]\ZLVWH SU]HNV]WDáFHQLH LQIRUPDFML SRGDQHM Z SRVWDFL SDUDPHWUyZ $E\ Z\ZRáDüSURFHGXU OXEIXQNFM Z\VWDUF]\ XPLHFLü Z SURJUDPLH MHM QD]Z ZUD] ] OLVW parametrów aktualnych, czyli Z\UD*H ]DZLHUDMF\FK LQIRUPDFM NWyUD PD E\ü SU]HWZRU]RQD =DZDUWRü OLVW\ SDUDPHWUyZ DNWXDOQ\FK PXVL RGSRZLDGDü OLFLH SRGDQHM Z GHILQLFML IXQNFML : V]F]HJyOQRFL MHOL Z GHILQLFML SRPLQL WR OLVW SDUDPHWUyZ QLH SRGDMH VL LFK SRGF]DV Z\ZRáDQLDPDP\ZyZF]DVGRF]\QLHQLD]IXQNFMOXESURFHGXUEH]SDUDPHWURZ :\ZRáDQLHSURFHGXU\PDSRVWDü nazwa-procedury(lista-parametrów-aktualnych);
]DZSU]\SDGNXIXQNFMLNWyUD]ZUDFDREOLF]RQZDUWRüSRSU]H]VZRMQD]Z PXVLV] GRGDWNRZR]DGEDüRXPLHV]F]HQLHJG]LH]ZUyFRQHJRZ\QLNXQSWDN zmienna := nazwa-funkcji(lista-parametrów-aktualnych);
)XQNFM PR*HV] UyZQLH* Z\NRU]\VWDü MDNR HOHPHQW Z\UD*HQLD OXE LQVWUXNFML QS writeln RJyOQLH PR*HV] M ]DVWRVRZDü ZV] G]LH WDP JG]LH PR*OLZH MHVW X*\FLH Z\UD*HQLD5. 4
2JUDQLF]HQLH WR PR*QD REHMü Z\NRU]\VWXMF W]Z GHNODUDFMH ]DSRZLDGDMFH UR]SRF]\QDQHVáRZHPNOXF]RZ\Pforward.
5
3DPL WDM *H LGHQW\ILNDWRU IXQNFML X*\W\ Z SURJUDPLH QLH MHVW l-ZDUWRFL D ZL F QLH PR*HV] X*\ZDü IXQNFML WDN VDPR MDN ]PLHQQHM — QLH PR*HV] QS SU]\SLV\ZDü MHM ZDUWRFLPR*OLZHWRMHVWZ\áF]QLHZREU ELHGHILQLFMLIXQNFMLLPDZyZF]DVQLHFRLQQH znaczenie).
62
Turbo Pascal — programowanie 3RF]ZV]\RGZHUVML7XUER3DVFDOXPR*OLZLD&L]LJQRURZDQLHZ\QLNX ]ZUDFDQHJRSU]H]IXQNFM F]\OLZ\NRU]\VWDQLHMHMWDNVDPRMDNSURFHGXU\ Jest WRPR*OLZHSRZáF]HQLXRSFMLNRPSLODWRUDExtended SyntaxOXEX*\FLX RGSRZLDGDMFHMMHMG\UHNW\Z\{$X+}. 8II3RWHMVROLGQHMLQX*FHM GDZFHWHRULLF]DVQDQLHFRSUDNW\NL1DSRF]WHNVSUyEXMP\]DUDG]LüSUREOHPRZLSU]HGVWDZLRQHPXSRGNRQLHFSRSU]HGQLHJRUR]G]LDáX2WR poprawiona wersja programu BisekcjaZ\NRU]\VWXMFDIXQNFM program Bisekcja; ^3URJUDPUR]ZL]XMHUyZQDQLDQLHOLQLRZHPHWRGELVHNFML` var DEFUHDO^JUDQLFHSU]HG]LDáXLSXQNWSRG]LDáX` HSVUHDO^GRNáDGQRü` function f(x:real):real;
{ badana funkcja }
begin f := 1 -H[SVLQ[ FRV[ ^WUHüIXQNFML` end; begin writeln('Program znajduje miejsce zerowe funkcji') writeln('w przedziale [a; b]'); ZULWH 3RGDMZDUWRVFD ^ZSURZDG(JUDQLFHSU]HG]LDOX` readln(a); write('Podaj wartosc b: '); readln(b); write('Podaj dokladnosc: '); readln(eps); repeat F DE ^SRG]LHOSU]HG]LDáQDSyá` if (f(a)*f(c)) < 0 then^Z\JOGDáDGQLHMSUDZGD"` b := c { funkcja ma przeciwne znaki w a i c } else a := c; { funkcja ma przeciwne znaki w b i c } writeln(c); untilDEVIF HSV^EDGDP\ZDUWRüEH]Z]JO GQ` writeln('Miejsce zerowe: c = ',c:12:8); readln; end.
&]\P Uy*QL VL QDV] SURJUDP RG ZHUVML SRSU]HGQLHM" 3R SLHUZV]H GHILQLFMD EDGDQHM IXQNFML]RVWDáDZ\RGU EQLRQDMDNRRGG]LHOQ\IUDJPHQWNWyU\áDWZR]QDOH(ü]LQWHUSUHWRZDü L SRSUDZLü 3R GUXJLH WUHü VDPHJR SURJUDPX MHVW F]\WHOQLHMV]D SURJUDP ]DMPXMH VL WHUD] Z\áF]QLH UHDOL]DFM ZáDFLZHJR DOJRU\WPX F]\OL V]XNDQLHP SLHUwiastka pewnej funkcji f(x) 3R WU]HFLH ]PQLHMV]\áD VL SRGDWQRü SURJUDPX QD Eá G\ (zmiana definicji funkcji wymaga poprawieQLD W\ONR MHGQHM OLQLMNL ]DVWDQyZ VL MDN Z\JOGDáDE\ SRSU]HGQLD ZHUVMD SURJUDPX JG\E\ REOLF]HQLD Z\PDJDá\ X*\FLD NLONX RGG]LHOQ\FK LQVWUXNFML :UHV]FLH SR F]ZDUWH SURJUDP Z\JOGD áDGQLHM MHVW EDUG]LHM elegancki i wymaga mniej pisania.
Funkcje i procedury
63
.RU]\VWDQLH]SURFHGXUZ\JOGDEDUG]RSRGREQLH]Z\MWNLHPWHJR*HQLHPXVLV]VL WURV]F]\üR]DJRVSRGDURZDQLH]ZUDFDQHMZDUWRFLSRQLHZD*MHMQLHPD 2JyOQLHU]HF] ELRUF IXQNFMH Z\NRU]\VW\ZDQH V JáyZQLH WDP JG]LH ]DFKRG]L SRWU]HED REOLF]HQLD MDNLHM SRMHG\QF]HM ZDUWRFL L SU]HND]DQLD MHM GR NROHMQ\FK LQVWUXNFML SURJUDPX QDWRPLDVW SURFHGXU\ SR]ZDODM QD HIHNW\ZQH Z\NRQ\ZDQLH SRZWDU]DMF\FK VL UXW\QRZ\FK F]\QQRFL $E\ QD SU]\NáDG XDWUDNF\MQLü V]DW JUDILF]Q SURJUDPX PR*HV] Z\NRU]\VWDüZQLPQDVW SXMFSURFHGXU procedure Szlaczek; begin for i := 1 to 60 do { wypisz szlaczek } ZULWH
^]áR*RQ\]JZLD]GHN` ZULWHOQ^SU]HMG(GRQRZHJRZLHUV]D` end;
*G]LH XPLHFLü GHILQLFM SURFHGXU\ — MX* ZLHV] 3R]RVWDMH M Z\ZRáDü FR UREL VL bardzo prosto: Szlaczek;
.D*GH WDNLH Z\ZRáDQLH XPLHFL QD HNUDQLH ÄV]ODF]HN´ VNáDGDMF\ VL ] JZLD]GHN 2F]\ZLFLH SRZ\*V]D SURFHGXUD QLH MHVW LGHDOQD ER MHOL QS ]DFKFH &L VL Z\SLVDü V]ODF]HN]áR*RQ\]NUHVHNE G]LHV]PXVLDá]PLHQLüMHMWUHü=QDF]QLHOHSV]\PUR]ZL]DQLHPMHVWFRWDNLHJR procedure Szlaczek(Znak:char; Ile:byte); begin for i := 1 to Ile do { wypisz szlaczek } ZULWH=QDN ^]áR*RQ\]LOX]QDNyZ` writeln; end;
6SUyEXMP\ZUDPDFK]DEDZ\Z\NRU]\VWDüQDV]SURFHGXU GRZ\ZLHWlenia na ekranie WUyMNWD]áR*RQHJR]JZLD]GHNF]\OLF]HJRWDNLHJR * ** *** ****
LWG2GSRZLHGQLSURJUDPE G]LHZ\JOGDáWDN program Szlaczki; var i : integer;
{ licznik wierszy }
procedure Szlaczek(Znak : char; Ile : integer); begin for i := 1 to Ile do { wypisz szlaczek } ZULWH=QDN ^]áR*RQ\]LOX]QDNyZ`
64
Turbo Pascal — programowanie writeln end; begin for i := 1 to 20 do Szlaczek('*', i); end.
{ wypisz 20 szlaczków }
-HOL XZD*DV] *H ZV]\VWNR MHVW 2. VSUyEXM WHUD] ]PLHQLü SURJUDP WDN E\ ND*G\ V]ODF]HN PLDá GáXJRü UyZQ NROHMQHM OLF]ELH QLHSDU]\VWHM WM SLHUZV]\ GUXJL LWG 2JyOQLH GáXJRü V]ODF]ND Z\UD]L VL Z]RUHP Ile = 2 ⋅ numer − 1 , gdzie numer jest QXPHUHPZLHUV]DWDNZL FZ\VWDUF]\]PLHQLüJáyZQS WO SURJUDPXQD for i := 1 to 20 do { wypisz 20 szlaczków } Szlaczek('*', 2*i - 1);
+PQRFK\EDQLHFDáNLHPWRFKFLDáHX]\VNDüSUDZGD"(IHNWNWyUHJRGRZLDGF]\áH XUXFKDPLDMF SURJUDP Z\QLND ] X*\FLD Z SURFHGXU]H L Z\ZRáXMFHM M S WOL WHM VDPHM zmiennej iDZ\JOGDQDVW SXMFR :DUWRü PDE\ü MHVWSU]HGSURFHGXU jest po procedurze jest po inkrementacji licznika
3U]HELHJS WOL 1 2 3 2 2 3 4
1 1 1 2
3 3 7 8
.D*GHZ\ZRáDQLHSURFHGXU\SRZRGXMHPRG\ILNDFM ]PLHQQHMiNWyUDMHVWMHGQRF]HQLH OLF]QLNLHP S WOL Z SURJUDPLH JáyZQ\P $E\ WHJR XQLNQü QDOH*DáRE\ Z SURFHGXU]H X*\ü MDNR OLF]QLND S WOL LQQHM ]PLHQQHM 7R ] NROHL QDNáDGD QDSURJUDPLVW RERZL]HN przejrzenia wszystkich procedXU]QDMGXMF\FKVL ZSURJUDPLHLZF]HQLHMV]HJR]DGHNODURZDQLD RGSRZLHGQLFK ]PLHQQ\FK WDN E\ VL QLH ÄQDNáDGDá\´ : HIHNFLH RWU]\PXMHP\NROHMQ\]HVWDZáDWZ\FKGRSU]HRF]HQLDSXáDSHN5R]ZL]DQLHPWHJRSUREOHPXV zmienne lokalne, którymi jednak zajmiem\VL MX*ZQDVW SQ\PUR]G]LDOH7DPUyZQLH* GRNRF]\P\ RPDZLDQLH SU]HND]\ZDQLD SDUDPHWUyZ L ZDUWRFL ] L GR SURFHGXU L funkcji.
Zapamietaj • 3URFHGXU\ L IXQNFMH SDVFDORZH SR]ZDODM ]DPNQü GDQ\ ]HVWDZ RSHUDFML Z ORJLF]Q FDáRü SRELHUDMF ] RWRF]HQLD RGSRZLHGQLH LQIRUPDFMH L ]ZUDFDMF *GDQ\Z\QLN • 3U]HGZ\NRU]\VWDQLHPZ\ZRáDQLHP IXQNFMLOXESURFHGXU\QDOH*\M]GHILnioZDüF]\OLRNUHOLüMHMWUHüLVSRVyENRPXQLNRZDQLDVL ]RWRF]HQLHP
Funkcje i procedury • 'R SU]HND]\ZDQLD LQIRUPDFML GR IXQNFML SURFHGXU\ VáX* SDUDPHWU\ DUJXmenty). W trakcie definiowania informacja przekazywana do funkcji (procedury) symbolizowana jest parametrami formalnymi. • 'HILQLFMHIXQNFMLSURFHGXU PXV]E\üXPLHV]F]RQHZSURJUDPLHSU]HGF] FL RSHUDF\MQLPXV]Z\VW SRZDüZRGSRZLHGQLHMNROHMQRFL • 6DPRZ\ZRáDQLHIXQNFMLSURFHGXU\ RGE\ZDVL SU]H]SRGDQLHZSURJUDPLHMHM nazZ\X]XSHáQLRQHMRGSRZLHGQLOLVWSDUDPHWUyZDNWXDOQ\FK • 6WRVRZDQLHIXQNFMLLSURFHGXUMHVWNRU]\VWQH]HZ]JO GXQDSRSUDZ F]\WHOQRFL L HIHNW\ZQRFL SURJUDPX ]PQLHMV]HQLH SRGDWQRFL QD Eá G\ L VNUyFHQLH F]DVX potrzebnego na jego pisanie.
65
66
Turbo Pascal — programowanie
Jak program SRUR]XPLHZDVL
]IXQNFM" -DN SRZLHG]LHOLP\ Z SRSU]HGQLP UR]G]LDOH IXQNFMD SURFHGXUD SR]ZDOD ]DPNQü ]HVWDZ ]áR*RQ\FK RSHUDFML Z VZRLVW\ SRMHPQLN Z\NRU]\VW\ZDQ\ SU]H] Z\ZRáXMF\ SURJUDP QD ]DVDG]LH F]DUQHM VNU]\QNL SR ZáR*HQLX GR IXQNFML ]HVWDZX LQIormacji, progUDP RGELHUD Z\QLN QLH SU]HMPXMF VL VSRVREHP MHJR X]\VNDQLD 1LHVWHW\ MDN PRJáH VL MX* SU]HNRQDü QDV]D VNU]\QND QLH MHVW V]F]HOQD L VWRVXQNRZR áDWZR GRSURZDG]Lü GR V\WXDFML Z NWyUHM IXQNFMD Z VSRVyE QLHNRQWURORZDQ\ ÄXV]NRG]L´ zmienne programu. Zjawiska tego typu (zarówno kontrolowane, jak i niekontrolowane) ]ZDQH V efektami ubocznymi (ang. side effects L GRü F] VWR XWUXGQLDM *\FLH PQLHM GRZLDGF]RQ\PSURJUDPLVWRP1DV]F] FLHHIHNWyZXERF]Q\FKPR*QDáDWZRXQLNQü SR]ZDODMQDWRzmienne lokalne6. -DN VDPD QD]ZD ZVND]XMH ]PLHQQD ORNDOQD MHVW ÄSU\ZDWQ ZáDVQRFL´ IXQNFML OXE SURFHGXU\ ZHZQWU] NWyUHM ]RVWDáD ]GHILQLRZDQD =PLHQQD WDND QLH MHVW ZLGRF]QD QD ]HZQWU]IXQNFMLF]\OLQSZZ\ZRáXMF\PMSURJUDPLH QDWRPLDVWMHVWGRVW SQDGOD ZV]HONLFK IXQNFML L SURFHGXU ]GHILQLRZDQ\FK Z REU ELH GDQHM IXQNFML OXE SURFHGXU\ (o LOHLFKGHILQLFMHXPLHV]F]RQHVSRGHNODUDFML]PLHQQHM 3U]HFLZLHVWZHP]PLHQQHM ORNDOQHMMHVWRF]\ZLFLH]PLHQQDglobalnaÄZLGRF]QD´ZFDá\PREV]DU]HSURJUDPXod PRPHQWXMHM]DGHNODURZDQLD.D*GD]GHILQLRZDQDZSURJUDPLHIXQNFMDLSURFHGXUDPD SHáQ\GRVW SGRZV]\VWNLFK]PLHQQ\FKJOREDOQ\FKF]HJRMHGQDNQLHQDOH*\QDGX*\ZDü DZU F]QLHQDOH*\X*\ZDüZRJyOH Ä=DNUHVZLG]LDOQRFL´]PLHQQHMQD]\ZDQ\MHVWMHM ]DVL JLHP (ang. scope). =DUyZQRGHNODUDFMDMDNLVSRVyEZ\NRU]\VWDQLD]PLHQQ\FKORNDOQ\FKVÄQDRNR´WDNLH VDPH MDN GOD ]PLHQQ\FK JOREDOQ\FK 5y*QLFD NU\MH VL Z ORNDOL]DFML ]PLHQQ\FK REX 6
FLOHM obiekty ORNDOQH ERZLHP RSUyF] ]PLHQQ\FK ORNDOQH PRJ E\ü UyZQLH* VWDáH i typy, o których jednak na ra]LHQLHPyZLOLP\
-DNSURJUDPSRUR]XPLHZDVL ]IXQNFM"
67
W\SyZ]PLHQQHJOREDOQHSU]HFKRZ\ZDQHVZW]Zsegmencie danych i LVWQLHMSU]H] FDá\F]DVZ\NRQ\ZDQLDSURJUDPX']L NLWHPXV]DZV]HGRVW SQHGODND*GHM]H]GHILQLRZDQ\FKZSURJUDPLHIXQNFMLRLOHQLH]DFKRG]LW]Z]MDZLVNRSU]\VáDQLDQLDRNWyU\P]DFKZLO =PLHQQHORNDOQHXPLHV]F]DQHV]NROHLQDstosie, czyli w specjalnym REV]DU]H SDPL FL SU]H]QDF]RQ\P GR W\PF]DVRZHJR SU]HFKRZ\ZDQLD LQIRUPDFML W RGUy*QLHQLXRG]PLHQQ\FKJOREDOQ\FKF]DV*\FLD]PLHQQ\FKORNDOQ\FKRJUDQLF]RQ\ MHVWGRF]DVXZ\NRQ\ZDQLDSRVLDGDMFHMMHIXQNFMLWDNZL FÄORNDOQRü´PDFKDUDNWHU nie tylko przestrzenny, ale i czasowy — ]PLHQQH ORNDOQH V WZRU]RQH Z PRPHQFLH UR]SRF] FLDZ\NRQ\ZDQLDIXQNFMLL]QLNDMSRMHM]DNRF]HQLX2F]\ZLVWHMHVWZL F*H SUyED RGZRáDQLD VL GR ]PLHQQHM ORNDOQHM QD ]HZQWU] GHNODUXMFHM M IXQNFML MHVW QLHOHJDOQDJG\*]PLHQQDWDNDSRSURVWXQLHLVWQLHMH7. -DN ZF]HQLHM ZVSRPQLHOLP\ IXQNFMD SURFHGXUD SU]\SRPLQD VWUXNWXU PDá\ SURJUDP WRWH* GHNODUDFMH ]PLHQQ\FK ORNDOQ\FK XPLHV]F]D VL ]Z\NOH QD MHM SRF]WNX SR QDJáyZNX 8*\FLH ]PLHQQ\FK ORNDOQ\FK ]DGHPRQVWUXMHP\ QD SU]\NáDG]LH SURJUDPX SzlaczkiGRSURZDG]DMFJRSU]\RND]MLGRVWDQXSHáQHMX*\ZDOQRFL$E\WR]URELü Z\VWDUF]\SRSUDZLüSURFHGXU Szlaczek: procedure Szlaczek(Znak : char; Ile : integer); var { deklaracja zmiennej lokalnej, } i : integer; { czyli licznika znaków } begin for i := 1 to Ile do { wypisz szlaczek } ZULWH=QDN ^]áR*RQ\]LOX]QDNyZ` writeln end;
7DNSRSUDZLRQ\SURJUDPSRZLQLHQG]LDáDüSRSUDZQLHQLH]DOH*QLHRG*GDQHMGáXJRFL FLJX ]QDNyZ :SURZDG]DMF GR SURFHGury Szlaczek GHNODUDFM ]PLHQQHM i spowodoZDáH*HSRGF]DVND*GHJRZ\ZRáDQLDNRU]\VWDRQDQLH]H]PLHQQHMJOREDOQHM DOH ]H VZRMHM ÄSU\ZDWQHM´ ]PLHQQHM ORNDOQHM =DXZD* SU]\ RND]ML *H RELH ]PLHQQH QD]\ZDMVL WDNVDPRDPLPRWRSURJUDPG]LDáDSRSUDZQLH=MDZLVNRÄPDVNRZDQLD´ ]PLHQQHM JOREDOQHM SU]H] LGHQW\F]QLH QD]ZDQ ]PLHQQ ORNDOQ QD]\ZD VL SU]\VáDQLDQLHP L GDMH &L JZDUDQFM *H QDZHW MHOL ]DGHNODUXMHV] Z IXQNFML ]PLHQQ ORNDOQ R QD]ZLH WDNLHM VDPHM MDN ]PLHQQD ]HZQ WU]QD Z V]F]HJyOQRFL JOREDOna), ZV]HONLHRGZRáDQLDZHZQWU]IXQNFMLE G]DZV]HNLHURZDQHGR]PLHQQHMORNDOQHM]D RGSRZLHGQLD ]PLHQQD ]HZQ WU]QD SR]RVWDQLH QLHQDUXV]RQD ']L NL WHPX QLH PXVLV] GEDü R WR E\ ]PLHQQH GHNODURZDQH Z UDPDFK SRV]F]HJyOQ\FK IXQNFML PLDá\ Uy*QH QD]Z\ L E\ NWyUD SU]\SDGNLHP QLH QD]\ZDáD VL WDN VDPR MDN RGSRZLHGQLD ]PLHQQD globalna. $E\]REUD]RZDüSRM FLD]DVL JXLSU]\VáDQLDQLDZ\REUD(P\VRELHSHZLHQDEVWUDNF\MQ\ program, w którym zdefiniowano kilka zmiennych globalnych oraz procedur i funkcji 7
:\MWNLHP V WXWDM ORNDOQH ]PLHQQH SUHGHILQLRZDQH ]PLHQQH ] ZDUWRFL SRF]WNRZ NWyUH ORNRZDQH V Z VHJPHQFLH GDQ\FK D ZL F LVWQLHM SU]H] FDá\ F]DV Z\NRQ\ZDQLD SURJUDPX 1LH ]PLHQLD WR IDNWX*H L RQH QLH V ZLGRF]QH QD ]HZQWU] SRVLDGDMF\FK MH funkcji i procedur.
68
Turbo Pascal — programowanie posiadaMF\FK VZRMH ]PLHQQH ORNDOQH 1D U\VXQNX RERN SU]HGVWDZLRQ\ MHVW VFKHPDW WDNLHJRSURJUDPX:WDEHOFHSRND]DQ\MHVW]DVL JSRV]F]HJyOQ\FK]PLHQQ\FKZLG]LDOQRüZ SURJUDPLHLSURFHGXUDFK ]QDNJZLD]GNLR]QDF]DSU]\VáDQLDQLH .LHG\ X*\ZDü ]PLHQQ\FK ORNDOQ\FK D NLHG\ JOREDOQ\FK" =DVDGQLF]R ]PLHQQ\FK JOREDOQ\FKZSURFHGXUDFKLIXQNFMDFKQLHQDOH*\X*\ZDüZRJyOH=GDU]DMVL MHGQDN sytuacje, kiedy ZLDGRPH X*\FLH ]PLHQQHM JOREDOQHM F]\OL ZLDGRPH Z\NRU]\VWDQLH efektów ubocznych) upraszcza program. Efekty XERF]QH]QDMGXMQDRJyá]DVWRVRZDQLH GR SU]HND]\ZDQLD LQIRUPDFML ] L GR IXQNFML SURFHGXU SR]ZDODMF QD ]UHGXNRZDQLH OLF]E\ SDUDPHWUyZ -HOL MHGQDN FKFLDáE\ ]DRV]F] G]Lü VRELH SLVDQLD GHNODUXMF Z progUDPLHMHGQ]PLHQQJOREDOQ iLX*\ZDMFMHMMDNROLF]QLNDZHZV]\VWNLFKSURFHduUDFK NWyUH WDNRZHJR SRWU]HEXM V]XNDV] JX]D 3U G]HM F]\ Sy(QLHM NWyUD z SU]\V]á\FK PRG\ILNDFML SURJUDPX VSRZRGXMH XMDZQLHQLH VL HIHNWyZ XERF]Q\FK w formie prowaG]FHMGREá GXZ\NRQDQLD 3RQLHZD*ZV]HONLHF]\QQRFLZ\NRQ\ZDQHSU]H]IXQNFM OXESURFHGXU VQLHGRVWU]HJDOQH GOD Z\ZRáXMFHJR M SURJUDPX ]PLHQQH Z\NRU]\VW\ZDQH Z WUDNFLH Z\NRQ\ZDQLD W\FK F]\QQRFL SRZLQQ\ E\ü GOD QLHJR QLHGRVWU]HJDOQH D ]DWHP SRZLQQ\ E\ü GHNODURZDQH MDNR ]PLHQQH ORNDOQH : V]F]HJyOQRFL GRW\F]\ WR ]PLHQQ\FK W\PF]DVRZ\FKLSRPRFQLF]\FKMDNOLF]QLNLS WOLW\PF]DVRZHZDUWRFLPDNVLPyZLPLQLPyZ ]PLHQQHWHNVWRZHX*\ZDQHSU]\Z\SURZDG]DQLXNRPXQLNDWyZLWS :V]HONLH]PLHQQHSU]H]QDF]RQHZ\áF]QLHGRX*\WNXZHZQ WU]QHJRIXQNFML i procHGXUSRZLQQ\E\üEH]Z]JO GQLHGHNODURZDQHMDNR]PLHQQHORNDOQH =PLHQQHJOREDOQHSRZLQQ\E\üZ\NRU]\VW\ZDQHW\ONRGRSU]HFKRZ\ZDQLD GDQ\FKLVWQLHMF\FKSU]H]FDá\F]DVWUZDQLDSURJUDPX : RVWDWQLHM F] FL WHJR UR]G]LDáX ]DMPLHP\ VL VSUDZ SU]HND]\ZDQLD LQIRUPDFML SRPL G]\ IXQNFMDPL L SURFHGXUDPL D Z\ZRáXMF\P MH SURJUDPHP -DN MX* ZLHV] Z\PLDQD WDND PR*H E\ü ]UHDOL]RZDQD ] Z\NRU]\VWDQLHP HIHNWyZ XERF]Q\FK FR QLH MHVW ZVND]DQH OXE ]D SRPRF SDUDPHWUyZ DUJXPHQWyZ 'HNODURZDQLH L wykorzystanie parametróZ E\áR MX* RPDZLDQH SRSU]HGQLR SU]\SRPQLMP\ ZL F Z skrócie: • SDUDPHWU\GHNODURZDQHVZQDJáyZNXIXQNFMLSURFHGXU\ MDNRW]Zparametry formalne F]\OL LGHQW\ILNDWRU\ QD]Z\ V\PEROL]XMFH GDQH SU]HND]\ZDQH GR funkcji; • SRGF]DV Z\ZRáDQLD Z PLHMVFH SDUDPHWUyZ IRUPDOQ\FK SRGVWDZLDQH V U]HF]\ZLVWHZDUWRFL]PLHQQ\FKVWDá\FKLZ\UD*HWZRU]FHW]Zparametry aktualne; • SDUDPHWU\IRUPDOQHRSLVXMMHG\QLHSRVWDüLQIRUPDFMLSU]HND]\ZDQHMGRIXQNFML SURFHGXU\ U]HF]\ZLVWLQIRUPDFM QLRV]HVREGRSLHURSDUDPetry aktualne.
-DNSURJUDPSRUR]XPLHZDVL ]IXQNFM"
69
SURJUDP=DVLHJL YDULMLQWHJHU [UHDO SURFHGXUH3LHUZV]D YDUNLQWHJHU
SURFHGXUH'UXJD[UHDO YDUNLQWHJHU
SURFHGXUH7U]HFLD[UHDO YDUNLQWHJHU SURFHGXUH:HZQ YDUNOLQWHJHU
Zmienna ZáDFLFLHO
Program
Pierwsza
=DVL J Druga
Trzecia
Wewn
i (program)
tak
tak
tak
tak
tak
j (program)
tak
nie (*)
tak
tak
tak
x (program)
tak
tak
nie (*)
nie (*)
nie
j (Pierwsza)
nie
tak
nie
nie
nie
k (Pierwsza)
nie
tak
nie
nie
nie
x (Druga)
nie
nie
tak
nie
nie
k (Druga)
nie
nie
tak
nie
nie
x (Trzecia)
nie
nie
nie
tak
tak
k (Trzecia)
nie
nie
nie
tak
nie (*)
k (Wewn)
nie
nie
nie
nie
tak
l (Wewn)
nie
nie
nie
nie
tak
Rysunek 10. :LG]LDOQRü]PLHQQych lokalnych i globalnych w programie
70
Turbo Pascal — programowanie :HZQWU]IXQNFMLSDUDPHWU\]DFKRZXMVL MDNQRUPDOQH]PLHQQHPR*QDZ\NRQ\ZDü QD QLFK ZV]HONLH RSHUDFMH WDN VDPR MDN QD ]PLHQQ\FK ORNDOQ\FK 0R*OLZH MHVW ]DGHNODURZDQLHSDUDPHWUXRQD]ZLHWDNLHMVDPHMMDN]PLHQQDJOREDOQDZRJyOQRFL— ]PLHQQD]DGHNODURZDQDZEORNXQDGU] GQ\P Z\VWSLZyZF]DVHIHNWSU]\VáDQLDQLDWM ZV]HONLH RGZRáDQLD ZHZQWU] IXQNFML NRU]\VWDMFHM ] SDUDPHWUX E G RGQRVLá\ VL GR QLHJRDQLHGRSU]\VáRQL WHMSU]H]H]PLHQQHM1LHOHJDOQHMHVWnatomiast deklarowanie ]PLHQQ\FKORNDOQ\FKLSDUDPHWUyZRLGHQW\F]Q\FKQD]ZDFKQLHPyZLFMX*R]DGHNODURZDQLXSDUDPHWUXRQD]ZLHLGHQW\F]QHM]QD]ZIXQNFMLNWyUDJRZ\NRrzystuje). :V]\VWNLHLGHQW\ILNDWRU\WMQD]Z\]PLHQQ\FKVWDá\FKW\SyZSDUDPHWUyZ SURFHGXULIXQNFML GHNODURZDQHZREU ELHGDQHJREORNX]Z\MWNLHPEORNyZ SRGU] GQ\FK PXV]E\üXQLNDOQH0R*OLZHMHVWQDWRPLDVWÄ]GXEORZDQLH´ LGHQW\ILNDWRUDZEORNXSRGU] GQ\PFRVSRZRGXMHHIHNWSU]\VáDQLDQLD :DUWR ZVSRPQLHü *H SRF]WNXMF\ SURJUDPLFL F] VWR QDGX*\ZDM SDUDPHWUyZ Z\NRU]\VWXMFMHMDNR]PLHQQHORNDOQHOXEFRMHVWMX*]EURGQL GHNODUXMGRGDWNRZH SDUDPHWU\ W\ONR L Z\áF]QLH Z W\P FHOX 3UDNW\ND WD FKRFLD* OHJDOQD MHVW VSU]HF]QD z ]DVDGDPL SRSUDZQHJR SURJUDPRZDQLD SDUDPHWU\ SU]H]QDF]RQH V GR Z\PLDQ\ LQIRUPDFMLSRPL G]\IXQNFMQLH]DGRÄSRGSLHUDQLDVL ´ZZ\NRQ\ZDQ\FKSU]H]QL RSHUDFMDFKRFKDUDNWHU]HZHZQ WU]Q\P 7ZRU]FSURJUDPPXVLV]SDPL WDüRZáDFLZ\PSRG]LDOHNRPSHWHQFMLSRPL G]\ VNáDGDMF\PLVL QDRELHNWDPL-HOLRELHNWSU]H]QDF]RQ\MHVWGRSU]HND]\ZDQLD LQIRUPDFMLQLHSRZLQLHQHX*\ZDüJRMDNR]PLHQQHMORNDOQHM3RF]WDQLHVáX*\ GRSU]HV\áDQLDZLDGRPRFLGRVVLHGQLHJRSRNRMX 'RWHMSRU\NRQFHQWURZDOLP\VL QDSU]HND]\ZDQLXLQIRUPDFML]Z\ZRáXMFHJRSURJUDPX GR IXQNFML OXE SURFHGXU\ 3R SU]HWZRU]HQLX WHM LQIRUPDFML QD RJyá ]DFKRG]L NRQLHF]QRü ]ZUyFHQLD Z\QLNX GR Z\ZRáXMFHJR -HOL Z\QLN MHVW SRMHG\QF] ZDUWRFL MHVW W\SX SURVWHJR QDMOHSLHM X*\ü IXQNFML NWyUD SR]ZDOD QD ]ZUyFHQLH JR przez nazw 5R]ZL]DQLH WR E\ZD MHGQDN F]DVDPL QLHZ\JRGQH QLH PyZLF MX* R V\WXDFMDFK JG\ WU]HED ]ZUyFLü GR Z\ZRáXMFHJR GZLH OXE ZL FHM ZDUWRFL 3RQLHZD* WU]\PDP\ VL ] daleka od efektów ubocznych, pozostaje wykorzystanie do tego celu SDUDPHWUyZ :\REUD( VRELH QD SU]\NáDG *H MHVW &L SRWU]HEQD IXQNFMD REOLF]DMFD MHGQRF]HQLHVLQXVLFRVLQXVGDQHJRNWD0R*QDWR]URELüQSWDN program Trygonometria; { demonstracja przekazywania parametrów } var i : integer; s, c : real; procedure SinCos(x : real; SinX, CosX : real); ^REOLF]DMHGQRF]HQLHVLQXVLFRVLQXVDUJXPHQWX` begin SinX := sin(x); CosX := cos(x); end;
-DNSURJUDPSRUR]XPLHZDVL ]IXQNFM"
71
begin 6LQ&RV3LVF ^REOLF]ZDUWRFL` writeln(s:8:3, c:8:3); { i wypisz je na ekranie } end.
1LHVWHW\ Z\QLN E\QDMPQLHM QLH MHVW VDW\VIDNFMRQXMF\ ]DPLDVW REOLF]RQ\FK ZDUWRFL SURJUDP Z\ZLHWOD ]HUD OXE LQQH SR]EDZLRQH VHQVX OLF]E\ ']LHMH VL WDN GODWHJR L* w swojej obecnej formie parametry SinX i CosX SR]ZDODM MHG\QLH QD SU]HND]DQLH LQIRUPDFML GR SURFHGXU\ QLH ]D RGZURWQLH 1D V]F] FLH Z\VWDUF]\ MHGQD GUREQD modyfikacja w programie: procedure SinCos(x : real; var SinX, CosX : real);
E\ZV]\VWNR]DF] áRG]LDáDüSRSUDZQLH&RWDNLHJRVL ]PLHQLáR" 2Wy*GRGDQLHVáRZDNOXF]RZHJR varSU]HGQD]ZSDUDPHWUXSDUDPHWUyZ ]DVDGQLF]R ]PLHQLD VSRVyE LFK SU]HND]\ZDQLD 3RSU]HGQLR PLHOLP\ GR F]\QLHQLD ] WDN ]ZDQ\P SU]HND]\ZDQLHPSU]H]ZDUWRüXPR*OLZLDMF\PZ\áF]QLHZáR*HQLHGDQ\FKGRIXQNFML SURFHGXU\ ']LDáDQLH SU]HND]\ZDQLD SU]H] QD]Z VSURZDG]DáR VL GR XPLHV]F]HQLD w odpowiednim miejscu (tj. na stosie) NRSLLZDUWRFLSDUDPHWUXDNWXDOQHJR, która nasW SQLHPRJáDE\üSU]HWZDU]DQDZHZQWU]IXQNFMLOXESURFHGXU\2EHFQLHZ\NRU]\VW\ZDQ\ PHFKDQL]P QRVL QD]Z SU]HND]\ZDQLD SU]H] QD]Z LQQH PGUH RNUHOHQLH WR SU]HND]\ZDQLHSU]H]ZVND(QLNOXESU]H]UHIHUHQFM LUy*QLVL RGSRSU]HGQLHJRW\P*H SURFHGXUD RWU]\PXMH QLH NRSL ZDUWRFL SDUDPHWUX DNWXDOQHJR OHF] LQIRUPDFM R MHJR SRáR*HQLX0R*QDWRSU]HGVWDZLüQDVW SXMFR
Rysunek 11. 0HFKDQL]PSU]HND]\ZDQLDSDUDPHWUyZD SU]H]ZDUWRüE SU]H]QD]Z
:SU]\SDGNXSU]HND]\ZDQLDSU]H]ZDUWRüIXQNFMDRWU]\PXMHMHG\QLHNRSL U]HF]\ZLVWHJRSDUDPHWUX=DVL JRSHUDFMLGRNRQ\ZDQ\FKQDWDNLHMNRSLLRJUDQLF]DVL GRZQ WU]D IXQNFML ]D JG\ WD NRF]\ G]LDáDQLH ZDUWRü SDUDPHWUX MHVW WUDFRQD 3DUDPHWU\ SU]HND]\ZDQH SU]H] ZDUWRü ]DFKRZXM VL ZL F LGHQW\F]QLH MDN ]PLHQQH ORNDOQH Uy*QLF VL RG QLFK MHG\QLH SU]H]QDF]HQLHP ,QDF]HM Z\JOGD VSUDZD Z SU]\SDGNX SU]HND]\ZDQLDSU]H]QD]Z IXQNFMDRWU]\PXMHWXQLHNRSL SDUDPHWUXOHF]W]ZZVND(nik opLVXMF\MHJRU]HF]\ZLVWHSRáR*HQLH:V]HONLHRSHUDFMHGRNRQ\ZDQHSU]H]IXQNFM QD SDUDPHWU]H SU]HND]\ZDQ\P SU]H] QD]Z GRW\F] QLH NRSLL DOH U]HF]\ZLVWHJR RELHNWXE GFHJRZáDVQRFLSURJUDPX0R*QDZL FSRZLHG]LHü*HIXQNFMDÄVL JDQD
72
Turbo Pascal — programowanie ]HZQWU]´ GR ]DVREyZ SURJUDPX L PRG\ILNXMH MH ]H VNXWNLHP QDW\FKPLDVWRZ\P D efekW\ ZV]\VWNLFK RSHUDFML SR]RVWDM ÄXWUZDORQH´ Z WUHFL RELHNWX E GFHJR SDUDPHWUHP =DXZD* *H SRQLHZD* IXQNFMD RWU]\PXMH WX ZVND(QLN GR U]HF]\ZLVWHJR SDUDPHWUXQLHPR*HV]SU]HND]DüSU]H]QD]Z RELHNWXQLHSRVLDGDMFHJRORNDOL]DFMLZ SDPL FLQSVWDáHMF]\Z\UD*HQLD F]\OLQLHE GFHJRl-ZDUWRFL3U]HND]DQLHWDNLHJR SDUDPHWUXSU]H]ZDUWRüMHVWQDWRPLDVWQDM]XSHáQLHMOHJDOQH .LHG\ VWRVRZDü SU]HND]\ZDQLH SDUDPHWUyZ SU]H] ZDUWRü D NLHG\ SU]H] QD]Z " 3U]HND]\ZDQLH SU]H] ZDUWRü X*\ZDQH MHVW Z ÄNRPXQLNDFML MHGQRNLHUXQNRZHM´ F]\OL ZyZF]DV JG\ ]ZUyFHQLH ZDUWRFL GR Z\ZRáXMFHJR SURJUDPX QLH MHVW Z\PDJDQH OXE ZU F] MHVW QLHZVND]DQH WM FKFHP\ ]DEH]SLHF]\ü VL SU]HG PRG\ILNDFM RELHNWX E GFHJR SDUDPHWUHP -H*HOL ]DFKRG]L SRWU]HED SU]HND]DQLD ZDUWRFL ] SRZURWHP GR Z\ZRáXMFHJR NRQLHF]QH MHVW X*\FLH SU]HND]\ZDQLD SU]H] QD]Z F]\OL SRSU]HG]HQLH QD]Z\ SDUDPHWUX VáRZHP var 3U]HND]\ZDQLH SU]H] QD]Z VWRVXMH VL UyZQLH* GOD DUJXPHQWyZ R ZL NV]\FK UR]PLDUDFK QS WDEOLF áDFXFKyZ L LQQ\FK ]PLHQQ\FK VWUXNWXUDOQ\FKRNWyU\FKSRZLHP\ZNUyWFH QDZHWZyZF]DVJG\QLHFKFHP\]ZUDFDü LFK ZDUWRFL -DN SRZLHG]LHOLP\ SU]HG FKZLO SU]HND]DQLH SU]H] ZDUWRü SRZRGXMH umieszczenie na stosie kopii parametUX FR SU]\ ZL NV]\FK UR]PLDUDFK SDUDPHWUyZ ]DMPXMHVSRURF]DVXLPR*HGRSURZDG]LüGRSU]HSHáQLHQLDVWRVXQDNWyU\PRSUyF]WHJR PXV] ]PLHFLü VL ]PLHQQH ORNDOQH L NLOND LQQ\FK U]HF]\ 3RGF]DV SU]HND]\ZDQLD SU]H] QD]Z QD VWRVLH XPLHV]F]DQ\ MHVW ]DZV]H F]WHUREDMWRZHM GáXJRFL ZVND(QLN GR SDUDPHWUX QLH]DOH*QLH RG IDNW\F]QHM ZLHONRFL WHJR RVWDWQLHJR FR RF]\ZLFLH WUZD ]QDF]QLH NUyFHM $E\ ]DEH]SLHF]\ü WDNL SDUDPHWU SU]HG QLHSR*GDQ PRG\ILNDFM PR*HP\ ]DVWRVRZDü Z PLHMVFH VáRZD var VáRZR NOXF]RZH const NWyUH UyZQLH* SRZRGXMH SU]HND]DQLH ZVND(QLND GR SDUDPHWUX EORNXMF MHGQRF]HQLH PR*OLZRü PRG\ILNRZDQLD WHJR RVWDWQLHJR $E\ VL R W\P SU]HNRQDü VSUyEXM ]PLHU]\ü F]DV Z\NRQDQLDQDVW SXMFHJRSURJUDPX program Parametry; type TablInt = array [1..5000] of integer; var i : integer; ti : TablInt; procedure Pusta(t : TablInt); var k : integer; begin k := t[1] end; begin for i := 1 to 1000 do^WRPR*HSRWUZDü` Pusta(ti); end.
-DNSURJUDPSRUR]XPLHZDVL ]IXQNFM"
73
-HOLMX*WR]URELáH]PLHQDJáyZHNSURFHGXU\Pusta na procedure Pusta(var t : TablInt)
7\PUD]HPSURJUDPSRZLQLHQZ\NRQDüVL Eá\VNDZLF]QLHSU]\QDMPQLHMZSRUyZQDQLX GR SRSU]HGQLHM ZHUVML ']LHMH VL WDN GODWHJR *H SRGF]DV ND*GHJR Z\ZRáDQLD SURFHGXU\QDVWRVLHXPLHV]F]DQ\MHVWMHG\QLHZVND(QLNGRWDEOLF\tZVXPLHW\VLFUD]\SR EDMW\ SRGF]DVJG\SRSU]HGQLRQDVWRVNRSLRZDQDE\áDFDáDWDEOLFDW\VLFUD]\ EDMWyZ F]\OL UD]\ ZL FHM 'RGDWNRZ ÄDWUDNFM´ ]ZL]DQ ] SU]HND]\ZDQLHP ZL NV]\FK VWUXNWXU SU]H] ZDUWRü MHVW PR*OLZRü SU]HSHáQLHQLD Vtosu (standardowo ZLHONRüVHJPHQWXVWRVXXVWDZLDQDMHVWSU]H]7XUER3DVFDODQDN% $E\VL RW\P SU]HNRQDü ]PLH Z SLHUZRWQHM ZHUVML SURJUDPX WHM EH] VáRZD var Z QDJáyZNX procedury) rozmiar tablicy na 10000 liczb: type TablInt = array [1..10000] of integer;
3UyED Z\NRQDQLD SURJUDPX VNRF]\ VL W\P UD]HP NRPXQLNDWHP Stack overflow error: sumaryczny rozmiar tablicy wynosi 20000 bajtów (10000 dwubajtowych liczb FDáNRZLW\FK F]\OL ZL FHM QL* PR*QD XPLHFLü QD VWRVLH 3RGREQLH MDN SRSU]HGQLR przekazanLHSDUDPHWUXSU]H]QD]Z UR]ZL]XMHSUREOHP 3U]HND]XMFZL NV]HVWUXNWXU\GDQ\FKMDNRSDUDPHWU\IXQNFMLLSURFHGXUQDOH*\ XQLNDüSU]HND]\ZDQLDSU]H]ZDUWRüLVWRVRZDüZ]DPLDQSU]HND]\ZDQLHSU]H] QD]Z $E\]DEH]SLHF]\üVL SU]HGSU]\SDGNRZPRG\ILNDFMZDUWRFL SDUDPHWUXPR*QD]DVWRVRZDüVáRZRNOXF]RZH const w miejsce var. :WHQVSRVyE]DNRF]\OLP\RPDZLDQLHSRGVWDZRZ\FK]DJDGQLH]ZL]DQ\FK]SURFHGXUDPL L IXQNFMDPL : QDVW SQ\FK UR]G]LDáDFK ]DMPLHP\ VL Z\MDQLDQLHP GZyFK QRZLQHNNWyUHSRMDZLá\VL ZRVWDWQLPSURJUDPLHLNWyUH]DSHZQHSU]\MáHQDZLDU 6 WR PLDQRZLFLH WDEOLFH D ZáDFLZLH W\S\ VWUXNWXUDOQH RUD] GHILQLRZDQLH ZáDVQ\FK W\SyZF]\OLVáRZRNOXF]RZHtype.
=DSDPL WDM • :V]HONLH RELHNW\ ]DGHNODURZDQH ZHZQWU] IXQNFML SURFHGXU\ V W]Z RELHNWDPLORNDOQ\PL2ELHNW\ORNDOQHVQLHZLGRF]QHQD]HZQWU]IXQNFML • 2ELHNW\ ]DGHNODURZDQH Z SURJUDPLH JáyZQ\P QD ]HZQWU] ZV]\VWNLFK SURFHGXULIXQNFML VRELHNWDPLJOREDOQ\PL6RQHGRVW SQHGODZV]\VWNLFKHOHPHQtów programu. • Wszelkie obiekW\ SU]H]QDF]RQH Z\áF]QLH GR X*\WNX ZHZQ WU]QHJR IXQNFML SURFHGXU\ SRZLQQ\E\üGHNODURZDQHMDNRORNDOQH • =DNUHVÄZLG]LDOQRFL´RELHNWX]ZDQ\MHVWMHJR]DVL JLHP • Zadeklarowanie w funkcji (procedurze) obiektu lokalnego o takiej samej nazwie MDNRELHNW]EORNXQDGU] GQHJRSRZRGXMHSU]\VáRQL FLHWHJRRVWDWQLHJR
74
Turbo Pascal — programowanie • Modyfikowanie obiektów nielokalnych (czyli przekazywanie informacji do/z IXQNFML OXE SURFHGXU\ GURJ LQQ QL* SU]H] SDUDPHWU\ OXE QD]Z IXQNFML QRVL QD]Z HIHNWyZXERF]Q\FK • (IHNWyZXERF]Q\FKQDOH*\XQLNDüDMHOLVL LFKX*\ZD—F]\QLüWR]UR]ZDJ • 3DVFDO XGRVW SQLD GZLH PHWRG\ SU]HND]\ZDQLD SDUDPHWUyZ SU]H] ZDUWRü i SU]H]QD]Z • 3U]HND]\ZDQLHSU]H]ZDUWRüG]LDáDMHGQRNLHUXQNRZRWMSU]HND]XMHLQIRUPDFM RGZ\ZRáXMFHJRGRZ\ZRá\ZDQHMIXQNFMLOXESURFHGXU\ • 3U]HND]\ZDQLH SU]H] QD]Z XPR*OLZLD ]ZUyFHQLH ]PRG\ILNRZDQHM ZDUWRFL SDUDPHWUXGRZ\ZRáXMFHJR • 3U]HND]XMFGRIXQNFMLOXESURFHGXUZL NV]HVWUXNWXU\GDQ\FKQDOH*\VWRVRZDü SU]HND]\ZDQLH SU]H] QD]Z 6NUDFD WR F]DV Z\NRQDQLD SURJUDPX L XPR*liwia XQLNQL FLHSU]HSHáQLHQLDVWRVX
3URJUDPRZDQLHQDSRZD*QLH
75
Programowanie na SRZD*QLH : NROHMQ\FK NLONX UR]G]LDáDFK ]DMPLHP\ VL UHDOL]DFM SURVWHJR DF] SRXF]DMFHJR ]DGDQLD PDV] RWR QDSLVDü SURJUDP ZVSRPDJDMF\ REVáXJ PDáHM ELEOLRWHNL 2SUyF] Z\MDQLHQLD ]DV\JQDOL]RZDQHJR XSU]HGQLR WHPDWX SU]HFKRZ\ZDQLD ZL NV]\FK LORFL GDQ\FKLNLONXLQQ\FKU]HF]\ VSUyEXMHP\QDW\PSU]\NáDG]LHSU]HGVWDZLüPHWRG\N SURMHNWRZDQLDSURJUDPXUHDOL]XMFHJRSHZQHU]HF]\ZLVWHLSUDNW\F]QH]DGDQLH 6IRUPXáRZDQLHQDV]HJR]DGDQLDEU]PLÄ1DSLV]SURJUDPZVSRPDJDMF\REVáXJ ELEOLRWHNLV]NROQHM´LMHVWRF]\ZLFLH]E\WRJyOQLNRZHE\GDáRVL VNXWHF]QLHSU]HWáXPDF]\ü QD SURJUDP $E\ MH XFLOLü PXVLP\ VSUHF\]RZDü Z\PDJDQLD X*\WNRZQLND F]\OL RVRE\ REVáXJXMFHM ELEOLRWHN RUD] RNUHOLü RJUDQLF]HQLD SURJUDPX F]\OL U]HF]\ NWyU\FK]GHILQLFMLQLHE G]LHRQZVWDQLH]URELüLQDGNWyU\PLQLHE G]LHP\VL ZRJyOH ]DVWDQDZLDü $E\ XVWDOLü OLVW Z\PDJD E GF SRGVWDZ GR ]DSURMHNWRZDQLD SRV]F]HJyOQ\FK IXQNFML SURJUDPX PXVLP\ VNRQVXOWRZDü VL ] MHJR SU]\V]á\P X*\WNRZQLNLHP FR w ]QDF]QHMPLHU]HVSURZDG]DVL GRWáXPDF]HQLDGODF]HJRWHJRF]\WDPWHJRVL QLHGD ]URELü =Dáy*P\ *H Z Z\QLNX SHUWUDNWDFML ] ELEOLRWHNDUN XVWDOLOLP\ *H QDV] NRPSXWHURZ\NDWDORJSRZLQLHQXPR*OLZLDü • ZSURZDG]HQLH ] NODZLDWXU\ L Z\ZLHWOHQLH QD HNUDQLH LQIRUPDFML R DXWRU]H i W\WXOHNVL*NL • Z\ZLHWOHQLH OLVW\ NVL*HN XSRU]GNRZDQ\FK DOIDEHW\F]QLH ZHGáXJ QD]ZLVND DXWRUDOXEW\WXáX • Z\V]XNDQLHNVL*NLZHGáXJSLHUZV]\FKOLWHUW\WXáX • VSUDZG]HQLHF]\NVL*NDMHVWQDSyáFHF]\WH*]RVWDáDZ\SR*\F]RQDMHOLWDN— to komu); • Z\V]XNDQLHNVL*NLQDMF] FLHMLQDMU]DG]LHMZ\SR*\F]DQHM
76
Turbo Pascal — programowanie 'X*RWHJRDOHMDNRVRELHSRUDG]LP\0DMFGRG\VSR]\FMLOLVW *\F]HNOLHQWDPR*HP\ SU]\VWSLü GR SURMHNWRZDQLD SURJUDPX NWyUHJR ]DVDGQLF]\PL HOHPHQWHP E G]LH ustalenie sposobu przechowywania informacji (czyli struktur danych) oraz sposobu jej SU]HWZDU]DQLD F]\OL DOJRU\WPyZ 3RQLHZD* GDQH UHSUH]HQWXM SHZQH U]HF]\ZLVWH RELHNW\ NVL*NL PXVLP\ SURMHNWRZDü QDV] SURJUDP SRG NWHP ZáDFLZRFL W\FK obiektyZ 1DMSLHUZ ]DWHP XWZRU]\P\ UHSUH]HQWDFM GDQ\FK D QDVW SQLH PHWRG\ ]D SRPRFNWyU\FKE G]LHP\MHSU]HWZDU]Dü7DNDZáDQLHNROHMQRüSRVW SRZDQLDVWRVRZDQDMHVWSRGF]DVSURMHNWRZDQLDZL NV]RFLSURJUDPyZ &KRFLD* ELEOLRWHND ]DZLHUD ZLHOH NVL*HN ZV]\VWNLH RQH PDM SHZLHQ ]HVWDZ ZVSyOQ\FK FHFK .ROHMQH XFLOHQLH E G]LH SROHJDáR QD RSLVDQLX SRMHG\QF]HM NVL*NL U]HF] MDVQD QDOH*\ SRPLQü LQIRUPDFMH PDMFH PDáH ]QDF]HQLH GOD X*\WNRZQLND MDN QS OLF]EDVWURQ 3RSU]\MU]HQLXVL OLFLH*\F]HPR*QDVWZLHUG]Lü*HZVNáDGRSLVXSRMHG\QF]HMNVL*NLSRZLQQ\ZFKRG]LüQDVW SXMFHLQIRUPDFMH • W\WXáFLJ]QDNyZ • QD]ZLVNRDXWRUDFLJ]QDNyZ • QD]ZLVNRRVRE\NWyUDNVL*N Z\SR*\F]\áDFLJ]QDNyZ • OLF]QLNZ\SR*\F]HOLF]EDFDáNRZLWD ,WXSLHUZV]\SUREOHPMDNUHSUH]HQWXMHVL ZSURJUDPLHFLJ]QDNyZ":7XUER3DVFDOX VáX*\ GR WHJR FHOX VSHFMDOQ\ W\S áDFXFKRZ\, z angielska string. Zmienna typu áDFXFKRZHJRPR*HSU]HFKRZ\ZDüFLJRGáXJRFLGR]QDNyZLGHNODURZDQDMHVW np. tak: tytul : string;
Aby nieQDUXV]DüFLJáRFLWHJRUR]G]LDáXGRNáDGQLHMV]\RSLVZáDFLZRFLLPR*OLZRFL W\SX áDFXFKRZHJR SU]HQLHVLHP\ QLHFR GDOHM ]REDF] UR]G]LDá àDFXFK\ na stronie QDUD]LH]DZUyFLP\GRELEOLRWHNL6NRURPDP\MX*GRG\VSR]\FMLZáDFLZHW\S\ PR*HP\]DGHNODURZDüZSURJUDPLH]PLHQQHRSLVXMFHNVL*N var tytul, autor, wypozyczajacy : string; l_wypozyczen : integer;
1LHVWHW\ELEOLRWHND]DZLHUD]QDF]QLHZL FHMQL*MHGQNVL*N 5]HF]MDVQDGHNODURwaQLHGODND*GHMSR]\FMLRGG]LHOQ\FK]PLHQQ\FKW\SX Tytul1, Tytul2MHVWFDáNRZLFLH EH] VHQVX Z\PDJDáRE\ ERZLHP XWZRU]HQLD RJURPQHM OLF]E\ ]PLHQQ\FK SRPLMDMF IDNW*HQLH]DZV]HZLDGRPR]LORPDRELHNWDPLE G]LHP\PLHOLGRF]\QLHQLD 3UREOHP WHQ ]RVWDá MHGQDN MX* GDZQR UR]ZL]DQ\ DE\ PyF REVáX*\ü Z SURJUDPLH GX* OLF]E MHGQDNRZ\FKSRGZ]JO GHPVWUXNWXU\ RELHNWyZPXVLV]Z\NRU]\VWDütablice. 7DNRWRSU]HFKRG]LP\GREDUG]RZD*QHJR]DJDGQLHQLDMDNLPVW\S\VWUXNWXUDOQH
7\S\VWUXNWXUDOQHF]\OLMDNSU]HFKRZDüZL FHMGDQ\FK
77
Typy strukturalne, F]\OLMDNSU]HFKRZDü ZL FHMGDQ\FK =SXQNWXZLG]HQLDX*\WNRZQLNDWDEOLFDMHVWSRSURVWXFLJLHPMHGQROLW\FKÄV]XIODGHN´ SU]HFKRZXMF\FKWRZD*QH GDQHWHJRVDPHJRW\SX.D*GDV]XIODGNDNWyUZQDV]\P SU]\SDGNX PR*QD ] JUXEV]D XWR*VDPLDü ] NDUW NDWDORJRZ MHVW LGHQW\ILNRZDQD numerem — tzw. indeksem — NWyU\ PXVL E\ü W\SX SRU]GNRZHJR WUXGQR ERZLHP Z\REUD]LüVRELHHOHPHQWWDEOLF\RQXPHU]HSyáWRUD 7DEOLFHGHNODURZDQHV]DSRPRF VáRZDNOXF]RZHJRarrayWDEOLFD ]DVNáDGQLDGHNODUDFMLMHVWQDVW SXMFD nazwa_tablicy : array[indeks_dolny..indeks_górny] of typ;
: QDZLDVDFK NZDGUDWRZ\FK F]\ QLH NRMDU] &L VL ] WDEOLF" PXVLV] XPLHFLü GZLH VWDáH RNUHODMFH QDMPQLHMV]\ L QDMZL NV]\ GRSXV]F]DOQ\ LQGHNV WDEOLF\ 3DPL WDM *H ZDUWRFL X*\WH Z GHNODUDFML PXV] E\ü ]QDQH Z PRPHQFLH NRPSLODFML SURJUDPX QDMF] FLHM SRGDZDQH V MDZQLH HZHQWXDOQLH Z SRVWDFL SURVW\FK Z\UD*H GRSXV]F]DOQ\FK Z GHILQLFMDFK VWDá\FK 3DVFDO Z\PDJD RNUHOHQLD UR]PLDUX WDEOLF\ Z FKZLOL NRPSLODFML L QLH GRSXV]F]D X*\FLD W]Z WDEOLF G\QDPLF]Q\FK R UR]PLDU]H RNUHODQ\P podczas wykonania) znan\FK]%DVLFD2EDLQGHNV\PRJPLHüGRZROQHZDUWRFLDOH PXV]E\üWHJRVDPHJRW\SXSRU]GNRZHJRDJyUQ\LQGHNVQLHPR*HE\üPQLHMV]\RG GROQHJR=Z\NOHWDEOLFHLQGHNVXMHVL RGMDNQSWDEOLF DXWRUyZNVL*HN var Autorzy : array[1..1000] of string[30];
DOHFDáNRZLFLHOHJDOQHVUyZQLH*GHNODUDFMH var Sinusy : array[0..359] of real; Odchylka : array[–10..10] of real;
78
Turbo Pascal — programowanie 1LH GRü WHJR WDEOLFH ZFDOH QLH PXV] E\ü LQGHNVRZDQH OLF]EDPL -HOL QS FKFHV] ]OLF]\ü F] VWRü Z\VW SRZDQLD Z WHNFLH SRV]F]HJyOQ\FK ]QDNyZ DOIDEHWX PR*HV] X*\üHIHNWRZQHMNRQVWUXNFML var Liczniki : array['a'..'z'] of word;
.D*G\]HOHPHQWyZWDNLHMWDEOLF\MHVWOLF]QLNLHPRSRMHPQRFLRNRáRW\VL F\ÄLPSXOVyZ´DGUHVRZDQ\P]DSRPRFRGSRZLHGQLHJR]QDNXDOIDEHWX $E\RGZRáDüVL GRHOHPHQWXWDEOLF\RGDQ\PQXPHU]HPXVLV]X*\üVNáDGQL nazwa_tablicy[indeks]
gdzie indeksMHVWQXPHUHP*GDQHJRHOHPHQWXVWDáOXE]PLHQQW\SXSRU]GNRZHJR R ZDUWRFL ]DZDUWHM SRPL G]\ GROQ\P D JyUQ\P ]DGHNODURZDQ\P LQGHNVHP $E\ ]DWHPZ\ZLHWOLüWU]HFL]NROHLSR]\FM WDEOLF\DXWRUyZZ\VWDUF]\X*\üLQVWUXNFML writeln(Autorzy[3]);
]DLQVWUXNFMD Autorzy[5] := 'Ernest Hemingway';
XVWDOLQD]ZLVNRDXWRUDSLWHMNVL*NLZNDWDORJX:SU]\SDGNXQDV]HMWDEOLF\OLF]QLNyZ ]QDNyZRGZRáDQLDE GZ\JOGDá\QDVW SXMFR ,QF/LF]QLNL>]QDN@ ^]ZL NV]\OLF]QLNGOD]QDNXR` ZULWHOQ/LF]QLNL> D @^Z\ZLHWOLZDUWRü` { licznika znaków 'a' }
3UyED X*\FLD LQGHNVX OH*FHJR SR]D ]DGHNODURZDQ\P ]DNUHVHP NRF]\ VL QD RJyá Eá GHPZ\NRQania, o ile opcja kontroli zakresów (Options-Compiler-Range checking) QLH ]RVWDáD Z\áF]RQD uwaga GRP\OQLH RSFMD WD MHVW Z\áF]RQD : W\P RVWDWQLP SU]\SDGNX RGF]\W ] WDEOLF\ ]ZUyFL EH]VHQVRZQ ZDUWRü ]D ]DSLV PR*H PLHü VNXWNL RSáDNDQH ] ]DZLHV]HQLHP NRPSXWHUD ZáF]QLH JG\* ZDUWRü ]RVWDQLH ZVWDZLRQD w PLHMVFHSU]H]QDF]RQHQDFR]XSHáQLHLQQHJR 'ZD JáyZQH REV]DU\ ]DVWRVRZDQLD WDEOLF WR ED]\ GDQ\FK F]\OL SURJUDP\ VáX*FH GR SU]HFKRZ\ZDQLD L ]DU]G]DQLD LQIRUPDFM RSLVXMF U]HF]\ZLVWH RELHNW\ QS NVL*NL w ELEOLRWHFH WRZDU\ Z KXUWRZQL LWS RUD] RSURJUDPRZDQLH LQ*\QLHUVNLH L QDXNRZH Z\NRU]\VWXMFH W]Z ZHNWRU\ L PDFLHU]H F]\OL OLQLRZH L SURVWRNWQH WDEOLFH OLF]E -DN ]DSLVDüZHNWRUF]\OLOLQLRZOXEMHGQRZ\PLDURZWDEOLF OLF]E MX*ZLHV]3U]\NáDGRZHPXZHNWRURZL]áR*RQHPX]G]LHVL FLXOLF]EU]HF]\ZLVW\FK
[ x1
x2
... x10 ]
E G]LHRGSRZLDGDáDWDEOLFD Wektor : array[1..10] of real
]DGODSURVWRNWQHMWDEOLF\PDFLHU]\ RZ\PLDUDFKm na n:
7\S\VWUXNWXUDOQHF]\OLMDNSU]HFKRZDüZL FHMGDQ\FK x11 x 21 x 31 ... x m1
x12 x 22 x 32 x m2
x13 x 23 x 33 ... x m3
79
... x1n ... x 2 n ... x 3n ... ... x mn
X*\MHP\GHNODUDFML Macierz : array[1..M, 1..N] of real
-DN ZLGDü WZRU]HQLH WDEOLF RGSRZLDGDMF\FK GZX- L ZL FHMZ\PLDURZ\P VWUXNWXURP GDQ\FK QLH VWDQRZL Z 3DVFDOX WUXGQHJR ]DGDQLD 2JyOQD VNáDGQLD GHNODUDFML WDEOLF\ ZLHORZ\PLDURZHMZ\JOGDWDN nazwa_tablicy : array[zakres_1, zakres_2, ... zakres_n] of typ
gdzie zakres_k opisuje zakres indeksów dla k-WHJR Z\PLDUX L PD IRUP SRF]tek..koniec. Dla tablic dwuwymiarowych pierwszy indeks oznacza numer wiersza, ]DGUXJL—QXPHUNROXPQ\ZSDPL FLNRPSXWHUDGDQHSU]HFKRZ\ZDQHVZLHUVzami XáR*RQ\PLMHGHQ]DGUXJLP &KRFLD*3DVFDOQLHQDU]XFDRJUDQLF]HQLDQDOLF]E Z\PLDUyZWDEOLF\MHG\Q\PLRJUDQLF]HQLDPLVáF]Q\UR]PLDUHOHPHQWyZQLHPRJF\SU]HNUDF]Dü EDMWyZ RUD] ]DNUHV LQGHNVyZ QLH PRJF\ Z\NUDF]Dü SR]D ]DNUHV OLF]E FDáNRZLW\FK WDEOLF ZL FHM QL* GZXZ\PLDURZ\FK X*\ZD VL EDUG]R U]DGNR 7DEOLFH GZXZ\PLDURZH VWRVRZDQH V SU]HGH ZV]\VWNLP Z SURJUDPDFK REOLF]HQLRZ\FK UHDOL]XMF\FK REOLF]HQLD W]Z UDFKXQNX PDFLHU]RZHJR L QLH E G]LHP\ VL WX QLPL V]F]HJyáRZR]DMPRZDü$E\MHGQDNQLHSRSU]HVWDZDüQDVDP\PRSLVLH]DGHPRQVWUXMP\NUyWNLSU]\NáDGRWRSURJUDPSR]ZDODMF\QDZSURZDG]HQLH]NODZLDWXU\ZDUWRFL HOHPHQWyZ PDFLHU]\ R Z\PLDUDFK QD L Z\ZLHWODMF\ QDMZL NV]\ ZSURZDG]RQ\ HOHPHQWRUD]VXP ZV]\VWNLFKHOHPHQWyZOH*F\FKQDSU]HNWQHMLSRZ\*HMQLHM program Macierz3x3; { program demonstruje elementarne obliczenia macierzowe } var t : array[1..3, 1..3] of real; { macierz 3x3 } max, sum : real; { tymczasowe maksimum i suma elementów } i, j : integer; { liczniki wierszy i kolumn } begin ^ZF]\WDQLH]DZDUWRFLPDFLHU]\` for i := 1 to 3 do for j := 1 to 3 do begin write('Podaj element macierzy x[',i,',',j,']: '); readln(t[i,j]); end; { wyszukanie maksymalnego elementu } max := -H^SDPL WDMRLQLFMDOL]DFMLPDNVLPXP` for i := 1 to 3 do for j := 1 to 3 do if t[i,j] > max then max := t[i,j]; ^REOLF]HQLHVXP\HOHPHQWyZQDLQDGSU]HNWQ` VXP ^SDPL WDMRZ\]HURZDQLXVXP\SU]HGREOLF]DQLHP` for i := 1 to 3 do
80
Turbo Pascal — programowanie for j := i to 3 do sum := sum+t[i,j]; writeln('Najwiekszy element: ', max:8:3); writeln('Suma elementow na i nad przekatna: ', sum:8:3); readln; end.
-DN QLHWUXGQR VL GRP\OLü REVáXJD WDEOLF QLH W\ONR GZXZ\PLDURZ\FK Z\PDJD LQWHQV\ZQHJRX*\FLDS WOLforQDRJyáÄSU]HFKRG]LP\´NROHMQRSRHOHPHQWDFKZLHUV]D OXE NROXPQ\ ]QDMF QXPHU SLHUZV]HJR L RVWDWQLHJR HOHPHQWX 3RZ\*V]\ SURJUDP demonstruje dwie typowe operacje na tablicach: • wyszukanie maksymalnego (minimalnego) elementu SROHJDMFH QD VSUDZG]DQLX F]\ NROHMQ\ HOHPHQW QLH MHVW ZL NV]\ PQLHMV]\ RG DNWXDOQHM ZDUWRFL PDNVLPXP PLQLPXP D MHOL WDN — SU]\M FLH MHJR ZDUWRFL MDNR nowego maksimum (minimum); • REOLF]HQLH ZDUWRFL VXP\ HOHPHQWyZ QD L SRQDG SU]HNWQ Z ]EOL*RQ\ VSRVyE REOLF]DVL VXP HOHPHQWyZSRGSU]HNWQVXP ZV]\VWNLFKHOHPHQWyZGRGDWnich itp.). =DXZD**HZWUDNFLHREOLF]HQDOH*\SU]HV]XNLZDü]DUyZQRZLHUV]HMDNLNROXPQ\FR UHDOL]RZDQH MHVW ]D SRPRF GZyFK ]DJQLH*G*RQ\FK XPLHV]F]RQ\FK MHGQD Z GUXJiej) S WOL for =DJQLH*G*DMF S WOH PXVLV] SDPL WDü E\ X*\ZDá\ RQH Uy*Q\FK OLF]QLNyZ, w SU]HFLZQ\P SU]\SDGNX ERZLHP ZHZQ WU]QD S WOD E G]LH Z QLH]DPLHU]RQ\ VSRVyE PRG\ILNRZDáDOLF]QLNS WOL]HZQ WU]QHMEáGWHQMHVWW\OH*SRVSROLW\FRQLHSU]\MHPQ\ =DXZD*SRQDGWR*HZHZQ WU]QDS WODUR]SRF]\QDVL QLHRGMHG\QNLOHF]RGELH*FHJR LQGHNVX S WOL ]HZQ WU]QHM G]L NL F]HPX RG UD]X RPLMDP\ HOHPHQW\ OH*FH SRG SU]HNWQPDMFHQXPHUZLHUV]DZL NV]\RGQXPHUXNROXPQ\ 0DMF GR G\VSR]\FML WDEOLFH PR*HP\ MX* ]DSURMHNWRZDü VWUXNWXU\ GDQ\FK RSLVXMFH ]DZDUWRü NDWDORJX ELEOLRWHF]QHJR 'OD XSURV]F]HQLD ]Dáy*P\ *H ZV]\VWNLH GDQH E G]LHP\SU]HFKRZ\ZDOLZSDPL FLNRPSXWHUD3RQLHZD*PDRQDRJUDQLF]RQSRMHPQRüZDUWRRGUD]XSU]\MüSHZQH]DáR*HQLDFRGRPDNV\PDOQHMSRMHPQRFLNDWDORJX i SRV]F]HJyOQ\FKIUDJPHQWyZRSLVXNVL*NL'RüRF]\ZLVW\PSRGHMFLHPE G]LHRJraQLF]HQLH GáXJRFL SyO SU]H]QDF]RQ\FK QD W\WXá L QD]ZLVNR DXWRUD RUD] RVRE\ Z\SR*\F]DMFHM1LHFKRSLVSRMHG\QF]HMNVL*NLZ\JOGDWDN • W\WXástring[30]; • nazwisko autora: string[25]; • QD]ZLVNRZ\SR*\F]DMFHJRstring[25]; • OLF]QLNZ\SR*\F]Hword. :V]\VWNLHSRODáF]QLH]DMPXMEDMWyZWDNZL F]DNáDGDMF*HPDP\GRG\VSR]\FML N%FRWU]HEDMHV]F]H]RVWDZLüQDSRPRFQLF]H]PLHQQH MHVWHP\ZVWDQLHRSLVDü RNRáR SR]\FML 6NG MHGQDN Z]L á\ VL WH NLOREDMW\ SU]HFLH* Z NRPSXWHU]H SDPL FL MHVW ]QDF]QLH ZL FHM — PyJáE\ ]DS\WDü 7R SUDZGD MHGQDN DE\ VL GR QLHM
7\S\VWUXNWXUDOQHF]\OLMDNSU]HFKRZDüZL FHMGDQ\FK
81
GRVWDü SRWU]HEQH V QLHFR EDUG]LHM Z\P\OQH UR]ZL]DQLD NWyUH ]RVWDQ RPyZLRQH w rozdziale pt. :L FHMSDPL FL (strona 114). :\JOGDáRE\QDWR*HPR*QD]DNDVDüU NDZ\LZ]LüVL GRURERW\F]\OL]DGHNODURZDü QDVW SXMFHWDEOLFH var Tytul : array[1..750] of string[30]; Autor : array[1..750] of string[25]; Wypozyczajacy : array[1..750] of string[25]; Licznik : array[1..750] of word;
=DXZD* MHGQDN *H RSLV SRMHG\QF]HM NVL*NL UR]SURV]RQ\ MHVW Z F]WHUHFK Uy*Q\FK WDEOLFDFK&RSUDZGDSRV]F]HJyOQHHOHPHQW\RSLVXVÄ]MHGQRF]RQH´ZVSyOQ\PQXPHUHP (indeksem), jednak z punktu wiG]HQLD ORJLNL UR]ZL]DQLH WDNLH MHVW QLHVSyMQH L PDáR HOHJDQFNLHFKRFLD*GDVL Z\NRU]\VWDü 5R]SURV]HQLHGDQ\FKRSLVXMF\FKSRMHG\QF]\ RELHNW Z IL]\F]QLH RGU EQ\FK VWUXNWXUDFK GDQ\FK PD WH* W ZDG *H áDWZLHM MHVW SU]HRF]\ü MDNL IUDJPHQW LQIRUPDFML OXE SRP\OLü QXPHUDFM -DN WHPX ]DUDG]Lü" 3U]\MU]\MP\VL QDV]HMNDUFLHNDWDORJRZHM 7\WXá Autor :\SR*\F]DMF\ Licznik
Emigranci 0UR*HN6áDZRPLU Nowak Krzysztof 78
:V]\VWNLH GDQH RSLVXMFH IL]\F]Q\ RELHNW V WX SRáF]RQH Z MHGQ ORJLF]QLH VSyMQ FDáRü VWDQRZLF ]QDF]QLH EDUG]LHM SU]HNRQXMF\ L VHQVRZQ\ RSLV DQL*HOL SRSU]HGQLR Z\REUD( VRELH MDN XFLHV]\áE\ VL ELEOLRWHNDU] JG\E\ ND]DQR PX SRVáXJLZDü VL RGU EQ\PL NDWDORJDPL ]DZLHUDMF\PL W\WXá\ QD]ZLVND LWG 3DVFDORZ\P odpowiednikiem takiego opisu jest rekord. 2LOHWDEOLFHSR]ZDODá\QDSRPLHV]F]HQLHZMHGQHMVWUXNWXU]HZLHOXGDQ\FKWHJRVDPHJR W\SXUHNRUG\XPR*OLZLDM]DPNQL FLHZFDáRüGDQ\FKUy*Q\FKW\SyZQLHSR]ZDODMF ]NROHLQDLQGHNVRZDQ\GRQLFKGRVW S6NáDGQLDGHNODUDFML]PLHQQHMW\SXrekordowego MHVWQDVW SXMFD nazwa : record pole-1 : typ-1; pole-2 : typ-2; ... pole-n : typ-n; end;
gdzie polaVSRSURVWXQD]ZDPLHOHPHQWyZSyO UHNRUGX]DZLHUDMF\FKSRV]F]HJyOQH GDQH ]D typy RNUHODM LFK W\S 3U]\NáDGRZ\ UHNRUG RGSRZLDGDMF\ QDV]HM NDUFLH NDWDORJRZHMQDOH*DáRE\]DGHNODURZDüWDN var Ksiazka : record
82
Turbo Pascal — programowanie Tytul : string[30]; Autor : string[25]; Wypozyczajacy : string[25]; Licznik : word end;
5]HF]MDVQDSRZ\*V]DGHNODUDFMDQLHUR]ZL]XMHQDV]HJRSUREOHPu, pozwala bowiem QD RSLVDQLH W\ONR MHGQHM NVL*NL 'ODF]HJR MHGQDN QLH ]RUJDQL]RZDü UHNRUGyZ Z WDEOLFH"2WRSU]\NáDG var Katalog : array[1..750] of record Tytul : string[30]; Autor : string[25]; Wypozyczajacy : string[25]; Licznik : word end;
3U]HGVWDZLRQDSRZ\*HMVWUXNWXUDGDQ\FKMHVWWDEOLFUHNRUGyZLVWDQRZLQLHXZ]JO GQLDMF NLONX GUREQ\FK SRSUDZHN RVWDWHF]Q IRUP MDN E G]LHP\ VL SRVáXJLZDü w naszym programie. Podobnie, jak szuflada katalogu zawiera wiele jednakowych kart oSLVXMF\FK SRMHG\QF]H NVL*NL WDN L QDV]D WDEOLFD ]DZLHUD ZLHOH MHGQDNRZ\FK UHNRUGyZVWDQRZLF\FKHOHNWURQLF]QIRUP WDNLHJRRSLVX7DEOLFHUHNRUGyZVWDQRZLMHGQ ] F] FLHM Z\NRU]\VW\ZDQ\FK VWUXNWXU GDQ\FK XPR*OLZLDMF\FK HIHNW\ZQH WZRU]HQLH baz danyFKLSU]HFKRZ\ZDQLHLQIRUPDFMLRSLVXMFHMZLHOHMHGQDNRZ\FKRELHNWyZ -DN]DSDPL W\ZDüLRGF]\W\ZDüLQIRUPDFM ]UHNRUGX"=DXZD**HND*G\HOHPHQWRSLVX LGHQW\ILNRZDQ\ MHVW GZLHPD QD]ZDPL QD]Z VDPHJR UHNRUGX Katalog[..]) oraz odpowiedniego pola (np. Tytul $E\ RGZRáDü VL GR NRQNUHWQHJR SROD UHNRUGX PXVLV]SRGDüRE\GZLHQD]Z\UR]G]LHODMFMHNURSN nazwa-rekordu.nazwa-pola
&KFF ZL F ZVWDZLü GR UHNRUGX QXPHU QD]ZLVNR DXWRUD NVL*NL Z\NRU]\VWDP\ LQVWUXNFM
Katalog[45].Autor := 'Mrozek Slawomir';
zaLQVWUXNFMD writeln(Katalog[29].Wypozyczajacy);
SRLQIRUPXMH QDV Z F]\LP SRVLDGDQLX ]QDMGXMH VL REHFQLH NVL*ND RSLVDQD UHNRUGHP numer 29.
Typy strukturalne, czyli jak przechowac wiecej danych
83
:SU]\SDGNXZ\NRQ\ZDQLDNLONXRSHUDFMLQDSRODFKWHJRVDPHJRUHNRUGXX*\ZDQLH]D ND*G\PUD]HPQRWDFMLÄ]NURSN´MHVWQLHFRXFL*OLZH3DVFDOXPR*OLZLDXSURV]F]HQLH RGZRáDGRSyOUHNRUGXSU]H]Z\NRU]\VWDQLHW]ZLQVWUXNFMLZL*FHM with: with Katalog[120] do begin Tytul := 'Paragraf 22'; Autor := 'Heller Joseph'; Wypozyczajacy := 'Yossarian John'; Licznik := 1254; end;
,QVWUXNFMDZL*FDZ\GDWQLHXSUDV]F]D]DGDQLDSRGREQHGRSRND]DQHJRZ\*HMPXVLV] MHGQDN SDPL WDü R XM FLX ZV]\VWNLFK LQVWUXNFML RSHUXMF\FK QD SRODFK UHNRUGX Z LQVWUXNFM ]áR*RQ begin end Z SU]HFLZQ\P SU]\SDGNX RSHUDFMD E G]LH GRW\F]\áD W\ONRSLHUZV]HJRSRODDSUyEDVNRPSLORZDQLDNROHMQ\FKLQVWUXNFMLQDMSHZQLHMVNRF]\ VL Eá GHP : ]DPLDQ ]D WR PR*HV] Z\NRU]\VWDü LQVWUXNFM with do operowania na NLONXUHNRUGDFKQDUD]-HOLQS]DGHNODURZDáHQDVW SXMFHVWUXNWXU\ DaneKlienta : array[1..1000] of record nazwisko : string[30]; { nazwisko klienta } SumaZakupow : real; { suma zakupów w danym roku } 6DOGRUHDO^ELH*FHVDOGRNOLHQWD` end; Zakup : array[1..1000] of record IdKlienta : integer; { identyfikator klienta } IdTowaru : integer; { identyfikator towaru } 1DOH]QRVFUHDO^QDOH*QRü]DWRZDU` end;
to operacja for i := 1 to LiczbaZakupow do with DaneKlienta[50], Zakup[i] do if IdKlienta = 50 then begin SumaZakupow := SumaZakupow + Naleznosc; Saldo := Saldo – Naleznosc; end;
VSRZRGXMHSU]HV]XNDQLHWDEOLF\]DNXSyZLXVWDOHQLHVXP\MDNNOLHQWQXPHU]DSáDFLá]DZV]\VWNLHVZRMH]DNXS\RUD]SRPQLHMV]HQLHMHJRVDOGDRW VXP =DXZD**HRSLV klienta nie zawiera pola identyfikatora, któU\ ]DVWSLRQ\ ]RVWDá LQGHNVHP Z WDEOLF\ rekordów. $E\ VNRSLRZDü ZV]\VWNLH SROD UHNRUGX GR LQQHJR UHNRUGX WHJR VDPHJR W\SX QLH PXVLV]ZRJyOHX*\ZDüRGZRáD]NURSNDQLLQVWUXNFMLwith7XUER3DVFDOXPR*OLZLD FDáRciowe kopiowanie rekordów, np. DaneKlienta[132] := DaneKlienta[1];
84
Turbo Pascal — programowanie 1LHVWHW\RSHUDFMLWHJRW\SXQLHGDVL X*\üGRZSURZDG]HQLD]DZDUWRFLUHNRUGX]NODZLDWXU\DQLZ\SURZDG]HQLDMHMQDHNUDQ2SHUDFMHWHQDOH*\Z\NRQ\ZDüÄSROHSRSROX´ X*\WHF]QDMHVWWXLQVWUXNFMDwith MDNZSRQL*V]\PSU]\NáDG]LH writeln('Pozycja w katalogu: ', i); with Katalog[i] do begin ZULWHOQ 7\WXO 7\WXO ^Z\SLV]]DZDUWRü` { odpowiednich pól } writeln('Autor: ', Autor); writeln('Wypozyczajacy: ', Wypozyczajacy); end;
:DQDORJLF]Q\VSRVyEPR*QDZSURZDG]DüGDQHGRUHNRUGX :WHQVSRVyESU]HGVWDZLOLP\GZDQDMSRSXODUQLHMV]HW\S\VWUXNWXUDOQHGRVW SQHZ3DVFDOXL]DSURMHNWRZDOLP\SRGVWDZRZVWUXNWXU VáX*FGRSU]HFKRZ\ZDQLDLQIRUPDFML w naszym programie. W kolejnych rozG]LDáDFK]DMPLHP\VL PHWRGDPLSU]HWZDU]DQLD LQIRUPDFMLF]\OLDOJRU\WPDPLLLFKUHDOL]DFMZSRVWDFLSURFHGXULIXQNFML RUD]Z\QLNDMF\PL]W\FK]DJDGQLHSUREOHPDPL
=DSDPL WDM • 'RSU]HFKRZ\ZDQLDZL NV]\FKLORFLGDQ\FKVáX*W\S\VWUXNWXUDOQH • 'ZDQDMZD*QLHMV]HW\S\VWUXNWXUDOQHZ3DVFDOXWRWDEOLFHLUHNRUG\ • 7DEOLFHSR]ZDODMQDJUXSRZDQLHGDQ\FKWHJRVDPHJRW\SX=DZDUWHZWDEOLF\ GDQHVGRVW SQHSRSU]H]LQGHNV\ • 7DEOLFH PRJ E\ü MHGQR- lub wielowymiarowe. Zakres indeksów tablicy jest dowolny, ale nLHPR*HSU]HNUDF]Dü]DNUHVXGR]ZRORQHJRGODOLF]EFDáNRZLW\FK • 'RREVáXJLWDEOLFZ\NRU]\VWXMHVL F] VWRS WOHfor. • 5HNRUG\ JUXSXM GDQH Uy*Q\FK W\SyZ =DZDUWH Z UHNRUG]LH GDQH V GRVW SQH poprzez nazwy pól.
Struktura programu
85
Struktura programu :LHP\ MX* Z MDNLHM IRUPLH E G]LHP\ SU]HFKRZ\ZDü LQIRUPDFM NROHMQ\P NURNLHP MHVW XVWDOHQLH VSRVREX MHM SU]HWZDU]DQLD RGSRZLHGQLHJR GR X*\ZDQ\FK Z SURJUDPLH VWUXNWXU GDQ\FK 3U]HGH ZV]\VWNLP PXVLP\ ]DWHP XVWDOLü MDNLH RSHUDFMH QD GDQ\FK SURJUDPSRZLQLHQZ\NRQ\ZDüDQDVW SQLH]DSURMHNWRZDüRGSRZLDGDMFHLPSURFHGXU\ OXE IXQNFMH MDNR *H SURJUDPXMHP\ SRU]GQLH F]\OL VWUXNWXUDOQLH — Z\NRU]\VWXMF SURFHGXU\ L IXQNFMH 3R VNRQVXOWRZDQLX VL ] OLVW *\F]H ]REDF] VWURQD VWZLHUG]DP\*HQDV]SURJUDPSRZLQLHQXPR*OLZLDü • ZSURZDG]HQLH]DZDUWRFLZ\EUDQHJRUHNRUGX]NODZLDWXU\ • Z\SURZDG]HQLH]DZDUWRFLZ\EUDQHJRUHNRUGXQDHNUDQ • ]EDGDQLHL]PLDQ ]DZDUWRFLSRODWypozyczajacy wybranego rekordu; • Z\V]XNDQLHUHNRUGX]DZLHUDMFHJR]DGDQ\FLJ]QDNyZZSROXTytul; • posortowanie tablicy rekoUGyZZHGáXJ]DGDQHJRNU\WHULXPW\WXáOXEQD]ZLVNR autora); • Z\V]XNDQLHUHNRUGXRQDMPQLHMV]HMLQDMZL NV]HM]DZDUWRFLSRODLicznik. 3RZ\*V]D OLVWD PR*H ]RVWDü EH]SRUHGQLR SU]HWáXPDF]RQD QD ]HVWDZ SRGVWDZRZ\FK SURFHGXUWZRU]F\FKSURJUDPU]HF]MDVQDWU]HEDE G]LHMHV]F]HGRU]XFLüNLONDSURFHGXU SRPRFQLF]\FK QR L RF]\ZLFLH F] ü RSHUDF\MQ =IRUPDOQHJRSXQNWXZLG]HQLD Z\PDJDQ\MHVWMHV]F]HVFKHPDWEORNRZ\OXESU]\QDMPQLHMVáRZQ\]DSLVDOJRU\WPXDE\ MHGQDN XQLNQü SU]HURVWX IRUP\ QDG WUHFL RJUDQLF]\P\ VL GR RJyOQHJR VFKHPDWX G]LDáDQLDSURJUDPX Z\ZLHWOPHQXGRVW SQ\FKRSHUDFML Z]DOH*QRFLRGZ\EUDQHMRSFML ZSURZDG(QRZ\UHNRUGGRGDQLHNVL*NLGRNDWDORJX OXE ]PLH]DZDUWRüSRODWypozyczajacyZ\SR*\F]HQLHNVL*NL OXE Z\V]XNDMUHNRUG]DZLHUDMF\GDQ\W\WXáZ\V]XNLZDQLHNVL*NL OXE
86
Turbo Pascal — programowanie Z\ZLHWOZV]\VWNLHUHNRUG\XSRU]GNRZDQHZHGáXJW\WXáyZOXEQD]ZLVNDXWRUyZ lub ]DNRF]SUDF SURJUDPX ZUyüGRSXQNWX -DNZLGDüF] üRSHUDF\MQDVSURZDG]DVL Z]DVDG]LHGRZ\ZRá\ZDQLDRGSRZiednich SURFHGXU VWRVRZQLH GR Z\EUDQHM SU]H] X*\WNRZQLND IXQNFML GRVNRQDáH PLHMVFH GOD instrukcji case 3RQLHZD*SU]HGVWDZLDQLHVFKHPDWyZSRV]F]HJyOQ\FKSURFHGXU]DM áRE\]E\WGX*RPLHMVFDSRSU]HVWDQLHP\QD]DSUH]HQWRZDQLXLFK]DSLVXZ3DVFDOX0HWRGD NWyU Z\NRU]\VWDP\ GR WZRU]HQLD QDV]HJR SURJUDPX MHVW W\SRZ\P SU]\NáDGHP SURMHNWRZDQLD ZVW SXMFHJR QDMSLHUZ XWZRU]\P\ ]HVWDZ RGSRZLHGQLFK SURFHGXU UHDOL]XMF\FK SRV]F]HJyOQH ]DGDQLD SRGU] GQH D QDVW SQLH SRZL*HP\ MH Z FDáRü F]\OLG]LDáDMF\SURJram. =DQLP MHGQDN GR WHJR GRMG]LH ]DVWDQyZP\ VL SU]H] FKZLO QDG SU]HND]\ZDQLHP GDQ\FKGRL]RGSRZLHGQLFKSURFHGXULIXQNFML:P\OGREUHMSUDNW\NLQLHE G]LHP\ GR WHJR FHOX Z\NRU]\VW\ZDü HIHNWyZ XERF]Q\FK OHF] VWRVRZQLH ]DSURMHNWRZDQH OLVW\ SDUDPHWUyZ 5R]ZD*P\ MDNR SU]\NáDG SURFHGXU ZSURZDG]DQLD ]DZDUWRFL UHNRUGX z NODZLDWXU\3RZLQQDRQDSU]\MPRZDüMDNRDUJXPHQWÄSXVW\´UHNRUGL]ZUDFDüWHQ*H UHNRUG Z\SHáQLRQ\ ZSLVDQ\PLSU]H]X*\WNRZQLNDGDQ\PL0XVLP\ZL FZ\NRU]\VWDü mechanizm przekazywania paraPHWUX SU]H] QD]Z $OH MDN ]DGHNODURZDü VDP SDUDPHWU"1DJáyZHNZSRVWDFL procedure Wprowadz(var r : record Tytul : string[30]; Autor : string[25]; Wypozyczajacy : string[25]; Licznik : word);
Z\JOGDFRQDMPQLHMSRGHMU]DQLH,VWRWQLHSUyEDVNRPSLORZDQLDSRGREQHMNRQVWUXNFML VNRF]\VL Z\ZLHWOHQLHPNRPXQLNDWX Type identifier expected (spodziewany identyfikator typu). 5R]ZL]DQLHPWHJRSUREOHPX]DMPLHP\VL ZQDVW SQ\PUR]G]LDOH=QDMG]LHVL ZQLP UyZQLH*NLONDVáyZRWDN]ZDQ\FKVWDá\FKV\PEROicznych.
7\S\LVWDáH
87
7\S\LVWDáH =DMPLHP\VL REHFQLHGZRPDVSRNUHZQLRQ\PL]HVRE]DJDGQLHQLDPLGHILQLRZDQLHP ZáDVQ\FKW\SyZRUD]VWDá\PLV\PEROLF]Q\PL*áyZQ\REV]DU]DVWRVRZDVWDá\FKLW\SyZ ]ZL]DQ\ MHVW ] Z\NRU]\VWDQLHP W\SyZ VWUXNWXUDOQ\FK GODWHJR PyZLP\ R QLFK ZáDQLH WHUD] Z\NRU]\VWDQLH GHILQLFML W\SyZ SR]ZDOD QD RPLQL FLH SHZQ\FK RJUDQLF]H Z SU]HND]\ZDQLX SDUDPHWUyZ ]REDF] NRQLHF SRSU]HGQLHJR UR]G]LDáX 3R]D W\P X*\ZDQLH ZáDFLZLH GREUDQ\FK GHILQLFML W\SyZ L VWDá\FK SROHSV]D F]\WHOQRü L HVWHW\N SURJUDPXRUD]]PQLHMV]DU\]\NREá GyZ 3RND]DQ\ QD NRFX SRSU]HGQLHJR UR]G]LDáX SU]\NáDG LOXVWUXMH QLH]U F]Q SUyE przekazania do procedury parametru typu strukturalnego. Niestety, nasz zapis stanowi SUyE SU]HP\FHQLD RSLVX GHILQLFML W\SX Z PLHMVFX GR WHJR QLH SU]H]QDF]RQ\P QD OLFLH SDUDPHWUyZ IRUPDOQ\FK SURFHGXU\ OXE IXQNFML PRJ ]QDMGRZDü VL Z\áF]QLH LGHQW\ILNDWRU\ SDUDPHWUyZ L RGSRZLDGDMFH LP identyfikatory (nie definicje!) typów. 'RSyNL SRVáXJLZDOLP\ VL SDUDPHWUDPL W\SX SURVWHJR SUREOHP QLH LVWQLDá JG\* QD OLFLH SDUDPHWUyZ XPLHV]F]DáH SR SURVWX QD]Z RGSRZLHGQLHJR W\SX : SU]\SDGNX W\SyZ VWUXNWXUDOQ\FK VSUDZD VL NRPSOLNXMH 1LH GRü *H QD OLFLH SDUDPHWUyZ QLH ZROQRXPLHFLüGHILQLFMLW\SXMDNZL F]GHILQLRZDüSDUDPHWUVWUXNWXUDOQ\" WRMHV]F]H LGHQW\F]QLHZ\JOGDMFHGHNODUDFMHWDEOLF var t1 : array[1..100] of real; t2 : array[1..100] of real;
ZFDOHQLHWZRU]RELHNWyZLGHQW\F]QHJRW\SX—ND*GD]QLFKLQWHUSUHWRZDQDMHVWMDNR definicja nowego typu, co utrudnia niektóre operacje (nie PR*QD QS GRNRQDü SU]\SLVDQLD FDáHM WDEOLF\ t2 do t1 1D GRELWN RND]XMH VL *H ]JRGQRü W\SyZ Z\PDJDQD MHVWUyZQLH*ZSU]\SDGNXSU]HND]\ZDQLDSDUDPHWUyZFRE\áR]UHV]WáDWZHGRSU]HZLdzenia). :\MFLHP ] WHJR LPSDVX MHVW ]GHILQLRZDQLH identyfikatora typu F]\OL QD]Z\ E GFHM V\QRQLPHPGDQHJRW\SXVWUXNWXUDOQHJR,GHQW\ILNDWRUWDNLZ\NRU]\VWDP\QDVW SQLHGR GHNODURZDQLD]PLHQQ\FKLSDUDPHWUyZGRNáDGQLHWDNVDPRMDNF]\QLOLE\P\WR]LGHQW\ILNDWRUHP W\SX SURVWHJR $E\ ]GHILQLRZDü LGHQW\ILNDWRU W\SX PXVLV] X*\ü VáRZD kluczowego typeW\S ZQDVW SXMFHMNRQVWUXNFML type nazwa-typu = opis-typu
88
Turbo Pascal — programowanie ]ZUyüXZDJ *HZGHILQLFMLW\SXZ\NRU]\VWXMHVL ]QDNUyZQRFLDQLHGZXNURSHN Nazwa-typu RNUHOD GHILQLRZDQ\ LGHQW\ILNDWRU L SRGOHJD ZV]\VWNLP UHJXáRP GRW\F]F\P LGHQW\ILNDWRUyZ ]D opis-typu jest takim samym opisem, jaki stosowany MHVWZGHNODUDFMDFK]PLHQQ\FK5y*QLFDSROHJDW\ONRQDW\P*HZSU]\SDGNXGHNODUDFML ]PLHQQHMNRPSLODWRUWZRU]\RGSRZLHGQLVWUXNWXU GDQ\FKLUH]HUZXMHGODQLHMPLHMVFH w SDPL FL QDWRPLDVW ]GHILQLRZDQLH W\SX SRZRGXMH MHG\QLH XWZRU]HQLH V]DEORQX QLH MHVW WZRU]RQ\ *DGHQ IL]\F]Q\ RELHNW NWyU\ E G]LH Z\NRU]\VW\ZDQ\ Z GHNODUDFMDFK GRSLHURZWHG\NRPSLODWRUE G]LHUH]HUZRZDáPLHMVFHQDGDQH 3U]\NáDGRZD GHILQLFMD W\SX UHNRUGRZHJR RSLVXMFHJR NVL*N L GHNODUDFMD RGSRwiedQLHMWDEOLF\UHNRUGyZ E G]LHZL FPLDáDSRVWDü type Ksiazka = record { tak samo, jak w deklaracji zmiennej } Tytul : string[30]; Autor : string[25]; Wypozyczajacy : string[25]; Licznik : word); end; var Katalog : array[1..750] of Ksiazka;
-X*QDSLHUZV]\U]XWRNDZ\JOGDWRáDGQLHMKatalog zawiera KsiazkiDQLHMDNLH UHNRUG\NWyU\FKSU]H]QDF]HQLDQDOH*\VL GRSLHURGRP\ODü QRDSR]DW\PPR*OLZH jest wreszcie zadeklarowanie odpowiednich parametrów: procedure Wprowadz(var r : Ksiazka);
'HILQLRZDQLHQRZ\FKLGHQW\ILNDWRUyZW\SyZPD]DVWRVRZDQLHJáyZQLHZSURJUDPDFK SRVáXJXMF\FK VL VWUXNWXUDOQ\PL UHSUH]HQWDFMDPL GDQ\FK FKRFLD* PR*OLZH MHVW UyZQLH* GHILQLRZDQLH QRZ\FK W\SyZ SURVW\ch (a nawet przedefiniowywanie typów standarGRZ\FK 2WRSU]\NáDG type IORDW H[WHQGHG^UHDOMHOLQLHPDV]NRSURFHVRUD`
3RZ\*V]D GHILQLFMD WZRU]\ QRZ\ W\S ]PLHQQRSU]HFLQNRZ\ float WR*VDP\ ] W\SHP extended GDMF\P QDMZL NV] PR*OLZ SUHF\]M L ]DNUHV ZDUWRFL -HOL SURJUDP SU]H]QDF]RQ\MHVWGODNRPSXWHUDSR]EDZLRQHJRNRSURFHVRUDLQLHPDHPXORZDüWHJR ostatniego), wystarczy w miejsce typu extended ZSLVDü real 'HNODUXMF ZV]\VWNLH liczby rzeczywiste w programie jako float uzyskasz w ten sposób PR*OLZRü áDWZHM DGDSWDFMLSURJUDPXGRZDUXQNyZVSU] WRZ\FK =DXZD**HZGHNODUDFML]PLHQQHMKatalogZ\PLDUWDEOLF\RNUHORQ\MHVWMDZQLHOLF]E Z\QLND RQD ] SRG]LHOHQLD ZLHONRFL GRVW SQHM SDPL FL SU]H] ZLHONRü UHNRUGX -HVW GRü SUDZGRSRGREQH *H GR ZDUWRFL WHM E G]LHV] VL Z SURJUDPLH RGZRá\ZDá MHV]F]H NLONDNURWQLH FKRüE\ SRGF]DV SU]HV]XNLZDQLD NDWDORJX OXE XVXZDQLD MHJR HOHPHQWyZ :\REUD(VRELHWHUD]*HSRVWDQRZLáHGRGDüGRUHNRUGXNUyWNLRSLVNVL*NL Z SRVWDFL áDFXFKD ]QDNyZ :Sá\QLH WR U]HF] MDVQD QD ZLHONRü UHNRUGX D ]DWHP i QD GRSXV]F]DOQ ZLHONRü WDEOLF\ NWyUD ]PDOHMH WHUD] GR RNRáR SR]\FML 3R
Typy i stale
89
GRNRQDQLX ]PLDQ\ E G]LHV] PXVLDá Z\V]XNDü Z SURJUDPLH ZV]\VWNLH PLHMVFD Z NWyU\FK Z\VW SRZDáD OLF]ED L ]DVWSLü M OLF]E — MHOL R NWyU\P ]DSRPQLV] NRQVHNZHQFMH PRJ E\ü QLH]E\W SU]\MHPQH GR ]DZLHV]HQLD NRPSXWHUD ZáF]QLH 'UXJLSUREOHP]ZL]DQ\]X*\FLHPOLF]E\OXE SRMDZLDVL ZNLONDPLHVL F\ SRQDSLVDQLXSURJUDPXLVSURZDG]DVL GRIDNWX*H]Z\NOHWUXGQRVRELHSU]\SRPQLHü co to za 750 i dlaczego akurat tyle. (OHJDQFNLP VSRVREHP QD SRUDG]HQLH VRELH ] RSLVDQ\P SUREOHPHP V VWDáH V\PERliczne 3RGREQLH MDN GHILQLFMD W\SX SR]ZDOD QD XWZRU]HQLH LGHQW\ILNDWRUD E GFHJR synonimem definicji typu, tak definicjD VWDáHM V\PEROLF]QHM XPR*OLZLD XWZRU]HQLH LGHQW\ILNDWRUD E GFHJR V\QRQLPHP RNUHORQHM ZDUWRFL VWDáHM QLHNRQLHF]QLH OLF]ERZHM 'R GHILQLRZDQLD VWDá\FK X*\ZDQH MHVW VáRZR NOXF]RZH const (ang. constant —VWDáD ]DVNáDGQLDGHILQLFMLZ\JOGDQDVW SXMFo: const nawa-VWDáHM ZDUWRü
.D*GHZ\VWSLHQLH nazwy-VWDáHMZSURJUDPLH]RVWDQLHSRGF]DVNRPSLODFML]DVWpione ZDUWRFL 3RGREQLH MDN Z SU]\SDGNX W\SyZ ]GHILQLRZDQLH VWDáHM QLH SRZRGXMH ]DUH]HUZRZDQLDPLHMVFDZSDPL FLZ]ZL]NX]W\PPXVLV]SDPL WDü*HVWDáDV\PERliczna nie jest l-ZDUWRFLLQLHPR*HVL ZSURJUDPLH]QDOH(üSROHZHMVWURQLHRSHUDWRUD SU]\SLVDQLD DQL Z PLHMVFX SDUDPHWUX SU]HND]\ZDQHJR SU]H] QD]Z SRPLMDMF RF]\ZLVWKHUH]M MDNMHVWSUyED]PLDQ\ZDUWRFLVWDáHM Definicja sWDáHM RNUHODMFHM PDNV\PDOQ SRMHPQRü WDEOLF\ L VWRVRZQLH ]PRG\fikoZDQDGHNODUDFMDWDEOLF\UHNRUGyZ E G]LHZL FZ\JOGDáDQDVW SXMFR const POJEMNOSC_KATALOGU = 750; var Katalog : array[1..POJEMNOSC_KATALOGU] of Ksiazka;
=DXZD* *H LGHQW\ILNDWRU VWDáHM ]DSLVDQ\ MHVW GX*\PL OLWHUDPL MHVW WR LVWRWQH W\ONR GOD programisty — 7XUER 3DVFDO QLH RGUy*QLD GX*\FK OLWHU RG PDá\FK .RQZHQFMD WD — SR]ZDODMFD áDWZR RGUy*QLü 67$à( od zmiennych MHVW GRü SRZV]HFKQLH VWRVRZDQD SU]H]SURJUDPLVWyZLZDUWRMVRELHSU]\VZRLü -HOL QLH FKFH &L VL SU]HOLF]Dü ZDUWRFL QDV]HM VWDáHM SR ND*GHM ]PLDQLH VWUXNWXU\ UHNRUGXF]HJR]GUXJLHMVWURQ\QLHSRZLQLHQHURELü]E\WF] VWRERGRZRG]LWR]áHJR ]DSURMHNWRZDQLDSURJUDPX PR*HV]X*\üQDVW SXMFHMGHILQLFML const MAX_PAMIEC = 63000; { maksymalna wielkosc katalogu } { w bajtach } POJEMNOSC_KATALOGU = MAX_PAMIEC div SizeOf(Ksiazka);
-DN QLHWUXGQR VL GRP\OLü UD] ]GHILQLRZDQHM VWDáHM PR*QD X*\ü Z NROHMQ\FK GHILnicjach. Co jednak znacznie ciHNDZV]HVWDáDPR*H]RVWDü]GHILQLRZDQD]DSRPRFZ\UD*HQLD ]DZLHUDMFHJR LQQH VWDáH L QLHNWyUH RSHUDWRU\ Z\UD*HQLH PXVL GDü VL REOLF]\ü w WUDNFLH NRPSLODFML QLH PR*H ZL F ]DZLHUDü LGHQW\ILNDWRUyZ ]PLHQQ\FK L IXQNFML
90
Turbo Pascal — programowanie ELEOLRWHF]Q\FKGRNáDGQLHMV]HLQIRUPDFMHQDWHQWHPDW]QDMG]LHV]ZV\VWHPLHSRPRF\ :QDV]\PSU]\SDGNXZDUWRüVWDáHM]GHILQLRZDQDMHVWMDNRZ\QLNFDáNRZLW\ SRG]LHOHQLD ZLHONRFL GRVW SQHM SDPL FL ]GHILQLRZDQHM LQQ VWDá SU]H] UR]PLDU UHNRUGX RSLVXMFHJRNVL*N :W\PPRPHQFLHPR*HV]SU]HVWDüSU]HMPRZDüVL MDNLPLNROZLHN liczbami. 6WRVRZDQLHVWDá\FKV\PEROLF]Q\FKLGHILQLFMLW\SyZVWDQRZLMHGQ]SRGVWDZ GREUHMSUDNW\NLSURJUDPRZDQLD2GSRZLHGQLRX*\WHPHFKDQL]P\WH]QDF]QLH SRSUDZLDMF]\WHOQRüSURJUDPXL]PQLHMV]DMMHJRSRGDWQRüQDEá G\ w trakcie pisania i poprawiania. &R SUDZGD SU]HG FKZLO SRZLHG]LDQR *H VWDáD ]GHILQLRZDQD VáRZHP NOXF]RZ\P
const nie jest l-ZDUWRFL RND]XMHVL MHGQDN*HVáRZDWHJRPR*QDX*\üUyZQLH*GR
definiowania... zmiennych. Chodzi tu o tzw. zmienne z ZDUWRFLSRF]WNRZ (zmienne predefiniowane, ang. typed constant =PLHQQDWDNDMHVWQRUPDOQ]PLHQQ—W\OH*H X]\VNXMH ZDUWRü MX* Z PRPHQFLH GHNODUDFML GHILQLFML 6NáDGQLD GHILQLFML ]PLHQQHM z ZDUWRFLSRF]WNRZMHVWQDVW SXMFD const nazwa-]PLHQQHMW\S ZDUWRü-SRF]WNRZD
=PLHQQHSUHGHILQLRZDQHSR]ZDODMQDáDWZHLQLFMDOL]RZDQLHGDQ\FKZSURJUDPLH2WR SU]\NáDG\ const /LF]EDBNVLD]HNZRUG ^QDSRF]WNX` { katalog jest pusty } Liczniki : array[1..4] of word = (0, 0, 0, 0); { inicjalizacja tablicy }
:LDGRPRFLSU]HGVWDZLRQHZW\PUR]G]LDOHSRZLQQ\SR]ZROLüQDPQDQDSLVDQLHSRGVWDZRZHM ZHUVML QDV]HJR SURJUDPX 7\P MHGQDN ]DMPLHP\ VL MX* Z QDVW SQ\P rozdziale.
=DSDPL WDM • 'HNODURZDQLH SDUDPHWUyZ W\SX VWUXNWXUDOQHJR PR*OLZH MHVW Z\áF]QLH SU]\ X*\FLXLGHQW\ILNDWRUyZW\SyZ • 'R]GHILQLRZDQLDLGHQW\ILNDWRUDW\SXX*\ZDQHMHVWVáRZRNOXF]RZHtype. • 'HILQLRZDQLH VWDá\FK V\PEROLF]Q\FK F]\OL LGHQW\ILNDWRUyZ SU]HFKRZXMF\FK ZDUWRFLVWDáHXPR*OLZLDVáRZRNOXF]RZHconst. • 6áRZR const SR]ZDOD UyZQLH* QD GHNODURZDQLH ]PLHQQ\FK SRáF]RQH ] QDGDZDQLHPLPZDUWRFLSRF]WNRZ\FK • 8*\ZDQLH GHILQLFML W\SyZ L VWDá\FK V\PEROLF]Q\FK SRSUDZLD F]\WHOQRü SURJUDPXMHJRXQLZHUVDOQRüLRGSRUQRüQDEá G\
'RG]LHáD
91
'RG]LHáD 3R W\P QLHFR SU]\GáXJLP WHRUHW\]RZDQLX ZL NV]Rü &]\WHOQLNyZ ]DSHZQH ZLHU]EL MX*U FH*HE\Z]LüVL GRSURJUDPRZDQLD:QLQLHMV]\PUR]G]LDOHVSUyEXMHP\SU]HGVWDZLü SRGVWDZRZH HOHPHQW\ VNáDGRZH QDV]HJR SURJUDPX L SRZL]Dü MH Z G]LDáDMF FDáRü =DF]QLHP\ RG U]HF]\ SRGVWDZRZ\FK F]\OL ]GHILQLRZDQLD VWUXNWXU GDQ\FK QD NWyU\FKSURJUDPE G]LHRSHURZDá program Biblioteka; ^3URVW\SURJUDPGRREVáXJLELEOLRWHNL` uses&UW^PRGXáREVáXJXMF\NODZLDWXU LPRQLWRU` type string30 = string[30]; { potrzebne do przekazywania } { parametrów } string25 = string>@^W\SXáDFXFKRZHJRGRSURFHGXU` Ksiazka = record^UHNRUGRSLVXMF\NVL*N ` Tytul : string30; Autor : string25; Wypozyczajacy : string25; Licznik : word; end; const 0$;B3$0,(& ^PDNV\PDOQDZLHONRüNDWDORJX` { w bajtach } POJEMNOSC = MAX_PAMIEC div SizeOf(Ksiazka); var Katalog : array[1..Pojemnosc] of.VLD]ND^ZáDFLZ\` { katalog } LbPoz : integer; { liczba pozycji w katalogu }
3RGVWDZRZ\P ZDUXQNLHP X*\WHF]QRFL NDWDORJX MHVW PR*OLZRü ZSURZDG]DQLD GR QLHJR LQIRUPDFML ] NODZLDWXU\ L Z\SURZDG]DQLD MHM QD HNUDQGUXNDUN 3RQLHZD* podstawoZ MHGQRVWN RUJDQL]DF\MQ NDWDORJX MHVW UHNRUG SRZLQQLP\ ]GHILQLRZDü SURFHGXU\ SR]ZDODMFH QD ZSURZDG]HQLH L Z\SURZDG]HQLH MHJR ]DZDUWRFL : P\O WHJR FR SRZLHG]LHOLP\ SRSU]HGQLR SURFHGXU\ WH SRZLQQ\ RSHURZDü QD SDUDPHWU]H odpowiedniego typu rekordowego:
92
Turbo Pascal — programowanie procedure WprowadzDane(var r : Ksiazka); { wprowadza pojedynczy rekord z klawiatury } begin with r do^ZSURZDG(SRV]F]HJyOQHSRODUHNRUGX` begin write('Tytul: '); readln(Tytul); write('Autor: '); readln(Autor); write('Wypozyczajacy: '); readln(Wypozyczajacy); end; end; procedure WypiszDane(r : Ksiazka); ^Z\SURZDG]D]DZDUWRüUHNRUGXQDHNUDQ` begin with r do^Z\SURZDG(SRV]F]HJyOQHSRODUHNRUGX` begin write('Tytul: '); writeln(Tytul); write('Autor: '); writeln(Autor); if Wypozyczajacy = '' then^QLNWQLHZ\SR*\F]\á` writeln('Ksiazka znajduje sie na polce.') else^SROH]DZLHUDQD]ZLVNRZ\SR*\F]DMFHJR` write('Wypozyczajacy: '); writeln(Wypozyczajacy); end; writeln; end;
0LPRFKRGHP SU]\M OLP\ NRQZHQFM Z P\O NWyUHM NVL*FH QLH Z\SR*\F]RQHM RGSRwiada puste pole WypozyczajacyFRMHVWGRüQDWXUDOQH 3RZ\*V]HGHILQLFMHZ\NRU]\VWDP\GRXWZRU]HQLDNLONXGRGDWNRZ\FKSURFHGXUSR]ZDODMF\FKQDZSURZDG]HQLH RSLVX QRZHM NVL*NL GR NDWDORJX RUD] Z\SURZDG]HQLH FDáHM ]DZDUWRFL NDWDORJX QD HNUDQ FR Z SU]\SDGNX ZL NV]HM OLF]E\ NVL*HN MHVW UDF]HM PDáR VHQVRZQH FK\ED *H ]DPLDVW HNUDQX X*\MH VL GUXNDUNL 3U]\ RND]ML ZDUWR WH* ]GHILQLRZDü SURFHGXU SR]ZDODMF QD XVXQL FLH NVL*NL ] NDWDORJX FR QDMSURFLHM ]URELü SU]H] SU]HSLVDQLH ostatniego elementu katalogu w miejsce elementu usuwanego. procedure DodajKsiazke; ^GRGDMHQRZNVL*N GRNDWDORJX` begin ,QF/E3R] ^GRGDMHP\QRZNVL*N ` writeln('Nowa pozycja w katalogu: ', LbPoz); :SURZDG]'DQH.DWDORJ>/E3R]@ ^ZSURZDG(GDQH` ^QRZHMNVL*NL` .DWDORJ>/E3R]@/LF]QLN ^NVL*NDQLHE\áD` ^Z\SR*\F]DQD` end;
'RG]LHáD
93
procedure UsunKsiazke(Numer : integer); ^XVXZDNVL*N ]NDWDORJX` begin .DWDORJ>1XPHU@ .DWDORJ>/E3R]@^]DPD]XMHGDQSR]\FM ` 'HF/E3R] ^XVXQL WRNVL*N ` end; procedure WypiszKatalog; ^Z\SLVXMHFDá]DZDUWRüNDWDORJXQDHNUDQ` var i : integer; begin for i := 1 to LbPoz do begin writeln('Pozycja katalogu nr ', i,':'); WypiszDane(Katalog[i]); end; end;
3RU]GQ\SURJUDPSRZLQLHQUyZQLH*]DSHZQLDüPR*OLZRü]PLDQ\RSLVXNVL*NLNRQVWUXNFM RGSRZLHGQLHMSURFHGXU\SR]RVWDZLDP&LMDNRüZLF]HQLH]REDF]WH*SRQL*HM .ROHMQ VSUDZ MHVW REVáXJD Z\SR*\F]HQLD L ]ZURWX NVL*NL : W\P FHOX QDOH*\ SR SLHUZV]HRGV]XNDüZ\EUDQNVL*N ZHGOHZF]HQLHMV]\FK]DáR*H—ZHGáXJW\WXáX D QDVW SQLH Z ]DOH*QRFL RG SRWU]HE ZSURZDG]Lü VSUDZG]Lü OXE XVXQü QD]ZLVNR Z\SR*\F]DMFHJR -HOL FKRG]L R Z\V]XNLZDQLH NVL*NL WR VHQVRZQ\P Z\GDMH VL ]DSURMHNWRZDQLHIXQNFMLNWyUHMDUJXPHQWHPE G]LH]DGDQ\IUDJPHQWW\WXáXDZDUWRFL ]ZUDFDQ — QXPHU NVL*NL Z NDWDORJX OXE – MHOL NVL*NL QLH ]QDOH]Lono (numery NVL*HNV]DZV]HGRGDWQLHDZL FOLF]ED–QLJG\QLHE G]LHRSLV\ZDáDU]HF]\ZLFLH LVWQLHMFHM Z NDWDORJX NVL*NL 3RQLHZD* NDWDORJ PR*H ]DZLHUDü NLOND NVL*HN R W\P VDP\PW\WXOHPXVLP\]DSURMHNWRZDüIXQNFM Z\V]XNXMFWDNE\XPR*OLZLDáD]QDOH]LHQLHZV]\VWNLFKÄSRGHMU]DQ\FK´:W\PFHOXZ\SRVD*\P\MZPR*OLZRüV]XNDQLD od zadanej pozycji: function Szukaj(Tekst : string; Pozycja : integer) : integer; ^Z\V]XNXMHNVL*N RW\WXOH]DZLHUDMF\P7HNVW` { szuka od zadanej pozycji katalogu } var i : integer; begin i := Pozycja; { szukaj od zadanej pozycji } ^VSUDZG(F]\W\WXá]DZLHUDWHNVW` ^LF]\SU]HV]XNDQRFDá\NDWDORJ`
94
Turbo Pascal — programowanie while (Pos(Tekst, Katalog[i].Tytul) = 0) and (i <= LbPoz) do Inc(i); if i <= LbPoz then^]QDOH]LRQRRGSRZLHGQL` ^SR]\FM NDWDORJX` Szukaj := i else { nie znaleziono pozycji w katalogu } Szukaj := –1; end;
=DXZD* *H LVWRWD SU]HV]XNXMFHM WDEOLF S WOL while VNXSLD VL Z ZDUXQNX ]D MHM treFL MHVW MHG\QLH ]ZL NV]HQLH LQGHNVX WDEOLF\ 'R VSUDZG]HQLD F]\ W\WXá ]DZLHUD GDQ\ FLJ ]QDNyZ X*\OLP\ IXQNFML Pos ]ZUDFDMFHM SR]\FM QD NWyUHM FLJ ]RVWDá znale]LRQ\ Z ]DGDQ\P áDFXFKX OXE ]HUR MHOL JR QLH ]QDOH]LRQR 3U]HV]XNLZDQLH NRF]\VL ZPRPHQFLHJG\LQGHNVWDEOLF\]UyZQDVL ]QXPHUHPRVWDWQLHMNVL*NLZ katalogu. :\V]XNDQLH ZV]\VWNLFK NVL*HN R ]DGDQ\P W\WXOH L Z\ZLHWOHQLH LQIRUPDFML R QLFK MHVWMX*SURVWH procedure SprawdzKsiazki(Tytul : string); ^Z\SURZDG]DGDQHNVL*HNR]DGDnym tytule } var i : integer; Tytul : string; begin write('Podaj tytul szukanej ksiazki: '); readln(Tytul); i := 1; repeat L 6]XNDM7\WXOL ^]QDMG(NROHMQH` ^Z\VWSLHQLHW\WXáX` if i <> -1 then^]QDOH]LRQRNVL*N ` begin writeln('Pozycja katalogu nr ', i,':'); WypiszDane(Katalog[i]); ,QFL ^SU]HMG(GRQDVW SQHMSR]\FML` end; until i = –^QLH]QDOH]LRQRZL FHMNVL*HN` end;
3RZ\*V]D SURFHGXUD F\NOLF]QLH Z\ZRáXMH IXQNFM Szukaj QDND]XMF MHM ]D ND*G\P UD]HP UR]SRF] FLHSU]HV]XNLZDQLDRGRVWDWQLR]QDOH]LRQHMNVL*NLGODF]HJR" LZ\SLVXMFGDQH]QDOH]LRQ\FKSR]\FML]DSRPRFSURFHGXU\ WypiszDane. W tym momencie áDWZRMX*XVWDOLüF]\NVL*ND]RVWDáDZ\SR*\F]RQDDMHOLWDN— to komu (w ramach üZLF]H VXJHUXM &L QDSLVDQLH SRGREQ\FK IXQNFML XPR*OLZLDMF\FK XVWDOHQLH NWyUH NVL*NL]RVWDá\Z\SR*\F]RQHRVRELHRSRGDQ\PQD]ZLVNX :áDFLZ REVáXJ Z\SR*\F]HQLD OXE ]ZURWX ]DMPXMH VL SU]HGVWDZLRQD SRQL*HM procedura Wypozycz =D]QDF]HQLH NVL*NL MDNR Z\SR*\F]RQHM RGE\ZD VL SU]H] ZSL-
'RG]LHáD
95
VDQLH QD]ZLVND Z\SR*\F]DMFHJR GR RGSRZLHGQLHJR SROD UHNRUGX L ]ZL NV]HQLH OLF]QLNDZ\SR*\F]H:FKZLOL]ZURWXSROHWypozyczajacy jest zerowane. procedure Wypozycz(var r : Ksiazka); ^REVáXJXMHZ\SR*\F]HQLH]ZURWNVL*NL` begin writeln; writeln('Biezace dane ksiazki:'); :\SLV]'DQHU ^Z\SLV]LQIRUPDFMHRNVL*FHGODNRQWUROL` writeln; writeln('Wprowadz nazwisko wypozyczajacego.'); writeln('W przypadku zwrotu ksiazki nacisnij Enter.'); with r do^ZSURZDG(QD]ZLVNROXEZ\F]\üSROHUHNRUGX` begin readln(Wypozyczajacy); if Wypozyczajacy <> '' then ,QF/E3R] ^SU]\Z\SR*\F]HQLX` ^]ZL NV]OLF]QLNZ\SR*\F]H` end; end;
3RZ\*V] SURFHGXU PR*QD Z\ZRáDü QS SRGF]DV VSUDZG]DQLD GDQ\FK NVL*HN F]\OL z procedury SprawdzKsiazki. Wymaga to niewielkiej modyfikacji tej ostatniej: { ... } writeln('Pozycja katalogu nr ', i,':'); WypiszDane(Katalog[i]); writeln('Obsluga wypozyczen: nacisnij "W"'); writeln('Nastepna pozycja: nacisnij dowolny klawisz.'); if UpCase(ReadKey) = 'W' then Wypozycz(Katalog[i]); Inc(i); { przejdz do nastepnej pozycji } { ... }
-HOLSRGF]DVSU]HJOGDQLDZ\EUDQ\FKSR]\FMLELEOLRWHNDU]]HFKFHZ\SR*\F]\üNVL*N OXESU]\MüMHM]ZURWSRZLQLHQQDFLVQüNODZLV]WFRZ\ZRáDSURFHGXU Wypozycz. 2EVáXJ QDFLQL FLD NODZLV]D ]DMPXMH VL ÄLPSRUWRZDQD´ ] PRGXáX Crt (zobacz str. 121) funkcja ReadKey ]D IXQNFMD UpCase XQLH]DOH*QLD SURJUDP RG ZLHONRFL OLWHU (w lub W). 6WDW\VW\N Z\SR*\F]HREVáXJXMHGRüREV]HUQDFKRFLD*EDUG]RSURVWDSURFHGXUDStatystyka2EOLF]DRQDQDMPQLHMV]QDMZL NV]LUHGQLZDUWRüOLF]QLNDZ\SR*\F]H GOD FDáHJR NDWDORJX :\NRU]\VWDQD Z QLHM PHWRGD Z\V]XNLZDQLD QDMPQLHMV]HM L QDMZL NV]HM ZDUWRFL Z WDEOLF\ MHVW EDUG]R W\SRZD L V]HURNR VWRVRZDQD D SROHJD QD EDGDQLXF]\NROHMQ\HOHPHQWWDEOLF\QLHMHVWPQLHMV]\ZL NV]\ RGDNWXDOQHJRPLQLPXP PDNVLPXP MHOLWDNMHVWRQSU]\MPRZDQ\Mako nowe minimum (maksimum).
96
Turbo Pascal — programowanie procedure Statystyka; var LLQWHJHU^OLF]QLNS WOL` min, max, sum : longint; { minimum, maksimum i suma } poz_min, poz_max : integer; { pozycje minimum i maksimum } begin PLQ ^LQLFMDOL]XMPLQLPXPPDNVLPXPLVXP ` max := 0; sum := 0; for i := 1 to LbPoz do with Katalog[i] do begin if Licznik > max then { znaleziono nowe maksimum } begin PD[ /LF]QLN^]DSDPL WDMQRZHPDNVLPXP` poz_max := i; { i numer odpowiedniej pozycji } end; if Licznik < min then { to samo dla minimum } begin min := Licznik; poz_min := i; end; VXP VXP/LF]QLN^]ZL NV]OLF]QLNZ\SR]\F]H` end; ZULWHOQ 6WDW\VW\NDZ\SR]\F]HQ ^Z\SLV]ZDUWRFL` { statystyk } writeln('Srednia wypozyczen na jedna ksiazke: ', sum/Licznik:6:0); writeln('Ksiazka najczesciej wypozyczana (', max, ' wypozyczen):'); WypiszDane(Katalog[poz_max]); writeln('Ksiazka najrzadziej wypozyczana (', min, ' wypozyczen):'); WypiszDane(Katalog[poz_min]); end;
3R]RVWDáDQDPGRUR]ZL]DQLDVSUDZDDOIDEHW\F]QHJRXSRU]GNRZDQLD]DZDUWRFLNDWDORJX =DGDQLH WR E GFH MHGQ\P ] NODV\F]Q\FK ]DGD SURJUDPRZDQLD QRVL QD]Z sortowania /LF]ED ]QDQ\FK REHFQLH DOJRU\WPyZ VRUWRZDQLD MHVW GRü VSRUD P\ ]DMPLHP\ VL MHGQ\P ] QDMSURVWV]\FK — tak zwanym sortowaniem przez proste wybieranie (ang. selection sort), które, chocia* QLH]E\W HIHNW\ZQH MHVW áDWZH GR zrozumienia i interpretacji. =Dáy*P\ *H PXVLP\ XSRU]GNRZDü RG ZDUWRFL QDMPQLHMV]HMGRQDMZL NV]HM WDEOLF ]DZLHUDMF SL ü OLF]E FDáNRZLW\FK : SLHUZV]\P NURNX Z\V]XNXMHP\ QDMPQLHMV] OLF]E ZWDEOLF\L]DPLHQLDP\MPLHMVFDPL]OLF]E]QDMGXMFVL QDSLHUZV]HMSR]\FML :W\PPRPHQFLHQDMPQLHMV]DZDUWRüZWDEOLF\MHVWMX*]ORNDOL]RZDQDLXVWDZLRQDQD ZáDFLZ\PPLHMVFXÄRGFLQDP\´ZL FSLHUZV]SR]\FM WDEOLF\LSRZWDU]DP\Z\V]XNLZDQLH PLQLPXP GOD SR]RVWDá\FK SR]\Fji (od 2 do 5). Po znalezieniu minimum ]DPLHQLDP\ MH PLHMVFDPL ] OLF]E QD SR]\FML GUXJLHM F]HJR HIHNWHP MHVW XVWDOHQLH
'RG]LHáD
97
GZyFK SLHUZV]\FK SR]\FML XSRU]GNRZDQHM WDEHOL 3R ÄRGFL FLX´ SLHUZV]\FK GZyFK SR]\FMLMX*XSRU]GNRZDQ\FK SRZWDU]DP\VRUWRZDQLHGODSR]\FMLGRLWDNGDOHM D* GR FKZLOL NLHG\ SR]RVWDQLH QDP GR SU]HV]XNDQLD RVWDWQLD SR]\FMD WDEOLF\ RF]\ZLFLH]DZLHUDMFDQDMZL NV]OLF]E Ä]HSFKQL W´QDVDPNRQLHF $RWRSU]\NáDG
Przed sortowaniem (krok 0)
krok 1
4 1 3 5 2
1 (4) 4 (1) 3 5 2
W trakcie sortowania krok 2 krok 3 1 2 (4) 3 5 4 (2)
1 2 3 (3) 5 4
krok 4 1 2 3 4 (5) 5 (4)
.RORUHP F]DUQ\P ]D]QDF]RQR ]DNUHV SU]HV]XNLZDQLD WDEOLF\ MDN ZLGDü Z NROHMQ\FK NURNDFK]PQLHMV]DVL RQR ]DZQDZLDVDFKXPLHV]F]RQRZDUWRFLNWyUH]QDMGRwaá\VL QDGDQHMSR]\FMLSU]HG]DPLDQWM R]QDF]D*HQDGDQHMSR]\FML]QDMGRZDáD VL OLF]ED]DPLHQLRQDQDVW SQLH]OLF]E -DNZLGDüQDV]DOJRU\WPMHVWFDáNLHPSURVW\FKRüRNXSLRQHMHVWWRHIHNW\ZQRFLEDUdziej ambitnym Czytelnikom polecam przestudiowanie innych algorytmów sortowania, ]NWyU\FKQDMF] FLHMVWRVRZDQ\PLFK\EDQDMHIHNW\ZQLHMV]\PMHVWW]Zszybkie sortowanie (ang. quicksort), zilustrowane m.in. dostarczanym wraz z Turbo Pascalem programem QSORT.PAS 1LHVWHW\ VSUDZ NRPSOLNXMH QLHFR Z\PDJDQLH VRUWRZDQLD ZHGáXJ W\WXáyZ OXE QD]ZLVN DXWRUyZ -DN MX* VL ]DSHZQH ]RULHQWRZDáH Z\NRU]\VW\ZDQH w DOJRU\WPLHZ\V]XNLZDQLHQDMPQLHMV]HMZDUWRFLSROHJDQDSRUyZQ\ZDQLX]DZDUWRFL RGSRZLHGQLHM NRPyUNLWDEOLF\]ELH*FZDUWRFLPLQLPXP$E\SRVRUWRZDüNDWDORJ ZHGáXJW\WXáyZQDOH*\SRUyZQ\ZDüSROD Tytul odpowiednich rekordów; sortowanie ZHGáXJ QD]ZLVN DXWRUyZ Z\PDJD SRUyZQ\ZDQLD SyO Autor &]\*E\ ZL F QDOH*DáR QDSLVDü GZLH RGG]LHOQH SURFHGXU\ VRUWXMFH" 1D V]F] FLH QLH FKRFLD* EDUG]R ZLHOX SRF]WNXMF\FK SURJUDPLVWyZ UDG]L VRELH ZáDQLH Z WHQ VSRVyE F]HJR DEVROXWQLH QLH QDOH*\ SROHFDü =DXZD* *H Z REX SU]\SDGNDFK PHFKDQL]P VRUWRZDQLD MHVW LGHQW\F]Q\]DUy*QLFDVSURZDG]DVL Z\áF]QLHGRSRUyZQ\ZDQLDUy*Q\FKSyOUHNRUGyZ. :\VWDUF]\ ]DWHP QDSLVDü RGSRZLHGQLH IXQNFMH SRUyZQXMFH GZD UHNRUG\ ZHGáXJ SyO Autor i Tytul D QDVW SQLH Z\ZRá\ZDü MH Z ]DOH*QRFL RG DNWXDOQHJR NU\WHULXP VRUWRZDQLD =Z\F]DMRZR IXQNFMH WDNLH ]ZUDFDM ZDUWRü –1, 0 lub 1 odpowiednio do WHJR F]\ SLHUZV]\ ] SRUyZQ\ZDQ\FK RELHNWyZ MHVW PQLHMV]\ UyZQ\ OXE ZL NV]\ RG drugiego. W naszym przypadku —SRQLHZD*VRUWXMHP\RELHNW\URVQFR— wystarczy LQIRUPDFMD F]\ SLHUZV]\ UHNRUG MHVW PQLHMV]\ RG GUXJLHJR F]\ WH* QLH 2WR SU]\NáDG IXQNFML SRUyZQXMFHM UHNRUG\ ZHGáXJ ]DZDUWRFL SROD Tytul GUXJ IXQNFM QDSLV] sam): function PorownajTytul(r1, r2 : Ksiazka) : integer; ^SRUyZQXMHUHNRUG\ZHGáXJSROD7\WXO` begin if r1.Tytul < r2.Tytul then PorownajTytul := -1 else PorownajTytul := 1;
98
Turbo Pascal — programowanie end;
6DPDSURFHGXUDVRUWXMFDSRZLQQDZ\NRQ\ZDüDOJRU\WPRSLVDQ\SRZ\*HMZ\ZRáXMF RGSRZLHGQLIXQNFM SRUyZQXMFZ]DOH*QRFLRG]DGDQHJRSU]H]X*\WNRZQLNDNU\teULXP 1D REHFQ\P HWDSLH ]QDMRPRFL 3DVFDOD MHVWHP\ Z VWDQLH ]UHDOL]RZDü WDNLH wywoáDQLH Z RSDUFLX R LQVWUXNFM ZDUXQNRZ MHGQDN ÄSUDZG]LZH´ SURJUDP\ Z\NRU]\VWXMQLHFRLQQHUR]ZL]DQLHRSDUWHRWDN]ZDQHparametry proceduralne. OmawiaQLHWHJR]DJDGQLHQLDZ\NUDF]DSR]DUDP\QLQLHMV]HMNVL*NLMHGQDNZVNUyFLHPHWRGDWD SROHJD QD SU]HND]DQLX SURFHGXU]H VRUWXMFHM ZVND(QLND RSLVXMFHJR SRáR*HQLH IXQNFML porównuMFHMMHMDGUHVX 3RGVWDZLDMFSRGSDUDPHWUDGUHV\Uy*Q\FKIXQNFMLMHVWHP\ w VWDQLHHOHJDQFNR]PLHQLDüNU\WHULDVRUWRZDQLD $RWRWUHüSURFHGXU\ procedure Sortuj(Kryterium : integer); { sortuje zawartRüNDWDORJXZHGáXJ]DGDQHJRNU\WHULXP` var i, j : integer; CzyWiekszy : integer; Pomoc : Ksiazka; begin for i := 1 to LbPoz-1 do { wykonaj LbPoz-1 przebiegów } for j := i to LbPoz do begin if Kryterium = 1 then^SRUyZQDQLHZJW\WXáXDXWRUD` CzyWiekszy := PorownajTytul(Katalog[i], Katalog[j]) else CzyWiekszy := PorownajAutor(Katalog[i], Katalog[j]); if CzyWiekszy = 1 then^WU]HED]DPLHQLüHOHPHQW\` begin Pomoc := Katalog[i]; { zachowaj pierwszy rekord } Katalog[i] := Katalog[j]; { wstaw drugi } { do pierwszego } Katalog[j] := Pomoc; { wstaw zachowany } { do drugiego } end; end; end;
-DNZLGDüSURFHGXUDZ\NRQXMHF\NOLF]QHSRUyZQDQLDLHZHQWXDOQH]DPLDQ\ZGZyFK ]DJQLH*G*RQ\FKS WODFK]NWyU\FK]HZQ WU]QDZ\]QDF]DNROHMQHNURNLDOJRU\WPX]D ZHZQ WU]QDREVáXJXMHSU]HJOGDQLHSR]RVWDá\FKMHV]F]HGRXSRU]GNRZDQLDUHNRUGyZ 6DPD ]DPLDQD HOHPHQWyZ Z\NRU]\VWXMH W\SRZ\ VFKHPDW ÄSRGSLHUDMF\ VL ´ SRPRFQLF]\PUHNRUGHPVáX*F\PGRW\PF]DVRZHJRSU]HFKRZDQLDGDQ\FK=DXZD*ZUHV]FLH *HDE\SRVRUWRZDüUHNRUG\PDOHMFRZ\VWDUF]\]PRG\ILNRZDüZDUXQHN if CzyWiekszy = 1
]DVW SXMFZDUWRüZDUWRFL–1.
'RG]LHáD
99
-DN QLHWUXGQR VL GRP\OLü RSHUDFMD VRUWRZDQLD SRZLQQD SRSU]HG]Dü Z\SURZDG]HQLH ]DZDUWRFLNDWDORJXQDHNUDQOXEGUXNDUN 3URFHGXUDNRMDU]FDRE\GZLHRSHUDFMHPR*H Z\JOGDüQDVW SXMFR procedure WypiszKatalog; var Kryterium : integer; begin write('Sortowanie wedlug tytulow (1)', ' lub nazwisk autorow (2)'); readln(Kryterium); Sortuj(Kryterium– ^SDUDPHWUSRZLQLHQE\üOXE` Wypisz; { wypisz posortowany katalog } UHDGOQ^LSR]ZyOJRSU]HF]\WDü` end;
:WHQVSRVyE]DNRF]\OLP\EXGRZ ]DVDGQLF]\FKNORFNyZ]NWyU\FKVNáDGDüVL PD QDV]SURJUDP3R]RVWDMHMHV]F]HQDSLVDQLHáDGQHJRPHQX function Menu : integer; var c : char; begin &OU6FU^Z\F]\üHNUDQ-Z\PDJDZáF]HQLDPRGXáX Crt } writeln('Program biblioteczny KATALOG, wersja 1.0, 1996'); writeln; writeln('Wybierz funkcje:'); writeln('1: Wyszukiwanie pozycji wg tytulu', ' i obsluga wypozyczen'); writeln('2: Wyswietlenie wszystkich pozycji'); writeln('3: Dodanie ksiazki do katalogu'); writeln('5: Statystyka wypozyczen'); writeln('0: Koniec pracy'); writeln; writeln; repeat^F]\WDMNODZLDWXU ` F 5HDG.H\^UyZQLH*Z\PDJDZáF]HQLDPRGXáX&UW` until c in ['0'..'5']; { ignoruj po]RVWDáH]QDNL` Menu := ord(c)-ord('0'); end;
6DPDF] üRSHUDF\MQDSURJUDPXMHVWUyZQLH*EDUG]RW\SRZD:\NRU]\VWXMHRQDS WO repeat F\NOLF]QLH Z\ZLHWODMF PHQX GRVW SQ\FK RSHUDFML .RG ]ZUyFRQ\ SU]H] IXQNFM Menu MHVW Z\NRU]\VW\ZDQ\ GR Z\ZRáDQLD RGSRZLHGQLHM RSHUDFML Z LQVWUXNFML case=ZUyFHQLHSU]H]IXQNFM MenuZDUWRFLSRZRGXMH]DNRF]HQLHG]LDáDQLDS WOL DW\PVDP\PFDáHJRSURJUDPX begin^F] üRSHUDF\MQD` repeat
100
Turbo Pascal — programowanie :\ERU 0HQX^Z\ELHU]RSFM ]PHQX` case Wybor of 1 : SprawdzKsiazki; 2 : begin WypiszKatalog; readln; end; 3 : DodajKsiazke; 5 : Statystyka; end; until Wybor = 0; { opcja 0 = koniec pracy } end. { program Biblioteka }
-DN]G*\áH]DSHZQH]DXZD*\üSURJUDPQLHXPR*OLZLDXVXQL FLDNVL*NL]NDWDORJX 3U]H]QDF]RQD MHVW GR WHJR EUDNXMFD F]ZDUWD SR]\FMD PHQX NWyUHM ]DSURJUDPRZDQLH SURSRQXM &LZUDPDFKüZLF]H 3R SRVNáDGDQLX RSLVDQ\FK Z W\P UR]G]LDOH IUDJPHQWyZ Z MHGQ FDáRü QDMOHSLHM w koleMQRFL Z MDNLHM E\á\ F\WRZDQH X]\VNXMHV] JRWRZ\ SURJUDP 1LHVWHW\ SHáQL V]F] FLD ]DNáyFDM GZD PDQNDPHQW\ ] NWyU\FK FR QDMPQLHM MHGHQ MHVW EDUG]R SRZD*Q\2ND]XMHVL PLDQRZLFLH*HQDV]NDWDORJLVWQLHMHGRSyW\GRSyNLX*\WNRZQLN nie wybierze opcji „Koniec pracy” — NROHMQH XUXFKRPLHQLH SURJUDPX ZL*H VL ] konieczQRFL ZSLVDQLD ZV]\VWNLFK NVL*HN RG QRZD FR MHVW QLHGRSXV]F]DOQH 1R L VDPDSRMHPQRüNDWDORJXWH*PRJáDE\E\üZL NV]D 5R]ZL]DQLHP QDV]\FK SUREOHPyZ ]DMPLHP\ VL MX* ]D FKZLO Z Gwóch kolejnych UR]G]LDáDFKWUDNWXMF\FKRSOLNDFKRUD]]PLHQQ\FKG\QDPLF]Q\FK
3OLNLF]\OLMDNXFKURQLüGDQHSU]HG]JXE
101
3OLNLF]\OLMDNXFKURQLü GDQHSU]HG]JXE 3DPL üRSHUDF\MQDZ\NRU]\VW\ZDQDGRSU]HFKRZ\ZDQLDGDQ\FKSU]HWZDU]DQ\FKSU]H] SURJUDP PD GZLH ]DVDGQLF]H ZDG\ RJUDQLF]RQ SRMHPQRü L XORWQRü WR SRHW\FNLH VáRZRR]QDF]DSRSURVWX*H]DZDUWRüSDPL FLMHVWWUDFRQDZFKZLOLZ\áF]HQLD]DVLODQLD .RPSXWHUXPR*OLZLDMF\SU]HFKRZ\ZDQLHGDQ\FKZ\áF]QLHSRGF]DVZáF]HQLD GRVLHFLE\áE\UDF]HMPDáRX*\WHF]Q\GODWHJRWH*SURMHNWDQFLVSU] WXRSUDFRZDOLV]HUHJ XU]G]H — tzw. SDPL FL PDVRZ\FK — SR]ZDODMF\FK QD WUZDáH SU]HFKRZ\ZDQLH GDQ\FK 5RO SDPL FL PDVRZHM Z NRPSXWHU]H RVRELVW\P SHáQL G\VNLHWNL RUD] G\VNL WZDUGHREDUR]ZL]DQLDZ\NRU]\VWXMLGHQW\F]QPHWRG ]DSLVXLUy*QLVL UR]ZLzaniami technologicznymi). Z logicznego punktu widzenia, dane zapisywane na dyskach RUJDQL]RZDQH V Z pliki D WH ] NROHL SU]HFKRZ\ZDQH V Z katalogach &DáRFL ]DU]G]DV\VWHPRSHUDF\MQ\]NWyUHJRXVáXJNRU]\VWDMSURJUDP\X*\WNRZH Rzecz jasna, UyZQLH* L 7XUER 3DVFDO G\VSRQXMH PR*OLZRFL NRU]\VWDQLD ] SOLNyZ Z WU]HFK GRVW SQ\FK Z 3DVFDOX URG]DMyZ SOLNyZ — elementowych (jednorodnych), tekstowych i amorficznych — RPyZLP\ GZD SLHUZV]H PDMFH QDMZL NV]H ]DVWRVRwanie w praktyce. 1D SRF]WHN QLHFR WHRULL 6DP SOLN MHVW SHZQ VWUXNWXU GDQ\FK ]DSLVDQ QD G\VNX i LGHQW\ILNRZDQ]DSRPRFQD]Z\FLOHM—FLH*NLGRVW SX 'DQHSU]HFKRZ\ZDQH Z SOLNX PRJ PLHü UHSUH]HQWDFM ELQDUQ WDN VDP MDN Z SDPL FL NRPSXWHUD OXE WHNVWRZWDNMDNDX*\ZDQDMHst do wprowadzania informacji z klawiatury i wyprowaG]DQLD MHM QD HNUDQ PRQLWRUD OXE GUXNDUN 5HSUH]HQWDFMRP W\P RGSRZLDGDM Z 3DVcalu pliki elementowe oraz tekstowe. • 3OLNL HOHPHQWRZH SU]HFKRZXM GDQH Z SRVWDFL ELQDUQHM ]D SOLNL WHNVWRZH — w SRVWDFL ZLHUV]\ WHNVWX ]DNRF]RQ\FK ]QDNDPL NRFD ZLHUV]D =DZDUWRü SOLNyZHOHPHQWRZ\FKMHVWQDRJyáQLHF]\WHOQDGODX*\WNRZQLNDQDWRPLDVWWUHü SOLNX WHNVWRZHJR GDMH VL áDWZR RGF]\WDü L ]LQWHUSUHWRZDü = GUXJLHM VWURQ\ binarna reprezentacja danych jest bardziHM]ZDUWDLRV]F] GQD
102
Turbo Pascal — programowanie • :V]\VWNLHGDQHSU]HFKRZ\ZDQHZSOLNDFKHOHPHQWRZ\FKPXV]E\üWHJRVDPHJR W\SX SURVWHJR OXE VWUXNWXUDOQHJR 3OLNL WHNVWRZH Z\NRU]\VWXMFH ]QDNRZH VIRUPDWRZDQH UHSUH]HQWDFMH GDQ\FK PRJ E\ü X*\WH GR SU]HFKRZ\ZDQLD PLHV]DQ\FKW\SyZGDQ\FKQSWHNVWyZLOLF]E JG\*ZV]HONDLQIRUPDFMDSU]HFKRZ\ZDQDMHVWZQLFKZSRVWDFLWHNVWRZHM3OLNLWHNVWRZHXPR*OLZLDMUyZQLH* formatowanie zapisu i korzystanie z procedur readln i writeln NWyUH V QLHGRVW SQHGODSOLNyZHOHPHQWRZ\FK • PlikiHOHPHQWRZHXPR*OLZLDMW]ZGRVW SVZRERGQ\— w dowolnym momencie PR*QD RGZRáDü VL GR GRZROQHJR HOHPHQWX SOLNX 3OLNL WHNVWRZH V SOLNDPL o GRVW SLHVHNZHQF\MQ\PFRR]QDF]D*HDE\GRVWDüVL GRZ\EUDQHJRHOHPHQWX SOLNXQDOH*\SU]HF]\WDüZV]\VWNLHHOHPHQW\]QDMGXMFHVL SU]HGQLP 2GZRáDQLDGRSOLNX]DSLV\RGF]\W\LLQQHRSHUDFMH UHDOL]RZDQHVSU]H]Z\ZRáDQLH RGSRZLHGQLFK IXQNFML V\VWHPX RSHUDF\MQHJR NWyU\ ] NROHL SRVáXJXMH VL OLF]ERZ\PL LGHQW\ILNDWRUDPL SOLNyZ NRU]\VWDQLH ] QD]Z E\áRE\ QLHZ\JRGQH 5yZQLH* SURJUDP SDVFDORZ\QLHRGZRáXMHVL GRSOLNyZÄEH]SRUHGQLR´OHF]SRSU]H]WDN]ZDQHzmienne plikowe F]\OL ]áR*RQH VWUXNWXU\ GDQ\FK UHSUH]HQWXMFH IL]\F]QH SOLNL ]DSLVDQH QD dysku. Ogólny schemat operacji plikowej w Pascalu obejmuje cztery etapy: • VNRMDU]HQLH ]PLHQQHM SOLNRZHM ] RGSRZLHGQLP SOLNLHP ]QDMGXMF\P VL QD dysku lub nowo tworzonym); • RWZDUFLHSOLNXSU]\JRWRZXMFHJRGR]DSLV\ZDQLDOXERGF]\W\ZDQLDLQIRUPDFML • MHGQDOXEZL FHMRSHUDFML]DSLVXOXERGF]\WXGDQ\FK • ]DPNQL FLHSOLNXLSU]HUZDQLHVNRMDU]HQLDSRPL G]\]PLHQQSOLNRZLSOLNLHP 6DP]PLHQQSOLNRZGHNODUXMHVL ZVSRVyEQDVW SXMF\ nazwa : file of typ { dla pliku elementowego } nazwa : text { dla pliku tekstowego }
gdzie typ RNUHOD W\S HOHPHQWX VNáDGRZHJR SOLNX L PR*H E\ü GRZROQ\P LGHQW\fikaWRUHP W\SX SURVWHJR OXE VWUXNWXUDOQHJR ] Z\MWNLHP W\SX SOLNRZHJR L RELHNWRZHJR =DXZD* *H SRMHG\QF]\P HOHPHQWHP SOLNX HOHPHQWRZHJR MHVW QLH EDMW OHF] ZáDQLH RELHNW ]DGDQHJR W\SX FR MHVW GRü ORJLF]QH 'ODWHJR WH* GR SOLNX UHNRrdów (drugi SU]\NáDGSRQL*HM PR*HV]ZSLV\ZDüZ\áF]QLHFDáHUHNRUG\]DSLV\ZDQLHOXERGF]\W\ZDQLH SRMHG\QF]\FK SyO MHVW QLHZ\NRQDOQH D MHJR GáXJRü E G]LH ]DZV]H UyZQD wieloNURWQRFL UR]PLDUX SRMHG\QF]HJR UHNRUGX 3RGREQLH GHNODUDFMD SOLNX NWyUHJR elemenWDPL VNáDGRZ\PL V WDEOLFH OLF]E FDáNRZLW\FK ]PXVL &L GR ]DSLV\ZDQLD L odczytyZDQLD FDá\FK WDEOLF JG\* RGZRáDQLH VL GR SRMHG\QF]HJR HOHPHQWX WDEOLF\ E G]LH QLHPR*OLZH 7HQ VDP SOLN PR*QD RF]\ZLFLH RWZRU]\ü MDNR SOLN OLF]E FDáNRZLW\FK FR SR]ZROL QDP QD RGF]\W\ZDQLH SRMHG\QF]\FK ZDUWRFL : SU]\SDGNX gdy plik przechowuje jednorodne dane, deklaracja zmiennej plikowej wykorzystuje na RJyá HOHPHQW\ VNáDGRZH RGSRZLHGQLHJR W\SX SURVWHJR 'OD ED] GDQ\FK ]áR*RQ\FK ] rekordów (przechowuMF\FK GDQH Uy*Q\FK W\SyZ MHG\Q\P Z\MFLHP MHVW GHNODUDFMD pliku rekordów.
3OLNLF]\OLMDNXFKURQLüGDQHSU]HG]JXE
103
2WRNLONDSU]\NáDGRZ\FKGHNODUDFML var Probki : file of real; { plik liczb rzeczywistych } KatalogNaDysku : file of Ksiazka; { plik rekordów } KatalogTekstowy : text; { plik tekstowy }
'OD SRWU]HE QDV]HJR SURJUDPX ELEOLRWHF]QHJR PR*HP\ Z\NRU]\VWDü GUXJL OXE WU]HFL z SRZ\*V]\FK SU]\NáDGyZ 1DMSRSXODUQLHMV]\P UR]ZL]DQLHP GOD ED] GDQ\FK D QDV] SURJUDPMHVWZáDQLHSURVWED]GDQ\FK V—MDNMX*SRZLHG]LDQR— pliki rekordów, XPR*OLZLDMFH VZRERGQ\ GRVW S GR GDQ\FK L OHSV]H ]DJRVSRGDURZDQLH G\VNX -HOL MHGQDN ]DOH*\ &L QD F]\WHOQRFL SOLNX ] GDQ\PL PR*HV] Z\NRU]\VWDü UHSUH]HQWDFM w postaci pliku tekstowego. 3R ]DGHNODURZDQLX RGSRZLHGQLHM ]PLHQQHM SOLNRZHM PR*QD SU]\VWSLü GR ZáDFLZ\FK RSHUDFML]ZL]DQ\FK]]DSLV\ZDQLHPLRGF]\W\ZDQLHPGDQ\FK3U]HGHZV]\VWNLPPXVLP\VNRMDU]\ü]PLHQQSOLNRZ]IL]\F]Q\PSOLNLHP]QDMGXMF\PVL QDG\VNX6áX*\ do tego procedura assign: assign(zmienna-plikowa, nazwa-pliku) Nazwa-plikuRNUHODWXSOLNGRNWyUHJRFKFHP\VL RGZRá\ZDüáF]QLH]HZHQWXDOQ
FLH*NGRVW SXF]\OLQD]ZG\VNXNDWDORJXLHZHQWXDOQ\FKSRGNDWDORJyZ]DZLHUDMcych plik). Po wykonaniu procedury assignZV]HONLHRGZRáDQLDGR]PLHQQHMSOLNRZHM E GGRW\F]\á\VNRMDU]RQHJR]QLSOLNXRQD]ZLHNWyUHJRPR*HP\]DSRPQLHü -HVWWR GRü LVWRWQH JG\* MHGQ\P ] Eá GyZ F] VWR SRSHáQLDQ\FK SU]H] SRF]WNXMF\FK SURJUDPLVWyZ MHVW SUyED RGZRá\ZDQLD VL GR SOLNX SU]H] SRGDQLH MHJR QD]Z\ FR MHVW rzecz jasna nielegalne. 3U]\NáDGRZHVNRMDU]HQLH]PLHQQHMSOLNRZHM]SOLNLHPPR*HPLHüSRVWDü assign(KatalogNaDysku, 'c:\biblio\dane\katalog.dat')
lub (lepiej) assign(KatalogNaDysku, NazwaPliku)
: GUXJLPSU]\SDGNXQD]ZDSOLNXSU]HND]\ZDQDMHVWMDNR]PLHQQDFRXPR*OLZLDQS ZSURZDG]HQLH MHM ] ]HZQWU] Ä]DV]\FLH´ QD]Z\ ZHZQWU] SURJUDPX ]PQLHMV]D MHJR XQLZHUVDOQRü 1DVW SQ\PNURNLHPMHVWRWZDUFLHSOLNXF]\OLSU]\JRWRZDQLHJRGRRGF]\WXOXE]DSLVX .RQLHF]QRü RWZDUFLD L Sy(QLHMV]HJR ]DPNQL FLD SOLNX Z\QLND ] PHWRG REVáXJL SOLNyZ SU]\M W\FK Z V\VWHPLH RSHUDF\MQ\P NWyUHJR IXQNFMH V ]UHV]W Z W\P FHOX wykorzystyZDQH :\PLDQD LQIRUPDFML SRPL G]\ SOLNLHP D SURJUDPHP PR*OLZD MHVW dopiero po otwarciu tego ostatniego.
104
Turbo Pascal — programowanie 'ZLHPD SRGVWDZRZ\PL SURFHGXUDPL X*\ZDQ\PL Z 3DVFDOX GR RWZLHUDQLD SOLNyZ V reset i rewrite: reset(zmienna-plikowa) rewrite(zmienna-plikowa)
Procedura reset XPR*OLZLD RWZDUFLH MX* LVWQLHMFHJR SOLNXXVWDZLDMFW]ZZVND(QLN plikowy QD MHJR SRF]WNX : SU]\SDGNX JG\ RWZLHUDQ\ SOLN QLH LVWQLHMH Z\ZRáDQLH SURFHGXU\ UHVHW NRF]\ VL Eá GHP Z\NRQDQLD = NROHL rewrite XPR*OLZLD RWZDUFLH SOLNXQLH]DOH*QLHRGWHJRF]\LVWQLDáRQSRSU]HGQLRMHOLQLH— tworzy ona nowy plik o GDQHM QD]ZLH ]D MHOL WDN — ]HUXMH GáXJRü LVWQLHMFHJR SOLNX L XVWDZLD ZVND(QLN SOLNRZ\ QD MHJR SRF]WNX F]HJR HIHNWHP Mest utracenie wszystkich danych zawartych w pliku :DUWR SDPL WDü *H Z SU]\SDGNX SOLNyZ WHNVWRZ\FK SURFHGXUD reset otwieUD SOLN Z\áF]QLH GR RGF]\WX ]D rewrite — Z\áF]QLH GR ]DSLVX QLH PD]DWHPPR*OLZRFLPLHV]DQLDRGF]\WyZL]DSLVyZZMHGQ\PF\NOXRWZDUFLD =DVDGD WDQLHRERZL]XMHGODSOLNyZHOHPHQWRZ\FKNWyUHPR*QDRGF]\W\ZDüL]DSLV\ZDüEH] ograQLF]H QLH]DOH*QLH RG WHJR F]\ ]RVWDá\ RWZDUWH ]D SRPRF SURFHGXU\ reset, czy rewriteZW\PRVWDWQLPSU]\SDGNXWU]HEDQDMSLHUZ]DSLVDüGRSOLNXMDNLHGDQH 6DPZVND(QLNSOLNRZ\MHVWSRSURVWXNROHMQ\PQXPHUHPHOHPHQWXQLHEDMWX ZSOLNX SU]\ F]\P QXPHUDFMD UR]SRF]\QD VL RG ]HUD .D*GD RSHUDFMD RGF]\WX OXE ]DSLVX SRZRGXMHSU]HVXQL FLHZVND(QLNDRZDUWRüUyZQOLF]ELHRGF]\WDQ\FKOXE]DSLVDQ\FK HOHPHQWyZSU]\F]\PGODSOLNyZRGRVW SLHVZRERGQ\PHOHPHQWRZ\FK PR*OLZHMHVW UyZQLH* MHJR GRZROQH SU]HVWDZLDQLH QDZHW SR]D NRQLHF SOLNX FKRü PD WR PDá\ VHQV i QDMF] FLHMSRZRGXMHEá G\Z\NRQDQLD 7U]HFL SURFHGXU RWZLHUDMF GRVW SQ Z\áF]QLH GOD plików tekstowych, jest
Append3URFHGXUDWDRWZLHUDSOLNGRGRSLV\ZDQLDWMRWZLHUDJRGR]DSLVXQLHQLV]F]F
poprzedQLHM ]DZDUWRFL L XVWDZLD ZVND(QLN SOLNRZ\ QD MHJR NRFX 8PR*OLZLD WR dodawanie danych do plików tekstowych, które —MDNRSOLNLRGRVW SLHVHNZHQF\MQ\P —QLHXPR*OLZLDMSURJUDPRZHJRSU]HVWDZLDQLDZVND(QLNDSOLNRZHJR 'R Z\PLDQ\ GDQ\FK SRPL G]\ SURJUDPHP D SOLNLHP VáX* ]QDQH QDP MX* SURFHGXU\
read (odczyt) i write]DSLV 3RQLHZD*ZÄVWDQGDUGRZHM´ZHUVMLREVáXJXMRQHHNUDQ
monitora i NODZLDWXU QLH]E GQH MHVW SRGDQLH GRGDWNRZHJR DUJXPHQWX RNUHODMFHJR SOLN ]GR NWyUHJR LQIRUPDFMD PD E\ü RGF]\WDQD OXE ]DSLVDQD $UJXPHQWHP W\P MHVW ZáDQLHQD]ZDRGSRZLHGQLHM]PLHQQHMSOLNRZHM read(zmienna-plikowa, lista-elementów) write(zmienna-plikowa, lista-elementów)
3RZ\*V]H RSHUDFMH RGQRV] VL ]DUyZQR GR SOLNyZ HOHPHQWRZ\FK MDN L WHNVWRZ\FK 'ODW\FKRVWDWQLFKPR*OLZHMHVWSRQDGWRX*\FLHSURFHGXU readln i writeln, odczytuMF\FKOXE]DSLVXMF\FKGDQHZUD]]H]QDNDPLNRFDZLHUV]D3RQLHZD*SOLNi elemenWRZHSU]HFKRZXMZ\áF]QLHGDQHRNUHORQHJRW\SXLQLHPRJ]DZLHUDü]QDNyZNRFD ZLHUV]D X*\FLH SURFHGXU readln i writeln MHVW Z LFK SU]\SDGNX QLHOHJDOQH 'UXJ LVWRWQ Uy*QLF MHVW ]DZDUWRü listy-elementów. W przypadku plików tekstowych OLVWDWDPR*H]DZLHUDüGRZROQH]PLHQQHVWDáHLZ\UD*HQLDJG\*ZV]\VWNLH]DSLV\ZDQH VZ SOLNXZSRVWDFLWHNVWX QDWRPLDVWGODSOLNyZHOHPHQWRZ\FKMHMVNáDGQLNDPLPRJ
3OLNLF]\OLMDNXFKURQLüGDQHSU]HG]JXE
105
E\üZ\áF]QLH]PLHQQHRGSRZLHGQLHJRW\SX']LHMHVL WDNGODWHJR*HSOLNHOHPHQWRZ\ PR*H]DZLHUDüZ\áF]QLHGDQHMHGQHJRW\SX]DSRV]F]HJyOQHHOHPHQW\OLVW\SU]HND]\ZDQHVSU]H]QD]Z 3RZ\NRQDQLX*GDQ\FKRSHUDFML]DSLVXLRGF]\WXGDQ\FKSOLNQDOH*\]DPNQü. Ta barG]RZD*QDRSHUDFMDMHVWLJQRURZDQDSU]H]ZLHOXSURJUDPLVWyZFRZHIHNFLHSURZDG]L GRSU]\NU\FKQLHVSRG]LDQHNZSRVWDFL]JXELRQ\FKGDQ\FK8SRGáR*DFDáHJRSUREOHPX OH*\WDN]ZDQHbuforowanie operacji dyskowychF]\OLWHFKQLNDSROHJDMFDQDRGF]\W\ZDQLXL]DSLV\ZDQLXGDQ\FKQLHSRMHG\QF]ROHF]FDá\PLSDF]NDPL]DSRUHGQLFWZHP VSHFMDOQHJRREV]DUXSDPL FL— tzw. bufora dyskowego. Wykorzystanie bufora pozwala na zredukowanie liczby fizycznych odczytów i zapisów na dysku, a przez to zmniejV]HQLH MHJR PHFKDQLF]QHJR REFL*HQLD L SRSUDZ Z\GDMQRFL RSHUDFML G\VNRZ\FK 3RQLHZD* MHGQDN SRGF]DV ]DSLVX ]DZDUWRü EXIRUD Z\V\áDQD MHVW QD G\VN GRSLHUR SR MHJR]DSHáQLHQLXOXEZFKZLOL]DPNQL FLDSOLNX SU]HUZDQLHZ\NRQ\ZDQLDSURJUDPX PR*HVSRZRGRZDüXWUDW GDQ\FK5yZQLH*SRSUDZQH]DNRF]HQLHSURJUDPXSRZRGXMH co prawda automatyczne zamkni FLH RWZDUW\FK SOLNyZ QLH RSUy*QLD MHGQDN EXIRUyZ SU]HFKRZXMF\FKQLH]DSLVDQHMHV]F]HGDQHFRPR*HVSRZRGRZDüLFKXWUDW :SU]\SDGNXJG\SOLNZ\NRU]\VW\ZDQ\MHVWZ\áF]QLHGRRGF]\WXGDQ\FKQLH]DPNQL FLHQLH SRZRGXMH XWUDW\ LQIRUPDFML FR QLH ]QDF]\ *H PR*QD MH VRELH RGSXFLü ERZLHP OHQLVWZRWDNLH]Z\NOHPFLVL ZQDMPQLHMVWRVRZQ\FKRNROLF]QRFLDFK 3DPL WDM]DPNQL FLHSOLNXMHVWSUDNW\F]QLHjedynym sposobem na bezpieczne zapisanie w nim wszystkich danych. 1DV]F] FLH]DPNQL FLHSOLNXMHVWEardzo proste. Realizuje je procedura close: close(zmienna-plikowa)
-HMZ\ZRáDQLHPDW VDPIRUP GODZV]\VWNLFKURG]DMyZSOLNyZ 7\OHWHRULL$E\ZSURZDG]LüMZ*\FLHVSUyEXMP\QDSLVDü]HVWDZSURFHGXUSR]ZDODMF\FK QD ]DSLVDQLH QDV]HJR NDWDORJX Z SOLNX G\VNRZ\P L RGF]\WDQLH JR ] SOLNX =JRGQLH]W\PFRSRZLHG]LHOLP\ZF]HQLHMGRSU]HFKRZ\ZDQLD]DZDUWRFLNDWDORJX wykorzystamy plik elementowy typu file of record. procedure ZapiszNaDysku(NazwaPliku : string); var f : file of Ksiazka; i : integer; begin DVVLJQI1D]ZD3OLNX ^VNRMDU]SOLN]H]PLHQQSOLNRZ` rewrite(f); { otwórz (utwórz) plik } for i := 1 to LbPoz do { zapisz kolejne rekordy } write(f, Katalog[i]); close(f); { zamknij plik } end;
106
Turbo Pascal — programowanie 3RZ\*V]D SURFHGXUD LOXVWUXMH W\SRZ PHWRG ]DSLV\ZDQLD Z SOLNX ]DZDUWRFL ED]\ GDQ\FK3RVNRMDU]HQLXSOLNX]RGSRZLHGQL]PLHQQLRWZDUFLXJR]DSLVXMHP\NROHMQH UHNRUG\ ]QDMGXMFH VL Z WDEOLF\ ]ZUyü XZDJ *H UHNRUG\ ]DSLV\ZDQH V Z FDáRFL a nie polami). Po zapisDQLXZáDFLZHMOLF]E\UHNRUGyZ]DP\NDP\SOLNLWRZV]\VWNR 0XVLV] MHV]F]H ]GDZDü VRELH VSUDZ *H ND*GH RWZDUFLH E G]LH SRZRGRZDáR XWUDW SRSU]HGQLHM ]DZDUWRFL SOLNX rewrite DOH SRQLHZD* SU]HG FKZLO QLHMDZQLH ]DáR*\OLP\*HND*GRUD]RZR]DSLVXMHP\FDá\NDWDORJMHVWWRGRSU]\M FLD 2GF]\WDQLH ]DZDUWRFL NDWDORJX ] SOLNX SU]HELHJD ZHGáXJ QLHFR LQQHJR VFKHPDWX 3RQLHZD*QLHZLHP\LOHUHNRUGyZPDP\ZáDFLZLHRGF]\WDüQLHPR*HP\]DVWRVRZDü S WOL for 1DMSRSXODUQLHMV]\P UR]ZL]DQLHP MHVW F]\WDQLH Nolejnych rekordów do PRPHQWXQDSRWNDQLDNRFDSOLNXFRZ\NU\ZDQHMHVWSU]H]SURFHGXU eof (ang. end-offile —NRQLHFSOLNX -DNQLHWUXGQRVL GRP\OLüW\PUD]HP]DVWRVXMHP\S WO while (lub repeat): procedure OdczytajZDysku(NazwaPliku : string); var f : file of Ksiazka; i : integer; begin DVVLJQI1D]ZD3OLNX ^VNRMDU]SOLN]H]PLHQQSOLNRZ` UHVHWI ^RWZyU]SOLNPXVLLVWQLHü ` i := 0; { wyzeruj licznik rekordów } while not eof(f) do^F]\WDMD*GRNRFDSOLNX` begin Inc(i); { kolejny rekord } read(f, Katalog[i]); end; LbPoz := i; { wczytano tyle rekordów } close(f); end;
3R]RVWDáH RSHUDFMH Z\NRQ\ZDQH Z SURFHGXU]H V SUDNW\F]QLH WDNLH VDPH MHG\QLH GR RWZDUFLD SOLNX Z\NRU]\VWXMHP\ W\P UD]HP SURFHGXU reset =DXZD* *H NRQVWUXNFMD procedur ZapiszNaDysku i OdczytajZDysku przewiduje przekazanie nazwy pliku MDNR SDUDPHWUX FR ] NROHL SR]ZDOD QD LFK X*\FLH EH] NRQLHF]QRFL ND*GRUD]RZHJR NRPXQLNRZDQLDVL ]X*\WNRZQLNLHPQD]Z PR*QDÄ]DV]\ü´ZSURJUDPLHMDNRVWDá -HGQ\P]PR*OLZ\FKLF] VWRVWRVRZDQ\FK UR]ZL]DNZHVWLL]DSDPL W\ZDQLDGDQ\FK MHVW ND*GRUD]RZH ]DSLV\ZDQLH FDáHM ED]\ Z FKZLOL ]DNRF]HQLD SURJUDPX L RGF]\W\ZDQLHMHM]DUD]SRXUXFKRPLHQLX:W\PFHOXZ\VWDUF]\QDSRF]WNXF] FLRSHUDF\MQHM SU]HGZ\ZRáDQLHPPHQX ZVWDZLüLQVWUXNFM
OdczytajZDysku(PLIK_KATALOGU);
]DSU]HGVDP\PNRFHPSURJUDPXGRSLVDü ZapiszNaDysku(PLIK_KATALOGU);
SU]\F]\PVWDáPLIK_KATALOGUQDOH*\ZF]HQLHM]GHILQLRZDüMDko np. PLIK_KATALOGU = 'Katalog.dat'
3OLNLF]\OLMDNXFKURQLüGDQHSU]HG]JXE
107
0HWRGD WD SR]ZDOD QD ND*GRUD]RZH ]DSDPL W\ZDQLH WUHFL NDWDORJX SR ]DNRF]HQLX SURJUDPX L MHM RGWZDU]DQLH QD SRF]WNX NROHMQHM VHVML EH] NRQLHF]QRFL SRGDZDQLD QD]Z\ SOLNX XZDJD SU]HG SLHUZV]\P XUXFKRPLHQLHP SURJUDPX PXVLV] XWZRU]\ü pusty plik o nazwie KATALOG.DAT, w przeciwnym przypadku próba otwarcia nie SRZLHG]LH VL ,QQ\P VSRVREHP MHVW X]XSHáQLHQLH PHQX R SROHFHQLD ]DSLVX L RGF]\WX GDQ\FKFRMHGQDNZL*HVL ]NRQLHF]QRFLZ\ZRá\ZDQLDRGSRZLHGQLFKSROHFH-HOi ZUHV]FLHFKFHV]GDüX*\WNRZQLNRZLPR*OLZRü]PLDQ\QD]Z\SOLNX]GDQ\PLPXVLV] X]XSHáQLüSURJUDPRRGSRZLHGQLHLQVWUXNFMHZF]\WXMFHM]NODZLDWXU\ 'R SU]HFKRZ\ZDQLD GDQ\FK PR*QD UyZQLH* Z\NRU]\VWDü SOLN WHNVWRZ\ MHGQDN RSHUDFMHRGF]\WXL]DSLVXE GQLHFREDUG]LHMVNRPSOLNRZDQH:\PLDQDGDQ\FK]SOLNLHP WHNVWRZ\P RGE\ZD VL WDN VDPR MDN ] PRQLWRUHP L NODZLDWXU D ZL F SRV]F]HJyOQH SRODUHNRUGyZQDOH*\]DSLV\ZDüLRGF]\W\ZDüLQG\ZLGXDOQLH:]DPLDQ]DWRX]\VNXMHP\ PR*OLZRü áDWZHJR REHMU]HQLD WUHFL SOLNX JG\* ]DZLHUD RQ Z\áF]QLH WHNVW a WDN*HVNLHURZDQLDOXERGF]\WDQLD GDQ\FKGR] MHGQHJR]HVWDQGDUGRZ\FKXU]G]H Z\MFLDZHMFLD REVáXJLZDQ\FKSU]H]V\VWHPRSHUDF\MQ\QSGUXNDUNL 2WRSU]\NáDG SURFHGXU\ ]DSLVXMFHM NDWDORJ GR SOLNX WHNVWRZHJR RSHUDFM RGF]\WX PR*HV] ]UHDOL]RZDüZUDPDFKüZLF]H procedure ZapiszNaDysku(NazwaPliku : string); var f : text; { tym razem plik tekstowy } i : integer; begin DVVLJQI1D]ZD3OLNX ^VNRMDU]SOLN]H]PLHQQSOLNRZ` rewrite(f); { utwórz plik } for i := 1 to LbPoz do { zapisz kolejne rekordy } with Katalog[i] do^Z\SURZDG(SRV]F]HJyOQHSRODUHNRUGX` begin writeln(f, 'Pozycja katalogu: ', i); writeln(f, 'Tytul: ', Tytul); writeln(f, 'Autor: ', Autor); if Wypozyczajacy = '' then^QLNWQLHZ\SR*\F]\á` writeln(f, 'Ksiazka znajduje sie na polce.') else^SROH]DZLHUDQD]ZLVNRZ\SR*\F]DMFHJR` writeln(f, 'Wypozyczajacy: ', Wypozyczajacy); writeln(f); end; close(f); { zamknij plik } end;
6SRVyE]DSLVDQLDWUHFLUHNRUGXGRSOLNXSU]\SRPLQDSURFHGXU WypiszDane (zobacz SRSU]HGQLUR]G]LDá ]W\P*HND*GDLQVWUXNFMD write(ln X]XSHáQLRQDMHVWRVSHF\ILNDFM ]PLHQQHMSOLNRZHMQS writeln(f, 'Autor: ', Autor);
108
Turbo Pascal — programowanie 2GF]\W\ZDQLHGDQ\FK]SOLNyZWHNVWRZ\FKQDVWU F]DQLHFRZL FHMNáRSRWyZ]ZáDV]F]D JG\SOLN]DZLHUDLQIRUPDFMHPLHV]DQ\FKW\SyZWHNVWLOLF]E\ &HQ]DÄOX(Q\´IRUPDW ]DSLVXMHVWQDMF] FLHMNRQLHF]QRüWZRU]HQLDVNRPSOLNRZDQ\FKSURFHGXUUHDOL]XMF\FK NRQZHUVMHW\SyZLVSUDZG]DQLHSRSUDZQRFLGDQ\FK 1DV]F] FLHSOLNLWHNVWRZHSRVLDGDMUyZQLH*]DOHW\MHGQ]QLFKMHVWZáDQLHF]\WHOQ\ IRUPDW 3RQLHZD*VWDQGDUGRZHXU]G]HQLDZ\MFLRZHVZV\VWHPLH'26REVáXJLZDQH WDN VDPR MDN SOLNL WHNVWRZH DE\ Z\SURZDG]Lü WUHü NDWDORJX QD HNUDQ W]Z NRQVRO RSHUDWRUVN Z\VWDUF]\QDVW SXMFHZ\ZRáDQLH ZapiszNaDysku('con');
]DDE\Z\GUXNRZDüNDWDORJQDGUXNDUFHPXVLV]X*\üZ\ZRáDQLD ZapiszNaDysku('prn');
gdzie con i prnVQD]ZDPLV\VWHPRZ\FKXU]G]HZ\MFLDNRQVROLLGUXNDUNL 1D NRQLHF ZUyFLP\ QD FKZLO GR SOLNyZ HOHPHQWRZ\FK E\ SRZLHG]LHü NLOND VáyZ o PHWRGDFK UHDOL]RZDQLD VZRERGQHJR GRVW SX GR GDQ\FK %LH*F\ HOHPHQW SOLNX WM HOHPHQWNWyUHJRGRW\F]\áDE G]LHNROHMQDLQVWUXNFMDread lub write) wskazywany jest SU]H]ZVSRPQLDQ\MX*ZVND(QLNSOLNRZ\:\ZRáDQLH Seek(zmienna-plikowa, numer-elementu)
SRZRGXMHXVWDZLHQLHZVND(QLNDSOLNRZHJRWDNE\NROHMQDRSHUDFMDRGF]\WXOXE]DSLVX UR]SRF] áDVL RGHOHPHQWXGDQHJR numerem-elementu (elHPHQW\QXPHURZDQHVRG ]HUD 'RGDWNRZ\PL IXQNFMDPL Z\NRU]\VW\ZDQ\PL SRGF]DV PDQLSXORZDQLD ZVND(niNLHPSOLNRZ\PVFilePos]ZUDFDMFDMHJRELH*FZDUWRüRUD]FileSize, zwracaMFDUR]PLDUSOLNX7DNZL F—]DNáDGDMF*H f jest plikiem typu file of integer —Z\ZRáDQLH Seek(f, FileSize(f));
XVWDZLZVND(QLNSOLNRZ\]DRVWDWQLPHOHPHQWHPSOLNXF]\OLSU]\JRWXMHSOLNGRGRSLV\ZDQLD ]DNRQVWUXNFMD for i := 1 to 10 do begin Seek(f, random(FileSize(f)); read(f, i); writeln(i); end;
odczyWD ] SOLNX G]LHVL ü ORVRZR Z\EUDQ\FK OLF]E IXQNFMD random(k) ]ZUDFD OLF]E SVHXGRSU]\SDGNRZ]]DNUHVXRG]HUDGRk LZ\ZLHWOLMHQDHNUDQLH 6ZRERGQ\GRVW SGRGDQ\FKFKRFLD*EDUG]RSU]\GDWQ\QLHSRZLQLHQE\üQDGX*\ZDQ\ :V]HONLHRSHUDFMHQDSOLNDFKV]QDF]QLHEDUG]LHMF]DVRFKáRQQHQL*RSHUDFMHQDGDQ\FK XPLHV]F]RQ\FK Z SDPL FL ]D RSHUDFMH Z WU\ELH VHNZHQF\MQ\P V ]QDF]QLH V]\EV]H QL* Z WU\ELH GRVW SX VZRERGQHJR 1LH]DOH*QLH RG W\FK XZDJ PXVLV] SDPL WDü *H ZV]HONLHPDQLSXODFMHQD]DZDUWRFLSOLNyZZL*VL ]U\]\NLHPXWUDW\GDQ\FKZSU]\SDGNX DZDULL V\VWHPX QS Z\áF]HQLD ]DVLODQLD 'ODWHJR WH* SOLNL QDOH*\ ]DP\NDü EH]SRUHGQLRSRZ\NRQDQLXQLH]E GQ\FKF]\QQRFL
3OLNLF]\OLMDNXFKURQLüGDQHSU]HG]JXE
109
=DSDPL WDM • 'RWUZDáHJRSU]HFKRZ\ZDQLDLQIRUPDFMLZV\VWHPLHNRPSXWHURZ\PVáX*SOLNL • 7XUER3DVFDOXPR*OLZLDREVáXJ SOLNyZHOHPHQWRZ\FKWHNVWRZ\FKRUD]DPRUficznych. • 3OLNL HOHPHQWRZH VNáDGDM VL ] HOHPHQWyZ WHJR VDPHJR W\SX SURVWHJR OXE VWUXNWXUDOQHJR /LF]EDHOHPHQWyZMHVW]DZV]HFDáNRZLWD • 3OLNLWHNVWRZH]DZLHUDMGDQHUHSUH]HQWRZDQHZSRVWDFLZLHUV]\WHNVWX0R*QD LFKX*\ZDüGRSU]HFKRZ\ZDQLDGDQ\FKUy*Q\FKW\SyZ • 3OLNL HOHPHQWRZH XPR*OLZLDM GRVW S VZRERGQ\ QDWRPLDVW SOLNL WHNVWRZH SR]ZDODMZ\áF]QLHQDGRVW SVHNZHQF\MQ\ • 3OLN UHSUH]HQWRZDQ\ MHVW Z SURJUDPLH SU]H] ]PLHQQ SOLNRZ NWyU QDOH*\ VNRMDU]\ü]IL]\F]Q\PSOLNLHP]DSRPRFSURFHGXU\assign. • 2SHUDFMH QD ]DZDUWRFL SOLNX PXV] E\ü SRSU]HG]RQH MHJR RWZDUFLHP reset lub rewrite) i ]DNRF]RQH]DPNQL FLHP (close). • 6ZRERGQ\ GRVW S GR HOHPHQWyZ SOLNX XPR*OLZLD SURFHGXUD Seek XVWDZLDMFD ZVND(QLNSOLNRZ\QD]DGDQHMSR]\FML • 0HFKDQL]P\ REVáXJL SOLNyZ WHNVWRZ\FK XPR*OLZLDM SU]HV\áDQLH GDQ\FK QLH W\ONR QD G\VN OHF] UyZQLH* ] L GR VWDQGDUGRZ\FK XU]G]H ZHMFLD-Z\MFLD systemu operacyjnego.
110
Turbo Pascal — programowanie
àDFXFK\ 'DQH WHNVWRZH PDM — obok grafiki — QDMZL NV]\ XG]LDá Z REM WRFL LQIRUPDFML SU]HWZDU]DQHMLSU]HFKRZ\ZDQHMZHZVSyáF]HVQ\FKV\VWHPDFKNRPSXWHURZ\FK=WHJR WH*Z]JO GXND*G\V]DQXMF\VL M ]\NZ\VRNLHJRSR]LRPXMHVWZ\SRVD*RQ\ZPHFKDnizP\ SR]ZDODMFH QD UHSUH]HQWRZDQLH SU]Hchowywanie i przetwarzanie tekstów. W 7XUER3DVFDOXVáX*\GRWHJRW\SáDFXFKRZ\string NWyU\P]DMPLHP\VL ZW\P UR]G]LDOH 'RZROQ\ WHNVW áDFXFK DQJ string) przechowywany jest w programie w SRVWDFLFLJX]QDNyZNWyU\PR*HE\üLQWHUSUHWRZDQ\MDNRVSHF\ILF]QDWDEOLFD array[0..255] of char
3U]\NáDGRZDGHNODUDFMD]PLHQQHMáDFXFKRZHMPDSRVWDü var Napis : string;
6WDáHáDFXFKRZH]DSLVXMHVL QDWRPLDVWZSRVWDFLFLJyZ]QDNyZXM W\FKZDSRVWURI\ SRGREQLHMDNVWDáH]QDNRZH const STALY_NAPIS = 'Turbo Pascal';
=HURZ\ HOHPHQW áDFXFKD SU]HFKRZXMH MHJR DNWXDOQ GáXJRü W]Z GáXJRü G\QDPLF]Q E GF W\SX ]QDNRZHJR PR*H RQ SU]\MPRZDü ZDUWRFL RG GR 6WG ZáDQLH Z\QLND RJUDQLF]HQLH GáXJRFL áDFXFKD GR ]QDNyZ FR ]UHV]W Z ZL NV]RFLSU]\SDGNyZZ\VWDUF]DD*QDGWR$E\ÄVNUyFLü´áDFXFKGDQDW\SX string ]DMPXMH ]DZV]H EDMWyZ QLH]DOH*QLH RG U]HF]\ZLVWHM GáXJRFL WHNVWX PR*QD Z\NRU]\VWDüGHNODUDFM
nazwa-zmiennej : string>GáXJRü@
0R*OLZRü WD MHVW V]F]HJyOQLH FHQQD MHOL Z SURJUDPLH Z\NRU]\VWXMHV] QS WDEOLF áDFXFKyZ GHNODUXMF HOHPHQW VNáDGRZ\ WDEOLF\ MDNR string[20] RV]F] G]DV] EDMWyZ FR SU]\ VWX HOHPHQWDFK GDMH ]\VN SRQDG N% :DUWR ]DXZD*\ü *H SUyED ]DSLVDQLD GR ÄVNUyFRQHJR´ áDFXFKD WHNVWX GáX*V]HJR QL* SR]ZDOD GHNODUDFMD QLH VSRZRGXMHEá GXDMHG\QLHREFL FLHQDGPLDURZ\FK]QDNyZ
àDFXFK\
111
2SHUDFMH QD áDFXFKDFK Z ]DVDG]LH QLH Uy*QL VL ]DSLVHP RG RSHUDFML QD ]PLHQQ\FK W\SX SURVWHJR L QLH Z\PDJDM VWRVRZDQLD *DGQ\FK VSHFMDOQ\FK V]WXF]HN 'R ZSURZDdzania, wyprowadzania i przypLV\ZDQLD áDFXFKyZ Z\NRU]\VWXMH VL — podobnie jak dla zmiennych typów prostych — procedury read(ln), write(ln) oraz operator SU]\SLVDQLD5yZQLH*SRUyZQDQLHGZyFKáDFXFKyZ]DSLV\ZDQHMHVWLGHQW\F]QLHSU]\ F]\PÄZHZQ WU]QLH´RGE\ZDVL RQRSU]H]SRUyZQDQLHNRGyZRGSRZLDGDMF\FKVRELH ]QDNyZ7DNZL F 'C' < 'Pascal'
(kod ASCII znaku 'C' jest mniejszy od kodu 'P')
'c' > 'Pascal'
NRG$6&,,]QDNX F MHVWZL NV]\RGNRGX 3
'C' > ''
GRZROQ\áDFXFKMHVWZL NV]\RGáDFXFKDSXVWHJR
Z rzeczy prostych pozRVWDáRMHV]F]HGRGDZDQLHáDFXFKyZSROHJDMFHQDLFK]Z\Ná\P ÄVNOHMDQLX´ QLHVWHW\ áDFXFKyZ QLH GD VL RGHMPRZDü PQR*\ü DQL G]LHOLü -H*HOL zmienna lancuch1 zawiera tekst 'Turbo' ]D lancuch2 — tekst 'Pascal', to wynikiem sklejenia obu zmiennych: wynik := lancuch1 + lancuch2;
E G]LHRF]\ZLFLHWHNVW'TurboPascal'. 5yZQLH* RGZRáDQLD GR SRV]F]HJyOQ\FK ]QDNyZ áDFXFKD UHDOL]XMH VL Z VSRVyE HOHPHQWDUQ\3RQLHZD*PR*HRQE\üWUDNWRZDQ\MDNRWDEOLFD]QDNyZLQVWUXNFMD s[5] := 'x'
wstawi znak xQDSLWSR]\FM ZáDFXFKXs. %DUG]LHM Z\P\OQH RSHUDFMH QD áDFXFKDFK Z\PDJDM X*\FLD VSHFMDOQLH GR WHJR FHOX SU]H]QDF]RQ\FKIXQNFML]NWyU\FKQDMZD*QLHMV]HRSLVDQRSRQL*HM Length(s)
— zZUDFDELH*FGáXJRüáDFXFKDs;
Concat(s1, s2)
— sNOHMDáDFXFK\s1 i s2 (podobnie, jak operator +)
Copy(s, m, n)
— zZUDFDSRGáDFXFKRGáXJRFL m]QDNyZZ\FL W\]áDcucha sSRF]\QDMFRGSR]\FMLn;
Pos(ch, s)
— zZUDFDQXPHUSR]\FMLQDNWyUHMZáDFXFKX s znajduje VL ]QDNch;
Delete(s, m, n) — usuwa n]QDNyZ]áDFXFKDs poc]\QDMFRGSR]\FMLm.
-DN SRZLHG]LDQR Z\*HM DNWXDOQ GáXJRü áDFXFKD PR*QD RGF]\WDü IXQNFM Length OXE SU]H] EH]SRUHGQLH RGZRáDQLH GR ]HURZHM NRPyUNL áDFXFKD $E\ ]PLHQLü GáXJRüG\QDPLF]QáDFXFKDPXVLV]X*\üNRQVWUXNFML s[0] := chr[n]
gdzie n MHVW *GDQ GáXJRFL SRQLHZD* áDFXFK VNáDGD VL ]H ]QDNyZ PXVLP\ SU]HNV]WDáFLü OLF]E n QD RGSRZLDGDMF\ MHM ]QDN IXQNFM chr 3RQLHZD* RSHUDFMD WD F]DVHPSU]\QRVLQLH]E\WSR*GDQHHIHNW\OHSLHMMHMXQLNDü
112
Turbo Pascal — programowanie 3U]\WRF]RQ\ SRQL*HM SURJUDP Lancuchy demonstruMH QLHNWyUH PR*OLZRFL REUyENL áDFXFKyZ L Z ]DVDG]LH QLH Z\PDJD GRGDWNRZHJR NRPHQWDU]D 3R]D Z\ZRáDQLDPL RSLVDQ\FK Z\*HM SURFHGXU ]QDOD]áD VL Z QLP UyZQLH* IXQNFMD UpCase, SU]HNV]WDáFDMFD PDá OLWHU DOIDEHWX QD GX* 2SHUXMH RQD FR SUDZGD QD W\SLH ]QDNRZ\P MHGQDN W\SRZH MHM ]DVWRVRZDQLH VSURZDG]D VL GR NRQZHUVML FDá\FK áDFXFKyZMDNSRND]DQRQL*HM program Lancuchy; ^'HPRQVWUDFMDRSHUDFMLQDáDFXFKDFK` const TP = 'Turbo Pascal to bomba'; var s1, s2 : string; i : integer; begin s1 := TP; { przypisanie } V
^MZáDFXFKSXVW\` for i := 1 to Length(s1) do V V ^GRGDZDQLHáDFXFKyZ]QDNyZ` writeln(s1); i := Pos('a', s1); { wyszukanie znaku } s2[i] := '^'; { wstawienie znaku } ZULWHOQV ^LFR]WHJRZ\QLNáR"` 'HOHWHV ^XVXQL FLHF] FLáDFXFKD` writeln(s1); for i := Length(s1) downto 1 do^Z\SLVDQLHáDFXFKD` ^RGW\áX` write(s1[i]); writeln; for i := 1 to Length(s1) do { zamiana naGX*H]QDNL` write(UpCase(s1[i])); writeln; V &RS\73 ^Z\FL FLHSRGáDFXFKD` for i := Length(s1) downto 1 do begin writeln(s1); 'HFV>@ ^VNUDFDQLHáDFXFKD` end; end.
1D]DNRF]HQLHWHJRUR]G]LDáXZVSRPQLP\RDOWHUQDW\ZQHMPHWRG]LHUHSUH]HQWRZDQLD danych tekstowych — tak zwanych áDFXFKDFK ]DNRF]RQ\FK ]HUHP (ang. nullterminated string ]ZDQ\FKWH*$6&,,=àDFXFK$6&,,=SRGREQLHMDN string) jest ]Z\NáWDEOLF]QDNyZMHGQDNQLHSRVLDGDSRODSU]HFKRZXMFHJRGáXJRüZ]DPLDQ]D
àDFXFK\
113
WR MHJR NRQLHF V\JQDOL]RZDQ\ MHVW ]QDNLHP R NRG]LH QLH P\OLü ]H ]QDNLHP Ä´ (IHNW\ZQDSRMHPQRüáDFXFKD$6&,,=RJUDQLF]RQDMHVWZLHONRFLGRVW SQHMSDPL FL ZSUDNW\FHGRN% DZL FMHVW]QDF]QLHZL NV]DQL*GODW\SXstring. àDFXFK\ $6&,,= GRVW SQH SRF]ZV]\ RG ZHUVML 7XUER 3DVFDOD GHNODURZDQH V MDNR]Z\NáHWDEOLFH]QDNyZLQGHNVRZDQHRG]HUDQS var BardzoDlugiLancuch : array[0..10000] of char;
(OHPHQWDUQD REVáXJD áDFXFKyZ $6&,,= ZF]\W\ZDQLH Z\SURZDG]DQLe, przypisywaQLH UHDOL]RZDQDMHVWWDNVDPRMDNGOD]Z\Ná\FKáDFXFKyZSRGZDUXQNLHPZáF]HQLD W]ZUR]V]HU]RQHMVNáDGQLG\UHNW\ZNRPSLODWRUD {$X+} (Options-Compiler-Extended Syntax %DUG]LHM ]áR*RQH RSHUDFMH QD áDFXFKDFK $6&,,= NRSLRZDQLH porównywanie, przeszukiwanie, konwersja do typu stringLYLFHYHUVD UHDOL]RZDQHV przez procedury zawarte w module bibliotecznym StringsRPRGXáDFKZNUyWFH LQLH E G WX RPDZLDQH :DUWR ZUHV]FLH ZVSRPQLHü R W\SLH ZVND(QLNRZ\P PChar, XPR*OLZLDMF\P PDQLSXORZDQLH QD G\QDPLF]QLH WZRU]RQ\FK L XVXZDQ\FK áDFXFKDFK ASCIIZ. 3RQLHZD* Z ZL NV]RFL SU]\SDGNyZ W\S string ]QDNRPLFLH VSHáQLD VZRMH ]DGDQLH SRSU]HVWDQLHP\QDSRZ\*V]\FKZ]PLDQNDFKRGV\áDMF]DLQWHUHVRZDQ\FK&]\WHOQLNyZ GRV\VWHPXSRPRF\LOLWHUDWXU\>@:QDVW SQ\PUR]G]LDOH]DMPLHP\VL SUREOHPHP EUDNX SDPL FL F]\OL ZVSRPQLDQ\P SU]HG FKZLO G\QDPLF]Q\P WZRU]HQLHP L XVXwaniem zmiennych.
=DSDPL WDM • 'R SU]HFKRZ\ZDQLD GDQ\FK WHNVWRZ\FK QDSLVyZ VáX*\ Z 7XUER 3DVFDOX W\S string. • àDFXFK W\SX string jesW VSHF\ILF]Q WDEOLF R SRMHPQRFL GR ]QDNyZ SU]\ F]\P ELH*FD GáXJRü áDFXFKD SU]HFKRZ\ZDQD MHVW Z ]HURZHM NRPyUFH tablicy. • =DNUHV SRGVWDZRZ\FK RSHUDFML QD áDFXFKDFK REHMPXMH ZSURZDG]DQLH Z\SURwaG]DQLH SU]\SLV\ZDQLH L SRUyZQ\ZDQLH UHDOL]RZDQH ]D SRPRF ÄVWDQdardowych” procedur i operatorów). • %DUG]LHM]DDZDQVRZDQHRSHUDFMHQDáDFXFKDFKWRNRSLRZDQLHSU]HV]XNLZDQLH Z\FLQDQLHLVNUDFDQLH2SHUDFMHWHUHDOL]RZDQHV]DSRPRFVSHFMDOQ\FKIXQNFML i procedur. • 7XUER 3DVFDO XPR*OLZLD UyZQLH* NRU]\VWDQLH ] áDFXFKyZ ]DNRF]RQ\FK zerem (ASCIIZ).
114
Turbo Pascal — programowanie
:L FHMSDPL FL -DNE\üPR*HMHV]F]HSDPL WDV]SU]\VW SXMFGRSLVDQLDQDV]HJRSURJUDPXELEOLRWHF]QHJRRNUHOLOLP\PDNV\PDOQOLF]E SR]\FMLUHNRUGyZ QDRNRáR2JUDQLF]HQLHWR Z\QLNDáR]ZLHONRFLGRVW SQHMSDPL FLNWyU]NROHLRV]DFRZDOLP\QD]JUXEV]D N% 'ODF]HJR MHGQDN W\ONR W\OH" : FKZLOL REHFQHM WUXGQR MHVW ]QDOH(ü NRPSXWHU 3& SRVLDGDMF\ PQLHM QL* 0% SDPL FL ]D VWDQGDUGHP MHVW OXE 0% &R SUDZGD system operacyjny DOS, pod nad]RUHP NWyUHJR SUDFXM SURJUDP\ SDVFDORZH XPR*OLZLDGRVW SW\ONRGRN%DOHLWDNSURJUDP program IlePamieci; begin writeln('Masz w tej chwili ', MemAvail, ' bajtow wolnej pamieci.'); end.
SRND*H]DSHZQHOLF]E ZL NV]RGN%-DN]DWHPGREUDüVL GRSR]RVWDáHMSDPL FL" =DF]QLHP\RGPDáHMGDZNLWHRULL:V]\VWNLH]PLHQQHNWyU\PLSRVáXJLZDáHVL GRWHM SRU\ QDOH*Dá\ GR NODV\ ]PLHQQ\FK JOREDOQ\FK MHOL ]GHILQLRZDáH MH QD SRF]WNX SURJUDPX OXE ORNDOQ\FK MH*HOL ]RVWDá\ ]GHILQLRZDQH Z SURFHGXUDFK). Zmienne gloEDOQHXPLHV]F]DQHVZW]Zsegmencie danychNWyUHJRZLHONRüZ\QRVLN%LMHVW VWDáD]PLHQQHORNDOQHSU]HFKRZ\ZDQHVZsegmencie stosuNWyUHJRZLHONRüPR*QD ]PLHQLDüZJUDQLFDFKRGGRN%=PLHQQHJOREDOQHVstatyczneWMLVWQLHMSU]H] FDá\ F]DV Z\NRQ\ZDQLD SURJUDPX QDWRPLDVW ]PLHQQH ORNDOQH Ä*\M´ W\ONR WDN GáXJR MDN GáXJR Z\NRQXM VL SRVLDGDMFH MH SURFHGXU\ OXE IXQNFMH .RQLHF NRFyZ QD ]PLHQQHPR*HP\SU]H]QDF]\üFRQDMZ\*HMNLOREDMWyZ]F]HJRN%GRVW SQHMHVW „warunkowo”. Skoro jednak program IlePamieci SRND]Dá PDP QDG]LHM *H SDPL FLPDV]QLHFRZL FHMPXVLP\]QDOH(üVSRVyEQDMHMZ\NRU]\VWDQLH 6SRVREHP W\P V WDN ]ZDQH zmienne wskazywane : RGUy*QLHQLX RG Ä]Z\Ná\FK´ ]PLHQQ\FK ]PLHQQH ZVND]\ZDQH PRJ E\ü XPLHV]F]DQH Z GRZROQ\P PLHMVFX SDPL FL]F]\PZL*HVL QLHFRLQQ\VSRVyERGZRá\ZDQLDGRQLFKZ\NRU]\VWXMF\W]Z ZVND(QLNL.
Wiecej pamieci!
115
WsND(QLN GR ]PLHQQHM MHVW SR SURVWX MHM DGUHVHP F]\OL OLF]E RSLVXMF MHM SRáR*HQLH w SDPL FL 5y*QLF SRPL G]\ ]PLHQQ VWDW\F]Q D ZVND]\ZDQ LOXVWUXMH SRQL*V]\ rysunek:
Rysunek 12. 6SRVyEREVáXJL]PLHQQ\FKVWDW\F]Q\FKD LZVND]\ZDQ\FKE -DN ZLGDü GRVW S GR ]PLHQQHM ZVND]\ZDQHM RGE\ZD VL GZXHWDSRZR ]D SRUHGnicWZHPZVND(QLNDSURJUDPRGF]\WXMHZDUWRüWHJRRVWDWQLHJRF]\OLDGUHV]PLHQQHM LQD MHMSRGVWDZLHRGZRáXMHVL GRZáDFLZHM]PLHQQHMSRáR*RQHMZSDPL FLZPLHMVFXRSLsanym adresem (w naszym przypadku 3CA6F szesnastkowo). Metoda ta powoduje QLH]QDF]QHZ\GáX*HQLHF]DVXGRVW SXGR]PLHQQHMDOHSR]ZDOD]DWRXPLHFLüMSUDNW\F]QLHZGRZROQ\PPLHMVFXSDPL FLGRNáDGQLH]PLHQQHZVND]\ZDQHXPLHV]F]DQHV na tzw. stercie (ang. heap) — wydziHORQ\P REV]DU]H SDPL FL ]DU]G]DQ\P SU]H] specjalne procedury). 'HNODUDFMDZVND(QLNDGR]PLHQQHMRNUHORQHJRW\SXMHVWEDUG]RSRGREQDGRÄ]Z\NáHM´ GHNODUDFML]PLHQQHMLUy*QLVL RGQLHMMHG\QLHV\PEROHPZVND(QLND^): zmienna : ^typ
przy czym typPXVLE\üLGHQW\ILNDWRUHPW\SXSURVWHJROXE]GHILQLRZDQHJRZF]HQLHM w sekcji type2GZRáDQLHGRVDPHJRZVND(QLNDZ\JOGDGRNáDGQLHWDNVDPRMDNGOD ND*GHM LQQHM ]PLHQQHM QDWRPLDVW RGZRáDQLH GR ZVND]\ZDQHM SU]H] QLHJR ]PLHQQHM zawiera dodatkowo znaczek ^, tym razHPSRáR*RQ\]DQD]ZZVND(QLND zmienna^
$RWRNLONDSU]\NáDGyZ type TabReal = array[1..200] of real; { tablica 100 liczb real } 37DE5HDO A7DE5HDO^ZVND(QLNGRWDEOLF\` string100 = string>@^VNUyFRQ\áDFXFK` var TabTabReal : array[1..200] of37DE5HDO^WDEOLFDZVND(QLNyZ` 3VWULQJAVWULQJ^ZVND(QLNGRáDFXFKD` SLALQWHJHU^ZVND(QLNGROLF]E\LQWHJHU`
116
Turbo Pascal — programowanie { ... } TabTabReal[10]^[30] := 12.345; Pstring100^ := 'Lancuch dynamiczny'; writeln(PString100^);
1D V]F]HJyOQ XZDJ ]DVáXJXMH WX ]PLHQQD TabTabReal E GFD WDEOLF ZVND(QLNyZ do tablic liczb rzeczywistych. Struktura tego typu pozwala na efektywne przechowanie GZXZ\PLDURZHM WDEOLF\ VNáDGDMFHM VL ] ZLHUV]\ ZVND]\ZDQ\FK ZVND(QLNDPL ]DZLHUDMF\FKSROLF]END*G\F]\OLZVXPLHW\VL F\OLF]ERREM WRFLRNRáR N%8PLHV]F]RQQLHFRQL*HMLQVWUXNFM TabTabReal[10]^[30] := 12.345PR*QD Z\WáXPDF]\ü MDNR RGZRáDQLH GR WU]\G]LHVWHM NRPyUNL Z G]LHVLW\P ZLHUV]X F]\OL WDEOLF\ ZVND]\ZDQHM SU]H] G]LHVLW\ ZVND(QLN Z WDEOLF\ TabTabReal. Jak nietrudno VL MX* GRP\OLü JáyZQ\P ]DVWRVRZDQLHP ZVND(QLNyZ MHVW REVáXJD GX*\FK VWUXNWXU GDQ\FK QS WDEOLF UHNRUGyZ F]\OL NDWDORJyZ ELEOLRWHF]Q\FK = WHJR WH* Z]JO GX PDá\ VHQV PD GHNODUDFMD ]PLHQQHM pi JG\* OLF]ED W\SX integer zajmuje dwa bajty, ]DZVND(QLN— cztery. :DUWR WX MHV]F]H ZVSRPQLHü *H RSUyF] ZVND(QLNyZ GR RELHNWyZ NRQNUHWQHJR W\pu 7XUER 3DVFDO XGRVW SQLD UyZQLH* ZVND(QLNL DPRUILF]QH WM ZVND]XMFH QD REV]DU SDPL FL L QLH ]ZL]DQH ] *DGQ\P NRQNUHWQ\P W\SHP :VND(QLN WDNL GHNODURZDQ\ MHVW VáRZHP pointer (ZVND(QLN LMHVW]JRGQ\SRGZ]JO GHPSU]\SLVDQLD]LQQ\PLW\SDPL ZVND(QLNRZ\PL 7\S pointer L ]ZL]DQH ] QLP RSHUDFMH Z\NRU]\VW\ZDQH V SU]H] EDUG]LHM ]DDZDQVRZDQ\FK SURJUDPLVWyZ GR EH]SRUHGQLHJR ÄQLVNRSR]LRPRZHJR´ PDQLSXORZDQLD]DZDUWRFLSDPL FL 'UXJEDUG]RZD*QLSR*\WHF]QFHFK]PLHQQ\FKZVND]\ZDQ\FKMHVWPR*OLZRüLFK WZRU]HQLD L QLV]F]HQLD Z ]DOH*QRFL RG SRWU]HE :\PDJD WR FR SUDZGD X*\FLD VSHFMDOQ\FKSURFHGXUSR]ZDODMHGQDNQD]QDF]QLHEDUG]LHMHIHNW\ZQJRVSRGDUN SDPL FL : RGUy*QLHQLX RG VWDW\F]Q\FK ]PLHQQ\FK JOREDOQ\FK LVWQLHMF\FK SU]H] FDá\ F]DV Z\NRQ\ZDQLD SURJUDPX ]PLHQQH ZVND]\ZDQH QDOH* GR NODV\ ]PLHQQ\FK dynamicznych F]\OL LVWQLHM GRNáDGQLH ZWHG\ JG\ *\F]\ VRELH WHJR SURJUDPLVWD 6DP SURFHV utworzenia zmiennej dynamicznej polega na zarezerwowaniu odpowiedniego obszaru SDPL FL L ]DSDPL WDQLX DGUHVX WHJR REV]DUX ZH ZVND(QLNX ZVND]XMF\P QD ]PLHQQ Z NROHL XVXQL FLH ]PLHQQHM SRZRGXMH Ä]ZROQLHQLH UH]HUZDFML´ ]DZDUWRFL ]PLHQQHM RUD] ZVND(QLND QLH V IL]\F]QLH QLV]F]RQH DOH OHSLHM VL MX* GR QLFK QLH RGZRá\ZDü &HQ ]D PR*OLZRü VZRERGQHJR SU]\G]LHODQLD L ]ZDOQLDQLD SDPL FL MHVW NRQLHF]QRü EH]Z]JO GQHJR LQLFMDOL]RZDQLD ZVND(QLNyZ NWyUH SU]HG XWZRU]HQLHP ZVND]\ZDQHM ]PLHQQHMPDMZDUWRüQLHRNUHORQ]Z\NOH]HURFRRGSRZLDGDZVND(QLNRZLnil, nie wskazuMFHPXQD*DGHQRELHNW 3UyEDRGF]\WX]Piennej wskazywanej przez taki wska(QLN GRVWDUF]\ ÄW\ONR´ EH]VHQVRZQHJR Z\QLNX QDWRPLDVW SUyED ]DSLVX Z SU]\SDGNRZH PLHMVFH SDPL FL PR*H VNRF]\ü VL ]DZLHV]HQLHP NRPSXWHUD OXE ]XSHáQLHQLHSU]HZLdzianym jego zachowaniem. 3DPL WDMRLQLFMDOL]DFMLZVND(QLNyZ
:L FHMSDPL FL
117
Turbo Pascal oferuje kilka metod tworzenia i usuwania zmiennych dynamicznych, z NWyU\FKQDMSRSXODUQLHMV]UHDOL]XMHSDUDSURFHGXUnew i dispose: QHZZVND(QLN-do-zmiennej) GLVSRVHZVND(QLN-do-zmiennej)
Procedura new Z\NRQXMH F]\QQRFL ]ZL]DQH ] utworzeniem zmiennej wskazywanej, natomiast dispose — RSHUDFMH ]ZL]DQH ] MHM XVXQL FLHP 'UXJ SDU ]DU]G]DMF G\QDPLF]Q\PSU]\G]LDáHPSDPL FLWZRU]SURFHGXU\GetMem i FreeMem: *HW0HPZVND(QLNUR]PLDU-bloku) )UHH0HPZVND(QLNUR]PLDU-bloku)
: RGUy*QLHQLX RG SDU\ new-dispose SURFHGXU\ WH Z\NRU]\VWXM ZVND(QLNL amorficzne (typu pointer L VáX* GR EDUG]LHM ÄZHZQ WU]QHJR´ PDQLSXORZDQLD SDPL FLWMSU]\G]LHODQLDL]ZDOQLDQLDEORNyZEDMWyZDQLH]PLHQQ\FKZVND]\ZDQ\FK MDNLHJR NRQNUHWQHJR W\SX :LHONRü SU]\G]LHODQHJR OXE ]ZDOQLDQHJR EORNX Z EDMWDFK RNUHOD SDUDPHWU rozmiar-bloku .RU]\VWDMF ] REX JUXS SURFHGXU PXVLV] SDPL WDü *H SDPL ü SU]\G]LHORQD SU]H] GetMem QLH PR*H E\ü ]ZROQLRQD SURFHGXU dispose i odwrotnie. 2VWDWQLFK\EDQDMU]DG]LHMVWRVRZDQSDU WZRU]SURFHGXU\mark i release: PDUNZVND(QLN UHOHDVHZVND(QLN
Wykonanie procedury markQLHSRZRGXMHSU]\G]LHOHQLDSDPL FLDQLXWZRU]HQLD]PLHQQHMDMHG\QLH]DSDPL WDQLHELH*FHMÄZ\VRNRFL´VWHUW\Z]PLHQQHM ZVND(QLN. ZwolQLHQLD FDáHJR REV]DUX VWHUW\ OH*FHJR SRZ\*HM ZVND(QLND GRNRQXMH VL ]D SRPRF procedury release 2E\GZLH SURFHGXU\ VWRVRZDQH V — podobnie jak GetMem i FreeMem — JáyZQLH Z SURJUDPRZDQLX QLVNLHJR SR]LRPX GR ÄPDVRZHJR´ ]ZDOQLDQLDSDPL FLSU]\G]LHORQHMQDVWHUFLH .RU]\VWDMF ]H ]PLHQQ\FK G\QDPLF]Q\FK PXVLV] SDPL WDü *H VWHUWD QLH MHVW DXWRPDW\F]QLHSRU]GNRZDQDWRWH*NROHMQHRSHUDFMHSU]\G]LHOHQLDL]ZROQLHQLDEORNyZSDPL FL GRZROQ PHWRG PRJ GRSURZDG]Lü GR W]Z fragmentacji, czyli rozbicia wolnego jeszcze obszaru SDPL FL QD PQLHMV]H UR]áF]QH EORNL 3RQLHZD* UR]PLDU WZRU]RQHM ]PLHQQHMG\QDPLF]QHMQLHPR*HE\üZL NV]\RGUR]PLDUXQDMZL NV]HJRZROQHJREORNX SDPL FLPR*HVL RND]Dü*HSUyEDXWZRU]HQLD]PLHQQHMVNRF]\VL QLHSRZRG]HQLHP PLPRL*ZLHONRüGRVW SQHMSDPL FLE G]LHZ\VWDUF]DMFD'ODWHJRWH*ZáDFLZPLDU PR*OLZRFLXWZRU]HQLDZL NV]HMVWUXNWXU\GDQ\FKQDVWHUFLHMHVWQLHIXQNFMD MemAvail ]ZUDFDMFDVXPDU\F]Q\UR]PLDUZROQHMSDPL FL OHF] MaxAvail]ZUDFDMFDUR]PLDU QDMZL NV]HJRZROQHJREORNX PoUDQDSU]\NáDG\1DSRF]WHNSU]HGVWDZLP\Ä]ELRUF]´GHPRQVWUDFM PR*OLZRFLREVáXJL]PLHQQ\FKG\QDPLF]Q\FK program ZmienneDynamiczne; type
118
Turbo Pascal — programowanie TabReal = array[1..5000] of real; { tablica liczb } { rzeczywistych } PString = ^string^ZVND(QLNGRáDFXFKD` var V36WULQJ^]PLHQQDW\SXZVND(QLNGRáDFXFKD` TabTabReal : array[1..100] of ^TabReal; { tablica } ^ZVND(QLNyZ` 6WHUWDSRLQWHU^ZVND(QLNZ\VRNRFLVWHUty } i : integer; { pomocniczy licznik } procedure IlePamieci; begin writeln('Wolne: ', MemAvail, ' max. blok: ', MaxAvail, ' bajtow.'); end; begin writeln(s^); { zmienna nie utworzona } QHZV ^ZL FMWZRU]\P\` writeln(s^); { utworzona, lecz nie zainicjalizowana } s^ := 'No wreszcie!'; { inicjalizujemy } writeln(s^); { teraz jest OK } dispose(s); { usuwamy } ZULWHOQVA ^]PLHQQDQLH]RVWDáDFDáNRZLFLH]QLV]F]RQD` mark(Sterta); { zaznaczamy 'poziom' sterty } L ^WZRU]\P\WDEOLF WDEOLFG\QDPLF]Q\FK` while MemAvail > SizeOf(TabReal) do { tyle wierszy ) ^LOHVL GD` begin ,OH3DPLHFL^LOHPDP\SDPL FL"` new(TabTabReal[i]); { tworzymy nowy wiersz } ,QFL ^]ZL NV]DP\LQGHNVZLHUV]D` end; dispose(TabTabReal[3]); { usuwamy jeden wiersz tablicy } IlePamieci; UHOHDVH6WHUWD ^]ZDOQLDP\KXUWHPFDáSDPL ü` IlePamieci; end.
3LHUZV]D F] ü SURJUDPX GHPRQVWUXMH HWDS\ WZRU]HQLD Z\NRU]\VWDQLD L XVXQL FLD ]PLHQQHM ZVND]\ZDQHM Z QDV]\P SU]\SDGNX áDFXFKD ]D SRPRF SURFHGXU new i dispose=DXZD**HXWZRU]HQLH]PLHQQHMZVND]\ZDQHMQLHMHVWUyZQR]QDF]QH]MHM LQLFMDOL]DFM D SR Z\NRQDQLX SURFHGXU\ dispose WUHü áDFXFKD QLH MHVW QLV]F]RQD FKRFLD*PR*HE\üQLHNRPSOHWQD 'UXJD F] ü WZRU]\ W\SRZ VWUXNWXU ZLHONLHM WDEOLF\ SU]\G]LHODMF SDPL ü GOD SRV]F]HJyOQ\FK ZLHUV]\ GRSyNL WR MHVW PR*OLZH =DXZD* *H SR XVXQL FLX WU]HFLHJR ZLHUV]D WDEOLF\ QD RJyá RND]XMH VL *H UR]PLDU QDMZL NV]HJR GRVW SQHJR EORNX MHVW PQLHMV]\RGFDáNRZLWHJRUR]PLDUXZROQHJRREV]DUXVWHUW\FRXQLHPR*OLZLDWZRU]HQLH
:L FHMSDPL FL
119
ZL NV]\FK VWUXNWXU G\QDPLF]Q\FK :UHV]FLH LQVWUXNFMD release ]ZDOQLD FDá VWHUW ÄZ]Z\*´SRF]ZV]\RGPLHMVFD]DUHMHVWURZDQHJRZ]PLHQQHMSterta. 1D]DNRF]HQLHWHJRUR]G]LDáXVSUyEXMHP\Z\NRU]\VWDüPHFKDQL]P\]PLHQQ\FKG\QDPLF]Q\FK GR OHSV]HJR ]DJRVSRGDURZDQLD SDPL FL Z SURJUDPLH REVáXJL ELEOLRWHNL 3RGDQH QL*HM LQIRUPDFMH E G PLDá\ ] NRQLHF]QRFL FKDUDNWHU ZVND]yZHN SRZLQQ\ MHGQDN XPR*OLZLü Ci skuteczne wprowadzenie zmian do programu. Przede wszystkim QDOH*\]DGHNODURZDüRGSRZLHGQLHVWUXNWXU\GDQ\FK type { ... } PKsiazka = ^Ksiazka; var Katalog : array[1..2000] of PKsiazka;
L XVXQü ]E GQH MX* GHILQLFMH VWDá\FK RNUHODMF\FK RJUDQLF]HQLD SDPL FLRZH /LF]ED 2000 w deklaracji tablicy Katalog]RVWDáDZ\EUDQDDUELWUDOQLHSR]\FMLWRRNRáR N% .ROHMQ\PNURNLHPMHVW]PRG\ILNRZDQLHZV]\VWNLFKSURFHGXUNRU]\VWDMF\FK z parametrów typu KsiazkaSU]H]]PLDQ W\SXSDUDPHWUXQDPKsiazka, np.: procedure WprowadzDane(var r : PKsiazka);
FR XPR*OLZL LP RSHURZDQLH QD ]PLHQQ\FK ZVND]\ZDQ\FK SDUDPHWUHP 2F]\ZLFLH w WUHFL WDN ]PRG\ILNRZDQHM SURFHGXU\ QDOH*\ ZV]\VWNLH RGZRáDQLD GR Ä]Z\NáHJR´ SDUDPHWUX]DVWSLüRGZRáDQLDPLZ\NRU]\VWXMF\PLZVND(QLNQS with r^ do {... }
0RG\ILNDFMD SURFHGXU\ VRUWXMFHM MHVW ]E GQD D QDZHW QLHSR*GDQD : QRZ\P SURJUDPLH ]DPLDQD UHNRUGyZ SU]\MPLH IRUP ]DPLDQ\ ZVND(QLNyZ FR RF]\ZLFLH E G]LH V]\EV]HLEDUG]LHMHIHNW\ZQHQL*NRSLRZDQLHFDá\FKUHNRUGyZ :V]HONLH Z\ZRáDQLD SURFHGXU SR]RVWDQ QLH]PLHQLRQH FKRFLD* IDNW\F]QLH ]DPLDVW UHNRUGX ]DZV]H SU]HND]\ZDQ\ E G]LH ZVND(QLN GR UHNRUGX 1DWRPLDVW ZV]\VWNLH EH]SRUHGQLH RGZRáDQLD GR SyO UHNRUGyZ ]DSLVDQ\FK Z WDEOLF\ Katalog QDOH*\ ]DVWSLüRGZRáDQLDPLZ\NRU]\VWXMF\PLZVND(QLNL Katalog[LbPoz]^.Licznik := 0;
1LH ZROQR UyZQLH* ]DSRPQLHü R X]XSHáQLHQLX SURFHGXU WZRU]F\FK L XVXZDMF\FK UHNRUG\ R Z\ZRáDQLD SURFHGXU new i dispose, których brak spowoduje najpewniej Eá\VNDZLF]QH]DZLHV]HQLHNRPSXWHUD procedure DodajKsiazke; { ... } writeln('Nowa pozycja w katalogu: ', Licznik); new(Katalog[Licznik]); { utwórz nowy rekord w katalogu } { ... }
120
Turbo Pascal — programowanie procedure UsunKsiazke(Numer : integer); begin dispose(Katalog[Numer]); { ... }
3RGREQLH PXVLV] SRVWSLü ] SURFHGXU OdczytajZDysku (w procedurze zapisu usuZDQLHUHNRUGyZQLHMHVWNRQLHF]QHDOHSU]\G]LHORQDSDPL üSRZLQQD]RVWDü]ZROQLRQD SU]HG]DNRF]HQLHPG]LDáDQLDSURJUDPX 3RZ\*V]HZVND]yZNLQLHREHMPXMRSHUDFMLSRPRFQLF]\FKMDNQSVSUDZG]DQLHPR*OLZRFL XWZRU]HQLD NROHMQHJR UHNRUGX 3RZLQQ\ RQH MHGQDN Z\VWDUF]\ü &L GR VNXWHF]nego zmodyfikowania programu.
=DSDPL WDM • 'R SU]HFKRZ\ZDQLD ZL NV]\FK LORFL GDQ\FK PR*HV] Z 3DVFDOX Z\NRU]\VWDü zmienne wskazywane (dynamiczne). • =PLHQQHZVND]\ZDQHVXPLHV]F]DQHQDW]ZVWHUFLHWHRUHW\F]QLHZGRZROQ\P PLHMVFX SDPL FL 0RJ RQH E\ü WZRU]RQH L QLV]F]RQH G\QDPLF]QLH Z ]DOH*QRFLRGSRWU]HE • =PLHQQDZVND]\ZDQDORNDOL]RZDQDMHVW]DSRPRFZVND(QLNDNWyU\]DZLHUDMHM DGUHV PLHMVFH Z SDPL FL :VND(QLNL PRJ ZVND]\ZDü QD ]PLHQQH konkreWQHJRW\SXPRJWH*E\üZVND(QLNDPLDPRUILF]Q\PLpointer). • 3U]HG Z\NRU]\VWDQLHP ]PLHQQHM G\QDPLF]QHM QDOH*\ M XWZRU]\ü SURFHGXU new), a po wykorzystaniu —XVXQüSURFHGXUdispose). • 'R SU]\G]LHODQLD L ]ZDOQLDQLD EORNyZ SDPL FL QD VWHUFLH VáX* UyZQLH* SURFHdury GetMem, FreeMem, mark i release.
Pozyteczne drobiazgi, czyli moduly biblioteczne
121
3R*yteczne drobiazgi, czyli PRGXá\ biblioteczne ,OH UD]\ ]DVWDQDZLDáH VL MDN Z\F]\FLü HNUDQ ]PLHQLü NRORU WHNVWX F]\ ZSURZDG]Lü znak z klawiatury bez naciskania klawisza ENTER" :\NRQDQLH W\FK F]\QQRFL QLH Z\PDJD ]DFKRGX Z\VWDUF]\ Z\ZRáDü RGSRZLHGQL SURFHGXU ELEOLRWHF]Q -DN VDPD QD]ZD ZVND]XMH SURFHGXUD WDND QLH MHVW QD VWDáH ÄZEXGRZDQD´ Z M ]\N SURJUDPRZDQLD OHF] SRELHUDQD ] RGG]LHOQHJR SOLNX ELEOLRWHNL L GRáF]DQD GR SURJUDPXZWUDNFLHW]ZNRQVROLGDFMLQDVW SXMFHMSRNRPSLODFML 3DVFDORZH SOLNL ELEOLRWHF]QH QRV] QD]Z PRGXáyZ DQJ unit). Wersja 7.0 oferuje SURJUDPLFLHG]LHVL üPRGXáyZVWDQGDUGRZ\FK System
— wszystkie procedury standardowe;
Crt
— oEVáXJDPRQLWRUDNODZLDWXU\LJáRQLND
Dos
— oEVáXJDIXQNFMLV\VWHPRZ\FKZ\ZRáDQLDIXQNFMLV\VWHPX06DOS);
Graph
— oEVáXJDJUDILNL
Strings
— oEVáXJDáDFXFKyZ$6&,,Z;
WinDos
— oGSRZLHGQLNPRGXáX'26Z\NRU]\VWXMF\áDFXFK\$6&,,=
Printer
— oEVáXJDGUXNDUNL
Overlay
— oEVáXJDW]ZQDNáDGHN
Turbo3
— mRGXáÄX]JDGQLDMF\´]7XUER3DVFDOHP
Graph3
— oEVáXJDW]ZJUDILNL*yáZLDX*\ZDQHMZ7XUER3DVFDOX
122
Turbo Pascal — programowanie 2GG]LHOQDREV]HUQDJUXSDPRGXáyZWZRU]\ELEOLRWHN 7XUER9LVLRQNWyUQLHE dzieP\VL WXWDM]DMPRZDü -DN QLHWUXGQR ]DXZD*\ü ND*G\ PRGXá ÄVSHFMDOL]XMH VL ´ Z RNUHORQ\FK RSHUDFMDFK Z\MWNLHP MHVW PRGXá System ]DZLHUDMF\ ZV]\VWNLH SURFHGXU\ L IXQNFMH VWDQGDUGRZH 1DMF] FLHM X*\ZDQH PRGXá\ System, Crt, Dos, Printer i Overlay) umieszczono w specjalnym pliku TURBO.TPLáDGRZDQ\PGRSDPL FLZUD]],'(7XUER 3DVFDOD G]L NL F]HPX LFK ]DZDUWRü GRVW SQD MHVW QDW\FKPLDVW .RG SR]RVWDá\FK PRGXáyZ ]DSLVDQ\ MHVW Z RGSRZLHGQLFK SOLNDFK ] UR]V]HU]HQLHP .TPU 1LH]DOH*QLH RG WHJRF]\NRGPRGXáX]QDMGXMHVL QDG\VNXF]\MHVWáDGRZDQ\GRSDPL FLDE\Z\NRU]\VWDüGRZROQ\MHJRHOHPHQW]DQDJáyZNLHPSURJUDPXPXVLV]XPLHFLüGHNODUDFM
uses nazwa-PRGXáX
-HOLZ\NRU]\VWXMHV]NLONDUy*Q\FKPRGXáyZPXVLV]UR]G]LHOLüLFKQD]Z\SU]HFLQNDPL &KRFLD* PRGXá\ WUDNWRZDQH V QDMF] FLHM MDNR ELEOLRWHNL SURFHGXU ]DZLHUDM RQH UyZQLH*GDQHZSRVWDFLVWDá\FKQSGHILQLXMF\FKNRORU\MDN Red=2), zmiennych (np. XVWDODMF\FK VSRVyE RWZLHUDQLD SOLNyZ — FileMode F]\ WH* REVáXJL PRQLWRUD — DirectVideo) i typów (np. DateTime — typ rekordowy przeznaczony do przechowywania czasu i daty, PointType — W\S RSLVXMF\ SXQNW QD SáDV]F]\(QLH =DUyZQRSURFHGXU\MDNLGDQHPR*HV]Z\NRU]\VW\ZDüEH]RJUDQLF]HDWDN*HSU]\VáDQLDüZáDVQ\PLGHILQLFMDPL3DPL WDMMHGQDN*HFHQ]DGRVW SGR]DZDUW\FKZPRGXOH RELHNWyZ MHVW SRZL NV]HQLH REM WRFL JRWRZHJR SURJUDPX Z\QLNDMFH ] GRáF]HQLD ÄLPSRUWRZDQHJR´ NRGX L GDQ\FK -HOL ]DOH*\ &L QD PLQLPDOL]DFML ZLHONRFL NRGX Z\QLNRZHJR]DVWDQyZVL F]\NRQLHF]QLHPXVLV]X*\ZDüQSPRGXáXCrt. Generalnie MHGQDN QDOH*\ ]DOHFLü X*\ZDQLH PRGXáyZ ELEOLRWHF]Q\FK JG\* GDM RQH SURJUDPLFLH PR*OLZRü VNRU]\VWDQLD ]H VSUDZG]RQ\FK UR]ZL]D ZLHOX SUREOHPyZ ]ZDOQLDMF RG NRQLHF]QRFLZ\P\ODQLDLFKQDZáDVQU N 6WRVXMPRGXá\ELEOLRWHF]QH
6SRUyGZ\PLHQLRQ\FKZ\*HMPRGXáyZQDMF] FLHMVWRVRZDQHV CrtXPR*OLZLDMF\ HIHNW\ZQ L HIHNWRZQ REVáXJ NRPXQLNDFML ] X*\WNRZQLNLHP Graph UHDOL]XMF\ operacje w trybie graficznym, oraz DosXPR*OLZLDMF\Z\NRQ\ZDQLHIXQNFMLV\VWHmoZ\FK 3RQLHZD* RPDZLDQLH WUHFL SRV]F]HJyOQ\FK PRGXáyZ MHVW NZHVWL GUXJRU] GQ QDV]DNVL*NDPDSU]HGHZV]\VWNLPXF]\üSURJUDPRZDQLDDQLHVáX*\üMDNROHNV\NRQ M ]\ND D WDN*H ]H Z]JO GX QD V]F]XSáRü PLHMVFD RJUDQLF]\P\ VL GR RPyZLHQLD NLONX QDMSRSXODUQLHMV]\FK HOHPHQWyZ PRGXáyZ Crt i Dos wraz z prostymi SU]\NáDGDPL = tych samych przyczyn zrezygnujemy z omawiania bardzo obszernej ]DZDUWRFLPRGXáXGraphRGV\áDMF]DLQWHUHVRZDQ\FK&]\WHOQLNyZGROLWHUDWXU\>@ =DF]QLHP\ RG PRGXáX Crt ZVSRPDJDMFHJR RSHUDFMH ZHMFLD L Z\MFLD ] X*\FLHP konsoli. Z procedur ÄXOHSV]DMF\FK´ REVáXJ HNUDQX L NODZLDWXU\ FK\ED QDMF] FLHM wykorzystywana jest bezparametrowa procedura ClrScr SRZRGXMFD Z\F]\V]F]HQLH HNUDQX 3U]\NáDG MHM X*\FLD ]QDMG]LHV] Z IXQNFML Menu naszego programu bibliotecz-
3R*\WHF]QHGURELD]JLF]\OLPRGXá\ELEOLRWHF]QH
123
QHJR -HOL GRGDWNRZR SU]\ RND]ML F]\V]F]HQLD HNUDQX FKFLDáE\ü ]PLHQLü NRORU\ PR*HV]Z\NRU]\VWDüSURFHGXU\TextColor i TextBackground: TextColor(kolor-tekstu) TextBackground(kolor-WáD
]PLHQLDMFHRGSRZLHGQLRNRORU]QDNyZRUD]WáD2F]\ZLFLH]DPLDVWOLF]ERZ\FKZDUWRFLNRORUyZNWRE\MHSDPL WDá QDMOHSLHMVWRVRZDüVWDáHV\PEROLF]QHQS Blue=1 GOD NRORUX QLHELHVNLHJR (IHNW G]LDáDQLD REX SURFHGXU ZLGRF]Q\ MHVW GRSLHUR SR Z\NRQDQLX NROHMQ\FK RSHUDFML Z\MFLD OXE Z\F]\V]F]HQLD HNUDQX ]D ELH*FH ZDUWRFLNRORUyZSU]HFKRZ\ZDQHVZ]PLHQQHMTextAttr. Procedura GotoXYVáX*\GRZ\SURZDG]DQLDWHNVWXQD]DGDQ\FKZVSyáU] GQ\FKHNUDQ WHNVWRZ\OLF]\VRELHZLHUV]\SR]QDNyZZLHUV]HL]QDNLQXPHURZDQHVRG 3U]\NáDGRZHZ\ZRáDQLH for i := 1 to 24 do begin GotoXY(i,i); write('*'); end;
Z\ZLHWOL QD HNUDQLH XNRQ OLQL ]áR*RQ ] JZLD]GHN =EOL*RQH ]DVWRVRZDQLH PD procedura Window: Window(x1, y1, x2, y2)
XPR*OLZLDMFD Z\]QDF]HQLH QD HNUDQLH RNLHQND RJUDQLF]DMFHJR REV]DU Z\SLV\ZDQLD WHNVWXGRSURVWRNWDRZVSyáU] GQ\FK x1, y1 (lewy górny róg) i x2, y2 (prawy dolny UyJ ']LDáDQLHSURFHGXU\WindowQDMOHSLHMLOXVWUXMHSRQL*V]\SU]\NáDG Window(10, 10, 20, 20); { okienko 10x10 } write('W tym okienku wypisuje sie bardzo dlugi tekst');
2E\GZLHSURFHGXU\XPR*OLZLDMVNXWHF]QHWZRU]HQLHáDGQ\FKPHQXF]\ÄIRUPXODU]\´ QLHZLHONLPQDNáDGHPNRV]WyZFKRFLD*F] VWRRND]XMHVL *HOHSLHMZW\PFHOXZ\NRU]\VWDüQSELEOLRWHN 7XUER9LVLRQ $E\ZSURZDG]Lü]NODZLDWXU\SRMHG\QF]\]QDNEH]QDFLVNDQLDklawisza ENTER warto Z\NRU]\VWDüIXQNFM ReadKey=ZUDFDRQDNRG$6&,,]QDNXRGSRZLDGDMFHJRNODZLszowi albo —ZSU]\SDGNXQDFLQL FLDNODZLV]DIXQNF\MQHJROXEVSHFMDOQHJR— tzw. rozszerzony kod klawisza poprzedzony znakiem o kodzie 0 (w tym przypadku konieczQH V GZD Z\ZRáDQLD )XQNFja ReadKey MHVW VWRVRZDQD JáyZQLH GR UHDOL]DFML PHQX (vide program Katalog L LQQ\FK Z\P\OQLHMV]\FK RSHUDFML Z\NRU]\VWXMF\FK NODZLDWXU 6SRNUHZQLRQD ] QL IXQNFMD KeyPressed VáX*\ GR EDGDQLD VWDQX EXIRUD klawiaWXU\ MHOL SU]HG MHM Z\ZRáDQLHP QDFLQL WR MDNL NODZLV] ]ZUyFL RQD ZDUWRü true :DUWR SDPL WDü *H KeyPressed QLH RSUy*QLD EXIRUD NODZLDWXU\ WRWH* NROHMQH Z\ZRáDQLD E G ]ZUDFDá\ true D* GR FKZLOL NLHG\ ]QDN ]RVWDQLH RGF]\WDQ\ QS w\ZRáDQLHPIXQNFMLReadKey=WHJRWH*Z]JO GXIXQNFMLKeyPressedQDOH*\X*\ZDü EDUG]RRVWUR*QLH]DVW SXMFMZPLDU PR*OLZRFLZ\ZRáDQLHPReadKey.
124
Turbo Pascal — programowanie 5HDOL]DFM HIHNWyZ G(ZL NRZ\FK XPR*OLZLDM SURFHGXU\ Sound, NoSound i Delay. 3LHUZV]H GZLH RGSRZLHGQLR ZáF]DM L Z\áF]DM ZHZQ WU]Q\ JáRQLF]HN NRPSXWHUD SRZRGXMF JHQHURZDQLH G(ZL NX R F] VWRWOLZRFL RNUHORQHM SDUDPHWUHP 3URFHGXUD DelayXPR*OLZLDXVWDOHQLHGáXJRFLWUZDQLDG(ZL NX3RQLHZD*JáRQLNNRPSXWHUD3& REVáXJLZDQ\ MHVW VSU] WRZR PXVLV] SDPL WDü R Z\áF]HQLX G(ZL NX SURFHGXU NoSound, w przeciwnym przySDGNX PR*H RQ E\ü JHQHURZDQ\ QDZHW SR ]DNRF]HQLX SURJUDPX.UyWNGHPRQVWUDFM HIHNWyZG(ZL NRZ\FKSRND]DQRSRQL*HM for i := 1 to 8 do begin 6RXQG ^G(ZL NRF] VWRWOLZRFLN+]` 'HOD\ ^RSy(QLHQLHPLOLVHNXQG` 1R6RXQG^Z\áF]G(ZL N` 'HOD\ ^MHV]F]HMHGQRRSy(QLHQLH` end;
Procedury i dane zawarte w module DosZ\NRU]\VW\ZDQHV]QDF]QLHU]DG]LHMJáyZQLH SU]H]EDUG]LHMGRZLDGF]RQ\FKSURJUDPLVWyZ3R]ZDODMRQHQDZ\NRQ\ZDQLHRSHUDFML na systemie plików, oEVáXJ ]HJDUD V\VWHPRZHJR RUD] ]DU]G]DQLH SURFHVDPL SURJUDPDPL LW]ZSU]HUZDQLDPLFRMHVW]DEDZQLH]DZV]HEH]SLHF]Q (OHPHQWDUQHLQIRUPDFMHRV\VWHPLHSOLNyZPR*HV]X]\VNDü]DSRPRFIXQNFMLSURcedur) DiskSize, DiskFree, GetDir, FindFirst i FindNext. Pierwsze dwie funkcje ]ZUDFDMFDáNRZLWSRMHPQRüRUD]LORüZROQHJRPLHMVFDGOD]DGDQHJRG\VNXZEDMWDFK ]DSURFHGXUDGetDirXPR*OLZLDRNUHOHQLHQD]Z\ELH*FHJRNDWDORJX *HW'LUV ^R]QDF]DG\VNELH*F\` writeln('Biezacy katalog: ', s); { s jest typu string } writeln('Pojemnosc dysku: ', DiskSize(0), ' bajtow.'); writeln('Wolne miejsce: ', DiskFree(0), ' bajtow.');
:DUWRZLHG]LHü*HG\VNLZV\VWHPLH'26QXPHURZDQHVRGMHG\QNLNWyUDRGSRZLDGD G\VNRZL$ ]DZDUWRüR]QDF]D]DZV]HG\VNELH*F\ Procedury FindFirst i FindNextZ\NRU]\VW\ZDQHVQDRJyáGRVSUDZG]DQLDREHFQRFL SOLNX QD G\VNX L RGF]\WX OLVW\ SOLNyZ ]DZDUW\FK Z NDWDORJX 3RQL*HM SU]HGVWDZLRQRW\SRZNRQVWUXNFM Z\ZLHWODMFOLVW SOLNyZ]DZDUW\FKZNDWDORJXJáywnym dysku C: FindFirst('c:\ $Q\)LOH2SLV3OLNX ^]QDMG(SLHUZV]\` { plik } while DosError = 0 do^V]XNDMD*GRZ\F]HUSDQLDSOLNyZ` begin )LQG1H[W2SLV3OLNX ^]QDMG(NROHMQ\SOLN` writeln(OpisPliku.Name); end;
Procedura FindFirst znajduje pierwszy plik o nazwie zadanej pierwszym parametrem i tworzy tzw. rekord opisu pliku (zmienna OpisPliku typu SearchRec), wykoU]\VW\ZDQ\ QDVW SQLH SU]H] FindNext do wyszukiwania kolejnych plików. Zmienna DosError przechowuje wynik ostatnio wykonanej funkcji systemu operacyjnego
3R*\WHF]QHGURELD]JLF]\OLPRGXá\ELEOLRWHF]QH
125
(w naszym przypadku — IXQNFML Z\V]XNDQLD SOLNX SU]\ F]\P ZDUWRü RGSRZLDGD Z\NRQDQLX EH]Eá GQHPX QDWRPLDVW SR]RVWDáH ZDUWRFL V NRGDPL RGSRZLHGQLFK Eá dów zwracanymi przez DOS. 1D W\P ]DNRF]\P\ QDV]H NUyWNLH VSRWNDQLH ] PRGXáDPL ELEOLRWHF]Q\PL = NRQLHF]QRFLRPyZLOLP\ZQLP]DJDGQLHQLDQDMEDUG]LHMSRGVWDZRZHSRPLMDMFV]F]HJyáRZ\ RSLV ]DZDUWRFL PRGXáyZ -HOL RND*H VL *H MHVW &L SRWU]HEQD MDND IXQNFMD OXE struktura danycKQDMOHSLHM]URELV]SU]HJOGDMFRGSRZLHGQLHWHPDW\V\VWHPXSRPRF\ HZHQWXDOQLHRGZRáXMFVL GROLWHUDWXU\ : NROHMQ\P UR]G]LDOH SRND*HP\ MDN WZRU]\ü ZáDVQH PRGXá\ L MDNLH ] WHJR Sá\Q NRU]\FL
=DSDPL WDM • 3DVFDORZHPRGXá\ELEOLRWHF]QH]DZLHUDMZLHOHX*\WHF]Q\FKSURFHGXULVWUXNWXU danych. • $E\RGZRáDüVL GR]DZDUWRFLPRGXáXPXVLV]XPLHFLüQDSRF]WNXSURJUDPX GHNODUDFM uses. • :\NRU]\VWDQLH PRGXáyZ SRZRGXMH SRZL NV]HQLH REM WRFL VNRPSLORZDQHJR programu. • 1DMF] FLHM Z\NRU]\VW\ZDQ\PL PRGXáDPL V Crt REVáXJD PRQLWRUD L NODZLDtury), Graph REVáXJD JUDILNL RUD] Dos REVáXJD Z\ZRáD IXQNFML V\VWHmowych).
126
Turbo Pascal — programowanie
0RGXá\ZáDVQH : PLDU UR]ZRMX 7ZRLFK XPLHM WQRFL E G]LHV] UR]ZL]\ZDá FRUD] EDUG]LHM ]áR*RQH SUREOHP\ L SLVDá FRUD] EDUG]LHM ]áR*RQH SURJUDP\ 3U G]HM F]\ Sy(QLHM VWDQLHV] WH* SU]HG NRQLHF]QRFL UR]ELFLD SURJUDPXQDNLONDSURVWV]\FKIUDJPHQWyZF]\OLSRG]LHlenia go na PRGXá\0RGXáRZRüE GFDMHGQ]SRGVWDZRZ\FK]DVDGGREUHJRSURJUDPRZDQLDMHVWUR]V]HU]HQLHPSRGHMFLDSURFHGXUDOQHJR6WUXNWXUDPRGXODUQD]DNáDGD Z\G]LHOHQLH IXQNFML ]DMPXMF\FK VL GDQ G]LHG]LQ QS RSHUDFMDPL ZHMFLD-Z\MFLD i ]JUXSRZDQLH LFK Z RGG]LHOQ\FK SOLNDFK 5y*QLF SRPL G]\ SURJUDPHP ÄOLQLRZ\P´ a SURJUDPHPPRGXáRZ\PUHDOL]XMF\PWRVDPR]DGDQLHSU]HGVWDZLDSRQL*V]\U\VXQHN Otoczenie
a)
Dane, struktury i funkcje globalne, procedury przetwarzania danych, procedury wejœcia-wyjœcia, interfejs u¿ytkownika, program g³ówny
Otoczenie
PROGRAM Dane i struktury globalne Funkcje globalne
Otoczenie
b)
Procedury przetwarzania danych
Otoczenie
Procedury wejœcia-wyjœcia i interfejs u¿ytkownika
Rysunek 13. 6WUXNWXUDSURJUDPXÄOLQLRZHJR´D LPRGXáRZHJRE &R GDMH ]DVWRVRZDQLH VWUXNWXU\ PRGXáRZHM" -DN QLHWUXGQR ]DXZD*\ü SURJUDP ÄOLQLRZ\´ JUXSXMH ZV]\VWNLH HOHPHQW\ Z MHGQ\P SOLNX (UyGáRZ\P 3U]\ ZL NV]\FK SrogUDPDFKOLF]EDZLHUV]\NRGX(UyGáRZHJRLG]LHZW\VLFHFR]NROHLGUDVW\F]QLHZ\GáX*D F]DVSRWU]HEQ\QD]QDOH]LHQLH*GDQHJRIUDJPHQWXSURJUDPXSRJDUV]DMHJRF]\WHOQRü
0RGXá\ZáDVQH
127
i XWUXGQLD LQWHUSUHWDFM L XUXFKDPLDQLH 2GSRZLHGQL SURJUDP R VWUXNWXU]H PRGXáRZHM VNáDGD VL ] NLONX NUyWV]\FK D ZL F áDWZLHMV]\FK GR F]\WDQLD SOLNyZ ]DZLHUDMF\FK IXQNFMH SRJUXSRZDQH WHPDW\F]QLH FR ] NROHL XáDWZLD Z\V]XNLZDQLH RGSRZLHGQLFK fragmentów programu i jego uruchamianie). 3LHUZV]NRU]\FL]]DVWRVRZDQLDVWUXNWXU\PRGXáRZHMMHVWSRSUDZD F]\WHOQRFLNRGX(UyGáRZHJRRUD]XáDWZLHQLHLQWHUSUHWDFMLLXUXFKDPLDQLD programu. 1LHGRüWHJRUD]QDSLVDQHLSU]HWHVWRZDQHIXQNFMHLVWUXNWXU\GDQ\FKPRJSU]\GDü&L VL Z SU]\V]áRFL 2F]\ZLFLH SRGF]DV SLVDQLD NROHMQHJR SURJUDPX PR*HV] ZUyFLü GR RGSRZLHGQLHJRWHNVWX(UyGáRZHJRLÄSRWUDNWRZDüJR´HG\WRUHPNRSLXMFRGSRZLHGQLH IUDJPHQW\MHGQDN]QDF]QLHOHSLHMMHVW]DPNQüUD]QDSLVDQ\NRGZPRGXOH'ODF]HJR" 3RSLHUZV]HXQLNDV]ZWHQVSRVyEÄSU]HNRS\ZDQLDVL ´SU]H]VWDUHSURJUDP\, wyszukiZDQLDRGSRZLHGQLFKIUDJPHQWyZL]áR*RQ\FKQLHUD]RSHUDFMLZHG\WRU]H]DVW SXMFWR ZV]\VWNR]Z\Ná\PGRáF]HQLHPPRGXáX3RGUXJLHSURJUDPRZDQLH]X*\FLHPELEOLRWHNSU]\SRPLQDXNáDGDQLHNORFNyZEH]NRQLHF]QRFL]DVWDQDZLDQLDVL ]F]HJR]RVWDá\ RQH ]URELRQH L MDN G]LDáDM — IDFKRZR QD]\ZD VL WR XNU\ZDQLHP V]F]HJyáyZ LPSOHmentacyjnych 3RWU]HFLHZ\NRU]\VWDQLHZF]HQLHMQDSLVDQ\FKLSU]HWHVWRZDQ\FKSURFHGXULIXQNFMLXáDWZLDXUXFKDPLDQLHSURJUDPX]DNáDGDMF*HNORFNL]RVWDá\]URELRQH solLGQLH 3RGHMFLH PRGXáRZH Z\PXV]D UyZQLH*QDSURJUDPLFLHSRSUDZQHSURMHNWRZDQLHHOHPHQWyZSURJUDPXFREH]ZWSLHQLDSU]\QLHVLHSURILW\ZSU]\V]áRFL1LHEH] ]QDF]HQLDMHVWWH*NZHVWLDF]DVRZDUD]VNRPSLORZDQ\PRGXáQLHNRPSLOXMHVL SRQRZQLH :\NRU]\VWDQLH PRGXáyZ GDMH ZUHV]FLH SURJUDPLVWRP PR*OLZRü UR]SRZV]HFKQLDQLD NRGX Z SRVWDFL VNRPSLORZDQ\FK ELEOLRWHN EH] NRQLHF]QRFL XMDZQLDQLD WHNVWyZ(UyGáRZ\FK 'UXJNRU]\FL]]DVWRVRZDQLDVWUXNWXU\PRGXáRZHMMHVWPR*OLZRüáDWZHJR wykorzystania wczeQLHMVWZRU]RQ\FKLSU]HWHVWRZDQ\FKIXQNFMLLVWUXNWXU GDQ\FKDQJUHXVDELOLW\ RUD]XáDWZLHQLHLFKG\VWU\EXFML -DNMX*SRZLHG]LHOLP\NRQLHF]QRüSURJUDPRZDQLDPRGXáRZHJRSU]\MG]LH]F]DVHP — SURJUDP\ SLVDQH SU]H] &LHELH REHFQLH V QLHFR ]D NUyWNLH 'ODWHJR WH* QD UD]LH RJUDQLF]\P\VL GRSU]HGVWDZLHQLDRJyOQ\FKUHJXáWZRU]HQLDPRGXáyZLLFKZ\NRU]\VWDQLD=DSU]\NáDGSRVáX*\QDPNUyWNLPRGXáTest: unit Test; interface { sekcja publiczna } type float = real; function Pow(x, y : float) : float; { SRGQRVLOLF]E [GRSRW JL\` function IleWywolan : word; ^]ZUDFDOLF]E Z\ZRáDIXQNFML3RZ`
128
Turbo Pascal — programowanie implementation { sekcja prywatna } var /LF]QLNZRUG^OLF]QLNZ\ZRáDIXQNFML` function Pow(x, y : float) : float; begin Inc(Licznik); Pow := exp(y*ln(x)); end; function IleWywolan : word; begin IleWywolan := Licznik; end; begin { sekcja inicjalizacji } Licznik := 0; end.
0RGXáWHQ]DZLHUDWU]\]DVDGQLF]HVHNFMHSXEOLF]Qinterface SU\ZDWQimplementation RUD]LQLFMDOL]DF\MQ SekcMD SXEOLF]QD RWZLHUDQD VáRZHP interface GHILQLXMH RELHNW\ NWyUH E G ÄHNVportoZDQH´]PRGXáXQD]HZQWU]=DZLHUDRQGHILQLFMHVWDá\FKLW\SyZRUD]GHNODUDFMH ]PLHQQ\FK DWDN*HW]ZGHNODUDFMH]DSRZLDGDMFH procedur i funkcji (czyli po prostu LFKQDJáyZNL 6HNFMDSXEOLF]QDVWDQRZLMHG\QEUDP SU]H]NWyUSURJUDPNRU]\VWDMF\]PRGXáXPR*HGRVWDüVL GRMHJR]DZDUWRFLZV]HONLHRELHNW\]GHILQLRZDQHZHZQWU] PRGXáX OHF] QLH ]DGHNODURZDQH Z VHNFML SXEOLF]QHM E G QLHZLGRF]QH QD ]HZQWU] :DUWR UyZQLH* SDPL WDü *H NRPXQLNDFMD ] PRGXáHP MHVW Z\áF]QLH MHGQRVWURQQDWMRELHNW\]GHILQLRZDQHZPRGXOHQLHPRJRGZRá\ZDüVL GRRELHNWyZ wykorzystuMFHJR JR SURJUDPX 0R*OLZH MHVW QDWRPLDVW Z\NRU]\VWDQLH Z PRGXOH LQQHJR PRGXáX Z W\P FHOX SR QDJáyZNX PRGXáX QDOH*\ XPLHFLü RGSRZLHGQL GHNODUDFM uses). Definicje obiektów zapowiedzianych w sekcji publicznej zawiera sekcja prywatna, RWZLHUDQD VáRZHP implementation -HM ]DZDUWRü MHVW QLHZLGRF]QD QD ]HZQWU] FR SR]RVWDMH Z ]JRG]LH ] LGH XNU\ZDQLD V]F]HJyáyZ LPSOHPHQWDF\MQ\FK RELHNW\ SU\ZDWQH Z\NRU]\VW\ZDQH V QDMF] FLHM GR ZHZQ WU]Q\FK SRWU]HE PRGXáX WDN ZL F QLH PD VHQVX XMDZQLDQLH LFK QD ]HZQWU] 0R*OLZH MHVW FR SUDZGD RGZRá\ZDQLH VL GR funkcji i procedur zadeklarowanych w sekcji interfaceDOHÄZLGRF]QRü´VSURZDG]D VL WXWDMZ\áF]QLHGR]QDMRPRFLSRVáX*HQLDVL GDQIXQNFM—Z\ZRáXMF\SURJUDP PXVL ]QDü MHM QDJáyZHN RNUHODMF\ VSRVyE SU]HND]DQLD SDUDPHWUyZ L RGHEUDQLD Z\QLNX QDWRPLDVW]QDMRPRüWUHFLQLHMHVWPXGRQLF]HJRSRWU]HEQD OstDWQL VHNFM PRGXáX MHVW QLHRERZL]NRZD VHNFMD LQLFMDOL]DFML UR]SRF]\QDMFD VL SRGREQLHMDNZ]Z\Ná\PSURJUDPLH VáRZHPNOXF]RZ\P begin. Instrukcje zawarte w VHNFMLLQLFMDOL]DFMLVZ\NRQ\ZDQHZFKZLOLXUXFKRPLHQLDSURJUDPXL]Z\NOHZ\NR-
0RGXá\ZáDVQH
129
U]\VW\ZDQH V MDN VDPD QD]ZD ZVND]XMH GR DXWRPDW\F]QHJR XVWDODQLD MHJR VWDQX SRF]WNRZHJR QS ]DSDPL W\ZDQLD NRORUyZ HNUDQX Z FHOX LFK Sy(QLHMV]HJR RGWZRU]HQLDLQLFMDOL]DFMLGUXNDUNLDXWRPDW\F]QHJRáDGRZDQLDSOLNyZNRQILJXUDF\MQ\FK &DáRü PRGXáX UR]SRF]\QD VL QDJáyZNLHP R SRVWDFL unit nazwa (ang. unit — PRGXá L NRF]\ VáRZHP NOXF]RZ\P end ] NURSN 7X XZDJD WUHü PRGXáX NRG (UyGáRZ\ L Z\QLNRZ\ ]DSDPL W\ZDQD MHVW Z RGG]LHOQ\FK SOLNDFK NWyU\FK QD]Z\ PXV] E\ü WDNLH VDPH MDN QD]ZD X*\WD Z QDJáyZNX Z QDV]\P SU]\SDGNX WHNVW (UyGáRZ\ PRGXáX QDOH*\ XPLHFLü Z SOLNX TEST.PAS ]D NRG Z\QLNRZ\ ]RVWDQLH zapisany do pliku TEST.TPU :\PLHQLRQH Z\*HM VHNFMH SRZLQQ\ Z\VW SRZDü Z WDNLHM NROHMQRFLZMDNLHM]RVWDá\RSLVDQHFKRFLD*ND*G]QLFKPR*QDSRPLQü3RVSROLWym zjawiskiem jest poPLQL FLH F] FL LQLFMDOL]DF\MQHM Z FKZLOL XUXFKRPLHQLD SURJUDPX PRGXá QLH Z\NRQXMH *DGQ\FK RSHUDFML 3RPLQL FLH F] FL SU\ZDWQHM VSRW\NDQH MHVW JáyZQLH Z PRGXáDFK GHNODUXMF\FK Z\áF]QLH VWDáH ]PLHQQH L W\S\ %UDN F] FL SXEOLF]QHM DXWRPDW\F]QLH XQLHPR*OLZLD NRPXQLNDFM ] PRGXáHP WRWH* V\WXDFMD WDND spotykana jest niezwykle rzadko. :UyüP\ GR QDV]HJR SU]\NáDGX 0RGXá Test ]DZLHUD Z F] FL SXEOLF]QHM GHNODUDFM dwóch funkcji: Pow SRGQRV]FHM OLF]E U]HF]\ZLVW GR SRW JL U]HF]\ZLVWHj, oraz ]QDF]QLH PQLHM X*\WHF]QHM IleWywolan ]ZUDFDMFHM OLF]E Z\ZRáD IXQNFML Pow. 6HNFMD SXEOLF]QD ]DZLHUD UyZQLH* GHILQLFM SURVWHJR W\SX ]PLHQQRSU]HFLQNRZHJR float. 6HNFMD SU\ZDWQD ]DZLHUD RF]\ZLFLH GHILQLFMH IXQNFML ]DSRZLHG]LDQ\FK Z VHNFML SXEOLF]QHMMDNUyZQLH*GHNODUDFM SU\ZDWQHM]PLHQQHM Licznik. Zmienna ta przechowuje OLF]E Z\ZRáD IXQNFML Pow 3RQLHZD* Licznik MHVW QLHGRVW SQ\ ] ]HZQWU] VSUyEXM MHJR ZDUWRü ]ZUDFDQD MHVW SU]H] IXQNFM IleWywolan. Warto tu ZVSRPQLHü *H ZV]HOkie gloEDOQH ]PLHQQH SU\ZDWQH PRGXáX V VWDW\F]QH WM SU]HFKRZXMVZRMZDUWRüSU]H]FDá\F]DVZ\NRQ\ZDQLDSURJUDPX &] ü LQLFMDOL]DF\MQD ]DZLHUD MHGQ LQVWUXNFM LQLFMDOL]XMF ZDUWRü ]PLHQQHM LicznikQD]HUR2VHQVRZQRFLWHJRUR]ZL]DQLDQLHWU]HEDFK\EDQLNRJRSU]HNRQ\ZDü 'R VSUDZG]HQLD G]LDáDQLD QDV]HJR PRGXáX Z\NRU]\VWDP\ NUyWNL SURJUDP
TestModulu3URJUDPWHQMHVWQDW\OHEDQDOQ\*HQLHZ\PDJDNRPHQWDU]D program TestModulu; uses Test; var x : float; { wykorzystanie zdefiniowanego typu }
begin writeln('2 do potegi 8 = ', Pow(2,8):8:4); x := 1.5; writeln('Pi do potegi 1.5 = ', Pow(Pi, x):8:4); writeln('Funkcje Pow wywolano ', IleWywolan, ' razy.'); end.
130
Turbo Pascal — programowanie -DNZLGDüZ\NRU]\VWDQLHZáDVQHJRPRGXáXRGE\ZDVL GRNáDGQLHWDNVDPRMDNVWDQGDUGRZHJRPRGXáXELEOLRWHF]QHJR-HOLSU]\MU]\V]VL XZD*QLHUDSRUWRZL]NRPSLODFML ]DXZD*\V] *H SU]HG VNRPSLORZDQLHP VDPHJR SURJUDPX 7XUER 3DVFDO Z\ZLHWOL LQIRUPDFM R NRPSLODFML PRGXáX 3R VNRPSLORZDQLX SURJUDPX QD G\VNX SRZLQLHQ SRMDZLüVL SOLNRQD]Zie TEST.TPU]DZLHUDMF\VNRPSLORZDQ\NRGZ\QLNRZ\PRGXáX 2GSRZLHGQLH IUDJPHQW\ NRGX V SRELHUDQH ] SOLNX L GRáF]DQH GR NRGX Z\QLNRZHJR programu w procesie konsolidacji. Po utworzeniu pliku .TPUPRGXáQLHE G]LHNRPSLORZDQ\ SRQRZQLH R LOH QLH ZSURZDG]LV] ]PLDQ GR NRGX (UyGáRZHJR OXE QLH Z\GDV] polecenia BuildZ\PXV]DMFHJREH]ZDUXQNRZHVNRPSLORZDQLHZV]\VWNLFKHOHPHQWyZ VNáDGRZ\FKSURJUDPX -DN SRZLHG]LHOLP\ QD SRF]WNX WHJR UR]G]LDáX ]DJDGQLHQLH PRGXáyZ MHVW UDF]HM ÄSU]\V]áRFLRZH´ WRWH* QLH E G]LHP\ VL QLP V]HU]HM ]DMPRZDü 2G VDPHM VWURQ\ WHFKQLF]QHM NWyUHM RSLV PR*HV] ]QDOH(ü Z OLWHUDWXU]H ZD*QLHMV]D Z\GDMH VL LGHD SURJUDPRZDQLD L SURMHNWRZDQLD PRGXáRZHJR SR]ZDODMFD QD V]\ENLH L VNXWHF]QH WZRU]HQLHHIHNWRZQ\FKHIHNW\ZQ\FKLEH]Eá GQ\FKSURJUDPyZ
=DSDPL WDM • =DVDGDPRGXODUQRFLMHVWMHGQ]SRGVWDZRZ\FK]DVDGGREUHJRSURJUDPRZDQLD 6WRVRZDQD MHVW RQD SU]HGH ZV]\VWNLP SRGF]DV UHDOL]DFML EDUG]LHM ]áR*RQ\FK ]DGD • 5HDOL]DFM WHM]DVDG\XPR*OLZLDMZ7XUER3DVFDOXPRGXá\ • 0RGXá]DZLHUDGHILQLFje i deklaracje obiektów zawarte w trzech sekcjach. Sekcja publiczna (interface RNUHODNWyUHRELHNW\E GZLGRF]QHQD]HZQWU]VHNcja prywatna (implementation GHILQLXMH LFK WUHü D WDN*H GHILQLXMH RELHNW\ SU\ZDWQH PRGXáX QDWRPLDVW VHNFMD LQLFMDOL]DF\MQD SU]H]QDF]RQD MHVW GR DXWRPDW\F]QHJRZ\NRQ\ZDQLD]DGDQ\FKF]\QQRFLZFKZLOLUR]SRF] FLDSURJUDPX • 2ELHNW\ ]GHILQLRZDQH Z VHNFML SU\ZDWQHM V QLHZLGRF]QH QD ]HZQWU]PRGXáX o LOHQLH]RVWDQ]DGHNODURZDQHZVHNFMLSXEOLF]QHM • 6NRPSLORZDQD WUHü PRGXáyZ MHVW SU]HFKRZ\ZDQD Z SOLNDFK R UR]V]HU]HQLX .TPU i GRáF]DQDGRZáDFLZHJRSURJUDPXZSURFHVLHNRQVROLGDFML • 3RG]LDá SURJUDPX QD PRGXá\ RUD] JUXSRZDQLH IXQNFML SURFHGXU L VWUXNWXU GDnych w ELEOLRWHNLJRWRZ\FKHOHPHQWyZXPR*OLZLDV]\ENLHLVNXWHF]QHWZRU]HQLH efektywQ\FKLEH]Eá GQ\FKSURJUDPyZ
Jak uruchamiaüRSRUQHSURJUDP\
131
-DNXUXFKDPLDü oporne programy ,P EDUG]LHM ]áR*RQ\ SURJUDP W\P PQLHMV]D V]DQVD *H XGD &L VL RG UD]X QDSLVDü JR EH]Eá GQLH :\áDSDQLH ZV]\VWNLFK Eá GyZ NRPSLODFML WR GRSLHUR SRF]WHN ]DZV]H PR*H &L VL SU]\WUDILü G]LHOHQLH SU]H] ]HUR F]\ SUyED RWZDUFLD QLHLVWQLHMFHJR SOLNX %á G\WH]ZDQHEá GDPLZ\NRQDQLDDQJruntime errors V]QDF]QLHPQLHMSU]\MHPQH i trudniejsze do XVXQL FLDRGEá GyZNRPSLODFML,FKORNDOL]DFMDZ\PDJDQDRJyáX*\FLD VSHFMDOQHJR QDU] G]LD XUXFKRPLHQLRZHJR ]ZDQHJR ] DQJLHOVND debuggerem (czyli RGSOXVNZLDF]HP 6\VWHP XUXFKRPLHQLRZ\ 7XUER 3DVFDOD E G]LH WHPDWHP RVWDWQLHJR MX*UR]G]LDáXSRZL FRQHJRWHmu kompilatorowi. 3ROHFHQLD V\VWHPX XUXFKRPLHQLRZHJR ]JUXSRZDQH V Z PHQX Run oraz Debug, przy F]\P ZL NV]RFL ] QLFK RGSRZLDGDM NODZLV]H VNUyWX 'R HNVSHU\PHQWyZ ] GHEXJJHUHP PR*QD Z\NRU]\VWDü SUDNW\F]QLH GRZROQ\ SURJUDP FKRFLD* ZDUWR E\ ]DZLHUDá on GHILQLFMHSURFHGXUL]PLHQQ\FKORNDOQ\FK'ODQDV]\FKSRWU]HERGSRZLHGQLE G]LH przedstawiony na stronie 62 program Bisekcja. -DNMX*ZLHV]Z\VWSLHQLHEá GXZ\NRQDQLDSRZRGXMHSU]HUZDQLHG]LDáDQLDSURJUDPX i ZVND]DQLH NXUVRUHP LQVWUXNFML NWyUD WHQ EáG VSRZRGRZDáD 1LHVWHW\ QD RJyá LQIRUPDFMD WDND MHVW QLHZ\VWDUF]DMFD JG\* GR VNXWHF]QHM ORNDOL]DFML Eá GX Z\PDJDQH MHVW SU]HOHG]HQLH ]DFKRZDQLD SURJUDPX QD FR QDMPQLHM NLOND LQVWUXNFML SU]HG MHJR Z\VWSLHQLHP 0R*OLZRü WDN GDMH Z QRZRF]HVQ\FK QDU] G]iach uruchomieniowych tzw. tryb krokowySR]ZDODMF\QDZ\NRQ\ZDQLHSURJUDPXLQVWUXNFMDSRLQVWUXNFML Turbo Pascal pozwala na krokowe wykonywanie programu na dwa sposoby, realizowane odpowiednio poleceniami Trace Into i Step Over z menu Run (lub odpowiadaMF\PLLPNODZLV]DPLF7 i F8 5y*QLFDSRPL G]\RE\GZRPDWU\EDPLVSURZDG]DVL do innego sposobu traktowania procedur i funkcji: polecenie Trace Into pozwala na ÄZHMFLH´ GR ZQ WU]D SURFHGXU\ ]D Step Over Z\NRQXMH M MDNR MHGQ LQVWUXNFM W obu przypDGNDFK DNWXDOQLH Z\NRQ\ZDQD LQVWUXNFMD ]RVWDMH Z\Uy*QLRQD Z WHNFLH SURJUDPX NRORURZ\P SDVNLHP $E\ Z\SUyERZDü G]LDáDQLH WU\EX NURNRZHJR skompiluj program Bisekcja (F9 L Z\NRQDM JR Z REX WU\EDFK =DXZD* WH* *H
132
Turbo Pascal — programowanie wydanie polecenia Program Reset (CTRL-F2) pozwala na zrestartowanie programu, co PR*HVL SU]\GDüJG\VL RND*H*HGDOV]HMHJRZ\NRQ\ZDQLHQLHPDVHQVX 3RZ\*V]D ZSUDZND QLH SU]\QLRVáD FK\ED *DGQ\FK QLHVSRG]LDQHN L QLHZLHOH LQIRUPDFML 7U\E NURNRZ\ SR]ZDODMF\ QD XVWDOHQLH GURJL MDN ÄSU]HE\wa” wykonanie SURJUDPX QLH GDMH *DGQ\FK ZVND]yZHN QD WHPDW ZDUWRFL SU]\MPRZDQ\FK SU]H] ]PLHQQH NWyUH Z ZL NV]RFL SU]\SDGNyZ V RGSRZLHG]LDOQH ]D VWHURZDQLH SUDF SURJUDPX D ZL F L HZHQWXDOQH NROL]MH 1D V]F] FLH SRGHMU]HQLH ]DZDUWRFL Z\EUDQHM zmiennHM MHVW EDUG]R áDWZH Z\VWDUF]\ GR WHJR SROHFHQLH Evaluate/modify (CTRL-F4) z menu Debug -HJR Z\GDQLH SRZRGXMH Z\ZLHWOHQLH RNLHQND ]DZLHUDMFHJR LQIRUPDFM RZDUWRFL]PLHQQHMRUD]SR]ZDODMFHJRQDMHM]PLDQ WDN
Rysunek 14. Pole dialogowe Evaluate and Modify W pole Expression ZSLVXMHP\ Z\UD*HQLH QS QD]Z ]PLHQQHM Z QDV]\P SU]\SDGNX eps NWyUHJR ZDUWRü FKFHP\ REHMU]Hü :DUWRü Z\ZLHWODQD MHVW Z SROX Result ]D pole New valueXPR*OLZLDMHM]PLDQ ]F]\PMHGQDNQDOH*\QLHFRXZD*Dü &]DVDPLRND]XMHVL *HSRGHMU]DQ]PLHQQQDOH*\OHG]LüFDá\F]DV:WDNLHMV\WXDFML ]DPLDVW PDáR Z\JRGQHJR SRGJOGDQLD SROHFHQLHP Evaluate OHSLHM MHVW X*\ü SROHFHQLD Watch (CTRL-F7). Po jego wydaniu (i wpisaniu nazwy odpowiedniej zmiennej lub wyra*HQLDZRNLHQNXAdd Watch QDGROHHNUDQXSRMDZLVL RNLHQNRWatches, zawieraMFH ZDUWRFL OHG]RQ\FK ]PLHQQ\FK Z QDV]\P SU]\SDGNX ]PLHQQHM a, czyli lewej JUDQLF\SU]HG]LDáXSRV]XNLZDSLHUZLDVWND
Rysunek 15. Okienko Watches 3RQLHZD*SRZUyWGRRNLHQNDHG\WRUD]Z\NOHSRZRGXMHSU]\VáRQL FLHRNLHQNDWatches, ZDUWR XSRU]GNRZDü XNáDG RNLHQHN QD HNUDQLH QS SU]HVXZDMF MH ]D SRPRF P\V]NL OXEZ\GDMFSROHFHQLHTile z menu Window. '\VSRQXMF W\PL ZLDGRPRFLDPL PR*HV] MX* Z\NRU]\VWDü WU\E NURkowy i polecenia SRGJOGDQLD ]PLHQQ\FK GR SU]HOHG]HQLD ]DFKRZDQLD ]PLHQQHM c E GFHM ELH*F ZDUWRFLSLHUZLDVWND
Jak uruchamiaüRSRUQHSURJUDP\
133
:SU]\SDGNXZL NV]\FKSURJUDPyZPR*HVL RND]Dü*HGRWDUFLHGRIDWDOQHMLQVWUXNFML ] Z\NRU]\VWDQLHP WU\EX NURNRZHJR MHVW ]E\W F]DVRFKáRQQe. W takich sytuacjach z SRPRFSU]\FKRG]LSROHFHQLHGo to cursor (F4 SRZRGXMFHZ\NRQDQLHZV]\VWNLFK LQVWUXNFML D* GR PLHMVFD ZVND]DQHJR NXUVRUHP D QDVW SQLH SU]HMFLH GR SUDF\ NURNRZHM:\NRU]\VWXMFMHPR*HV]áDWZRÄZVNRF]\ü´QSGRZQ WU]DIXQNFMLf(x) bez konieczQRFLZ\NRQ\ZDQLDLQVWUXNFMLSRSU]HG]DMF\FKMHMZ\ZRáDQLH -HOLSRZ\*V]HF]\QQRFLPDV]Z\NRQ\ZDüZLHORNURWQLH]QDF]QLHEDUG]LHMX*\WHF]QH od funkcji Go to cursorRND]XMHVL SROHFHQLHAdd breakpoint z menu Debug (CTRLF8). Jego wydanie pozwala na ustawienie w miejscu wskazanym kursorem tzw. punktu wstrzymaniaSRZRGXMFHJR]DWU]\PDQLHSURJUDPXSRND*GRUD]RZ\PMHJRRVLJQL FLX 1LH GRü WHJR GRGDWNRZH SDUDPHWU\ SXQNWX ZVWU]\PDQLD Condition i Pass count) XPR*OLZLDMMHJRZDUXQNRZHZ\NRQ\ZDQLHOXE]LJQRURZDQLHRNUHORQHMOLF]E\SU]HMü 2SFMHWHX*\ZDQHVU]DGNRLQLHE G]LHP\LFKWXRPDZLDüZZL NV]RFLSU]\SDGNyZ X*\FLH SXQNWyZ ZVWU]\PDQLD VSURZDG]D VL GR LFK XVWDZLDQLD L XVXZDQLD ]D SRPRF klawiszy CTRL-F8 (odpowiednia instrukcja zosWDQLH Z\Uy*QLRQD Z WUHFL SURJUDPX NRORURZ\PSDVNLHP 3RGRMFLXSURJUDPXGRSXQNWXZVWU]\PDQLDQDRJyáZ\VWDUF]\ VSUDZG]Lü]DZDUWRüSRGHMU]DQHM]PLHQQHMSROHFHQLHPEvaluate lub Add Watch. 6NUyWRZHRPyZLHQLHSROHFHV\VWHPXXUXFKRPLHQLRZHJRNRF]\QDV]Hwprowadzenie GRSURJUDPRZDQLDL7XUER3DVFDOD'DOV]HZLDGRPRFL]GRE G]LHV]NRU]\VWDMF]EDUdziej zaawansowanej literatury, a przede wszystkim na drodze praktycznej — SLV]F SURJUDP\3DPL WDM .RU]\VWDQLH]NRPSXWHUDQLH]ZDOQLDRGP\OHQLD
,P ZL NV]\ QDFLVN SRáR*\V] QD ZáDFLZH ]DSURMHNWRZDQLH UR]ZL]DQLD W\P PQLHM F]DVX E G]LHV] PXVLDá SRZL FLü QD MHJR ]DSURJUDPRZDQLH L W\P PQLHMV]H V]DQVH *H E G]LHV]PXVLDáRGZRá\ZDüVL GRSRPRF\URGNyZXUXFKRPLHQLRZ\FK Powodzenia!
134
Turbo Pascal — programowanie
Literatura 1. A. Marciniak: Turbo Pascal 7.01$.203R]QD 2. Tomasz M. Sadowski: Praktyczny kurs Turbo Pascala, Helion, Gliwice 1991, 1993. 3. J. Zahorski: Turbo Pascal 7.0, Helion, Gliwice 1995.