Zanme vn programovat dc struktury Petypovn Vstupn vstupn

  • Slides: 39
Download presentation
Začínáme vážně programovat Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Začínáme vážně programovat Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Podmínky a cykly… Dokončení stručného přehledu řídících struktur jazyka C.

Podmínky a cykly… Dokončení stručného přehledu řídících struktur jazyka C.

Složený příkaz, blok n n Pascalské BEGIN a END představují v jazyce C složené

Složený příkaz, blok n n Pascalské BEGIN a END představují v jazyce C složené závorky „{“ a „}“. Příkazy uvnitř složených závorek „{ … }“ představují jeden složený příkaz. n n Používá se tehdy, potřebujeme-li provést několik příkazů tam, kde se očekává pouze jeden, např. v cyklech. Závorky „{}“ uzavírají také blok, proto uvnitř závorek smíme (mimo jiné) deklarovat proměnné.

Podmíněný příkaz – větvení ano ? příkaz_1 ne if (podmínka) příkaz_1; else příkaz_2; příkaz_2

Podmíněný příkaz – větvení ano ? příkaz_1 ne if (podmínka) příkaz_1; else příkaz_2; příkaz_2 n n ano příkaz_1 ? Platí-li podmínka, provede se „příkaz_1”. Neplatí-li podmínka, provede se „příkaz_2”. ne if (podmínka) příkaz_1; n Platí-li podmínka, provede se „příkaz_1”. (Je-li v sobě vnořeno několik if, patří else k poslednímu if bez else)

Příkaz switch – přepínač n n Příkaz pro mnohonásobné větvení programu. Nejedná se o

Příkaz switch – přepínač n n Příkaz pro mnohonásobné větvení programu. Nejedná se o plný ekvivalent příkazu CASE známého z Pascalu: n nelze jednoduše napsat prostý výčet několika hodnot pro jeden příkaz rozhodovací výraz musí být typu int v každé větvi smí být více příkazů bez „{}“ složených závorek každá větev musí být ukončena break; n jednu větev lze definovat jako „default“ n n n

Příkaz switch – přepínač (2) výraz switch (výraz) { case h 1: př_1; break;

Příkaz switch – přepínač (2) výraz switch (výraz) { case h 1: př_1; break; case h 2: case h 3: př_3; break; default: př_def; [break; ] } == h 1 ano př_1 ne == h 2 ano ne == h 3 ano př_3 ne př_def break;

Cyklus – for (inicializace; podmínka; iterační výraz) příkaz; n n n Inicializace se provede

Cyklus – for (inicializace; podmínka; iterační výraz) příkaz; n n n Inicializace se provede pouze jedenkrát na začátku. Cyklicky se pak provádí: n test platnosti podmínky n je-li splněna n provedení příkazu n vyhodnocení iteračního výrazu Příklad: for (int x = 0; x < 10; x++) printf(“Ahoj”); inicializace ano příkaz iterační výraz ? ne

Cyklus – while a do-while (podmínka) příkaz; ano ? ne n příkaz Dokud platí

Cyklus – while a do-while (podmínka) příkaz; ano ? ne n příkaz Dokud platí podmínka, provádí se „příkaz”. n (příkaz se nemusí provést) do příkaz; while(podmínka); n příkaz ano ? n ne Provede se příkaz. Dokud platí podmínka, provádí se „příkaz”. n (příkaz se provede nejméně jednou)

Příkazy break a continue n n n Mění normální průběh cyklu. Použití má smysl

Příkazy break a continue n n n Mění normální průběh cyklu. Použití má smysl v cyklech (for, while, dowhile) a v případě break i v přepínači. break n n n continue n n n ukončuje smyčku opouští ihned cyklus skáče na konec smyčky – vynutí další iteraci cyklu neopouští cyklus Oba se vztahují k nejvnitřnější neuzavřené smyčce.

Příkazy break a continue (2) int x = 0; while (x++ < 5) {

Příkazy break a continue (2) int x = 0; while (x++ < 5) { if (x == 3) break; if (x == 2) continue; printf ("%dn", x); } printf ("%dn", x); 1 – uvnitř cyklu 3 – mimo cyklus x=0 ne <5 ano == 3 ano break; ne continue; ano == 2 ne printf()

Příklady „ekvivalentních“ cyklů for(x = 0; x < 10; x++) vysledek += x; x

Příklady „ekvivalentních“ cyklů for(x = 0; x < 10; x++) vysledek += x; x = 0; while (x < 10) { vysledek += x; x++; } x = 0; do { vysledek += x; x++; } while (x < 10); x = 0; if (x < 10) do { vysledek += x; x++; } while (x < 10);

Příklady „ekvivalentních“ cyklů x = 0; if (x < 10) do ; while (vysledek

Příklady „ekvivalentních“ cyklů x = 0; if (x < 10) do ; while (vysledek += x++, x < 10); x = 0; for (; ; ) { vysledek += x; if (++x >= 10) break; }

Fibonacciho posloupnost int p 1 = 0, p 2 = 1, f; printf ("0

Fibonacciho posloupnost int p 1 = 0, p 2 = 1, f; printf ("0 printf ("1 for (int x f = p 1 + p 1 = p 2; p 2 = f; : 0n"); : 1n"); = 2; x < 10; x++) { p 2; printf ("%d : %dn", x, f); }

Fibonacciho posloupnost n Vaším úkolem je program přepsat bez použití cyklu for.

Fibonacciho posloupnost n Vaším úkolem je program přepsat bez použití cyklu for.

Fibonacciho posloupnost n Vaším úkolem je program přepsat bez použití cyklu for. int x

Fibonacciho posloupnost n Vaším úkolem je program přepsat bez použití cyklu for. int x = 2, p 1 = 0, p 2 = 1, f; printf ("0 : 0n"); printf ("1 : 1n"); while (x < 10) { f = p 1 + p 2; p 1 = p 2; p 2 = f; printf ("%d : %dn", x, f); x++; }

Přetypování Typová konverze

Přetypování Typová konverze

Přetypování, typová konverze n n Převod proměnné nebo hodnoty určitého typu na typ jiný.

Přetypování, typová konverze n n Převod proměnné nebo hodnoty určitého typu na typ jiný. Dva typy typové konverze n Implicitní n n n prováděny automaticky nemůžeme téměř ovlivnit Explicitní n n n přetypování (typecasting) plně pod naší kontrolou používá se často, zejména při práci s ukazateli nevhodné použití může způsobit značné komplikace v C probíhá v době překladu, C++ i dynamicky

Přetypování – příklad použití int a = 10, b = 3; printf("10/3 = %dn",

Přetypování – příklad použití int a = 10, b = 3; printf("10/3 = %dn", a/b); printf("10/3 = %fn", (double)a/b); 10/3 = 3. 333333 double d = 5. 4, e = 5. 9; int c = (int)d; //c == 5 c = (int)e; //c == 5

Vstupně výstupní operace Základní informace.

Vstupně výstupní operace Základní informace.

Vstupně výstupní operace n n n Programovací jazyk C neimplementuje žádnou IO (Input Output)

Vstupně výstupní operace n n n Programovací jazyk C neimplementuje žádnou IO (Input Output) operaci jako vlastní součást jazyka (jako tomu je třeba u jazyka Pascal). Standardní knihovna proto obsahuje několik IO funkcí, které vstupně výstupní operace zajišťují. Prototypy těchto základních funkcí jsou v hlavičkovém souboru „stdio. h“.

Čtení/zápis znak po znaku n putchar() n n getchar() n n zajistí výstup jednoho

Čtení/zápis znak po znaku n putchar() n n getchar() n n zajistí výstup jednoho znaku zajistí vstup jednoho znaku Obě pracují s celočíselným typem int (ne s char).

Formátovaný vstup a výstup n scanf(“řídící řetězec formátu”, parametry) n n printf(“řídící řetězec formátu”,

Formátovaný vstup a výstup n scanf(“řídící řetězec formátu”, parametry) n n printf(“řídící řetězec formátu”, parametry) n n zajišťuje vstup zajišťuje výstup „Řídící řetězec formátu“ obsahuje n „Formátové specifikace“ n n n začínají ‘%’ určují formát výstupu či vstupu „Znakové posloupnosti“ n n nejsou uvozeny ‘%’ používají se zejména u printf()

Formátovaný vstup a výstup (2) n n n Formátování je přehledně uvedeno na stránkách

Formátovaný vstup a výstup (2) n n n Formátování je přehledně uvedeno na stránkách předmětu. Pozor, při čtení pomocí funkce scanf() musí být před proměnnou znak ‘&’ – pokud se nejedná o ukazatel (problém předávání hodnotou). Funkce scanf() vrací počet přečtených položek (“%d %d” odpovídá návratové hodnotě 2). Funkce printf() vrací počet vypsaných znaků („%d %d” může odpovídat návratové hodnotě více než 2). %16. 10 lf. . . tisk celkem na 16 míst, z toho 10 za desetinnou tečkou. První číslo se nedodrží, pokud s daným počtem nelze hodnotu vypsat.

Vstupně výstupní operace (2) n Probíhají asynchronně (buffer) n n n pokud někdo zadá

Vstupně výstupní operace (2) n Probíhají asynchronně (buffer) n n n pokud někdo zadá vstup „ 10 20 30 40 50“ a budeme číst desítková čísla v cyklu proběhne cyklus 5 x a pak scanf() vrátí EOF while (scanf("%d", &cislo) != EOF) { ++poradi; printf("%d: opis: %dn", poradi, cislo); } 10 20 30 40 50 1: opis: 10 2: opis: 20 3: opis: 30 4: opis: 40 5: opis: 50

1. Úkol – průměr n n Napište program pro výpočet aritmetického průměru bez použití

1. Úkol – průměr n n Napište program pro výpočet aritmetického průměru bez použití pole. Jednotlivé hodnoty čtěte ze vstupu až do konce souboru (Ctrl+D) nebo do výskytu záporné hodnoty. n n Poté vypište aritmetický průměr zadaných hodnot. Hodnoty >= 100 ignorujte (nezapočítávejte). Snažte se použít příkazů break i continue. Zkusit lze na počítači Aisa: /home/xbayer/open/prumer

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) {

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) {

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) { if (vstup

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) { if (vstup >= 100) continue;

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) { if (vstup

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) { if (vstup >= 100) continue; else if (vstup < 0) break;

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) { if (vstup

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) { if (vstup >= 100) continue; else if (vstup < 0) break; printf ("Zadano: %dn", vstup);

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) { if (vstup

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) { if (vstup >= 100) continue; else if (vstup < 0) break; printf ("Zadano: %dn", vstup); soucet += vstup;

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) { if (vstup

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) { if (vstup >= 100) continue; else if (vstup < 0) break; printf ("Zadano: %dn", vstup); soucet += vstup; pocet++; }

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) { if (vstup

1. Úkol – průměr (2) while (scanf ("%d", &vstup) != EOF) { if (vstup >= 100) continue; else if (vstup < 0) break; printf ("Zadano: %dn", vstup); soucet += vstup; pocet++; } //vypocet pak muze byt ((double)soucet / pocet));

2. Úkol – koza, vlk a zelí n Na počítači Aisa si stáhněte soubor:

2. Úkol – koza, vlk a zelí n Na počítači Aisa si stáhněte soubor: /home/xbayer/open/zeli. c n n Dokončete program tak, aby pracoval. Vyzkoušet lze na: /home/xbayer/open/zelifull n K dispozici je již řada hotových funkcí, Vaším úkolem bude zejména naprogramovat vlastní ovládání.

2. Úkol – koza, vlk a zelí – cíle n n Na jedné straně

2. Úkol – koza, vlk a zelí – cíle n n Na jedné straně (A) jezera se vyskytujete Vy, koza, vlk a zelí. Koza má zálusk na zelí. n n a vlk na kozu Máte loďku a vždy můžete přepravit sebe a jednoho společníka. Úkolem je dostat všechny tři na druhou stranu (B) jezera. (Triviální řešení, kdy necháme kozu sežrat zelí, poté vlka kozu a následně převezeme vlka, bude uznáno pouze, pokud předvedete i reversní proces )

2. Úkol – hotové funkce (1) n n n Vzhledem k probrané látce není

2. Úkol – hotové funkce (1) n n n Vzhledem k probrané látce není program napsán příliš elegantně. Tři globální proměnné typu char (k, v, z) nabývají hodnot ‘A’ a ‘B’, dle umístění kozy, vlka a zelí. Pro testování konfliktů a korektního vstupu již máte napsány funkce, stačí použít, např. : do { if (scanf ("%c", &vstup) == EOF) return 1; } while (preprav ('a', vstup));

2. Úkol – hotové funkce (2) n Funkce test() n n n int test

2. Úkol – hotové funkce (2) n Funkce test() n n n int test (char breh); Zjistí, zda nedošlo ke konfliktu na jednom z břehů (parametr breh – ‘A’, ‘B’). V případě konfliktu vypíše hlášení a vrátí hodnotu 1. Pokud vše OK, vrátí hodnotu 0 a nic nevypisuje. Funkce kdo_ceka() n void kdo_ceka (char breh); n Nepovinné, jen vypíše, kdo je na daném břehu.

2. Úkol – hotové funkce (3) n Funkce preprav() n n n n int

2. Úkol – hotové funkce (3) n Funkce preprav() n n n n int preprav (char odkud, char vstup); Pokusí se přepravit „vstup“(změnit stav globálních proměnných). Na vstup obdrží znak, co uživatel zadal. Jako parametr „odkud“ obdrží ‘A’ nebo ‘B’, dle toho, odkud kam „vstup“ přepravujeme. Vrátí hodnotu 0, pokud vše OK. Vrátí hodnotu 1, pokud se vyskytnul problém. Řeší i nemožnost přepravy, jelikož „pasažér“ je na druhém břehu, vypisuje odpovídající hlášení.

2. Úkol – hotové funkce (4) n Funkce test_vitezstvi() n n int test_vitezstvi (void)

2. Úkol – hotové funkce (4) n Funkce test_vitezstvi() n n int test_vitezstvi (void) Vrátí hodnotu 0, pokud nebylo dosaženo vítězství. Vrátí hodnotu 1, pokud hráč vyhrává. Způsoby volání funkcí: n n test (‘B’); //test konzistence na břehu B kdo_ceka (‘B’); //výpis, kdo čeká na břehu B while (preprav (‘A', vstup)); //kde vstup je znak test_vitezstvi (); //pravda, když hráč vyhrál

Shrnutí n Bez cyklů nelze programovat, je žádoucí jimi plně proniknout. IO v jazyku

Shrnutí n Bez cyklů nelze programovat, je žádoucí jimi plně proniknout. IO v jazyku C je značně problematické a nejednou možná strávíte mnoho hodin hledáním chyby – v C++ je značně vylepšeno. n Děkuji za pozornost. n