C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -1C2110 Operační systém UNIX a základy programování Petr Kulhánek kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Přírodovědecká fakulta Masarykova univerzita, Kamenice 5, CZ-62500 Brno PS/2021 Prezenční forma výuky: Rev3 7. lekce / modul 2 C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -2- Cykly stav ? ano ne blok 1 změna inicializace Cyklické vykonávání bloku počítadlo (proměnná) C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -3Cyklus pomocí while/until ... stav ? ano ne blok 1 změna inicializace stav ? ano ne blok 1 změna inicializace vyhodnocení podmínky na konci cyklu vyhodnocení podmínky na začátku cyklu C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -4Cyklus pomocí while/until ... stav ? ano ne blok 1 změna inicializace stav ? ano ne blok 1 změna inicializace vyhodnocení podmínky na konci cyklu vyhodnocení podmínky na začátku cyklu Tento algoritmus nemá přímou podporu v řídích strukturách jazyka bash, jeho přepis je možný, ale za cenu horší čitelnosti výsledného kódu. komplikovaná implementace v bash C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -5Cyklus pomocí while/until ... stav ? ano ne blok 1 změna inicializace stav ? ano ne blok 1 změna inicializace vyhodnocení podmínky na konci cyklu vyhodnocení podmínky na začátku cyklu Tento algoritmus nemá přímou podporu v řídích strukturách jazyka bash, jeho přepis je možný, ale za cenu horší čitelnosti výsledného kódu. snadná transformace snadná implementace v bash C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -6Cyklus pomocí while/until while prikaz1 do prikaz2 ... done while prikaz1; do prikaz2 ... done Kompaktní zápis: cyklus probíhá zatímco prikaz1 vrací v návratové hodnotě 0 (bez chyby) Cyklus (smyčka) je řídicí struktura, která opakovaně provádí posloupnost příkazů. Opakování i ukončení cyklu je řízeno podmínkou. until prikaz1; do prikaz2 ... done cyklus probíhá dokud prikaz1 nevrátí v návratové hodnotě 0 C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -7Praktický příklad - cyklus I < N ano ne I = I + 1 N=10 I=0 writestr "X" počítadlo (proměnná) N=10 I=0 while [[ I –lt N ]]; do echo "X" ((I = I + 1)) done C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -8Praktický příklad - cyklus I < N ano ne I = I + 1 N=10 I=0 writestr "X" počítadlo (proměnná) N=10 I=0 while test "$I" –lt "$N"; do echo "X" ((I = I + 1)) done N=10 I=0 while [[ "$I" –lt "$N" ]]; do echo "X" ((I = I + 1)) done N=10 I=0 while [[ I –lt N ]]; do echo "X" ((I = I + 1)) done nutno použít $ volitelné $, pokud je použit blok [[ ]] nebo (( )) C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -9Cvičení I 1. Napište skript v jazyce bash, který do terminálu vypíše N znaků "X ". Počet znaků uživatel zadá jako první argument skriptu. Skript vypíše chybové hlášení v případě, že zadaný počet znaků nebude větší než dva. C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -10Složitější konstrukce - vnořování Jazyk bash nemá návěstí a příkaz goto, či jeho obdobu. Komplexnějších konstrukcí lze tedy dosáhnout jen zanořováním cyklů a podmínek vzájemně do sebe. Úroveň zanoření není omezena. podminka cyklus Při návrhu algoritmu/skriptu se však snažíme o zamezení zbytečného vnořovaní (převážně z důvodu snadnější orientace ve skriptu). ! podminka cyklus exit Vhodnější uspořádání např. pro testovaní vstupních dat od uživatelů. cyklus podminka cyklus I cyklus II C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -11Vnořování cyklů - příklad počítadlo vnějšího cyklu může ovlivňovat chování vnitřního cyklu N=10 I=0 while [[ I –lt N ]]; do J=0 while [[ J –lt I ]]; do echo –n "X" ((J = J + 1)) done echo "" ((I = I + 1)) done U zanořených konstrukcí dbáme na odsazovaní textových bloků, které zvyšuje přehlednost a čitelnost kódu. V textových editorech je integrována podpora, která odsazovaní usnadňuje, např. v editoru gedit, lze odsazení označeného textového bloku dosáhnout klávesou TAB či Shift+TAB. C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -12Cvičení II 1. Napište skripty v jazyce bash pro následující úlohy. Rozměr vykreslovaného obrazce nechť uživatel zadá interaktivně po spuštění skriptu. Při práci se opírejte o vytvořený algoritmus z domácí úlohy. C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -13Úkol 1 Do terminálu vytiskněte čtverec se znaků X. Délku strany čtverce zadá uživatel. X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X To, že se nejedná vzhledově o čtverec, ignorujte. Počet znaků X na řádku a počet řádků však musí být stejný. C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -14Úkol 2 Do terminálu vytiskněte pravoúhlý trojúhelník se znaků X, tak aby jedna odvěsna byla umístěna nahoře a druhá na levé straně. Délku odvěsny zadá uživatel. X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X C2110 Operační systém UNIX a základy programování 7. lekce / modul 2 -15Úkol 3 Do terminálu vytiskněte pravoúhlý trojúhelník se znaků X, tak aby jedna odvěsna byla umístěna dole a druhá na levé straně. Délku odvěsny zadá uživatel. X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X