začínáme vážně programovat
DESCRIPTION
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. Složený příkaz, blok. Pascalské BEGIN a END představují v jazyce C složené závorky „ { “ a „ } “ . - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/1.jpg)
Začínáme vážně programovat
Řídící strukturyPřetypováníVstupně výstupní operaceVlastní tvorba programů
![Page 2: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/2.jpg)
Podmínky a cykly…
Dokončení stručného přehledu řídících struktur jazyka C.
![Page 3: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/3.jpg)
Složený příkaz, blok 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. 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é.
![Page 4: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/4.jpg)
Podmíněný příkaz – větvení
if (podmínka) příkaz_1;
else příkaz_2;
Platí-li podmínka, provede se „příkaz_1”. Neplatí-li podmínka, provede se
„příkaz_2”.
if (podmínka) příkaz_1;
Platí-li podmínka, provede se „příkaz_1”.
?
příkaz_1 příkaz_2
?
příkaz_1
ano
ano
ne
ne
(Je-li v sobě vnořeno několik if, patří else k poslednímu if bez else)
![Page 5: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/5.jpg)
Příkaz switch – přepínač
Příkaz pro mnohonásobné větvení programu.
Nejedná se o plný ekvivalent příkazu CASE známého z Pascalu:
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; jednu větev lze definovat jako „default“
![Page 6: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/6.jpg)
Příkaz switch – přepínač (2)
switch (výraz) { case h1: př_1; break;case h2:case h3: př_3; break;default: př_def;
[break;]}
výraz
== h1
== h2
== h3
př_1
př_3
př_def
ano
ano
ano
ne
ne
ne
break;
break;
break;
![Page 7: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/7.jpg)
Cyklus – for
Inicializace se provede pouze jedenkrát na začátku.
Cyklicky se pak provádí: test platnosti podmínky je-li splněna
provedení příkazu vyhodnocení iteračního
výrazu Příklad:
for (int x = 0; x < 10; x++) printf(“Ahoj”);
inicializace
?
příkaz
iteračnívýraz
ano ne
for (inicializace; podmínka; iterační výraz) příkaz;
![Page 8: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/8.jpg)
Cyklus – while a do-while
while (podmínka) příkaz; Dokud platí podmínka, provádí se
„příkaz”. (příkaz se nemusí provést)
do příkaz;while(podmínka); Provede se příkaz. Dokud platí podmínka, provádí se
„příkaz”. (příkaz se provede nejméně
jednou)
?
příkaz
ano ne
?ano ne
příkaz
![Page 9: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/9.jpg)
Příkazy break a continue Mění normální průběh cyklu. Použití má smysl v cyklech (for, while, do-while) a v případě break i v přepínači.
break ukončuje smyčku opouští ihned cyklus
continue skáče na konec smyčky – vynutí další iteraci cyklu neopouští cyklus
Oba se vztahují k nejvnitřnější neuzavřené smyčce.
![Page 10: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/10.jpg)
Příkazy break a continue (2)
int x = 0;
while (x++ < 5) {
if (x == 3)
break;
if (x == 2)
continue;
printf ("%d\n", x);
}
printf ("%d\n", x);
1 – uvnitř cyklu3 – mimo cyklus
< 5
== 3
== 2
break;
continue;
x = 0
printf() printf()
ano
ano
ano
ne
ne
ne
![Page 11: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/11.jpg)
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);
![Page 12: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/12.jpg)
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;
}
![Page 13: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/13.jpg)
Fibonacciho posloupnost
int p1 = 0, p2 = 1, f;
printf ("0 : 0\n");printf ("1 : 1\n");for (int x = 2; x < 10; x++) { f = p1 + p2; p1 = p2; p2 = f;
printf ("%d : %d\n", x, f);}
![Page 14: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/14.jpg)
Fibonacciho posloupnost
Vaším úkolem je program přepsat bez použití cyklu for.
![Page 15: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/15.jpg)
Fibonacciho posloupnost
Vaším úkolem je program přepsat bez použití cyklu for.
int x = 2, p1 = 0, p2 = 1, f;printf ("0 : 0\n");printf ("1 : 1\n");
while (x < 10) { f = p1 + p2; p1 = p2; p2 = f; printf ("%d : %d\n", x, f); x++;}
![Page 16: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/16.jpg)
Přetypování
PřetypováníTypová konverze
![Page 17: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/17.jpg)
Přetypování, typová konverze
Převod proměnné nebo hodnoty určitého typu na typ jiný.
Dva typy typové konverze Implicitní
prováděny automaticky nemůžeme téměř ovlivnit
Explicitní 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
![Page 18: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/18.jpg)
Přetypování – příklad použití
int a = 10, b = 3;
printf("10/3 = %d\n", a/b);
printf("10/3 = %f\n", (double)a/b);
10/3 = 3
10/3 = 3.333333
double d = 5.4, e = 5.9;
int c = (int)d; //c == 5
c = (int)e; //c == 5
![Page 19: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/19.jpg)
Vstupně výstupní operace
Základní informace.
![Page 20: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/20.jpg)
Vstupně výstupní operace 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“.
![Page 21: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/21.jpg)
Čtení/zápis znak po znaku
putchar() zajistí výstup jednoho znaku
getchar() zajistí vstup jednoho znaku
Obě pracují s celočíselným typem int (ne s char).
![Page 22: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/22.jpg)
Formátovaný vstup a výstup
scanf(“řídící řetězec formátu”, parametry) zajišťuje vstup
printf(“řídící řetězec formátu”, parametry)
zajišťuje výstup „Řídící řetězec formátu“ obsahuje
„Formátové specifikace“ začínají ‘%’ určují formát výstupu či vstupu
„Znakové posloupnosti“ nejsou uvozeny ‘%’ používají se zejména u printf()
![Page 23: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/23.jpg)
Formátovaný vstup a výstup (2)
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.10lf ... 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.
![Page 24: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/24.jpg)
Vstupně výstupní operace (2)
Probíhají asynchronně (buffer) pokud někdo zadá vstup „10 20 30 40 50“ a budeme číst desítková čísla v cyklu proběhne cyklus 5x a pak scanf() vrátí EOF
10 20 30 40 501: opis: 102: opis: 203: opis: 304: opis: 405: opis: 50
while (scanf("%d", &cislo) != EOF) { ++poradi; printf("%d: opis: %d\n",
poradi, cislo);}
![Page 25: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/25.jpg)
1. Úkol – průměr 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.
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
![Page 26: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/26.jpg)
1. Úkol – průměr (2)
while (scanf ("%d", &vstup) != EOF) {
![Page 27: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/27.jpg)
1. Úkol – průměr (2)
while (scanf ("%d", &vstup) != EOF) { if (vstup >= 100) continue;
![Page 28: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/28.jpg)
1. Úkol – průměr (2)
while (scanf ("%d", &vstup) != EOF) { if (vstup >= 100) continue; else if (vstup < 0) break;
![Page 29: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/29.jpg)
1. Úkol – průměr (2)
while (scanf ("%d", &vstup) != EOF) { if (vstup >= 100) continue; else if (vstup < 0) break; printf ("Zadano: %d\n", vstup);
![Page 30: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/30.jpg)
1. Úkol – průměr (2)
while (scanf ("%d", &vstup) != EOF) { if (vstup >= 100) continue; else if (vstup < 0) break; printf ("Zadano: %d\n", vstup); soucet += vstup;
![Page 31: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/31.jpg)
1. Úkol – průměr (2)
while (scanf ("%d", &vstup) != EOF) { if (vstup >= 100) continue; else if (vstup < 0) break; printf ("Zadano: %d\n", vstup); soucet += vstup; pocet++;}
![Page 32: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/32.jpg)
1. Úkol – průměr (2)
while (scanf ("%d", &vstup) != EOF) { if (vstup >= 100) continue; else if (vstup < 0) break; printf ("Zadano: %d\n", vstup); soucet += vstup; pocet++;}
//vypocet pak muze byt ((double)soucet / pocet));
![Page 33: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/33.jpg)
2. Úkol – koza, vlk a zelí Na počítači Aisa si stáhněte soubor:
/home/xbayer/open/zeli.c Dokončete program tak, aby pracoval. Vyzkoušet lze na:
/home/xbayer/open/zelifull K dispozici je již řada hotových funkcí,
Vaším úkolem bude zejména naprogramovat vlastní ovládání.
![Page 34: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/34.jpg)
2. Úkol – koza, vlk a zelí – cíle
Na jedné straně (A) jezera se vyskytujete Vy, koza, vlk a zelí.
Koza má zálusk na zelí. 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 )
![Page 35: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/35.jpg)
2. Úkol – hotové funkce (1) 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));
![Page 36: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/36.jpg)
2. Úkol – hotové funkce (2)
Funkce test() 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() void kdo_ceka (char breh); Nepovinné, jen vypíše, kdo je na daném břehu.
![Page 37: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/37.jpg)
2. Úkol – hotové funkce (3)
Funkce preprav() 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í.
![Page 38: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/38.jpg)
2. Úkol – hotové funkce (4) Funkce test_vitezstvi()
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í: 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
![Page 39: Začínáme vážně programovat](https://reader035.vdocuments.net/reader035/viewer/2022062409/56815055550346895dbe5600/html5/thumbnails/39.jpg)
Shrnutí 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.
Děkuji za pozornost.