Linux E X P R E S

Facebook

Naučte se Ruby 6 - Řízení běhu programu, podmínky a cykly

ruby.jpg

Dnes to bude náročné, budeme vytvářet programy, které se budou sami rozhodovat. Naštěstí pro nás, toto rozmýšlení nebude tak složité jako v běžném životě. Také se podíváme na cykly, které nám umožní opakovat určité částí programu, aniž bychom je museli psát znovu. Takže pusťme se do toho.


Podmínky

Stejně jako se musíme rozhodovat my, koná tato rozhodnutí během svého běhu i většina počítačových programů. Rozhodnutí jsou činěna na základě vyhodnocení určitého výrazu a stanovení zda je či není pravdivý, tedy zda je pravda (true) nebo není pravda (false).

puts 1 > 2
puts 2 > 1

puts ''

puts 5 >= 5
puts 5 <= 4

puts ''

puts 1 == 1
puts 2 != 1

odpovědí programu je

false
true

true
false

true
true

Tedy platí, že 1 není větší než 2, 2 je větší než 1, 5 je větší nebo rovno než 5 a 5 není menší nebo rovno než 4. Poslední dvě podmínky značí, porovnání, resp. nerovnost dvou čísel. Tedy je pravda, že se číslo 1 rovná číslu 1 a také platí, že číslo 2 se nerovná číslu 1.

Porovnání == resp. != se v programování používají velmi často. Běžně je potřeba zjistit, zda se nějaká proměnná rovná či nerovná námi hledané či sledované hodnotě.

Zatímco zápis a = b znamená do a přiřaď b, výsledkem zápisu a == b je hodnota true nebo false.

Také můžete porovnávat dva textové řetězce

puts 'kocka' < 'pes'
puts 'kocka' > 'pes'
puts 'KOCKA' > 'pes'

zobrazí

true
false
false

V případě textových řetězců se porovnává jejich umístění v abecedě.

Platí, že písmena velké abecedy se nachází před písmeny malé abecedy a tak např. Zebra se nachází před autem. Pokud nevíte, zda budou slova začínat malými či velkými písmeny, můžete použít pro sjednocení velikosti metody downcase, upcase a capitalize.

Vyhodnocení podmínky

Nyní, když jsme schopni určit co je a není pravda, můžeme na základě těchto znalostí činit závěry. K tomu slouží konstrukce if podmínka … end (jestliže podmínka pak udělej … konec).

puts 'Ahoj, jak se jmenuješ?'
jmeno = gets.chomp
puts 'Ahoj ' + jmeno + '!'
if jmeno == 'Martin'
   puts 'To je ale pěkné jméno!'
end

zobrazí

Ahoj, jak se jmenuješ?
Martin
Ahoj Martin!
To je ale pěkné jméno!

V případě, že zadáte jiné jméno, pak bude výstupem např. následující:

Ahoj, jak se jmenuješ?
Adam
Ahoj Adam!

Jistě bychom dříve či později chtěli provést také odpovídající činnost v situaci kdy nebude počáteční podmínka splněna. K tomu slouží klíčové slovo else (jinak).

puts 'Ahoj, jak se jmenuješ?'
jmeno = gets.chomp
puts 'Ahoj ' + jmeno + '!'
if jmeno == 'Martin'
   puts 'To je ale pěkné jméno!'
else
   puts 'Nechceš se nechat přejmenovat?'
end

zobrazí v případě nesplnění podmínky

Ahoj, jak se jmenuješ?
Adam
Ahoj Adam!
Nechceš se nechat přejmenovat?

Podmínky lze do sebe také vnořovat. Tyto programy jsou na první pohled trochu složitější ale díky správnému strukturování kódu se čtou celkem snadno.

puts 'Ahoj, jak se jmenuješ?'
jmeno = gets.chomp
if jmeno == jmeno.capitalize
    puts 'Ahoj ' + jmeno + '!'
else
   puts 'Myslel jsi ' + jmeno.capitalize + ', že?'
   puts 'Umíš vůbec správně napsat své jméno?'

   odpoved = gets.chomp
   if odpoved.downcase == 'ano'
        puts 'Aspoň, že tak..'
   else
        puts 'Přestaň si ze mě dělat srandu!'
   end
end

zobrazí např.

Ahoj, jak se jmenuješ?
adam
Myslel jsi Adam, ze?
Umíš vůbec správně napsat své jméno?
ano
Aspoň, že tak..

Kód svého programu byste měli psát s ohledem na provádění pozdějších změn. Neměl by působit dojmem šifry, ale měl by být příjemným čtením po nedělním obědu či před spaním.

Cykly

Cykly představují opakující se smyčku, která skončí až v okamžiku, kdy to dovolíme.

prikaz = 'Zadejte příkaz'

while prikaz != 'konec'
    puts prikaz
    prikaz = gets.chomp
end

puts 'Na shledanou'

zobrazí

Zadejte příkaz
help
help
?
?
konec
Na shledanou

Tento cyklus je tedy uvozen klíčovým slovem while na jedné straně a end na straně druhé. Česky řečeno: dokud platí podmínka dělej … konec. Cyklus tedy končí v okamžiku kdy je podmínka nesplněna.

Pozor na nekonečné cykly (cykly, které nikdy neskončí)! Někdy se nám tyto cykly mohou hodit, jindy značně ztěžují hledání chyb. Nekonečný cyklus ukončíte stiskem kláves [Ctrl+c].

Trocha logiky

Pojďme nyní zkombinovat to, co jsme se dozvěděli v předchozí části, a podívejme se na následující příklad

puts 'Jak se jmenujete?'

jmeno = gets.chomp

puts 'Ahoj ' + jmeno + '.'

if jmeno == 'Martin'
   puts 'To je opravdu pěkné jméno.'
else
   if jmeno == 'Adam'
      puts 'To je opravdu pěkné jméno.'
   end
end

Tento zápis je jistě v pořádku, ale jak je vidět, není příliš praktický ani úsporný. Celé si to můžeme zkrátit pomocí podmínky or (česky nebo).

puts 'Jak se jmenujete?'

jmeno = gets.chomp

puts 'Ahoj ' + jmeno + '.'

if (jmeno == 'Martin' or jmeno == 'Adam')
      puts 'To je opravdu pěkné jméno.'
end

Platí následující poučka: Co nemá programátor v hlavě, to musí mít v prstech. Tuto větu lze i zobecnit …

Mezi další logické operátory patří and (a) a not (negace výroku). Jak tyto operátory fungují, můžete vidět v dalším příkladě.

jaJsemMartin = true
jsemZelenej = false
jimMaso = true
mamRadBehani = false

puts (jaJsemMartin and jimMaso)
puts (jaJsemMartin and jsemZelenej)
puts (jsemZelenej and jimMaso)
puts (jsemZelenej and mamRadBehani)
puts
puts (jaJsemMartin or jimMaso)
puts (jaJsemMartin or jsemZelenej)
puts (jsemZelenej or jimMaso)
puts (jsemZelenej or mamRadBehani)
puts
puts (not jaJsemMartin)
puts (not jsemZelenej)

zobrazí

true
false
false
false

true
true
true
false

false
true

Příklady 6

  • Napište program, který bude počítat ovečky až do 200 …
  • Napište program, který po zadání počátečního a koncového roku napíše všechny přestupné roky, které byly mezi těmito roky. (Pro jednoduchost předpokládejme, že je přestupný rok beze zbytku dělitelný číslem 4.)
  • Napište variantu programu yes. Tento program se standardně chová tak, že na každý řádek napíše písmeno y a vypisuje ho tak dlouho, dokud uživatel nestiskne kombinaci kláves [Ctrl+c]. (Použijte nekonečnou smyčku.)
  • Napište program, který se vás bude ptát na jméno a po jeho napsání vás pozdraví. Program skončí zadáním slova konec.
  • A co bude příště? Příště se podíváme na pole. Ne, nemusíte si chystat pracovní oděv, řeč bude o poli prvků, ať už jsou jeho prvky jakékoliv.

    Diskuze (0) Nahoru