3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Podobné dokumenty
Řídicí struktury. alg3 1

Řídící struktury, if, while, switch

Řídící struktury, if, while, switch

Algoritmizace a programování

Algoritmizace a programování

Algoritmizace a programování

5. přednáška - Rozklad problému na podproblémy

Úvod do programování - Java. Cvičení č.4

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Paměť počítače. alg2 1

6 Příkazy řízení toku

Příkazy if, while, do-while, for, switch

9. přednáška - třídy, objekty

6. Příkazy a řídící struktury v Javě

Rozklad problému na podproblémy

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Úvod do programovacích jazyků (Java)

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

Algoritmy a datové struktury

Algoritmizace a programování

Větvení a cykly. Úvod do programování 1 Tomáš Kühr

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

Příkaz while. while (podmínka) { příkaz; } Příklad: int i=0; while (i < 10) { System.out.println(i); i++; } // vypíše čísla od 0 do 9

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Algoritmizace a programování

Řídicí příkazy KAPITOLA 3. Vstup znaků z klávesnice

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Jak v Javě příkazy, operace a výrazy. BD6B36PJV 00 Fakulta elektrotechnická České vysoké učení technické

Algoritmizace a programování. Terminálový vstup a výstup

Jazyk C# a platforma.net

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Cykly. Základy programování 1 Martin Kauer (Tomáš Kühr)

Spojové struktury. x, y, a, b. X1 y1 X2 y2 X3 y3. Grafické objekty bod. kružnice. obdélník. lomenáčára

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

Programování v jazyce JavaScript

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Řetězce a řídicí struktury

KTE / ZPE Informační technologie

Příkazy a řídicí struktury v Javě. Tomáš Pitner, upravil Marek Šabo

1. Téma 03 - Rozhodování

5 Přehled operátorů, příkazy, přetypování

Operační systémy. Cvičení 4: Programování v C pod Unixem

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

3 KTE / ZPE Informační technologie

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

Část 1 Soubory a vytvoření projektu. Řetězce a řídicí struktury. Část 2 Připomínka (NSD) Část 3 Textové řetězce, operátory a načítání vstupu

8. přednáška: Soubory a proudy

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Větvení programů příkaz IF

1. Téma 12 - Textové soubory a výjimky

2. lekce Algoritmus, cyklus Miroslav Jílek

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Klíčové pojmy: Cyklus, řídící proměnná, inicializace, test podmínky, přerušení cyklu, vnořování cyklů.

Algoritmizace prostorových úloh

Řetězce a řídicí struktury

Základní stavební prvky algoritmu

Základy algoritmizace a programování

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

KTE / ZPE Informační technologie

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Úvod do programování v jazyce Java

Algoritmizace prostorových úloh

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

KTE / ZPE Informační technologie

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

5 Rekurze a zásobník. Rekurzivní volání metody

Funkce a procedury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 5 A0B36PR1 Programování 1

Část 1 Funkce, lokální proměnné a přidělování paměti. Funkce a procedury. Část 2 Cykly a řízení jejich průchodu. Část 3 Příklady

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Algoritmizace a programování

C# konzole Podíl dvou čísel, podmínka IF

Programovací jazyk Pascal

7. Datové typy v Javě

Algoritmizace. Algoritmizace (Y36ALG), Šumperk - 1. přednáška 1

MQL4 COURSE. By Coders guru -5 Smyčky & Rozhodnutí Část 2

Úvod do programování. Lekce 3

Tato tematika je zpracována v Záznamy přednášek: str , 44-61

2. Základy jazyka. Proměnné. Základy jazyka

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

IAJCE Přednáška č. 6. logický celek, řešící dílčí část problému Příklad velmi špatného zápisu programu na výpočet obsahu obdélníku

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Algoritmizace. Cíle předmětu

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Lekce 04 Řídící struktury

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Objektově orientované programování

Úvodní informace. Petr Hnětynka 2/2 Zk/Z

Funkce, podmíněný příkaz if-else, příkaz cyklu for

cyklus s daným počtem opakování cyklus s podmínkou na začátku (cyklus bez udání počtu opakování)

Programovací jazyk C++ Hodina 1

Datové struktury. alg12 1

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

3. Řízení běhu programu

Java reprezentace dat, výrazy. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

Transkript:

Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti 3. přednáška nalezení největšího prvku, druhého nejvyššího prvku, algoritmus shozeného praporku. Algoritmizace (Y36ALG), Šumperk - 3. přednáška 1

Řídící struktury sekvence if - else while for do + - - + - + + if switch - Algoritmizace (Y36ALG), Šumperk - 3. přednáška 2

Řídící struktury Řídicí struktura je programová konstrukce, která se skládá z dílčích příkazů a předepisuje pro ně způsob provedení Tři druhy řídicích struktur: posloupnost, předepisující postupné provedení dílčích příkazů větvení, předepisující provedení dílčích příkazů v závislosti na splnění určité podmínky cyklus, předepisující opakované provedení dílčích příkazů v závislosti na splnění určité podmínky Budeme používat následující složené příkazy: složený příkaz nebo blok pro posloupnost příkaz if pro větvení příkazy while, do nebofor pro cyklus Řídicí struktury mají obvykle formu strukturovaných příkazů Další strukturované příkazy jazyka Java: Složený příkaz: { <posloupnost příkazů> Blok: { <posloupnost deklarací a příkazů> Pozn.:Deklarace jsou v bloku lokální, tzn. neplatí vně bloku Algoritmizace (Y36ALG), Šumperk - 3. přednáška 3

Větvení příkaz if Příkaz if (podmíněný příkaz) umožňuje větvení na základě podmínky Má dva tvary: if (podmínka) příkaz 1 else příkaz 2 if (podmínka) příkaz 1 kde podmínka je logický výraz (výraz, jehož hodnota je typu boolean, tj. true nebo false) if - else Příklad (do min uložit a pak vypsat menší z hodnot x a y): // 1. varianta true if (x < y) min = x; else min = y; System.out.println(min); if // 2. varianta min = x; if (y < min) min = y; System.out.println(min); true false false Algoritmizace (Y36ALG), Šumperk - 3. přednáška 4

Víceúrovňové větvení Pozor na vnoření neúplného if do úplného if Příklad: zapište příkazem if následující větvení: z = 2 false true i > 0 false i <10 true z = 1 Špatně: if (i > 0) if (i < 10) z = 1; else z = 2; Dobře: if (i > 0) { if (i < 10) z = 1; else z = 2; Algoritmizace (Y36ALG), Šumperk - 3. přednáška 5

Hledání a výpis druhého největšího prvku - naivně Ze dvou čísel x, y: if (x > y)system.out.println( max2 je + y); Ze třech čísel x, y,z: if (x>y && y>z)system.out.println( max2 je + y); else if (z>y && y>x)system.out.println( max2 je + y); else if (x>z && z>y)system.out.println( max2 je + z); else if (y>z && z>x)system.out.println( max2 je + z); else if (y>x && x>z)system.out.println( max2 je + x); else if (z>x && x>z)system.out.println( max2 je + x); počet různých pořadí je 3*2*1 = 6 Ze čtyřčísel x, y, z, u: počet různých pořadí je 4*3*2*1 = 24 Z pěti čísel počet různých pořadí je 5*4*3*2*1 = 120 A co když nebudou všechna čísla různá? Algoritmizace (Y36ALG), Šumperk - 3. přednáška 6

Hledání a výpis druhého největšího prvku - lépe 1. Zavedeme dvě proměnné max a max2 2. Nastavíme počáteční hodnoty z prvních dvou hodnot posloupnosti (x a y) 3. Pro každé dalšíčíslo ze vstupní posloupnosti rozhodneme, zda je nutné jejich hodnoty změnit (čteme je pomocí cyklu, viz. dále) ad 1:int max, max2; ad 2:if(x>y){max=x; max2=y; else{max=y; max2=x; totéž jinak: max = x>y? x : y; max2 = x>y? y : x; Aktualizuj max i max2 {max2 = max;max = z ad 3:Příchozíčíslo (z) je větší než max menší (nebo roven) než max, ale větší než max2 menší než max2 Nedělej nic Aktualizuj max2 {max2 = z Algoritmizace (Y36ALG), Šumperk - 3. přednáška 7

Základní příkaz cyklu, který má tvar while (podmínka) příkaz Příklad: int x = 1; while(x<10){ System.out.print(x); x++; Příkazy cyklu: while //co bude vypsáno? int x = 1; while(x<10){ System.out.print(x +, ); x+=2; //co bude vypsáno? podmínka true příkaz false Algoritmizace (Y36ALG), Šumperk - 3. přednáška 8

Základní příkaz cyklu, který má tvar while (podmínka) příkaz Příklad: int x = 1; while(x<10){ System.out.print(x); x++; Příkazy cyklu: while //co bude vypsáno? 123456789 int x = 1; while(x<10){ System.out.print(x +, ); x+=2; //co bude vypsáno? 1, 3, 5, 7, 9, podmínka true příkaz false Algoritmizace (Y36ALG), Šumperk - 3. přednáška 9

Příkazy cyklu test na rovnost či nerovnost Příklad: int x = 1; while(x!=10){ //nahrazeno znaménko < System.out.print(x); x++; //co bude vypsáno? int x = 1; while(x!=10){//nahrazeno znaménko < System.out.print(x +, ); x+=2; //co bude vypsáno? 123456789 Používejte test na nerovnost! 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, Algoritmizace (Y36ALG), Šumperk - 3. přednáška 10

Příkaz while Příklad: q = x; p = 0; while (q >= y) { q = q-y; p = p+1; Jsou-li hodnotami proměnných x a y přirozenáčísla, co je hodnotou proměnných p a q po skončení uvedeného cyklu? Algoritmizace (Y36ALG), Šumperk - 3. přednáška 11

Příklad: Faktoriál Výpočet faktoriálu přirozeného čísla n. n! = 1 2... n public class Faktorial { public static void main(string[] args) { System.out.println("zadejte prirozene cislo"); int n = sc.nextint(); if (n<1) { System.out.println(n + " neni prirozene císlo"); System.exit(0); int i = 1, f = 1; while (i<n) { i = I + 1; f = f * i; System.out.println (n + "! = " + f); Algoritmizace (Y36ALG), Šumperk - 3. přednáška 12

Příkaz for Tvar příkazu for: for( inicializace ; podmínka ; změna ) příkaz; Převedení příkazu for na while: inicializace; while (podmínka) { příkaz změna; inicializace podmínka true příkaz false Změnu řídicí proměnné přičtením resp. odečtením 1 lze zkráceně předepsat pomocí operátoru inkrementace resp. dekrementace: x++ x se zvětší o 1 x-- x se zmenší o 1 Příklad: f = 1; for(i=1; i<=n; i++) f=f*i; Algoritmizace (Y36ALG), Šumperk - 3. přednáška 13

Zpracování posloupností Příklad: program pro součet posloupnosti čísel Hrubéřešení: suma = 0; while (nejsou přečtena všechna čísla){ dalsi = přečti celé číslo; suma = suma+dalsi; Jak určit, zda jsou přečtena všechna čísla? Možnosti: 1. Početčísel bude vždy stejný, např. 5. 2. Početčísel bude dán na začátku vstupních dat. 3. Vstupní data budou končit zarážkou, např. nulou. Struktura vstupních dat formálně: 1. a 1 a 2 a 3 a 4 a 5 2. n a 1 a 2... a n 3. a 1 a 2... a 5 0 kde a i 0 Algoritmizace (Y36ALG), Šumperk - 3. přednáška 14

Zpracování posloupnosti I Řešení 1 vstupní data: a 1 a 2 a 3 a 4 a 5 public class Suma1 { public static void main(string[] args) { Scanner sc = new Scanner(System.in); int dalsi, suma, i; System.out.println ("zadejte 5 čísel"); suma = 0; for (i=1; i<=5; i++) { dalsi = sc.nextint(); suma = suma+dalsi; System.out.println ("součet je " + suma); Algoritmizace (Y36ALG), Šumperk - 3. přednáška 15

Zpracování posloupnosti II Řešení 2 vstupní data: n a 1 a 2... a n public class Suma2 { public static void main(string[] args) { int dalsi, suma, i, n; System.out.println("zadejte počet čísel"); n = sc.nextint(); System.out.println("zadejte " + n +" čísel"); suma = 0; for(i=1; i<=n; i++) { dalsi = sc.nextint(); suma = suma+dalsi; System.out.println("součet je " + suma); Algoritmizace (Y36ALG), Šumperk - 3. přednáška 16

Zpracování posloupnosti III Řešení 3 vstupní data: a 1 a 2... a n 0 kde a i 0 public class Suma3 { public static void main(string[] args) { int dalsi, suma; System.out.println("zadejte řadu čísel zakončenou nulou"); suma = 0; dalsi = sc.nextint(); while(dalsi!=0) { suma = suma+dalsi; dalsi = sc.nextint(); System.out.println("součet je " + suma); Algoritmizace (Y36ALG), Šumperk - 3. přednáška 17

Přerušení běhu cyklu: příkaz continue Příkazy while a for testují ukončení cyklu před provedením těla cyklu. Příkaz do testuje ukončení cyklu po provedení těla cyklu. Někdy je třeba ukončit cyklus v nějakém místě uvnitř těla cyklu (které je v tom případě tvořeno složeným příkazem). Příkaz continue předepisuje předčasné ukončení průchodu těla cyklu Příklad: for (int i=1; i<=100; i++) { if (i%10==0) continue; System.out.println(i); Příkaz vypíše čísla od 1 do 100 s výjimkou dělitelných 10: Algoritmizace (Y36ALG), Šumperk - 3. přednáška 18

Přerušení běhu cyklu: příkaz break Příkaz break vnořený do podmíněného příkazu ukončí předčasně příkaz, schematicky: while (...) {... if (ukončit) break;... Příkazbreak předepisuje předčasné ukončení těla cyklu. Příklad: for (int i=1; i<=100; i++) { if (i%10==0) break; System.out.println(i); Příkaz vypíše čísla od 1 do 9. Algoritmizace (Y36ALG), Šumperk - 3. přednáška 19

Příkaz break a continue příklad public class PrikazContinueBreak{ public static void main(string[] args ){ for (int i=1; i<=30; i++) { if (i%10==0) continue; System.out.println("hodnota i = " + i); for (int i=1; i<=30; i++){ if (i%10==0) break; System.out.println("hodnota i = " + i); Algoritmizace (Y36ALG), Šumperk - 3. přednáška 20

Konečnost cyklů Aby algoritmus byl konečný, musí každý cyklus v něm uvedený skončit po konečném počtu kroků. Nekonečný cyklus je častou chybou! Základní pravidlo pro konečnost cyklu: provedením těla cyklu se musí změnit hodnota proměnné vyskytující se v podmínce cyklu. Triviální příklad špatného cyklu: while (i!=0) j = i-1; Tento cyklus se buď neprovede ani jednou, nebo neskončí Uvedené pravidlo konečnost cyklu ještě nezaručuje Konečnost cyklu závisí na hodnotách proměnných před vstupem do cyklu. double x=0; int i = -1; while (i<0) { x = x + Math.sin(i* 0.6); i--; Algoritmizace (Y36ALG), Šumperk - 3. přednáška 21

Konečnost cyklů Příklad: while (i!=n) { P; // příkaz, který nezmění hodnotu proměnné i i++; Otázka: co musí splňovat hodnoty proměnných i a n před vstupem do cyklu, aby cyklus skončil? Odpověď vstupní podmínka konečnosti cyklu: i <= n Vstupní podmínku konečnosti cyklu lze určit ke každému cyklu (někdy je to velmi obtížné). Splnění vstupní podmínky konečnosti cyklu musí zajistit příkazy předcházející příkazu cyklu. Zásada: Zabezpečený program testuje přípustnost vstupních dat. Algoritmizace (Y36ALG), Šumperk - 3. přednáška 22

Metoda shozeného praporku Testování jedné podmínky pro všechny prvky dané posloupnosti. 1. Nastav praporek indikující splnění podmínky na hodnotu true. 2. Postupně procházej posloupnost a pro každý nový člen ověř, že je podmínka stále splněna 3. Pokud není splněna, shoď praporek Příklad: Zjistěte zda daná posloupnost obsahuje pouze sudáčísla Využijeme cyklus do. příkazy podmínka false true Algoritmizace (Y36ALG), Šumperk - 3. přednáška 23

Metoda shozeného praporku - příklad public static void main(string[] args) { Scanner sc = new Scanner(System.in); boolean vsechnasuda = true; // praporek, je zvednutý int cislo; // aktualní clen posloupnosti System.out.println("Budou všechna čísla sudá?"); System.out.println("Zadávej čísla (0 je stop)."); do { cislo = sc.nextint(); if (cislo % 2 == 1) vsechnasuda = false; // pád praporku, liché else vsechnasuda = true; //Chybné nahození praporku while (cislo!= 0); if (vsechnasuda)system.out.println( Všechna sudá ); else System.out.println( Alespoň jedno bylo liché"); Algoritmizace (Y36ALG), Šumperk - 3. přednáška 24

Příkaz switch Příkaz switch (přepínač) umožňuje větvení do více větví na základě různých hodnot výrazu (nejčastěji typu int nebo char). Základní tvar příkazu: switch (výraz) { case konstanta 1 : příkazy 1 ; break; case konstanta 2 : příkazy 2 ; break;... case konstanta n : příkazy n ; break; default : příkazy def ; kde konstanty jsou téhož typu, jako výraz příkazy jsou posloupnosti příkazů výraz konstanta1 konstanta n příkazy1 příkazy n Sémantika (zjednodušeně): vypočte se hodnota výrazu a pak se provedou všechny příkazy, počínaje těmi, které jsou označeny konstantou označující stejnou hodnotu až po break. není-li žádná větev označena hodnotou výrazu, provedou se příkazy def Algoritmizace (Y36ALG), Šumperk - 3. přednáška 25

Příklad den v roce Program pro výpočet pořadového čísla dne v roce public class Den { public static void main(string[] args) { System.out.println( Zadejte den, měsíc a rok"); int den = sc.nextint(); int mesic = sc.nextint(); int rok = sc.nextint(); int n = 0; switch (mesic) { case 1: n = den; break; case 2: n = 31+den; break; case 3: n = 59+den; break; case 4: n = 90+den; break; case 5: n = 120+den; break; case 6: n = 151+den; break;... case 12: n = 334+den; break; if(mesic>2 && rok%4==0 && (rok%100!=0 rok%1000==0)) n = n+1; System.out.print(den+"."+mesic+"."+rok+" je "+n+". den v roce"); Algoritmizace (Y36ALG), Šumperk - 3. přednáška 26