Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0 int policko[100]; // tj. pole je od 0 do 99!!! policko[5] = 7; // pozor je to 6. prvek s indexem 5 policko[99] = 2; // poslední prvek. 6 policko[100] = 78; // C nijak neprotestuje příkaz vykoná - hodnota 78 je zapsána do paměti ZA moje pole, přepisuji paměť, kterou nemám přidělenu => pravděpodobně bude program chybovat. Může tam uložena moje jiná proměnná... - to znamená, že C nekontroluje rozsahy polí a ohlídání je na programátorovi musím si udržovat např. nějakou proměnnou, kde budu délku pole uloženu. Dvourozměrné pole: int pol2d[5][10]; pol2d[0][0] = 4; /* levý horní roh */ pol2d[4][9] = 7; /* pravý dolní roh */ "Prolezu" dvourozměrné pole: int pole2d[100][100]; int sloupec, radek; for(sloupec = 0; sloupec < 100; sloupec++) for(radek = 0; radek < 100; radek++) pol2d[radek][sloupec] = 5; // po sloupcích vždy pro sloupec-tý sloupec projedu všechny řádky (pomocí radek)
- nebo s konstantami #define RADKU 100 #define SLOUPCU 50...tady nějaký začátek programu int pole2d[radku][sloupcu]; for(rad = 0; rad < RADKU; rad++) for(sl = 0; sl < SLOUPCU; sl++) pol2d[rad][sl] = 5; // po řádcích vždy pro rad-tý řádek projedu všechny sloupce (pomocí sl) Funkce základy - základní deklarace funkce: návratový_typ název_funkce(typ_parametru název_parametru_funkce) tělo_funkce; return návratová_hodnota; Např: pom = a * b; return(pom); /* lze též return pom; */ Jinak totéž: return(a * b); Pozn.: funkční prototyp této funkce (např. v hlavičkovém souboru) by vypadal takto: ;
nebo také: int pocitej_soucin(int, int); Potom volání této funkce: int vysledek, prvniop, druhyop; prvniop = 10; druhyop = 20; vysledek = pocitej_soucin(prvniop, druhyop); printf("vysledek soucinu %d a %d je %d.", prvniop, druhyop, vysledek); printf("vysledek soucinu %d a %d je %d.",5,6,pocitej_soucin(5,6)); - jiný postup - kompletnější int vstup1, vstup2, vysledek; vstup1 = 23; vstup2 = 25; vysledek = pocitej_soucin(vstup1, vstup2); printf("vysledek soucinu %d a %d je %d.",vstup1,vstup2, vysledek); - typ proměnné použité jako parametr u return musí být shodný s typem (návratovým typem) dané funkce - lze provést přetypování návratové hodnoty nebo se udělá implicitní typová konverze. Např.: return((int) (a * b)); - pozor pokud funkci volám, musí už být známa (stačí hlavička funkce, tzv. funkční prototyp) #include <stdio.h> /* funkcni prototyt */
; // tato funkce umi scitat int vstup1, vstup2, vysledek; vstup1 = 23; vstup2 = 25; vysledek = pocitej_soucin(vstup1, vstup2); printf("vysledek soucinu %d a %d je %d.\n",vstup1,vstup2, pocitej_soucin (vstup1, vstup2)); system("pause"); pom = a * b; return(pom); /* lze též return pom; */ Nebo: void nazdar(void); /* musím uvést, aby ho ahoj mohl zavolat */ int ahoj(void)...nějaké příkazy... nazdar(); /* u funkcí bez parametrů se uvádí závorky */... atd... void nazdar(void)...nějaké příkazy... int v = ahoj(); /* u funkcí bez parametrů se uvádí závorky */... atd... - používá se hlavně pokud jsou funkce v různých souborech potom se nedávají funkční prototypy na začátek, ale do vlastního hlavičkového souboru (.h): Např.:
funkce1.h obsahuje: /* funkcni prototyp */ ; funkce1.c obsahuje: #include <stdio.h> #include "funkce1.h" int vstup1, vstup2, vysledek; vstup1 = 23; vstup2 = 25; vysledek = pocitej_soucin(vstup1, vstup2); printf("vysledek soucinu %d a %d je %d.\n",vstup1,vstup2, pocitej_soucin (vstup1, vstup2)); system("pause"); v jiném souboru: nasobeni.c obsahuje: #include <stdio.h> #include "funkce1.h" pom = a * b; return(pom); /* lze též return pom; */ - do hlavičkových souborů se umisťují dále konstanty a deklarace nových datových typů (typedef) Dále k funkcím: - pokud funkce nevrací nic návratový typ je void - pokud nemá parametry parametry jsou void - volání funkce bez parametrů: funkce(); /* závorky jsou nutné!!! */ - nezapomenout parametry funkce se chovají jako lokální proměnné
- C umí předat parametry do funkce pouze hodnotou, jinak musím obejít (viz dále - pointery) - lokální proměnné uvnitř funkce z vnějšku nejsou vidět, zanikají při skončení "své" funkce - globální proměnné jsou deklarovány mimo funkci, jsou vidět "všude" - nesmí se umístit do souboru.h mohl bych jej víckrát "includovat" => proměnná by byla v projektu několikrát při linkování dojde ke kolizi... lze ošetřit viz dále. - pokud bude mít lokální proměnná ve funkci stejné jako nějaká globální proměnná => lokální proměnná překryje ve funkci tu globální. int g; double fn; double vypocet(int fn) double g; g = 2.45; // měním lokální g, globální g je překryto g = 3.5 * fn; // jde o lokální fn, ten parametr funkce // zde zbytek programu return(nejaky_vysledek); Práce s pamětí - oblast působnosti identifikátoru kde daná proměnná platí, kde je vidět - viz výše lokální ve funkci, lokální v bloku, globální Pozor, častá chyba: for (int i = 0; i < 10; i++) /* tady platí i v bloku */ pole[i] = 20; atd... i = 5; /* chyba, tady už i neexistuje */ nebo:
nějaké_příkazy; double pole[10000];...příkazy pracující s polem pole... /* tady pole zaniká */ další_příkazy; Práce s pamětí u funkcí - proměnná je viditelná ve funkci kde byla deklarována - globální proměnné - deklarace mimo funkci na zač. souboru s programem Soubor fcemakej.c: int makej(int a, int b) /* neco dela */ pom = (a * b) / (a + b); return pom; pom 2 a 3 b 6 Soubor hlavni.c: int makej(int a, int b); /* funkční prototyp, je-li třeba */ /* volání této funkce: */ void volacka(void) int x = 3, y = 6, vysl; vysl = makej(x, y); - C umí předávat parametry pouze hodnotou x 3 vysl 2 y 6