C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -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 8. lekce / modul 1 C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -2- Cyklus C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -3Cyklus pomocí for for((inicializace;podminka;zmena)) do prikaz1 ... done for((inicializace;podminka;zmena)); do prikaz1 ... done Kompaktní zápis: Cyklus (smyčka) je řídicí struktura, která opakovaně provádí posloupnost příkazů. Opakování i ukončení cyklu je řízeno podmínkou. provede se před spuštěním cyklu (inicializace počítadla) pokud je podmínka splněna, vykonají se příkazy prikaz1 a další aktualizace počítadla po vykonání příkazů C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -4Cyklus pomocí for a vývojový diagram I < N ano ne I = I + 1 N=10 I=0 writevar I N=10 for((I = 0; I < N; I = I + 1)); do echo $I done počítadlo (proměnná) C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -5Cyklus pomocí for versus while for((I=1;I <= 10;I++)); do echo $I done I=1 while [[ I –le 10 ]]; do echo $I (( I = I + 1 )) done provede se před spuštěním cyklu (inicializace počítadla) pokud je podmínka splněna, vykonají se příkazy v bloku do/done aktualizace počítadla po vykonání příkazů Změnu počítadla je možné provádět kdekoliv v těle cyklu (i na více místech). Kromě změny počítadla na konci cyklu, je možné provádět i další změny v těle cyklu. Toto se však NEDOPORUČUJE, protože to snižuje čitelnost kódu. C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -6Cyklus pomocí for, použití for((I=1;I <= 10;I++)); do echo $I done for((I=10;I >= 1;I--)); do echo $I done Vypíše čísla 10 až 1Vypíše čísla 1 až 10 Podmínka: Lze použít následující porovnávací operátory: != nerovná se == rovná se < menší <= menší nebo rovno > větší >= větší nebo rovno Inicializace se řídí volnými pravidly, jelikož je výraz uveden v (( )) bloku. Proměnná I má roli počítadla. Změna: Lze použít libovolný výraz, který je možné interpretovat v (( )) bloku, např. ++ hodnotu proměnné zvýší o jedničku -- hodnotu proměnné sníží o jedničku další ... Lze použít pouze na celá čísla v (( )). C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -7Cyklus pomocí for, změna počítadla Pokud lze proměnnou interpretovat jako celé číslo, lze použít následující aritmetické operátory: ++ hodnotu proměnné zvýší o jedničku A++ -- hodnotu proměnné sníží o jedničku A-- + sečte dvě hodnoty A = 5 + 6 A = A + 1 - odečte dvě hodnoty A = 5 - 6 A = A – 1 * vynásobí dvě hodnoty A = 5 * 6 A = A * 1 / vydělí dvě hodnoty (celočíselné dělení) A = 5 / 6 A = A / 1 += k proměnné přičte hodnotu A += 3 A += B -= od proměnné odečte hodnotu A -= 3 A -= B *= proměnnou vynásobí hodnotou A *= 3 A *= B /= proměnnou podělí hodnotou A /= 3 A /= B A=A+3 C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -8Vnořování cyklů Řídící skupiny cyklů lze do sebe libovolně vnořovat. for((I=1;I <= 10;I++)); do for((J=1;J <= 10;J++)); do echo "$I $J" done done vnější cyklus vnitřní cyklus for((I=1;I <= 10;I++)); do for((J=1;J <= I;J++)); do echo "$I $J" done done počítadlo vnějšího cyklu může ovlivňovat chování vnitřního cyklu Počet vnoření není omezen. Lze kombinovat s jinými cykly (while, until, for in) nebo podmínkami. C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -9Cvičení 1 1. Napište skripty v jazyce bash řešící Úkol 1, 2 a 3. Místo cyklu pomocí while použijte cyklus pomocí for. Rozměr vykreslovaného obrazce nechť uživatel zadá jako první argument skriptu. Skript otestuje, zda-li je zadán správný počet argumentů a zda-li je první argument celé číslo větší než nula. 2. Upravte řešení Úkolu 1 tak, aby se vykresloval obdélník. Rozměry obdélníku bude uživatel zadávat interaktivně po spuštění skriptu. 3. Napište skripty v jazyce bash řešící Úkol 4 a 5. C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -10Ú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ý. Popř. použijte "X " - X a mezera. C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -11Ú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í 8. lekce / modul 1 -12Ú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 C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -13Úkol 4 Do terminálu vytiskněte obrys čtverce 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 Vhodným řešením je využít kostru z Úkolu 1 a vypisování znaků kontrolovat pomocí vhodně zvolené podmínky. C2110 Operační systém UNIX a základy programování 8. lekce / modul 1 -14Úkol 5 Do terminálu vytiskněte obrys čtverce a jeho uhlopříčky 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 Vhodným řešením je využít kostru z Úkolu 1 a vypisování znaků kontrolovat pomocí vhodně zvolené podmínky.