Zjednodušené základy jazyku C Josef Podstata 23. 4. 2014
1
Předmluva Tento dokument je určen všem zájemcům o programování v jazyce C. Nezáleží na tom, jestli už jste někdy v „céčku“ programovali nebo ne. Text vznikl jako projekt do předtmětu TeX pro začátečníky vyučovaného na Univerzitě Palackého v Olomouci.
2
Obsah I
Úvod
5
1 Historie
5
2 Vývojové prostředí
5
3 Kompilace
5
II
První program
6
4 Vytvoření projektu
6
5 Hello world
7
III
8
Datové typy
6 Čísla 6.1 Char . . . . . . . . 6.2 Short, int a long . 6.3 Float a double . . 6.4 Signed a unsigned
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
8 8 8 8 8
7 Jednoduchý příklad
9
8 Proměnné v printf()
9
9 Načtení proměnné ze vstupu
10
10 Středně těžký příklad
10
11 Těžší příklad
11
12 Samostatná práce
12
IV
13
Řízení programu
13 Podmíněný příkaz 13 13.1 If . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13.2 Else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13.3 Else if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 14 Operátory
14
15 Příklad
14
16 Další příklad
15
3
17 Poslední příklad
16
V
17
Pole
18 Jednorozměrné pole 17 18.1 Řetězce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 19 Vícerozměrné pole 18 19.1 Příklad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 20 Konec
18
4
Část I
Úvod 1
Historie
C je jeden z nejpopulárnějších kompilovaných programovacích jazyků1 minulosti. V roce 1972 ho vyvinuli Ken Thompson a Dennis Ritchie. Do dnes se ale používá například k výuce na školách, protože je jednoduchý, čitelný, dostatečně silný a obsáhlý, a navíc z něho vychází dnes popularní programovací jazyky, například C# nebo Java.
2
Vývojové prostředí
Softwaru pro psaní a kompilování kódu (tzn. vývojového prostředí, také IDE) v jazyce C je několik. Ještě k tomu je jazyk multiplatformní a na každém operačním systému je rozdílný výběr prostředí. Na Windows je často používané Microsoft Visual Studio, na Mac OS například Xcode. Svobodné multiplatformní vývojové prostředí je například Code::Blocks.
3
Kompilace
Pojem kompilování jsem zmínil už výše. Co to ale znamená? Zkráceně řečeno, napíšeme několik řádků zdrojového kódu a chceme, aby se program spustil. Kompilátor (též překladač2 .) kód zpracuje a vytvoří z něho spustitelný program. Do detailů zacházet nemusíme.
1 http://en.wikipedia.org/wiki/Programming_language 2 http://en.wikipedia.org/wiki/Compiler
5
Část II
První program 4
Vytvoření projektu
Teď budete potřebovat nějaké vývojové prostředí. Na obrázkovém tutorialu používám Xcode, ale v čem budete pracovat je čistě na vás. Ve většině IDE je postup založení projektu stejný, a to něco ve smyslu File → New → Project .
Poté zvolte konzolovou aplikaci (Console Application, Command Line Tool atp.).
Zadáte jméno projektu a ujistíte se, že programovací jazyk je nastaven na C.
6
Zbývá už jen v editoru otevřít soubor main.c, tedy náš zdrojový kód. Možná už ho máte otevřený hned po založení projektu, možná ne.
5
Hello world
Základní kostra programu by už pro nás měla být napsána. Jestli ne, napište ji sami: 1 2 3 4 5 6 7 8
#i n c l u d e <s t d i o . h> i n t main ( ) { p r i n t f ( " H e l l o world ! \ n" ) ; return 0; }
Když program spustíme (tlačítkem Run, Compile, Build and run atp., ve Visual Studiu také klávesou F5 ), neudělá nic jiného, než že do konzole (na standartní výstup) vypíše: Hello world! Pojďme si kód rozebrat po jednotlivých řádcích. Příkaz na prvním řádku říká jen, že v kódu budeme používat funkce z knihovny stdio.h (například printf() na pátém řádku). Tuhle knihovnu využijete při psaní snad každého programu, proto v prvním řádku nemusíte hledat žádnou vědu, prostě tam je vždy. Druhý řádek je vynechaný jen kvůli lepší přehlednosti. Na třetím nám začíná funkce main(), tedy hlavní funkce, která se spustí při spuštění programu. Jako každá jiná funkce má své tělo ohraničeno složenými závorkami ({ na čtvrtém a } na osmém řádku). Zatím o ní víc vědět nemusíme. Na pátém řádku voláme funkci printf(), které předáváme jeden argument - řetězec "Hello World! \n". O řetězcích jindy, teď stačí vědět, že reprezentují text, píší se do uvozovek a "\n" zalomí řádek. Na sedmém řádku se volá příkaz return, který ukončí funkci main() a tím pádem skončí běh celého programu. Všimněte si, že jednotlivé příkazy jsou vždy ukončeny středníkem. Takový program by se měl chovat jak očekáváme. Některé vývojové prostředí ale zavírají konzoli hned po skončení programu a to má za výsledek, že nám program jen problikne před očima. Jedna z možností řešení je příkaz system("pause");, který vložíme před příkaz return.
7
Část III
Datové typy V programování se používají k uchovávání různých dat proměnné3 . Hodnota proměnné se může během programu měnit a každá proměnná má v jazyku C svůj datový typ, který určuje druh hodnot, kterých může nabývat. Také nám určuje, které operace pak lze s proměnnou provádět. Vývojové prostředí nás bude varovat když nebudou sedět operace pro dané datové typy, například když budeme chtít sčítat celé číslo a text.
6
Čísla typ char short int long unsigned long float double
6.1
velikost 1B 2B 2B nebo 4B 4B 4B 4B 8B
rozsah od -128 do 127 od -32,768 do 32,767 pro 4B od -2,147,483,648 do 2,147,483,647 od -2,147,483,648 do 2,147,483,647 od 0 do 4,294,967,295 od 1.2E-38 do 3.4E+38 od 2.3E-308 do 1.7E+308
Char
Datový typ char může sloužit dvojím způsobem. Méně častější je jako celé číslo v rozmezí -128 až 127. Častěji jako jeden znak z ASCII tabulky (viz. http: //cs.wikipedia.org/wiki/ASCII). Tedy proměnná je pořád uložená jako malé číslo, ale má dvojí rozdílnou reprezentaci. Například číslo 65 reprezentuje znak ’A’ a naopak. Jako znak z ASCII tabulky se zapisuje vždy do apostrofů (’znak’).
6.2
Short, int a long
Všechny tři datové typy reprezentují celé číslo, liší se pouze rozsahem. U int ještě rozhoduje operační systém a vývojové prostředí.
6.3
Float a double
Tyto datové typy slouží k uchování čísla s desetinnou čárkou (správně řečeno pohyblivou nebo plovoucí řádovou čárkou). Typ float může uchovávat až 6 cifer za desetinnou čárkou, double až 15. Kdyby vám ani to nestačilo, ještě existuje typ long double.
6.4
Signed a unsigned
Signed nebo unsigned lze napsat před celočíselné datové typy a udělat tak z nich proměnné pro uchování pouze kladných nebo pouze záporných čísel. 3 http://en.wikipedia.org/wiki/Variable_(computer_science)
8
7
Jednoduchý příklad
Například bychom chtěli, aby v proměnné x byla uchována hodnota 5, v y rozdíl proměnné x a čísla 1 (5 – 1 = 4). Poté přidáme proměnnou desetinne, do kterého uložíme výsledek dělení čísel x a y (5 / 4 = 1,25, nebo ne?). Tady přichází moment správné volby datových typů. Pokud by proměnná desetinne byla typu int, nešlo by do ní uložit 1,4 a hodnota by se uložila jako celé číslo, tedy 1. Celý příklad by mohl vypadat takhle: 1 2 3 4 5 6 7 8 9 10
#i n c l u d e <s t d i o . h> i n t main ( ) { int x = 5; int y = x − 1; float desetinne = x / y ; return 0; }
Program by měl fungovat tak, jak jsme chtěli. Jediná nevýhoda je, že se vše provede interně a my nevidíme na výstupu ani ň. K tomu si musíme více objasnit funkci printf(), se kterou jsme se už setkali.
8
Proměnné v printf()
Kromě napevno předaného textu dokáže funkce printf() vypisovat i proměnné, popřípadě delší text, který obsahuje více proměnných. Vždy musíme uvést, v jaké reprezentaci proměnnou chceme vypsat. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#i n c l u d e <s t d i o . h> i n t main ( ) { int x = 5; int y = 1; float desetinne p r i n t f ( "x j e %d p r i n t f ( "y j e %d p r i n t f ( "x + 5 =
= 1.765; \n" , x ) ; a d e s e t i n n e j e %f \n" , y , d e s e t i n n e ) ; %d \n" , x + 5 ) ;
c h a r pismenoA = 6 5 ; c h a r pismenoH = ’ h ’ ; p r i n t f ( "%c%c o j \n" , pismenoA , pismenoH ) ; return 0; }
Možná tušíte, že výpis do konzole bude: x je 5 y je 1 a desetinne je 1,765 x + 5 = 10 Ahoj Výpis je úhledně na čtyři řádky, protože sme každý řetězec poctivě ukončovali znakem \n, tedy skokem na nový řádek. Jinak by se vše vypsalo na jeden řádek. 9
Na osmém řádku voláme funkci printf() s řetězcem a proměnnou. V řetězci je přesně vyznačené místo, kde se má dosadit proměnná, a to díky řídící sekvenci %d. Písmeno za znakem % určuje reprezentaci čísla. Řídící sekvence je i \n. %d %f %c %o %h
celé číslo reálné číslo celé číslo jako znak celé číslo v osmičkové soustavě celé číslo v šestnáctkové soustavě
Porovnejte údaje v tabulce a kód. Snad je to jasné a jestli ne, tak ještě ve zkratce: v řetězci se může vyskytovat více řídících sekvencí a jako výraz se může předat i úplně nový výpočet (x + 5 ), ne jen proměnná.
9 1 2 3 4 5 6 7 8 9 10 11
Načtení proměnné ze vstupu
#i n c l u d e <s t d i o . h> i n t main ( ) { int x ; p rin tf (" zadej x : " ) ; s c a n f ( "%d" , &x ) ; p r i n t f ( "%d \n" , x ) ; return 0; }
Program funguje tak, že načte celé číslo ze vstupu, uloží ho do proměnné x a poté ho vytiskne na výstup. Pojďme si kód rozebrat po řádcích. Na pátém řádku deklarujeme ( „založíme“ ) proměnnou x. Na šestém řádku fuckce printf() vytiskne text s instrukcemi. Na sedmém řádku voláme funkci scanf(), která načte celé číslo do proměnné x. Proměnná x má navíc před sebou znak &, který odkazuje na adresu proměnné x. Moc to neřeště, funkce scanf() vypadá skoro vždy stejně.
10
Středně těžký příklad
Chceme implementovat naprosto neužitečnou matematickou funkci: f : y = x2 + ln x 1 2 3 4 5 6 7 8 9 10 11 12
#i n c l u d e <s t d i o . h> #i n c l u d e <math . h> i n t main ( ) { int x ; p rin tf (" zadej x : " ) ; s c a n f ( "%d" , &x ) ; p r i n t f ( "y = %f \n" , ( x ∗ x ) + l o g ( x ) ) ; return 0; }
10
11
Těžší příklad
Chceme sestavit program, který ze vstupu přečte 3 číselné hodnoty reprezentující strany a, b a c nějakého trojúhelníku. Poté vypočte obvod a obsah trojúhelníku a vypíše je. Pro výpočet obvodu slouží jednoduchý známý vzorec: O =a+b+c A pro obsah využijeme Heronův vzorec: Definice 1 Jsou-li a, b, c délky stran trojúhelníka, platí pro jeho obsah p S = s(s − a)(s − b)(s − c) kde s = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
a+b+c 2
(1)
je poloviční obvod trojúhelníka.
#i n c l u d e < s t d i o . h> #i n c l u d e <math . h> i n t main ( ) { int a , b , c ; p r i n t f ( " z a d e j s t r a n u A: " ) ; s c a n f ( "%d " , &a ) ; p r i n t f ( " z a d e j stranu B: " ) ; s c a n f ( "%d " , &b ) ; p r i n t f ( " z a d e j stranu C: " ) ; s c a n f ( "%d " , &c ) ; f l o a t obvod = a + b + c ; f l o a t s = obvod / 2 ; f l o a t obsah = s q r t ( s ∗ ( s − a ) ∗ ( s − b ) ∗ ( s − c ) ) ; p r i n t f ( " o b v o d j e %f \n" , o b v o d ) ; p r i n t f ( " o b s a h j e %f \n" , o b s a h ) ; return 0; }
Na šestém řádku deklarujeme několik proměnných naráz. Už jste si možná všimli, že deklarace může být bez zadání hodnot a naplnění hodnotou až později (int x; a potom x = 42; nebo scanf("%d", &x);), nebo naplníme hodnotou přímo v deklaraci (int x = 42;). Oba způsoby platí i pro více deklarací na jednom řádku (viz 6. řádek nebo např. int x = 4, y = 2;). Podle Heronova vzorce jsme potřebovali použít odmocninu. Tu na řádku 21 vypočítává funkce sqrt(). Kvůli tomu jsme museli přidat knihovnu math.h na matematické funkce (druhý řádek). Pro vstupy 9, 9 a 9 by se mělo do konzole vypsat: zadej zadej zadej obvod obsah
stranu A: 9 stranu B: 9 stranu C: 9 je 27.000000 je 35.074028 11
12
Samostatná práce
Napište program, který ze vstupu bere reálné číslo a na výstupu vypíše sinus, cosinus a druhou mocninu tohoto čísla. Implementujte tedy funkce: f (x) = sin x
0.5 −4 −2 −0.5
2
4
f (x) = cos x 1 0.5 −4 −2 −0.5
2
4
f (x) = x2 20 10
−4 −2
2
4
Ke všem najdete příslušnou funkci v knihovně math.h. Jmenovitě sin() a cos(). Druhou mocninu lze implementovat jako x ∗ x. Pro vstup 3.14 by měl program vypsat něco jako: Zadej cislo: 3.14 sinus: 0.001593 cosinus: -0.999999 na druhou: 9.859601
12
Část IV
Řízení programu 13
Podmíněný příkaz
Často musíme program rozdělit na více větví, které se vykonají pouze bude-li určitá podmínka pravda nebo ne. Například při čtení dvou čísel ze vstupu bychom chtěli vypsat, které zadané číslo bylo větší. Za předpokladu, že by se čísla uložili do proměnných A a B, bychom zkoumali podmínku A > B.
13.1
If
Větvení pomocí if vypadá následovně: if (podmínka) { tělo } Tedy u výše zmíněného příkladu by to vypadalo: if (A > B) { printf("A je vetsi. \n"); } Pokud se výraz v závorkách vyhodnotí jako pravda, tělo proběhne. Jestli ne, celé tělo se přeskočí (příkazy v něm jsou ignorovány). Hodilo by se ještě podotknout, že výraz (A > B) sice může skončit jako pravda nebo nepravda, v jazyku C se ale ale vyhodnotí na celé číslo, tedy 1 (pravda) nebo 0 (nepravda). V jiných programovacích jazycích jsou pravdivostní hodnoty reprezentovány speciálním datovým typem, v „céčku“ se ale musíme spokojit jen s čísly. Obecně je ale bráno jako pravda jakékoliv číslo kromě nuly.
13.2
Else
Else větev se vykoná, pokud předchozí podmínka skončila jako nepravda. To nám tedy umožňuje rozdělit program na dvě rozdílné větve. Na základě vyhodnocení podmínky vždy vykoná pouze jedna z větví. if (A > B) { printf("A je vetsi. \n"); } else { printf("A neni vetsi. \n"); } V takovém případě je při vyhonocování úplně ignorována jedna z větví. Takže nezáleží, jak velká tajemství větev else skrývá, nebo jestli skončí chybou a pádem programu – pokud se podmínka vyhodnotí na pravdu, celá část else se přeskočí.
13
13.3
Else if
Else if slouží k testování další podmínky, pokud předchozí skončila nepravdou. Například: if (A > B) { printf("A je vetsi. \n"); } else if (A < B) { printf("B je vetsi. \n"); } else { printf("A ma stejnou hodnotu jako B. \n"); }
14
Operátory
Už vás možná napadlo, že na klasické operace s čísly fungují známé znaky +, –, * (krát) a / (děleno). Představíme si ale několik nových, které se vyhodnocují na pravdu nebo nepravdu. operátor > < == != >= <= && ||
význam větší než menší než rovná se nerovná se větší nebo roven menší nebo roven a zároveň nebo
Větší než a menší než už jsme si ukázali. U rovná se je důležité, že se znak ’=’ píše dvakrát po sobě. To kvůli tomu, že samostatně to je přiřazení (např. int x = 42;). Logický operátor && skončí pravdou pouze tehdy, když jsou oba výrazy také pravda. || zase pokud alespoň jeden z výrazů je pravda.
15
Příklad
Zase budeme načítat ze vstupu 3 hodnoty jakožto strany a, b a c nějakého trojúhelníku. Tentokrát ale budeme testovat, zda takový trojúhelník vůbec lze sestrojit. Aby šel sestrojit, musí součet libovolných dvou stran být vždy větší než strana třetí, tedy: a+b>c b+c>a c+a>b
14
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#i n c l u d e < s t d i o . h> i n t main ( ) { int a , b , c ; p r i n t f ( " z a d e j s t r a n u A: " ) ; s c a n f ( "%d " , &a ) ; p r i n t f ( " z a d e j stranu B: " ) ; s c a n f ( "%d " , &b ) ; p r i n t f ( " z a d e j stranu C: " ) ; s c a n f ( "%d " , &c ) ; if
( ( a + b > c ) && ( b + c > a ) && ( c + a > b ) ) { p r i n t f ( " t r o j u h e l n i k l z e s e s t r o j i t ! \n" ) ; p r i n t f ( " j e h o o b v o d b u d e : %d \n" , ( a + b + c ) ) ;
} else { printf (" trojuhelnik }
nelze
s e s t r o j i t ! \n" ) ;
return 0; }
Podmínka na řádku 16. možná vypadá na první pohled nepřehledně. S tím nám částečně pomáhají závorky. Závorky určují i nastavení priority, například 1+2∗3 není to samé co (1 + 2) ∗ 3 a jestli nevíte proč, vraťte se na základní školu. Pro vstupy vstupy 8, 0 a 8 by program měl vypsat: zadej stranu A: 8 zadej stranu B: 0 zadej stranu C: 8 trojuhelnik nelze sestrojit!
16
Další příklad
Chtěli bychom ze tří zadaných hodnot najít maximum. Poprvé používáme funkci scanf() k načtení více hodnot naráz, oddělené pouze mezerou. If taky používáme trochu jinak než do teď - bez těla ve složených závorkách. Pokud tělo obsahuje pouze jeden příkaz, lze to napsat takhle. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#i n c l u d e < s t d i o . h> i n t main ( ) { i n t a , b , c , max ; p r i n t f ( " Zadej 3 c i s l a : " ) ; s c a n f ( "%i %i %i " , &a , &b , &c ) ; i f ( a >= b && a >= c ) max = a ; i f ( b >= a && b >= c ) max = b ; i f ( c >= b && c >= a ) max = c ; printf (" Nejvetsi
cislo
j e %i . \n" , max ) ;
return 0; }
15
17
Poslední příklad
Program příjme jedno písmeno (char) a vypíše: • "pismeno je male", pokud je zadaný znak malé písmeno • "pismeno je velke", pokud je zadaný znak velké písmeno • "znak neni pismeno", pokud je zadaný znak cokoliv jiného než písmeno 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#i n c l u d e < s t d i o . h> i n t main ( ) { char znak ; p r i n t f ( " Z a d e j pismeno : " ) ; s c a n f ( "%c " , &z n a k ) ; i f ( z n a k >= ’ a ’ && z n a k <= ’ z ’ ) { p r i n t f ( " Pismeno j e male . \n" ) ; } e l s e i f ( z n a k >= ’A ’ && z n a k <= ’ Z ’ ) { p r i n t f ( " Pismeno j e v e l k e . \n" ) ; } else { p r i n t f ( " Zadany z n a k n e n i pismeno . \n" ) ; } return 0; }
Na devátém a dvanáctém řádku testujeme podmínku, jestli zadaný znak malé nebo velké písmeno podle tabulky ASCII (6.1). Protože jsou písmena v tabulce hned za sebou, platí podmínka (’a’ < ’b’) atd. Pro vstup ’Z’ prohram vypíše: Zadej pismeno: Z Pismeno je velke. A pro vstup ’42’ prohram vypíše: Zadej pismeno: 42 Zadany znak neni pismeno.
16
Část V
Pole Pole je v informatice datová struktura, která ukládá daný počet prvků stejného typu (celá čísla, reálná čísla, ...). K jeho prvkům se přistupuje přes index, což je celé číslo určující pořadí prvku. Indexuje se od nuly, nikoli od jedničky. Velikost pole zůstává v jazyku C neměnná. Pole je i už zmíněný řetězec a můžeme mít i více rozměrné pole.
18
Jednorozměrné pole
Mějme celočíselné pole, do kterého chceme uložit čísla 0, 42, x, 42, kde x bude číslo přečtené ze vstupu. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#i n c l u d e < s t d i o . h> i n t main ( ) { int x ; p r i n t f ( " Zadej c i s l o : " ) ; s c a n f ( "%d " , &x ) ; int pole [ 4 ] ; pole [ 0 ] = 0; pole [ 1 ] = 42; pole [2] = x ; pole [ 3 ] = 42; return 0; }
Celočíselné pole tedy deklarujeme stejně jako celé číslo, pouze za název do hranatých závorek napíšeme jeho rozsah (viz. 8. řádek). Všimněte si indexování od nuly - zadali jsme velikost pole 4, ale prvek na indexu 4 neexistuje, protože poslední je na indexu 3. Pole můžeme naplnit už při deklaraci, a to pomocí složených závorek. Výše zmíněný postup je ekvivalentní s: int pole[4] = {0, 42, x, 42};
18.1
Řetězce
Textový řetězec je znakové (char, 6.1) pole. Ukažme si program, který ze vstupu přečte celý řetězec a vypíše z něho první a druhé písmeno. 1 2 3 4 5 6 7 8 9 10 11 12
#i n c l u d e < s t d i o . h> i n t main ( ) { char r e t e z e c [ 1 6 ] ; p r i n t f ( " Zadej r e t e z e c : " ) ; s c a n f ( "%s " , &r e t e z e c ) ; p r i n t f ( "%c %c \n" , r e t e z e c [ 0 ] , return 0; }
17
retezec [1]);
Protože nevíme, jak dlouhý bude vstupní řetězec, zvolili jsme na pátém řádku nějaký rozsah, v našem případě 16 písmen. Pokud zadáme víc, program by spadl. Možná vám vývojové prostředí hází varování, ale to neřešte. Pro vstup "Ahoj" by program měl vypsat "A h": Zadej retezec: Ahoj A h
19
Vícerozměrné pole
Další rozměr poli přidáme další hranatou závorkou v deklaraci. Například bychom chtěli celočíselné dvourozměrné pole o rozměrech 3 ∗ 10, tedy o třech „řádcích“ a deseti „sloupcích“ : int pole[3][10];
19.1
Příklad
Chceme zapsat jednoduchou matici A o rozměrech 4 ∗ 3: 2 5 3 4 7 9 A4,3 = 6 8 0 4 8 1 Zdrojový kód bude velice jednoduchý, jelikož jsme chtěli matici pouze zapsat a nic víc. 1 2 3 4 5 6 7 8 9 10 11
#i n c l u d e < s t d i o . h> i n t main ( ) { i n t matice [ 4 ] [ 3 ] = {{2 , {4 , {6 , {4 ,
5, 7, 8, 8,
3} , 9} , 0} , 1}};
return 0; }
20
Konec
Tak a to je vše. Pokud jste to dočetli až sem, tak palec hore. Dohledání dalších elementů jazyka je na vás. Doporučuji se podívat na cykly.
18