Po úvodních teoretických lekcích se konečně dostáváme do praxe. Náplní dnešní lekce programování v jazyce C++ bude vytvoření první fungující aplikace.
C++ a Visual C++ 2008 Express
Počítačové programy v jazyce C++ budeme vytvářet v nejmodernějším integrovaném vývojovém prostředí současnosti, které obsahuje produkt Visual C++ 2008 Express od společnosti Microsoft. Expresní edice vývojového prostředku je volně k dispozici na webových stránkách Microsoftu, a pokud jste pravidelními čtenáři PC Worldu, mohli jste jej najít také na DVD příloze u čísla 2/2008. Visual C++ 2008 Express jsme se rozhodli využít zejména proto, že obsahuje veškeré funkce a programové rysy, jež budeme ke své práci potřebovat. Navíc je tento programovací nástroj zdarma dosažitelný pro každého zájemce, který by se rád ponořil do tajů programování v jazyce C++. Ačkoliv jsme pro účely tohoto kurzu zvolili Visual C++ 2008 Express, vzdělávat se s námi samozřejmě mohou také majitelé vyšších verzí Visual Studia 2008 (Standard a Professional). Po pravdě řečeno, osnovy jednotlivých lekcí budou přístupné i pro uživatelé starších verzí produktu Visual C++, tedy jmenovitě Visual C++ .NET, Visual C++ .NET 2003 a Visual C++ 2005. Patříte-li k vymezenému cílovému publiku, vítáme vás!
Instalace produktu Visual C++ 2008 Express a první kontakt s vývojovým prostředím
Instalační proces je jednoduchý, přehledný a názorný, tudíž nepředpokládáme, že byste s instalací vývojového softwaru měli mít nějaké potíže. Po nainstalování se ve složce Všechny programy objeví položka Visual C++ 9.0 Express Edition, která obsahuje zástupce Microsoft Visual C++ 2008 Express Edition. Když klepnete na tohoto zástupce, spustí se Visual C++ 2008 Express. Vedle již zmíněného zástupce se ve složce Visual C++ 9.0 Express Edition nachází rovněž vnořená složka Visual Studio Tools. V ní je obsažen zástupce Visual Studio 2008 Command Prompt, jenž nám dovolí spouštět programy napsané v jazyce C++ přímo z příkazového řádku.
Po spuštění Visual C++ 2008 Express se před vámi objeví hlavní okno programu, které vidíte na obrázku 1.
Hlavní okno programu představuje základní pohled na komplexní integrované vývojové prostředí (IDE, Integrated Development Environment). Pod zkratkou IDE rozumíme balík nástrojů, které automatizují standardní programátorské činnosti. Automatizací máme na mysli softwarové provádění aktivit, která na svá bedra převezme Visual C++ 2008 Express. Tím pádem se programátorovi velice usnadňuje život, poněvadž se může plně soustředit na svou vlastní abstraktní práci a technickou část směle přenechat „digitálním“ pomocníkům. Součástí prostředí IDE je editor pro psaní zdrojového kódu jazyka C++, dále preprocesor a kompilátor, ladící a spojovací program, zapomenout nesmíme ani na systém elektronické dokumentace s množstvím cenných technických informací a zdrojů.
Po prvním spuštění vás Visual C++ 2008 Express vybídne k registračnímu procesu. Registraci doporučujeme, poněvadž na oplátku získáte od společnosti Microsoft další přidanou hodnotu v podobě rozmanitých dárků. Standardně vás Visual C++ 2008 Express přivítá s úvodní stránkou Start Page, na které jsou umístěna čtyři okna: Recent Projects, Getting Started, Visual C++ Express Headlines a Visual C++ Developer News. Nás budou zajímat pouze dvě z nich: Recent Projects a Visual C++ Developer News. První obsahuje seznam posledně editovaných projektů jazyka C++ a hypertextová návěstí pro otevření existujícího (Open Project) a vytvoření nového (Create Project) projektu. Je nasnadě, že seznam projektů bude po prvním spuštění Visual C++ 2008 Express prázdný, poněvadž jsme ještě žádný projekt nezaložili, ani neotevřeli. Druhé okno, Visual C++ Developer News, předkládá před vývojáře aktuální informační zprávy, které získává ze spřízněných RSS kanálů. Jste-li připojeni k Internetu, okno bude zaplněno zprávami, jež by vás mohly zajímat. Informace z RSS kanálů jsou aktualizovány každou hodinu, čili vždy budete mít přehled o tom, co se ve vývojářském světě děje.
Visual C++ 2008 Express, programovací jazyky a vývoj softwaru
Ještě než přikročíme k založení prvního projektu v jazyce C++, rádi bychom vás seznámili s programátorskými modely, které lze v prostředí Visual C++ 2008 Express použít. Visual C++ je jediným softwarovým produktem, v němž se snoubí hned několik programovacích jazyků a jejich kompilátorů. Visual C++ 2008 vám totiž umožňuje:
1. Programovat aplikace v jazyce C s využitím standardní knihovny CRT jazyka C (C Runtime Library).
2. Programovat aplikace v jazyce C++ s využitím standardní knihovny a šablonové knihovny jazyka C++ (STL, Standard Template Library).
3. Programovat aplikace v jazycích C a C++ společně s Win32 aplikačním programovým rozhraním (API, Application Programming Interface).
4. Programovat aplikace v jazyce C++ s objektově orientovanou knihovnou MFC (Microsoft Foundation Classes).
5. Programovat řízené (.NET) aplikace v jazyce C++/CLI pro platformu .NET Framework 3.5.
Expresní edice Visual C++ 2008 nepodporuje přímý vývoj MFC aplikací, ovšem i tak obsahuje překladače jazyků C, C++ a C++/CLI. V našem kurzu se budeme soustřeďovat na objasnění základních principů programování v jazyce C++. Vzhledem k tomu, že nechceme, aby byla křivka učení příliš strmá, budeme základy vykládat ve spojení s vývojem konzolových aplikací. Konzolová aplikace představuje program, jenž běží v okně příkazového řádku. Je to tedy program, který pracuje s textovým vstupem a výstupem. Konzolová aplikace má dvě hlavní výhody: Za prvé, studenti nejsou zatíženi tvorbou grafického rozhraní programu, a tak se mohou plně soustředit na proces vymýšlení a zapisování algoritmů. A za druhé, práce s „konzolovkou“ je nesmírně snadná, protože komunikace s uživatelem probíhá zadáváním textových dat, která jsou posléze zpracována implementovanými algoritmy. Dialog uživatele s konzolovou aplikací je veden tímto stylem: uživatel specifikuje vstupní data, která pak program zpracuje a oznámí uživateli výsledek své činnosti. Samozřejmě v jazyce C++ je možné psát i „okenní“ aplikace, tedy programy s přívětivým vizuálním kabátkem. Problém je ale v tom, že abychom byli schopni vytvořit takovouto aplikaci, musíme být pokročilými programátory v C++. Je to způsobeno tím, že při programování aplikací s grafickým rozhraním se využívají externí knihovny (jako již zmíněná MFC), které však běžně pracují se složitými programovacími entitami a technikami.
Všechny programy, které vznikou v našem programátorském kurzu, budou patřit k nativním programům. Nativní programy nejsou závislé na platformě Microsoft .NET Framework, takže tato platforma nemusí být na cílovém počítači přítomna, program bude i tak fungovat. Ve skutečnosti jsou spustitelné soubory (.exe) nativních programů naplněny čistým strojovým kódem, který procesor počítače dovede bez nejmenších potíží identifikovat a zpracovat. Jestliže vás ale láká vytváření programů pro platformu .NET 3.5, vaším favoritem se stane jazyk C++/CLI, což je varianta jazyka C++ pro psaní řízených aplikací splňujících směrnice společné jazykové infrastruktury (CLI, Common Language Infrastructure) platformy .NET 3.5.
Založení prvního projektu v jazyce C++
Nový projekt konzolové aplikace jazyka C++ založíme tímto způsobem:
1. Na úvodní stránce Start Page zaměříme svou pozornost na okno Recent Projects.
2. Zde klepněme na hypertextový odkaz Project…, jenž je situován napravo od návěstí Create. Téměř okamžitě se objeví dialogové okno New Project
3. Ať už upřednostníme kteroukoliv variantu, zobrazí se dialogové okno New Project. Ve stromové struktuře Project types vybereme položku Win32.
4. V seznamu projektových šablon (Templates) zvolíme šablonu s názvem Win32 Console Application. Projektová šablona představuje startovní bod pro budování aplikací jistého typu. V našem případě jsme provedli selekci šablony pro založení nativní konzolové aplikace ve stylu Win32 API.
5. Každý projekt musí být před svým vytvořením pojmenován. Textové pole Name je připraveno pro název projektu. Poněvadž jde o první projekt v jazyce C++, pojmenujeme ho „PrvniProjekt“ (bez uvozovek). Samozřejmě můžete projekt pojmenovat jakkoliv budete chtít.
6. V textovém poli Location je zadána absolutní cesta ke složce, v níž budou umístěny všechny součásti nově zakládaného projektu. Visual C++ 2008 Express implicitně vytváří pro každý nový projekt tzv. řešení. Řešení vystupuje jako fyzický kontejner, do něhož smí být umístěn jeden, nebo i více projektů současně.
Je důležité, abyste hned ze začátku pochopili sémantický rozdíl mezi řešením a projektem. Nezřídka se stává, že programátoři tyto termíny volně zaměňují, což ovšem není správné. V našich intencích je řešení balíčkem, v němž se bude ve většině případů nacházet pouze jeden projekt. Nic nám však samozřejmě nebrání v tom, abychom (v době, kdy už budeme zkušenější) začali vytvářet víceprojektová řešení. Podobně jako projekt, i řešení má své jméno, které můžeme zapsat do pole Solution name. Podotkněme, že není-li určeno jinak, jméno řešení je shodné s názvem projektu. Visual C++ 2008 Express pro každé řešení přichystá novou složku (což se dovtípíme při pohledu na pole Create directory for solution, které je implicitně aktivní). Nyní by mělo dialogové okno New Project vypadat jako na obrázku 2.
7. Po klepnutí na tlačítko OK se k slovu dostane průvodce sestrojením nové konzolové aplikace (Win32 Application Wizard). V okně průvodce klepněte na hypertextový odkaz Application Settings.
8. Dostáváme se do okna konfigurace aplikačních nastavení. V sekci Additional options si povšimneme pole Empty project, které aktivujeme. Tím přikážeme, aby Visual C++ 2008 Express vytvořil prázdný projekt. To je přesně to, co chceme, neboť zdrojový soubor, do něhož zapíšeme zdrojový kód našeho prvního programu, přidáme sami vlastními silami.
9. Po stisknutí tlačítka Finish zahájí průvodce generování bázové struktury projektu.
Poté, co průvodce dokončí své inicializační aktivity, se v levé části integrovaného vývojového prostředí objeví okno Solution Explorer (Průzkumník řešení). V okně Průzkumníka máme možnost pohlédnout na strukturu řešení a projektu. V řešení se nachází jeden projekt, do něhož mohou být ukládány tři základní typy souborů: hlavičkové soubory (složka Header Files), soubory s aplikačními zdroji (Resource Files) a zdrojové soubory (Source Files). Pro nás je v tomto okamžiku zajímavá poslední složka, protože potřebujeme do projektu manuálně přidat jeden zdrojový soubor. To uděláme takto:
1. Na složku Source Files klepneme pravým tlačítkem myši.
2. V zobrazené místní nabídce ukážeme na položku Add, poté klepneme na příkaz New Item….
3. V dialogu Add New Item vybereme šablonu C++ File (.cpp). Prostřednictvím této šablony vložíme do projektu nový zdrojový soubor. Zdrojový soubor obsahuje zdrojový kód jazyka C++ a jeho souborová přípona je .cpp. Každý projekt musí mít minimálně jeden zdrojový soubor, ve kterém bude umístěn zdrojový kód programu. V praxi se zdrojový soubor často nazývá také implementační soubor – tento název odráží skutečnost, že v zdrojovém souboru je zapsán zdrojový kód, jenž implementuje pracovní algoritmy.
4. Do pole Name zapíšeme název našeho zdrojového souboru: Program.cpp. Dodejme, že zadání souborové přípony není obligatorní: jestliže koncovku .cpp za názvem zdrojového souboru neuvedeme, Visual C++ 2008 Express ji automaticky doplní sám. Přidání zdrojového souboru přibližuje obrázek 3.
5. Po aktivaci tlačítka Add je zdrojový soubor přidán do projektu a můžeme ho spatřit i v okně Solution Explorer (obrázek 4).
Obr. 4: Projekt obsahuje jeden zdrojový soubor jazyka C++.
Visual C++ 2008 Express přidaný zdrojový soubor okamžitě otevře v editoru zdrojového kódu. Na panel záložek se pro zdrojový soubor přidá nová záložka s jeho jménem. Samotný soubor je prázdný, prozatím neobsahuje žádný zdrojový kód jazyka C++. To se však záhy změní.
Zdrojový kód prvního programu v jazyce C++
Náš první program, který v jazyce C++ napíšeme, bude vypadat následovně:
Tento program zobrazí v konzolovém okně uvítací zprávu. Pojďme se podívat, z jakých součástí je zdrojový kód programu složen. Na prvním řádku se nachází direktiva preprocesoru #include, která určuje hlavičkový soubor iostream,
jenž je důležitý pro správné provádění vstupně-výstupních datových operací. Hlavičkové soubory obsahují definice konstant a deklarace funkcí nebo tříd. Snadno je poznáte podle přípony .h. V jazyce C++ jsou vstupně-výstupní operace realizovány prostřednictvím objektů, jež spolupracují s příslušnými datovými proudy. Pro nás je nyní důležité, že nemusíme vědět, jak se objekty s načítáním a zobrazováním dat vypořádají po technické stránce. Stačí vědět, že objekty „vědí“, jak mají uvedené operace vykonat, což je vše, co v tuto chvíli potřebujeme znát.
Na druhém řádku stojí direktiva using, která zavádí do zdrojového kódu standardní jmenný prostor s názvem std. Jmenný prostor nebo také prostor jmen si nejlépe představíme jako složku, v níž se nacházejí funkčně spřízněné entity. Ve standardním jmenném prostoru se nalézají nejčastěji používané prvky, s nimiž se při programování setkáme. K těmto prvkům se řadí také objekty, jež nám pomohou s načítáním a zobrazováním dat. Jestliže se jistý objekt, pojmenujme jej třeba NasObjekt, nachází ve jmenném prostoru NasJmennyProstor, pak když budeme chtít s tímto objektem pracovat, musíme uvést jeho kvalifikované jméno. Kvalifikované jméno objektu je složeno z názvu jmenného prostoru, ve kterém je objekt uložen, dále z operátoru :: (dvě dvojtečky zapsány za sebou, bez mezery) a názvu samotného objektu. V naší ukázce by tedy kvalifikované jméno objektu vypadalo takto: NasJmennyProstor::NasObjekt.
Kvalifikovaná jména různých entit jsou často dlouhá, což vede k vyšší manuální náročnosti při psaní zdrojového kódu. Pokud si chceme práci usnadnit, můžeme provést zavedení nebo též import jmenného prostoru pomocí direktivy using. Po zavedení jmenného prostoru se rázem stanou přímo dosažitelné všechny v něm žijící entity. Jelikož jsou entity přímo dosažitelné, nemusíme na ně odkazovat pomocí dlouhého kvalifikovaného jména. Stačí, když zapíšeme pouze jméno dotyčné entity, již bez specifikace jmenného prostoru. Všimněte si, že direktiva using zavádějící standardní jmenný prostor std je v jazyce C++ příkazem. To poznáte podle symbolu středníku, jenž se na konci řádku vyskytuje. V C++ platí pravidlo, že jakýkoliv syntakticky korektně zapsaný příkaz musí na svém konci obsahovat středník. Jinými slovy, příkazy v jazyce C++ jsou oddělovány středníky a nikoliv symboly nových řádků, jak je to kupříkladu ve Visual Basicu.
I ten nejjednodušší program v jazyce C++ musí mít jednu povinnou součást, kterou je hlavní funkce main. Mějte prosím na paměti, že název funkce je zapsán s malým začátečním písmenem. Jazyk C++ rozlišuje mezi velikostí znaků, takže je bezpodmínečně nutné, aby se hlavní funkce jmenovala main, a ne Main nebo MAIN.
Funkce je v teorii programování specifický termín a má zcela jiný význam než v matematice. Programátoři definují funkci jako uzavřenou neprázdnou množinu programových příkazů, které jsou provedeny vždy, je-li tato funkce zavolána. Funkce main je hlavní funkcí programu a zastává pozici vstupního bodu naší konzolové aplikace. Co to znamená? Každý program musí mít hlavní funkci, kterou zavolá operační systém pokaždé, když dojde ke spuštění dotyčného programu. Mezi programem a hlavní funkcí existuje relace 1 : 1, tudíž program má právě jednu hlavní funkci. Termínem „zavolání funkce“, nebo také „aktivace funkce“ či „exekuce funkce“ se rozumí zpracování všech příkazů, které jsou v ní obsaženy.
Funkce main (ovšem obecně jakákoliv funkce v jazyce C++) je složena ze dvou částí, které tvoří hlavička funkce a tělo funkce. Hlavička funkce main má tuto podobu:
Z hlavičky funkce umíme o funkci zjistit tyto informace:
1. Název (identifikátor) funkce. Hlavní funkce se jmenuje main, a jak jsme si již řekli, tento název je pevně daný a neměnný.
2. Datový typ návratové hodnoty funkce. O datových typech pojednáme blíže v příští lekci našeho programátorského kurzu, ale již nyní můžeme předeslat, že datový typ determinuje typ a rozsah hodnot, s nimiž lze pracovat. Datový typ návratové hodnoty funkce main je int, což jsou celá čísla (z angl. integer). Funkce v programování se dělí na dvě základní skupiny: funkce, které po vykonání své činnosti vrací nějakou návratovou hodnotu, a funkce, které žádnou hodnotu nevracejí. Jelikož nalevo od identifikátoru funkce main se nachází určení datového typu int, znamená to, že naše hlavní funkce bude nějakou hodnotu vracet.
3. Seznam formálních parametrů. Za identifikátorem hlavní funkce jsou zapsány závorky, které jsou prázdné. To nám říká, že funkce nepracuje s žádnými formálními parametry. Ponechme nyní stranou, co to vůbec formální parametry jsou, vše si časem vysvětlíme.
Když jsme analyzovali hlavičku hlavní funkce main, můžeme se soustředit na její tělo, které má tuto podobu:
Tělo je syntakticky vymezeno blokem, jenž je ohraničen otevírací ({) a uzavírací (}) složenou závorkou. Složené závorky nám podávají informace o tom, kde začíná a kde zase končí tělo hlavní funkce main. V těle funkce main se nacházejí příkazy, které budou provedeny po každém spuštění našeho prvního programu. A jaképak příkazy tady máme? Inu, jsou pouze dva. První příkaz:
využívá služeb objektu cout, jehož pomocí zobrazujeme text na výstupu. (Název objektu cout pochází se slovního spojení „console output“, tedy datový konzolový výstup.) Text, který bude v okně naší konzolové aplikace zobrazen, je obklopen dvojitými uvozovkami. Takový text, jenž je uzavřen v dvojitých uvozovkách, se označuje termínem textový řetězec. Editor zdrojového kódu barevně odlišuje textové řetězce, které jsou vykreslovány červenou barvou. Máme tedy objekt cout, který dovede zobrazit text na výstupu, a máme také potřebný textový řetězec.
Otázkou zůstává, jak objektu cout sdělíme, že si přejeme zobrazit právě daný textový řetězec. Tím pomyslným kouzelníkem je výstupní operátor << (operátor je složen ze dvou symbolů „menší než“ zapsaných ihned za sebou, bez mezery). Šipky výstupního operátoru směrují doleva, čímž udávají orientaci toku informací. Tok si můžete představit asi takto: odesíláme textový řetězec objektu cout, jenž zabezpečí jeho zobrazení na výstupu. Za textovým řetězcem je opětovně zadán výstupní operátor <<, za kterým následuje manipulátor endl. Tento manipulátor objektu cout sděluje, aby za zobrazený textový řetězec vložil nový řádek. Manipulátor endl ovlivňuje obsah výstupního datového proudu, analogicky se chovají i další manipulátory, s nimiž se na naší pouti ještě setkáme.
Druhý příkaz, nacházející se v těle hlavní funkce main, má tuto podobu:
Tento příkaz vrací nulu, která působí jako návratová hodnota funkce main. Jestli si vzpomínáte, v hlavičce funkce jsme určili celočíselný datový typ (int) návratové hodnoty hlavní funkce. Když funkce main ukončí svou činnost, používá příkaz return pro navrácení jisté hodnoty. My víme, že touto hodnotou je 0. Můžeme se však oprávněně ptát, kampak je tato hodnota vlastně posílána. Odpověď zní: je určena operačnímu systému. Systém totiž dokáže určit, zda program skončil normálně, anebo zda byl jeho běh nějakým nečekaným (abnormálním) způsobem přerušen. Přijatá konvence ISO standardu jazyka C++ říká, že nula představuje normální ukončení programu.
Po napsání a ozřejmění prvního programu nadešel čas pro jeho překlad (kompilaci) a spuštění. Otevřete nabídku Build a klepněte na příkaz Build PrvniProjekt. Visual C++ 2008 Express povolá do práce preprocesor, kompilátor a spojovací program (linker), jejichž společným úsilím vznikne spustitelný (.exe) soubor naší první konzolové aplikace se strojovým kódem. Jestliže je vše v pořádku, v dialogu Output (nachází se ve spodní části hlavního okna Visual C++ 2008 Express) spatříte zprávu: Build: 1 succeeded (1 úspěšně sestavený projekt). Program spustíte vybráním příkazu Start Without Debugging z nabídky Debug integrovaného vývojového prostředí Visual C++ 2008 Express.
Obr. 5: Finální podoba prvního programu
v jazyce C++.
Program se rozeběhne a zobrazí zprávu „Vita vas jazyk C++!“. Poté je činnost programu ukončena, ovšem konzolové okno zůstává na obrazovce počítače zobrazeno tak dlouho, dokud nestisknete libovolnou klávesu. 8 0070/VAC o
Nový projekt jazyka C++ můžeme vytvořit dalšími třemi způsoby:
1. Pomocí nabídky File. Otevřeme nabídku File, ukážeme na položku New, poté klepneme na položku Project….
2. Pomocí tlačítka New Project () na standardním panelu nástrojů. Jakmile stiskneme toto tlačítko, zobrazí se dialog New Project.
3. Klávesovou zkratkou: po zadání „trojhmatu“ Ctrl+Shift+N máme před sebou okno pro založení nového projektu.
Když označíme libovolnou projektovou šablonu, v textovém poli pod seznamem Templates se objeví její stručná charakteristika. Tímto způsobem nám Visual C++ 2008 Express sděluje účel využití dotyčné projektové šablony.
Mimochodem, toto je hezká ukázka jednoho z principů objektově orientovaného programování (OOP), kterým je zapouzdření. Zapouzdření říká, že objekt je samostatná entita, která vůči vnějšímu světu působí jako „černá skříňka“. Běžný pozorovatel proto neumí říci, co se v objektu nachází. Aby bylo možné využívat služby objektu, zpřístupňuje tento soustavu metod, které můžeme volat a uskutečňovat tak různé činnosti.
Jednou sestavený program lze rychle spustit pomocí klávesové zkratky Ctrl+F5.