home *** CD-ROM | disk | FTP | other *** search
- /* Popis programovacího jazyku C++ 3.1: Fr.Sokolovskÿ
- Tento krátkÿ návod vznikl jako nápovêda pro zaçáteçníky C++, kte⌐í jiæ
- trochu ovládají Pascal. V tomto návodu je srovnáván Pascal s C++, které
- snad pomûæe p⌐epsat nêkteré programy z Pascalu do C++.
-
- Dále jsem pouæil p⌐edná¿ky programování v C++, které p⌐edná¿í
- ing. M. Virius, CSc. na FJFI ÇVUT. Tímto mu dêkuji za odpovêdi na mé
- rûznorodé otázky.
-
- Tento krátkÿ Help vznikl prohlídnutím nêkolika programû v C++ a vlastními
- zku¿enostmi autora p⌐i uçení C++ a náv¿têvou ví¿e uvedenÿch p⌐edná¿ek.
- V¿echny nové poznatky, které jsou ov¿em prakticky vyzkou¿ené, jsou uvedeny
- v tomto souboru. Je nutné upozornit, æe pouæívám Borland C++ 3.1 verzi
- pro MS-DOS.
-
- ------------------------------------------------------------------------
-
- ùvodní poznámky:
- 1. C++ rozli¿uje malá a velká písmena, pokud napí¿eme místo main => Main
- vznikne chyba p⌐i linkování programu.
- 2. Za main jsou nutné kulaté závorky ()!
- 3. Rovnêæ jsou nutné závorky i za procedurou, která nemá parametry (narozdíl
- od Pascalu).
- 4. Je nutné uvést závorky i p⌐i volání, v p⌐ípadê, æe chceme volat Tisk a
- napsali bychom pouze Tisk; tak se procedura ani nazavolá (p⌐estoæe
- p⌐eklad ani linkování neohlásí chybu).
- 5. Mezi { a } se vkládají p⌐íkazy (je obdobou begin
- end; v Pascalu).
- 6. P⌐íkaz "include" umoæñuje p⌐eçíst ze souboru C++ soubor procedur a funkcí,
- nêco jako USES jméno v Pascalu, zde se soubor vædy znovu p⌐ekládá,
- v Pascalu se p⌐eloæenÿ soubor .TPU pouze p⌐ipojí k vlastnímu .EXE
- souboru. Soubory .h spí¿e p⌐ípomínají (neæ .TPU) soubory, které se
- nahrávají p⌐íkazem Pascalu: {$I jméno}.
- IOSTREAM.H je jednotka s procedurami a funkcemi umoænující tisk dat
- na obrazovce, çtení znakû z klávesnice atd. Jméno souboru je vyjímka,
- u nêhoæ se nerozli¿ují malá a velká písmena (ani MS-DOS je nerozli¿uje).
- Bylo by zajímavé si spustit C++ pod Unixem (Unix rozli¿uje velké a
- malé písmena), abychom zjistili, zda C++
- p⌐evádí znaky ve jménê souboru na velké písmena nebo je p⌐edává tak, jak
- to napí¿e programátor pop⌐. uæivatel (bez p⌐evedení) DOSu...
- 7. P⌐íkaz cout umoæñuje standartní vÿstup, pokud není nastaveno jinak,
- provádí se vÿstup na obrazovku (hlavnê mám na mysli p⌐esmêrování vÿstupu,
- kdyæ spou¿tíme soubory EXE,COM).
- 8. Za kaædÿm p⌐íkazem (aæ na nêkolik vyjímek) se stejnê jako v Pascalu pí¿í
- st⌐edníky ";".
- 9. Deklarace procedury:
- (Procedura je podprogram, kterÿ se volá názvem dané procedury, v C++ je
- nutné p⌐idat (), ikdyæ procedura nemá parametry.)
- void Jméno(parametry);
- viz Pascal:
- procedure Jméno(parametry);
- ------------------------------------------------------------------------
- 1. P⌐íklad: Definice hlavního programu: */
-
- void main()
- {
- }
-
- /* viz Pascal:
-
- program main;
- begin
- end.
-
- ------------------------------------------------------------------------
- 2. P⌐íklad: Definice procedury Tisk a pouæití: */
-
- #include <iostream.h>
- void Tisk()
- {
- cout << "Zkou¿ka deklarace procedury.";
- }
-
- void main()
- {
- Tisk();
- }
-
- /* viz Pascal:
-
- program main;
- procedure Tisk;
- begin
- Write('Zkou¿ka deklarace procedury.');
- end;
-
- begin
- Tisk;
- end.
-
- ------------------------------------------------------------------------
-
- Poznámky:
- 1. Existuje nêkolik druhû promênnÿch (stejnê jako v Pascalu):
- tab.1:
- ┌─────────────────┬──────────────┐
- │C++ │Pascal │
- ├─────────────────┼──────────────┤
- │int │integer │
- │unsigned char │char │
- │unsigned int │word │
- │long │longint │
- │long double │extended │
- │float │single │
- └─────────────────┴──────────────┘
- 2. Deklarace promênnÿch: poæití tab.1:
- tab.2:
- ┌─────────────────┬───────────────┐
- │C++ │Pascal │
- ├─────────────────┼───────────────┤
- │int a; │var a:integer; │
- │unsigned char a; │var a:char; │
- │float a; │var a:single; │
- │long double a; │var a:extended;│
- │... atd. │ │
- └─────────────────┴───────────────┘
- 3. Deklarace funkcí:
- prom Jméno(parametry);
- viz Pascal: prom:=Jméno(parametry);
- 4. Pouæití funkce:
- Funkce vrací uvedenou hodnotu (p⌐ed jejím jménem v deklaraci) a volá
- se jejím jménem:
- promênná=funkce(parametry)
- v Pascalu: promênná:=funce(parametry);
- Vÿstup funkce mûæe bÿt pouæit v libovolném p⌐íkazu jako parametr nebo
- ve vzorci.
- 5. Vÿstupní hodnota funkce se p⌐edává pomocí p⌐íkazu "return" hodnota, ale
- v Pascalu se p⌐edává do promênné, která se jmenuje stejnê jako funkce,
- v tom je rozdíl mezi C++ a Pascalem.
- 6. Není dobré, aby se funkce a promênná jmenovaly stejnê. Potom má p⌐ekadaç
- problémy s odli¿ením a hlasí zbyteçné chyby.
- ------------------------------------------------------------------------
- 3. P⌐íklad: Definice a pouæití funkce: */
- #include <iostream.h>
- double mocnina(double x)
- {
- return x*x;
- }
-
- void main()
- {
- double a,b;
- b=5;
- a=mocnina(b);
- cout <<"Druhá mocnina je "<<a<<". ";
- }
-
- /* viz Pascal:
- program main;
- function mocnina(x:double):double;
- begin
- mocnina:=x*x;
- end;
-
- var a,b:double;
- begin
- b:=5;
- a:=mocnina(b);
- Write('Druhá mocnina je ',a,'. ');
- end.
-
- ------------------------------------------------------------------------
-
- Poznámky: Grafika v C++
- 1. Grafické procedury pouæívají .BGI soubory stejnê jako v Borland (Turbo)
- Pascalu, mají vesmês stejné jména a téme⌐ stejné parametry.
- 2. Standartní grafická knihovna se "p⌐ekvapivê" jmenuje GRAPHICS.H. Opêt
- na zaçátku programu pouæijeme p⌐íkaz "#include <graphics.h>". (viz Pascal
- uses Graph;).
- 3. Nutné mít nastavenou cestu k nalezení grafické knihovny v menu
- Options - Directories - ⌐ádka "Include Directories" v dialogu. Zapisování
- prohledávacích cest je stejné jako v Turbo Pascalu, jednotlivé cesty se
- v ⌐ádku oddêlují st⌐edníkem, cesta odpovídá MS-DOSu (nebo systému, pod
- kterÿm C++ pracuje). Dále kvûli linkování programu je dobré mít nastaveno
- v Options - Linker - Libraries - volbu "Graphics library" zatrhnutou
- (za¿krtnutou çi zapnutou), znak [X], stiskem mezerníku.
- 4. Dále je dobré mít v aktuálním adresá⌐i nebo v adresá⌐i, odkud spou¿tíme
- p⌐eloæenÿ .EXE soubor, mít BGI soubory nebo programem APPEND MS-DOSu
- nastaven adresá⌐, kde se nachází .BGI soubory. Jinak p⌐i bude nutné p⌐i
- otevírání grafiky (viz bod 5.) nutné psát vædy cestu k BGI souborûm.
- 5. Otevírání grafiky (neboli p⌐epnutí PC a monitoru do grafického reæimu)
- provedeme p⌐íkazem: "initgraph (çíslo grafického ovladaçe,çíslo grafického
- módu, cesta ke grafickému ovladaçi)." Otev⌐ení grafiky je umêní: Jednak
- musí uspê¿nê probêhnout kompilace, linkování, spu¿têní programu, nalezení
- .BGI souboru, p⌐eçtení a pokud má správnÿ formát (nap⌐. BGI v Pascalu a
- v C++ z⌐ejmê nejsou stejného formátu, snad nêkteré verze snad budou kompa-
- tibilní...) a musí bÿt dostatek pamêti. Potom (za têchto p⌐edpokladû) se
- úspê¿nê p⌐epne monitor a PC do grafického módu. Nêkdy je lep¿í vzít pod-
- program v Assembleru, nastavit správné çíslo grafického módu a zavolat
- p⌐eru¿ení 10H. Viz Pascal: InitGraph
- 6. Je dobré, pokud se otev⌐ení grafiky neda⌐í, si p⌐ekopírovat p⌐íklad programu
- z HELPu:
- a) otev⌐ít nové okno: File - New
- b) napsat "initgraph" a umístit na nêj kurzor a stisknout >CTRL<+>F1<
- c) p⌐íklad k p⌐íkazu "initgraph" uloæit do bloku, pohybem textem stikem
- kláves pro pohyb kurzoru p⌐i stisknutém Shift. Na konci bloku klávesy
- pustit a v menu Edit - Copy a klávesou F6 p⌐eponout do nového okna nebo
- stiskem ESC uzav⌐ít HELP
- d) vyvolat z Clipboard text: Edit - Paste
- Pokud program z HELPu nebude fungovat, zkuste nastavení - viz bod 3. a
- mít BGI soubor - viz bod 4. Pokud ani potom nepude otev⌐ít grafika,
- bude chyba buâ v malé pamêti nebo v grafické kartê çi p⌐i komunikaci
- s grafickou kartou (v takovém p⌐ípadê je dobré vyuæít standartní
- p⌐eru¿ení 10H pro práci s monitorem) a nebo zniçené C++.
- 7. Çekání na stisk klávesy: p⌐íkaz: "getch()" - viz Pascal: ReadKey. Dobré
- aby se uæivatel Va¿eho programu mohl dívat na grafickÿ vÿstup po neomezenê
- dlouhou dobu a aæ se vynadívá, stiskne grafickou nebo alfanumerickou
- klávesu.
- 8. Vykreslení bodu: "putpixel(x,y,barva)" stejnê jako v Pascalu
- 9. Çtení barvy bodu v sou⌐adnicích x,y: "promênná=getpixel(x,y)" stejnê jako
- v Pascalu
- 10. Kruænice "circle(x,y,r)" stejnê jako v Pascalu
- 11. ùseçka "line(xa,ya,xb,yb)" stejnê jako v Pascalu
- 12. Zav⌐ení grafiky: "closegraph()" viz Pascal: CloseGraph
- Programování grafiky v C++ 3.1 pod MS-DOSem v porovnání s Pascalem pod
- MS-DOSem je témê⌐ stejné, procedury a funkce se vesmês jmenují stejnê a mají
- také vesmês stejné parametry jako v Pascalu, navíc v Helpu je nêkolik
- funkçních programkû, takæe je zde nebudu uvádêt, snad jen pro ty kte⌐í nemají
- help v C++ (coæ je chyba).
- ------------------------------------------------------------------------
- 4. P⌐íklad: Grafika: */
- #include <graphics.h> /* viz: uses Graph; */
- #include <stdlib.h> /*pouæit procedura "exit" pro ukonçení programu
- viz Halt(chybovÿ kód) v Pascalu */
- #include <stdio.h> /*pouæit "printf" pro tisk na monitor - popsán
- v následující kapitole */
- #include <conio.h> /*jednotka, která se podobá CRT v Pascalu*/
-
- int main(void) /*zde je hlaví program definován jako funkce (a proç ne???)*/
- {
- /* request auto detection */
- int gdriver = DETECT, gmode, errorcode; /* vloæení hodnoty DETECT do
- promênné "gdriver" a její deklarace a deklrace gmode, errorcode */
-
- /* initialize graphics mode */
- initgraph(&gdriver, &gmode, "");
-
- /* read result of initialization */
- errorcode = graphresult(); /* funkce pro zji¿têní, zda probêhlo otev⌐ení
- grafiky v po⌐ádku. */
-
- if (errorcode != grOk) /* an error occurred */
- {
- printf("Graphics error: %s\n", grapherrormsg(errorcode));
- printf("Press any key to halt:"); /* vÿpis chybové zprávy a ukonçení */
- getch();
- exit(1); /* return with error code */
- }
-
- /* draw a line */
- line(0, 0, getmaxx(), getmaxy());
-
- /* clean up */
- getch();
- closegraph();
- return 0; /* vrací jako vÿstup programu 0 */
- }
-
- /*
- ------------------------------------------------------------------------
- Dal¿í poznámky:
- 1. Pokud máme hlavní program jako funkci a poda⌐í se p⌐eloæit a nalinkovat,
- po odstartování .EXE souboru a ukonçení programu se hodnota vrácená pomocí
- "return x" je uloæena do promênné ERRORLEVEL (viz MS-DOS), kterou lze
- testovat v BAT souboru.
- 2. Pokud máme hlavní program jako proceduru (void main()), potom je têæké
- zjistit co vrací, neboƒ promênná ERRORLEVEL je na neznámém místê v RAM,
- ale ani se nedá vypsat z BAT souboru, pouze zda je hodnota vêt¿í nebo
- rovna nêjaké zadané hodnotê.
- 0 se vrací v p⌐ípadê, æe program byl úspê¿nê, bezchybnê ukonçen.
- 3. Podmínka v "if" v C++ se (narozdíl od Pascalu) pí¿e v závorce, za kterou
- se dá { p⌐íkazy }; else {p⌐íkazy}. Else lze (stejnê jako v Pascalu)
- vynechat. V C++ se podmínka zásadnê pí¿e bez klíçového slova "then" a vædy
- se za blokem p⌐íkazu pí¿e st⌐edník (ikdyæ následuje "else").
- 4. Pokud je v podmínce v "if" vyk⌐içník (viz minulÿ p⌐íklad - testování
- chyby p⌐i otev⌐ení grafiky), potom je podmínka znegována (Not v Pascalu).
- 5. P⌐íkaz "printf" má vodnê moæností, proto ho popí¿u v p⌐í¿tí kapitole.
- 6. "getch" je obdoba ReadKey v Pascalu - çekání na stisk klávesy.
- 7. exit(ChybovÿKód) je obdoba Halt(ChybovÿKód) - ukonçení programu.
- 8. P⌐i⌐azovací p⌐íkaz "=" (jako v Pascalu, ale bez dvojteçky). Na levé stranê
- je vædy promênná, na pravé stranê mohou bÿt promênné, konstanty nebo
- vÿraz.
- 9. Dûleæitá poznámka: parametry procedur a funkcí (v Pascalu)
- a) promênné p⌐edávané hodnotou: typ JménoPromênné (jménoPromênné:typ)
- b) promênné p⌐edávané odkazem: typ &JménoPromênné (var JménoPromênné:typ)
-
- a) P⌐i p⌐edávání promênné odkazem se pod názvem promênné "myslí" adresa
- v pamêti, takæe promênná se p⌐i volání nekopíruje a zustává pouze
- jednou. Z toho vyplÿvá, æe pokud promênnou zmêníme uvnit⌐ procedury
- nebo funkce, projeví se zmêna promênné i "vnê" procedury. P⌐edávání
- promênné odkazem je stejné jako vÿstup funkce. Promênná, do které je
- ukládán vÿstup funkce, se také zmêní po provedení funkce. Jako parametr
- p⌐edávanÿ odkazem mûæe bÿt pouze promênná (nikoliv konstanta çi vÿraz
- apod.).
- b) P⌐i p⌐edávání promênné hodnotou se pod názvem promênná "myslí" tolik
- Bytû, kolik promênná zabírá. P⌐i volání procedury se udêlá kopie
- promênné a pokud mêníme promênnou uvnit⌐ procedury, mêníme pouze kopii
- promênné. Takæe po opu¿têní procedury zûstane originál nezmênên.
-
- Vÿhody promênnÿch p⌐edávanÿch odkazem:
- 1. ¢et⌐í se pamêt p⌐i volání procedury (kdyby bylo parametr procedury
- velké pole, tak se p⌐i volání procedury znovu vytvo⌐í v pamêti a potom
- se po ukonçení procedury pamêƒ uvolní).
- 2. Takto lze u procedur çi funkcí p⌐edávat více vÿstupû.
-
- Vÿhody promênnÿch p⌐edávanÿch hodnotou:
- 1. Pouæívají se v rekurzi, pokud se rekurze volá s jinÿmi vstupními para-
- metry (coæ je zpravidla v kaædé rekurzi), pokud bychom rekurentní
- procedu⌐e p⌐edávali parametry odkazem, pak by se p⌐i kaædém volání
- procedury p⌐emazávala promênná. Ale to se nemûæe stát u rekuretní
- procedury v parametry p⌐edávanÿmi hodnotou, protoæe p⌐i kaædém volání
- procedury se vytvo⌐í nová kopie dané promênné, takæe stará zûstane
- bezezmêny.
- 2. Logickÿ závêr: P⌐i p⌐edávání promênné hodnotou se nemusíme obávat
- zniçení hodnoty pûvodní promênné, pokud v procedu⌐e mêníme promênné.
-
- 10. V p⌐i⌐azovacím p⌐íkazu lze psát i vÿraz typu: p=p+1 nebo p=p-1,
- coæ lze v Pascalu napsat p:=p+1 resp. p:=p-1 nebo moæné ekvivalentní
- (v matematickém çi logickém smyslu) zápisy v Pascalu jsou:
- Inc(p) resp. Dec(p). Pozn.: V Assembleru existuje instrukce INC a DEC,
- které umoænují zvÿ¿it resp. sníæit obsah registru çi pamêƒové buñky
- o 1. Pascalské Inc a Dec navíc umoæñují zvÿ¿it resp. sníæit obsah
- promênné o více neæ o 1.
- V C++ existují zápisy: p++ resp. p--, kde "p" je promênná (hlavnê dost
- çasto celá çíselná promênná) a "++" je operátor INC (zvÿ¿ení o 1)
- "--" je operátor DEC (sníæení o 1).
-
- Kuriozita: Uæ moæná vím, proç se tento jazyk jmenuje C++..
- Asi autor chtêl zvÿ¿it promênnou velké C o jedniçku a tak napsat
- C++ pro zvÿ¿ení hodnoty C o 1. A omylem se na disku p⌐emazal pûvodní
- p⌐ekladaç kouskem zdrojového textu zrovna v místê, kde byl název
- programovacího jazyka a tak p⌐i dal¿ím spu¿têním se divil, co se
- stalo a jak se mu programovací p⌐ejmenoval... He, he, héé...
-
- Ale teâ váænê, na p⌐edná¿ce Programování v C++, kterou p⌐edná¿í na FJFI - ÇVùT
- Ing. M.Virius, jsem se dozvêdêl lep¿í vysvêtlení, od çeho je odvozen název C++
- a to, æe C++ je následovník jazyka C. Proto se domnívám, æe dal¿í norma jazyka
- C bude obsahovat oznaçení "(C++)++".
- Ale z çeho vznikl název "C"? Prÿ (podle neovê⌐enÿch zdrojû) existoval jazyk "B"
- (nikdy jsem ho nevidêl...) a tak se tedy domnívám, æe p⌐ed tím existoval jazyk
- "A". A pokud já nêjakÿ programovací jazyk vytvo⌐ím, nazvu ho t⌐eba "D" a dal¿í
- verze: "D++", "(D++)++", "((D++)++)++" atd.
- Nyní jiæ na mê k⌐içíte, abych se vrátil k programování v C++, tak tedy zpêt ke
- grafice...
-
- ------------------------------------------------------------------------
- viz Pascal: Grafika
- program Main;
- uses Graph,Crt;
- var gdriver,gmode,errorcode:Integer;
- begin
- { request auto detection }
- gdriver:=DETECT;
-
- { initialize graphics mode }
- initgraph(gdriver, gmode, '');
-
- { read result of initialization }
- errorcode := graphresult;
-
- if (errorcode <> grOk) then { an error occurred }
- begin
- Writeln('Graphics error: ',grapherrormsg(errorcode));
- Writeln('Press any key to halt:');
- ReadKey;
- Halt(1); { return with error code }
- end;
-
- { draw a line }
- line(0, 0, getmaxx, getmaxy);
-
- { clean up }
- ReadKey;
- closegraph;
- end.
-
- ------------------------------------------------------------------------
- 5. P⌐íklad: Parametry p⌐edávané odkazem, zvy¿ování a sniæování promênnÿch: */
- #include <iostream.h>
- int glob; /* deklarace nêjaké globální promênné */
- void proc(int &p1)
- {
- p1=5;
- }
-
- void main()
- {
- glob=2;
- cout << glob << " ";
- proc(glob);
- cout << glob << " ";
- glob++;
- cout << glob << " ";
- glob--;
- cout << glob << " ";
- }
- /*
- ------------------------------------------------------------------------
- viz Pascal:
- program main;
- var glob:integer; { deklarace nêjaké globální promênné }
-
- procedure proc(var p1:integer);
- begin
- p1:=5;
- end;
-
- begin
- glob:=2;
- Write(glob,' ');
- proc(glob);
- Write(glob,' ');
- Inc(glob);
- Write(glob,' ');
- Dec(glob);
- Write(glob,' ');
- end.
- ------------------------------------------------------------------------
-
- Poznámky: p⌐íkaz "printf":
- 1. Pokud nêkdo programoval v jazyku ACTION! na ATARI 800 XL, ví, æe jakási
- podobnost mezi "printf" v ACTIONu a v C++ je. Narozdíl od PRINT v Basicu
- je "printf" v C++ dokonalej¿í, umoæñuje jakÿsi formátovanÿ vÿstup.
- 2. "printf" má hodnê parametrû (které se ale zadávájí do ⌐ezêzce textu).
- Text se v C++ (stejnê jako v BASICu nebo v ACTIONu zadávají v uvozovkách),
- narozdíl od apostrofû v Pascalu.
- 3. Ti kdo vlastní HELP budou mít vÿhodu, ti co ho nemají, budou se muset
- spokojit s informacemi, které zde uvedu. V HELPu se pí¿e mnoho hezkÿch
- vêcí...
- */
-