-
Nßsledujφcφ funkce provßdφ hledßnφ zadanΘ hodnoty X v prvnφch N
prvcφch pole A.
int vyskyt(int N,
int A[], int X)
{
int i;
for (i = 0;
i < N; i++) if (A[i] == X) return i;
return -1;
}
Funkce vracφ index v²skytu prvku, nenφ-li hodnota v poli obsa╛ena,
je vrßceno -1. Vytvo°te obdobnou funkci, kterß bude zji╣╗ovat, zda zadan²
znak je obsa╛en v poli znak∙. Funkci pou╛ijte v konzolovΘ aplikaci, kterß
p°eΦte v∞tu ukonΦenou teΦkou a kterß zjistφ celkov² poΦet v²skyt∙ samohlßsek
v tΘto v∞t∞ (v╣echny samohlßsky ulo╛φme do pole prvk∙ typu char
a k urΦenφ zda znak je samohlßska pou╛ijeme upravenou funkci).
-
Nßsledujφcφ funkce provßdφ °azenφ pole n hodnot typu int.
Pole je °azeno vzestupn∞.
void razeni(int n,
int a[])
{
int i, priznak,
pom;
do {
priznak = 0;
for (i = 0; i < n-1; i++)
if (a[i] > a[i+1]) {
pom = a[i];
a[i] = a[i+1];
a[i+1] = pom;
priznak = 1;
}
} while (priznak);
}
Zm∞≥te tuto funkci tak, aby provßd∞la °azenφ pole s prvky typu double
a pou╛ijte ji v programu, kde takovΘto pole p°eΦtete, nechßte je se°adit
a op∞t je vypφ╣ete.
-
C++ nepodporuje °et∞zcovΘ prom∞nnΘ (prom∞nnΘ, kterΘ obsahujφ text). ╪et∞zce
v programech C++ jsou reprezentovßny poli datovΘho typu char. Nap°.
znakovΘmu poli lze p°i°adit °et∞zec takto:
char text[] = "Toto
je °et∞zec.";
Tφm alokujeme 17 slabik v pam∞ti a ulo╛φme °et∞zec na toto mφsto. Pokud
spoΦφtßme znaky na╣eho °et∞zce, zjistφme, ╛e jich je pouze 16. Poslednφ
17 slabika je alokovßna pro ulo╛enφ ukonΦujφcφho znaku °et∞zce (tento
znak je na konec °et∞zce vlo╛en automaticky). UkonΦujφcφ znak je specißlnφ
znak, kter² je reprezentovßn konstantou '\0', co╛ je ekvivalentnφ s Φφslem
0.
-
Kdy╛ program nalezne ve znakovΘm poli znak s k≤dem 0, interpretuje jej
jako konec °et∞zce. To nßm ukß╛e nßsledujφcφ konzolovß aplikace.
int main(int argc,
char **argv)
{
char ret[]
= "Toto je °et∞zec.";
cout <<
ret << endl;
ret[7] = '\0';
cout <<
ret << endl;
getch();
return 0;
}
P∙vodn∞ znakovΘ pole obsahovalo znaky Toto je °et∞zec. nßsledovanΘ
ukonΦujφcφm znakem. Tento °et∞zec je vypsßn. Dal╣φ p°φkaz vlo╛φ ukonΦujφcφ
znak za sedm² prvek pole. Kdy╛ znakovΘ pole op∞t vypφ╣eme, pak je vypsßno
pouze prvnφch sedm znak∙ pole (do ukonΦujφcφho znaku pole). Zbytek pole
je ji╛ za ukonΦujφcφm znakem a nenφ ji╛ souΦßstφ na╣eho °et∞zce.
Namφsto znaku '\0' m∙╛eme jednodu╣e pou╛φvat 0. Nßsledujφcφ dva °ßdky
k≤du jsou ekvivalentnφ:
ret[7] = '\0';
ret[7] = 0;
Nezapom∞nte na rozdφl mezi apostrofy a uvozovkami. Kdy╛ p°i╛azujeme
ukonΦujφcφ znak (nebo jinou znakovou konstantu), pak pou╛φvßme apostrofy.
P°i prßci se znakov²mi °et∞zci (vφce znak∙), pak je nutno pou╛φvat uvozovky.
-
Pro prßci s °et∞zci (porovnßvßnφ °et∞zc∙, kopφrovßnφ apod.) pou╛φvßme funkce
z hlaviΦkovΘho souboru string.h. Nejd∙le╛it∞j╣φ funkce z tohoto
hlaviΦkovΘho souboru jsou: strcpy (kopφrovßnφ
znak∙ °et∞zce), strcat (p°ipojuje °et∞zec
k jinΘmu °et∞zci), strchr (hledß znak v °et∞zci),
strcmp
(porovnßvßnφ °et∞zc∙), strcmpi (porovnßvßnφ
°et∞zc∙ bez rozli╣enφ velikosti pφsmen), strlen
(dΘlka °et∞zce), strlwr (p°evßdφ velkß pφsmena
v °et∞zci na malß), strrev (obracφ °et∞zec),
strstr
(hledßnφ pod°et∞zce v °et∞zci) a strupr (p°evßdφ
malß pφsmena v °et∞zci na velkß). ╪et∞zec m∙╛eme Φφst datov²m proudem
cin.
V²stup °et∞zc∙ provßdφme datov²m proudem
cout.
Tyto funkce byly zavedeny ji╛ v jazyku C. P°i vytvß°enφ aplikacφ GUI
budemo p°i prßci s °et∞zci pou╛φvat t°φdu AnsiString (viz dßle).
Nßsleduje n∞kolik p°φklad∙ manipulace s °et∞zci. Funkce strcpy
se pou╛φvß ke kopφrovßnφ jednoho °et∞zce do jinΘho. Zdrojov² °et∞zec m∙╛e
b²t prom∞nnß nebo °et∞zcovß konstanta.
// vytvo°enφ prom∞nnΘ
pro ulo╛enφ 29 znak∙
char buff[30];
// kopφrovßnφ °et∞zcovΘ
konstanty do buff
strcpy(buff, "Toto
je test.");
// zobrazenφ buff
cout << buff
<< endl;
// inicializace druhΘho
buferu
char buff2[] = "Druh²
°et∞zec.";
// kopφrovßnφ obsahu
buff2 do buff
strcpy(buff, buff2);
cout << buff
<< endl;
Stejn∞ jako u Φφseln²ch polφ, i u znakov²ch polφ se nesmφ p°ekroΦit
konec pole. Nap°.
char buff[10] = "╪et∞zec";
// a n∞kdy pozd∞ji
strcpy(buff, "Toto
je test.");
Zp∙sobφ chybu, nebo╗ do buff je mo╛no ulo╛it pouze °et∞zec o
devφti znacφch (a ukonΦujφcφ znak). V tomto p°φpad∞ op∞t dojde k p°epsßnφ
n∞jak²ch informacφ ulo╛en²ch za polem.
Jinou Φasto pou╛φvanou funkcφ je sprintf. Tato funkce umo╛≥uje
vytvß°et formßtovanΘ °et∞zce mφchßnφm textu a hodnot. S touto funkcφ jsme
se ji╛ v na╣ich programech setkali. Nßsleduje p°φklad pou╛itφ tΘto funkce:
char buff[30];
int x = 20;
int y = 5;
sprintf(buff, "%d
+ %d = %d", x, y, x + y);
cout << buff;
Tato Φßst programu nßm na obrazovce zobrazφ:
20 + 5 = 25
JednoduchΘ zp∞tnΘ lomφtko v °et∞zci indikuje Escape sekvenci. Nap°.
'\n'
pro
od°ßdkovßnφ nebo '\t' reprezentuje znak tabulßtoru. Pokud v °et∞zci
pot°ebujeme pou╛φt zp∞tnΘ lomφtko musφme zapsat dv∞ zp∞tnß lomφtka. Nap°.
strcpy(jmenoSouboru,
"c:\\prac\\abc.txt");
Nemusφme pracovat pouze se znakov²mi poli, ale m∙╛eme mφt takΘ pole
znakov²ch polφ (pole °et∞zc∙). Nap°.
char retezec [][20]
= {
"Toto je °et∞zec
1.",
"Toto je °et∞zec
2.",
"Toto je °et∞zec
3.",
"Toto je °et∞zec
4."
};
Tento k≤d vytvß°φ pole Φty° °et∞zc∙, ka╛d² m∙╛e obsahovat a╛ 19 znak∙.
-
Vytvo°te program, ve kterΘm p°eΦtete n∞kolik jmen (nepou╛φvejte jmΘna s
diakritick²mi znamΘnky), abecedn∞ je se°a∩te a op∞t vypi╣te.
-
Napi╣te funkci, kterß p°eΦte jmΘno a p°φjmenφ (jako dva °et∞zce - pou╛φvejte
pouze pφsmena anglickΘ abecedy), u p°φjmenφ zm∞≥te v╣echny znaky na velkß
pφsmena a u jmΘna v╣echny znaky na malß pφsmena. Hodnota funkce bude text
vytvo°en² spojenφm p°φjmenφ, mezera, jmΘno. Tuto funkci vyzkou╣ejte v n∞jakΘm
programu.
-
Vytvo°te konzolovou aplikaci, kterß p°eΦte p°irozenß Φφsla n a m
a hodnoty matice typu n * m s prvky typu double (p°edpoklßdejte,
╛e n < 10 a m < 5). V programu zjist∞te pr∙m∞rnou hodnotu ze v╣ech
prvk∙ matice a prvky matice p°ehledn∞ vypi╣te.
Kontrolnφ otßzky:
-
Co C++ d∞lß k zaji╣t∞nφ nep°epsßnφ informacφ za koncem pole?
-
Co je chybnΘ na nßsledujφcφm programu?
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
void zobrazText();
zobrazText()
{
cout <<
"Ahoj." << endl;
}
-
Kolik hodnot m∙╛e vracet funkce?
-
Co d∞lß funkce strcpy?
-
Kolik funkcφ m∙╛e program obsahovat?
-
M∙╛e funkce volat jinou funkci?
-
Co je chybnΘho na nßsledujφcφm programu?
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
int main(int argc,
char **argv)
{
delejNeco();
return 0;
}
void delejNeco()
{
cout <<
"Nynφ nic ned∞lßm." << endl;
}
-
Podφvejte se na tento °ßdek k≤du
char buff[20];
Kolik znak∙ m∙╛e nejv²╣e obsahovat °et∞zec, kter² do prom∞nnΘ buff
ulo╛φme?
-
Je index prvnφho prvku pole 0 nebo 1?
╪e╣enφ