-
Pokuste se vytvo°it aplikaci GUI, ve kterΘ do editaΦnφho ovladaΦe budete
zadßvat p°irozenΘ Φφslo a po stisku tlaΦφtka bude vypsßna informace, zda
zadanΘ Φφslo je nebo nenφ prvoΦφslo.
-
Nßsledujφcφ konzolovß aplikace obsahuje rekurzivnφ funkci (funkce, kterß
je volßna ze sebe sama) provßd∞jφcφ v²poΦet n-tΘ mocniny reßlnΘho Φφsla.
long double mocnina(int
exponent, long double zaklad);
int main(int argc,
char **argv)
{
int n;
long double
x;
cout <<
"Zadej exponent a zßklad mocniny: ";
cin >> n >>
x;
cout <<
x << " na " << n << " = " << mocnina(n, x);
getch();
return 0;
}
long double mocnina(int
exponent, long double zaklad)
{
return (exponent
< 1) ? 1 : zaklad * mocnina(exponent-1, zaklad);
}
Vytvo°te program provßd∞jφcφ obdobn∞ v²poΦet faktorißlu. U obou program∙
urΦete jak bude probφhat v²poΦet pomocφ rekurzivnφ funkce.
-
Vytvo°te konzolovou aplikaci pracujφcφ obdobn∞ jako p°φkaz type
operaΦnφho systΘmu DOS. P°i vytvß°enφ programu se m∙╛ete inspirovat vzorov²m
p°φkladem k funkci fopen. JmΘno vypisovanΘho
souboru zadßvejte jako parametr z p°φkazovΘ °ßdky (pokud je zadßn jin²
poΦet parametr∙ ne╛ jeden, vypi╣te signalizaci chyby). UrΦen² soubor otev°ete
(funkce fopen) v textovΘm re╛imu, Φtete jej
po znacφch (funkcφ fgetc) a╛ do konce souboru
(zjistφme jej funkcφ feof) a vypisujte jednotlivΘ
znaky na obrazovku (funkcφ putchar
nebo datov²m proudem cout). Na zßv∞r
je pot°eba soubor uzav°φt funkcφ fclose.
-
Upravte p°edchozφ program tak, aby p°i del╣φm souboru byl v²pis na obrazovku
provßd∞n po Φßstech. Vypi╣te v╛dy n∞kolik °ßdk∙ nap°. 22 a Φekejte na stisk
libovolnΘ klßvesy.
-
Vytvo°te konzolovou aplikaci, kopφrujφcφ obsah jednoho textovΘho souboru
do druhΘho. V novΘm souboru vynechte v╣echny znaky mezer. JmΘna obou soubor∙
zadßvejte jako parametry. Na zßv∞r vypi╣te celkov² poΦet p°ekopφrovan²ch
znak∙.
-
Termφn rozsah urΦuje viditelnost prom∞nn²ch v r∙zn²ch Φßstech na╣eho
programu. Mnoho prom∞nn²ch mß lokßlnφ rozsah. Tzn. prom∞nnß je viditelnß
pouze v bloku k≤du, ve kterΘm je deklarovßna. Podφvejte se na nßsledujφcφ
program.
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
//---------------------------------------------------------------------------
#pragma argsused
int x = 20;
void citacCyklu(int);
int main(int argc,
char **argv)
{
int x = 40;
int i = 0;
cout <<
"V hlavnφm programu x = " << x << endl;
bool hotovo
= false;
while (!hotovo)
{
int x;
cout << "Zadej Φφslo (-1 je konec): ";
cin >> x;
if (x != -1) {
cout << "V cyklu x = " << x << endl;
citacCyklu(++i);
}
else hotovo = true;
}
cout <<
"Globßlnφ x = " << ::x << endl;
getch();
}
void citacCyklu(int
x)
{
cout <<
"Cyklus byl proveden " << x << " krßt." << endl;
}
Prvnφ v∞cφ, kterΘ si pov╣imneme je to, ╛e prom∞nnß x je zde
deklarovßna 4x. Nejprve je deklarovßna p°ed funkcφ main, dßle na
zaΦßtku funkce main, na zaΦßtku cyklu while a nakonec jako
parametr funkce citacCyklu. Pokud deklarujeme prom∞nnou vφce ne╛
jednou, pak p°ekladaΦ generuje chybu "Multiple declaration for 'x'" (vφcenßsobnß
deklarace x). Tento program je ale p°elo╛en bez chyby. Je to tφm, ╛e ka╛dß
prom∞nnß je v jinΘm rozsahu.
Deklarace x uvnit° cyklu while je lokßlnφ v bloku k≤du
tohoto cyklu. Neexistuje mimo tento blok. Tato prom∞nnß mß lokßlnφ platnost.
Podobn∞ deklarace parametru funkce je lokßlnφ ve funkci citacCyklu
a neexistuje mimo tuto funkci. V tomto p°φpad∞ se jednß o Φßst seznamu
parametr∙, ale je to takΘ deklarace prom∞nnΘ.
Dßle se podφvßme na prom∞nnΘ x a i deklarovanΘ na zaΦßtku
funkce main. Tyto prom∞nnΘ jsou lokßlnφ v bloku, ve kterΘm jsou
deklarovßny. Jin²mi slovy, prom∞nnΘ x a i jsou v rozsahu
funkce main a v rozsahu cyklu while. U prom∞nnΘ i
je to jasnΘ. Jak je to ale s x? Uvnit° cyklu while jsou dv∞
prom∞nnΘ x a ob∞ jsou v rozsahu. Kterß z nich bude pou╛φvßna? Odpov∞∩
je jasnß. Bude to x deklarovanΘ v cyklu, proto╛e mß nejbezprost°edn∞j╣φ
rozsah.
Nakonec se budeme zab²vat deklaracφ x, kterß je umφst∞na p°ed
funkcφ main. Proto╛e je deklarovßna mimo funkci, je to globßlnφ
prom∞nnß a mß globßlnφ rozsah. Globßlnφ prom∞nnß x je dostupnß kdekoliv
v programu: uvnit° funkce main, uvnit° bloku while i uvnit°
funkce citacCyklu.
Jak je uvedeno v²╣e, lokßlnφ prom∞nnΘ majφ p°ednost p°ed globßlnφmi
prom∞nn²mi. Jak ale lze p°istoupit ke globßlnφ prom∞nnΘ uvnit° funkce main?
Pou╛ijeme operßtor rozsahu ::. V na╣em programu se vyskytuje °ßdek:
cout << "Globßlnφ
x = " << ::x << endl;
Operßtor rozsahu :: °φkß p°ekladaΦi: "Pou╛ij globßlnφ prom∞nnou
x
a ne lokßlnφ prom∞nou x".
Podφvejte se je╣t∞ na nßsledujφcφ p°φklad:
for (int i = 0; i
< 10; i++) {
if (pole[i]
== 40) break;
}
index = i;
// chyba
Tento k≤d generuje chybu, proto╛e prom∞nnß i je viditelnß pouze
v bloku cyklu for. Prom∞nnou i v tomto p°φpad∞ je
nutno deklarovat p°ed cyklem. Nßsledujφcφ °e╣enφ je ji╛ sprßvnΘ:
int i;
for (i = 0; i <
10; i++) {
if (pole[i]
== 40) break;
}
index = i;
-
ReßlnΘ aplikace se obvykle sklßdajφ z n∞kolika soubor∙ zdrojovΘho k≤du.
Globßlnφ prom∞nnΘ deklarovanΘ v jednom zdrojovΘm souboru jsou globßlnφ
v tomto souboru, ale nejsou viditelnΘ z ostatnφch zdrojov²ch soubor∙. Namφsto
pojmu globßlnφ prom∞nnß by bylo lΘpe pou╛φvat termφn prom∞nnß s rozsahem
souboru. Jsou ale p°φpady, kdy pot°ebujeme n∞kterΘ prom∞nnΘ vid∞t i
z ostatnφch zdrojov²ch soubor∙ programu. Vytvo°enφ t∞chto "skuteΦn²ch globßlnφch
prom∞nn²ch" je dvoukrokov² proces. Nejprve deklarujeme prom∞nnou v jednom
zdrojovΘm souboru jako prom∞nnou s rozsahem souboru. Potom v ostatnφch
zdrojov²ch souborech, ve kter²ch budeme pot°ebovat p°istupovat k tΘto prom∞nnΘ,
deklarujeme tuto prom∞nnou znova, ale tuto deklaraci musφ p°edchßzet klφΦovΘ
slovo
extern. Nap°.
extern int x;
KlφΦovΘ slovo extern °φkß p°ekladaΦi: "Tento zdrojov² soubor
bude pou╛φvat prom∞nnou, jejφ╛ deklarace bude nalezena v jinΘm zdrojovΘm
souboru". Jak poznßme pozd∞ji (v souvislosti s objektov∞ orientovan²m programovßnφm)
je vhodnΘ pou╛φvßnφ globßlnφch prom∞nn²ch omezit na minimum.
Hlavnφ pravidla pro funkce:
-
Funkce m∙╛e mφt libovoln² poΦet parametr∙ nebo m∙╛e b²t bez parametr∙.
-
Funkce m∙╛e vracet hodnotu, ale jsou i funkce, kterΘ hodnotu nevracφ.
-
Pokud funkce mß nßvratov² typ void, pak nem∙╛e vracet hodnotu. Jak²koliv
pokus o nßvrat hodnoty z funkce s nßvratov²m typem void zp∙sobφ
chybu. Funkce vracejφcφ void nemusφ obsahovat p°φkaz return,
ale mohou jej obsahovat. Pokud funkce neobsahuje p°φkaz return,
pak funkce automaticky skonΦφ p°i dosa╛enφ konce bloku funkce.
-
Pokud prototyp funkce indikuje, ╛e funkce vracφ hodnotu, pak t∞lo funkce
musφ obsahovat p°φkaz return s vracenou hodnotou. Pokud funkce nevracφ
hodnotu, pak p°ekladaΦ generuje varovßnφ.
-
Funkce m∙╛e p°ebφrat libovoln² poΦet parametr∙, ale m∙╛e vracet pouze jednu
hodnotu.
-
Prom∞nnΘ mohou b²t p°edßvßny funkci hodnotou, ukazatelem nebo odkazem (podrobn∞j╣φ
popis bude uveden pozd∞ji).