Vytvo°te konzolovou aplikaci, kterß zjistφ, zda zadanΘ p°irozenΘ Φφslo
je prvoΦφslo.
Vytvo°te konzolovou aplikaci, kterß Φte z klßvesnice v∞tu ukonΦenou teΦkou
a kterß spoΦφtß poΦet znak∙ pφsmen (anglickΘ abecedy), poΦet znak∙ Φφslic
a celkov² poΦet znak∙.
Mimo ji╛ popsanΘho p°φkazu cyklu while m∙╛eme pou╛φvat dal╣φ dva
p°φkazy cykl∙. Jednß se o cykly for a do-while. Cyklus for
pou╛φvßme, kdy╛ znßme omezenφ cyklu (jeho inicializaΦnφ instrukci, ukonΦujφcφ
kritΘrium a inkrementaΦnφ instrukci). Nap°. cyklus for je Φasto
pou╛φvßn k prochßzenφ prvky pole nebo znaky °et∞zce.
for (i = 0; i <
delka; i++) {
// n∞jakß Φinnost s i-t²m prvkem
}
Kdy╛ zapisujeme program, vφme ╛e nap°. chceme zaΦφt od zaΦßtku pole,
skonΦit na konci pole a pou╛φt ka╛d² prvek pole. V tomto p°φpad∞ je vhodn²
p°φkaz for. Obecn² popis p°φkazu for je tento:
for (inicializace;
ukonΦenφ; inkrementace)
p°φkaz
Inicializace je p°φkaz, kter² inicializuje cyklus; je proveden pouze
jednou a to na zaΦßtku cyklu. UkonΦenφ je v²raz, kter² urΦuje kdy bude
cyklus ukonΦen. Kdy╛ je v²raz pravdiv², cyklus pokraΦuje, nenφ-li pravdiv²,
cyklus skonΦφ. Inkrementace je v²raz, kter² je vyvolßn po ka╛dΘm pr∙chodu
cyklem. Ka╛dß z t∞chto Φßstφ m∙╛e b²t prßzdn²m p°φkazem (samotn² st°ednφk).
Inicializace a inkrementace m∙╛e b²t tvo°ena i vφce p°φkazy (odd∞lujeme
je Φßrkou).
Pou╛itφ p°φkazu for si ukß╛eme v nßsledujφcφ konzolovΘ aplikaci.
V tΘto aplikaci jsou pou╛ity dva p°φkazy cykl∙, jeden probφhß vzestupn∞
a druh² sestupn∞.
cout << endl
<< "ZaΦßtek programu ... " << endl << endl;
int i;
for (i = 0; i <
10; i++) {
cout <<
"Iterace Φφslo " << i << endl;
}
cout << endl;
for (i = 10; i >
0; i--) {
cout <<
"Iterace Φφslo " << i << endl;
}
Podmφnka ukonΦenφ m∙╛e b²t libovoln² v²raz C++. Hodnota v testovacφm
v²razu m∙╛e b²t Φφselnß konstanta (jak je pou╛ito v p°edchozφm p°φklad∞),
prom∞nnß nebo hodnota vrßcenß volßnφm funkce. Nßsledujφ p°φklady p°φpustn²ch
cykl∙:
for (int i = 0; i
< 100; i++) {...}
for (int i = 0; i
< pocetPrvku; i++) {...}
for (int i = 0; i
< ZiskejPocetPrvku(); i+=2) {...}
V poslednφm p°φklad∞ je °φdφcφ prom∞nnß cyklu zv∞t╣ovßna po 2. Inkremntace
m∙╛e b²t o libovolnou hodnotu. Nap°. o 10:
for (int i = 0; i
< 100; i+=10) {...}
Poslednφm p°φkazem cyklu je cyklus do-while, kter² se podobß cyklu
while,
s tφm rozdφlem, ╛e podmφnka opakovßnφ cyklu je uvedena na konci cyklu.
do {
p°φkazy
} while (v²raz)
Tento p°φkaz je mßlo pou╛φvan²m p°φkazem, ale mß svΘ opodstatn∞nφ.
P°φkaz je u╛iteΦn² v p°φpadech, kdy cyklus musφ prob∞hnout alespo≥ jednou
(kdy╛ nap°. Φteme informace ze souboru a vφme, ╛e musφme p°eΦφst alespo≥
jeden znak).
V p°φkazu cyklu je mo╛nΘ takΘ pou╛φvat p°φkaz break a to ve stejnΘm
v²znamu jako v p°φkazu switch. Pou╛itφ p°φkazu break zp∙sobφ
p°echod na p°φkaz, kter² je uveden bezprost°edn∞ za cyklem. V cyklu lze
pou╛φt takΘ p°φkaz continue. Pou╛itφ tohoto p°φkazu zp∙sobφ p°echod
na podmφnku ukonΦujφcφ cyklus a tato podmφnka rozhodne, zda cyklus bude
je╣t∞ pokraΦovat. Je to vlastn∞ p°echod na nov² pr∙chod cyklu bez dokonΦenφ
p°edchozφho pr∙chodu.
Nap°. m∙╛eme mφt jistou Φßst cyklu, kterou chceme provΘst pouze v p°φpad∞
spln∞nφ jistΘ podmφnky.
bool done = false;
while (!done) {
bool chyba
= NejakaFunkce();
if (chyba)
continue;
// skok na konec cyklu
// dal╣φ p°φkazy,
kterΘ se majφ provΘst pouze kdy╛ chyba nevznikne
}
P°φkaz break lze nap°. pou╛φt p°i hledßnφ n∞jakΘ hodnoty v poli
hodnot (pot°ebujeme zjistit index hledanΘho prvku).
int index = -1;
int hledanaHodnota
= 50;
for (int i = 0; i
< pocetPrvku; i++) {
if (mojePole[i]
== hledanaHodnota) {
index = i;
break;
}
}
if (index != -1)
cout << "╚φslo nalezeno na indexu " << index << endl;
else cout <<
"╚φslo se v poli nevyskytuje." << endl;
S poli hodnot se podrobn∞ji seznßmφme pozd∞ji.
Poslednφm ukonΦujφcφm p°φkazem je p°φkaz return. Tento p°φkaz je
mo╛no pou╛φt k ukonΦenφ funkce a k p°echodu na nßsledujφcφ p°φkaz za volßnφm
funkce. Tento p°φkaz mß dva tvary: s hodnotou a bez nφ. Tvar s hodnotou
pou╛φvßme k nßvratu hodnoty funkce. V tomto p°φpad∞ za return zapφ╣eme
v²raz urΦujφcφ vrßcenou hodnotu. Nap°.
return ++pocet;
Tato vrßcenß hodnota musφ b²t stejnΘho typu jako je typ opou╣t∞nΘ funkce.
Jestli╛e funkci deklarujeme jako funkci typu void, pak pou╛φvßme
druh² tvar p°φkazu return, kter² neobsahuje v²raz s vracenou hodnotou:
return;
Nßsledujφcφ konzolovß aplikace vypisuje hodnoty funkcφ sinus a kosinus
pro ·hly 0 a╛ 90 stup≥∙ s krokem 10 stup≥∙:
cout << "┌hel
Sinus Cosinus" << endl;
cout << "-----------------------------"
<< endl;
char pom[50];
for (int i = 0; i
<= 90; i += 10) {
sprintf(pom,
"%3d %10.6f %10.6f",
i, sin(i*3.14159/180), cos(i*3.14159/180));
cout <<
pom << endl;
}
Pov╣imn∞te si, ╛e deklarace prom∞nnΘ i je uvedena v p°φkazu
for
(toto je mo╛nΘ v C++, ale nelze to pou╛φt v C). MatematickΘ funkce (sinus,
kosinus, atd.) jsou deklarovßny v hlaviΦkovΘm souboru math.h (musφme
jej vlo╛it direktivou include na zaΦßtku zdrojovΘho textu programu).
P°i pou╛itφ funkcφ sinus a kosinus je nutno ·hel zadßvat v radißnech.
Funkce sprintf vytvß°φ ve svΘm prvnφm parametru °et∞zec podle
formßtovacφho °et∞zce urΦenΘho druh²m parametrem. Na mφsta oznaΦenß %d
a %f ve formßtovacφm °et∞zci jsou ulo╛eny hodnoty dal╣φch parametr∙.
╚φsla v %d a %f urΦujφ poΦet znak∙ pou╛it²ch pro v²stup.
%nd
slou╛φ k v²stupu celoΦφselnΘ hodnoty na n mφst a %n.mf
slou╛φ k v²stupu reßlnΘ hodnoty pomocφ n znak∙ s m mφsty
za desetinnou teΦkou. Vytvo°en² v²stupnφ °et∞zec znak∙ je v na╣em p°φkladu
vlo╛en do prom∞nnΘ pom (musφ umo╛≥ovat vlo╛enφ pot°ebnΘho poΦtu
znak∙).
Vyzkou╣ejte tuto aplikaci.
Napi╣te konzolovou aplikaci, kterß vypφ╣e tabulku funkΦnφch hodnot funkce
f(x) = 3x2 + 7x v intervalu <1,10> s krokem 2. Vypisujte
x a f(x). Tabulku opat°ete hlaviΦkou.
Vrßtφme se op∞t k aplikacφm GUI. Vytvo°φme nov² prßzdn² projekt a umφstφme
na formulß° seznam °et∞zc∙ (ListBox zv∞t╣φme
jeho velikost a zm∞nφme v n∞m typ pφ zv∞t╣φ ? Courier New) a dv∞ tlaΦφtka
(s texty For a While).
Obsluha stisku prvnφho tlaΦφtka bude tvo°ena p°φkazy:
char pom[30];
ListBox1->Items->Clear();
for (int i = 1; i
<= 20; i++){
sprintf(pom,
"╪et∞zec %3d", i);
ListBox1->Items->Add(pom);
}
Pro druhΘ tlaΦφtko vytvo°φme tuto obsluhu:
char pom[30];
ListBox1->Items->Clear();
randomize();
int i = 0;
while (i < 1000)
{
i = i + random(100);
sprintf(pom,
"NßhodnΘ Φφslo:%5d", i);
ListBox1->Items->Add(pom);
}
Tato aplikace ukazuje pou╛itφ cykl∙ a generovßnφ nßhodn²ch Φφsel. V
na╣em programu funkce
sprintf uklßdß vytvo°en²
v²stup do prom∞nnΘ pom. Prom∞nnß pom
je deklarovßna jako pole o 30 prvcφch typu char (do tΘto prom∞nnΘ
m∙╛eme ulo╛it °etezec o dΘlce a╛ 29 znak∙). Funkce randomize
inicializuje generßtor nßhodn²ch Φφsel. Funkci random
potom m∙╛eme pou╛φt pro generovßnφ nßhodn²ch Φφsel z intervalu <0,
n), kde n je parametr funkce. Aplikaci vyzkou╣ejte.
Vytvo°te aplikaci, ve kterΘ budete zobrazovat tabulku funkΦnφch hodnot
funkcφ sinus a cosinus od 0 do 90 stup≥∙ s krokem 10. Na formulß° umφst∞te
komponentu ListBox a zv∞t╣φme ji. Tabulku
vypisujte ve dvou sloupcφch; prvnφ sloupec nadepi╣te ?┌hel a druh² ?Sinus,
resp. ?Cosinus. Na formulß° je╣t∞ vlo╛φme tlaΦφtka ?Sinus a ?Cosinus.
Vytvo°te obsluhy stisku tlaΦφtek tak, aby v╛dy p°i stisknutφ jednoho z tlaΦφtek
byly zobrazeny funkΦnφ hodnoty p°φslu╣nΘ hel?
Kontrolnφ otßzky:
Kolik ·rovnφ vno°enφ m∙╛e b²t u p°φkazu if?
Bude cyklus automaticky ukonΦen v p°φpad∞ nekoneΦnΘho cyklu?
Musφ p°φkaz switch obsahovat Φßst default?
KterΘ p°φkazy jsou provedeny, kdy╛ podmφnka p°φkazu if je pravdivß?