ARCHIV |
|||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
Perl (9) - CyklyDalší hojně užívanou řídící strukturou, bez které se neobejde žádný větší program, je cyklus. Cyklus umožňuje vykonávat určitou část programu opakovaně. Funguje v podstatě podobně jako podmínka. Na základě vyhodnocení testu se provede blok kódu. Rozdíl mezi podmínkou a cyklem je v tom, že u cyklu se vyhodnocuje test opakovaně. Dokud není test vyhodnocen jako false (nebo v některých speciálních cyklech true), stále se znovu a znovu opakuje blok kódu. Existuje hned několik druhů cyklů. Cyklus while - předem neznámý počet iteracíDokud platí test, provádí se blok kódu.
Cyklus by měl mít možnost být ukončen - tj. vepsat nějaký kód, který ho bude přibližovat ke konci, až nakonec také skončí. Pro naše účely to lze vyřešit například takto:
10× je proveden kód uvnitř cyklu. Je to stejné, jako kdybychom za sebe nakopírovali 10× blok.
Ano, je to dost netypická situace pro použití while. V praxi bychom v této situaci bez váhání sáhli po cyklu for. Avšak tento zápis se dá velmi snadno pochopit. Teď už ale přijde na řadu skutečné while. Další příklad totiž do nekonečna vypisuje to, co napíšete. V praxi má taková forma cyklu velmi časté využití.
Po spuštění kódu získáváme výstup:
Zkusme kód poupravit tak, aby se při zadání q nebo exit ukončil. Dosáhneme toho přidáním podmínky (funkce die často nebude stačit. Příští díl osvětlí lepší řešení).
Cyklus for - předem známý počet iteracíCyklus for se od while liší tím, že je předem znám počet iterací (jde sice změnit v bloku, ale potom je často lepší užít while). for a while jsou vzájemně zaměnitelné (for lze napsat jako while a naopak). Ale většinou je jeden konkrétní vhodnější a ten druhý méně. Cyklu for se budeme podrobněji věnovat později, neboť je dobré mít zvládnutou práci se seznamy. Podívejme se nyní pouze na základní užití. V každé iteraci přiřadíme do proměnné číslo postupně od 1 do 10.
Céčkovské forVe zbytku dílu se podívejme na několik zajímavých konstrukcí, které však pravděpodobně nikdy nepoužijeme. Proto klidně zbytek článku bez obav přeskočte. Taktéž existuje cyklus s klasickou céčkovskou notací. Pro zajímavost ho zde zmíníme, ale kvůli přehlednosti bychom na něj měli hned zase zapomenout a nikdy ho nepoužívat. Syntaxe je následující:
Počáteční_hodnota_počítadla spouští počítadlo. Konečná_hodnota_počítadla je vlastně testem. Dokud platí, je cyklus opakován (tj. proveden blok kódu). A krokem je výraz, který změní hodnotu počítadla.
Výstup je stejný jako u prvního příkladu u while. Nejprve se přiřadí do proměnné $i hodnota 1. Je-li test true, provede se blok, proměnná se inkrementuje (krok) a pokud opět platí test, opakuje se vše znovu. Ve chvíli, kdy test neplatí, je blok přeskočen a program pokračuje za ním. Složitost výrazů v hlavičce for není omezena jen na takto jednoduché záležitosti. Můžeme třeba přidat další počítadlo. Operátor , (čárka) odděluje se dva výrazy, přičemž první se vyhodnotí a následně zapomene. Druhý výraz se také vyhodnotí a je výsledkem celkového vyhodnocení obou výrazů.
Výstup:
Je vidět, že počítadlem řídící cyklus je až druhá část výrazu - za čárkou (s proměnnou $j). Výraz s $i je sice každou iteraci zapomenut, ale hodnota je vždy změněna. počáteční_hodnotu_počítadla, konečnou_hodnotu_počítadla ani krok není povinné uvést. Vynecháme-li počáteční_hodnotu_počítadla, zůstane v $i hodnota, která tam dosud byla. Pokud je nedefinovaná, v první iteraci bude stále proměnná $i nedefinovaná, ale v dalších už nemusí. Je-li totiž v kroku výraz $i++, v druhé iteraci bude hodnota $i = undef + 1 = 1. Vynecháním konečné_hodnoty_počítadla se cyklus stává nekonečným. Nemá se co vyhodnocovat, a proto je za všech okolností true. Neuvedení kroku má za následek, že se počítadlo (aspoň v hlavičce cyklu) nebude iterovat. Tímto způsobem lze vynechat třeba i všechny tři výrazy. Zápis for (;;){...} je ekvivalentní while (1){...}. Odtud plyne, že počáteční_hodnota_počítadla není nic jiného, než výraz, který se vyhodnotí před započetím cyklu, konečná_hodnota_počítadla je testem a krok výrazem, který se vyhodnocuje na konci každé iterace. Céčkový cyklus for podle posledního tvrzení můžeme jednoduše přepsat do while (není to úplně přesné, krok by správně měl být až v bloku continue, který představíme příště. Toto řešení neplatí pro případy, kdy je konec bloku vynechán):
Alternativní cyklus untilStejně jako jsou ve vztahu if a unless je ve vztahu i while a until. Cyklus je prováděn, dokud je test false. A i zde platí, že bychom takovou konstrukci neměli nadále používat. Cyklus za příkazemCykly while a for se dají v Perlu napsat i za příkaz. Opět to výrazně snižuje čitelnost programu. Ukažme si alespoň pro představu zdrojový kód:
Cyklus za blokemCykly do...while, do...until jsou dalšími variacemi cyklů. Jejich používání znovu nelze v žádném případě doporučit. Nejprve se provede blok příkazů a až poté se vyhodnotí test (výsledný efekt je stejný, jako kdybyste blok v cyklu zkopírovali před klasický while). Je-li true (while) resp. false (until), vykonává se blok znovu.
Za testem musí být stejně jako u konstrukcí do...if a do...unless středník. I cyklus for lze napsat za příkaz nebo blok. O tom se zmíníme až budu rozebírat další cyklus foreach. PříkladNapišme program, který bude ze vstupu přijímat kladná čísla. Zadáním nekladného čísla skončí zadávání (toto číslo se již nepočítá) a program vytiskne počet zadaných čísel, jejich součet a průměr. Měli bychom získat přibližně takový výstup:
Kostra programu bude vypadat velmi podobně jako dnes již zmíněná ukázka kódu k while. Lišit se bude tím, že v každé iteraci se bude aktualizovat součet a počet zadaných čísel a před ukončením se ještě vytisknou výsledky.
V mezivýpočtu stačí navyšovat součet a počet.
Na závěr je třeba dokončit výpis výsledků. Spočítáme průměr, vypíšeme výsledky a ukončíme.
Když dopíšeme program, je vždy nutné otestovat jeho reakce v závislosti na podmínkách. Všechny případy musí být ošetřeny. To my nemáme, protože program hlásí chybu, pokud neuvedeme žádný parametr. Tedy na začátek bloku v podmínce připišme:
A tím je úloha splněna. Zdrojový kód příkladu.
Související články
Předchozí Celou kategorii (seriál) Další
Perl (1) - Dávka teorie na úvod
Perl (2) - Úvod do syntaxe Perl (3) - Proměnné Perl (4) - Čísla a řetězce Perl (5) - Podmínky Perl (6) - Pravdivostní výrazy Perl (7) - Vstup poprvé Perl (8) - Některé základní vestavěné funkce Perl (10) - Další řídící struktury Perl (11) - Pole - úvod Perl (12) - Pole - základní operace Perl (13) - Hashe Perl (14) - Další nástroje pro seznamy Perl (15) - Výchozí proměnná, heredoc, symbolické odkazy Perl (16) - Regulární výrazy - začínáme Perl (17) - Regulární výrazy - kotvy Perl (18) - Regulární výrazy - množiny znaků Perl (19) - Regulární výrazy - opakování a kvantifikátory Perl (20) - Regulární výrazy - magické závorky Perl (21) - Regulární výrazy - nahrazování Perl (22) - Regulární výrazy - přepínače Perl (23) - Regulární výrazy - rozšířené vzory Perl (24) - Regulární výrazy - příklady Perl (25) - Regulární výrazy - závěr Perl (26) - Podprogramy Perl (27) - Prototypy Perl (28) - Rozsahy platnosti proměnných Perl (29) - Úvod k práci se soubory Perl (30) - Práce se soubory Perl (31) - Testování souborů Perl (32) - Jiné typy souborů Perl (33) - Formátování výstupu - printf Perl (34) - Formátování výstupu - formáty Perl (35) - Vestavěný debugger Perl (36) - Grafické debuggery Perl (37) - Začínáme s moduly Perl (38) - Rozhraní modulu Perl (39) - Pragma Perl (40) - Dodatky k modulům Perl (41) - CPAN Perl (42) - Argumenty příkazového řádku Perl (43) - Přepínače Perl (44) - Dlouhé přepínače Perl (45) - Odkazy Perl (46) - Užití odkazů a anonymní data Perl (47) - Složitější datové struktury Perl (48) - Libovolně složité datové struktury Perl (49) - Tabulky symbolů a typegloby Perl (50) - Uzávěry a iterátory Perl (51) - Signály Perl (52) - Externí příkazy Perl (53) - Režim nakažení Perl (54) - Fork Perl (55) - Eval Perl (56) - Volby příkazu perl Perl (57) - Jednořádkové skripty Perl (58) - OOP - úvod Perl (59) - OOP - typické použití Perl (60) - OOP - dědičnost Perl (61) - OOP - přínos a užití dědičnosti Perl (62) - OOP - přetěžování Perl (63) - OOP - závěr Perl (64) - Projekt - čtečka sportovních výsledků Perl (65) - Projekt - získání dat Perl (66) - Projekt - výběr zápasů a podrobnosti Perl (67) - Projekt - dokončujeme modul Perl (68) - Projekt - zobrazení zápasů Perl (69) - Projekt - online přenos Perl (70) - Plain Old Documentation Perl (71) - Navazování proměnných Perl (72) - Navazování složitějších datových typů Perl (73) - DBM Perl (74) - Sockety Perl (75) - Obsluha více klientů Perl (76) - Síťová hra v kostky Perl (77) - Služby internetu Perl (78) - Databáze - úvod Perl (79) - Databáze - manipulace s daty Perl (80) - Databáze - závěrečné poznámky Perl (81) - CGI - příprava webového serveru Perl (82) - CGI - první skripty Perl (83) - CGI - získávání dat od uživatele Perl (84) - CGI - usnadnění tvorby skriptů pomocí modulu CGI Perl (85) - CGI - generování dokumentu modulem CGI Perl (86) - CGI - cookies Perl (87) - CGI - příklad aplikace Perl (88) - CGI - závěr Perl (89) - Mason - snadné psaní webů Perl (90) - Mason - speciální bloky Perl (91) - Mason - handlery Perl (92) - Mason - závěr Perl (93) - Catalyst - MVC framework pro Perl Perl (94) - Catalyst - základy pro psaní aplikace Perl (95) - Catalyst - šablony Perl (96) - Catalyst - spolupráce s databází Perl (97) - Curses - tvorba textových uživatelských rozhraní Perl (98) - Curses - pozicování a okna Perl (99) - Curses - měření rychlosti psaní Perl (100) - Curses - použití hotových widgetů Perl (101) - Curses - jednoduchý textový editor Perl (102) - Rozšiřování Perlu pomocí XS Perl (103) - Rozšiřování Perlu pomocí SWIG Perl (104) - Testování rychlosti Perl (105) - Testování programových jednotek Perl (106) - Debugování pomocí komentářů Perl (107) - Moose - moderní objektový systém Perl (108) - Moose - základní vlastnosti Perl (109) - Moose - role Perl (110) - Moose - meta API Perl (111) - Pokročilá práce se seznamy Perl (112) - Práce s PDF Perl (113) - Práce s archivy Perl (114) - Tk - úvod Perl (115) - Tk - umísťování widgetů Perl (116) - Tk - základní widgety Perl (117) - Tk - některé pokročilejší widgety Perl (118) - Tk - čas a události Perl (119) - Tk - CD man Perl (120) - Wx - základní práce s widgety Perl (121) - Wx - události Perl (122) - Gtk2 - úvod Perl (123) - Gtk2 - základní práce s obrázky Perl (124) - Gtk2 - události a čas Perl (125) - Gtk2 - vlastní widgety Perl (126) - Gtk2 - textové okno a práce s pozicemi Perl (127) - Gtk2 - hierarchické seznamy Perl (128) - Gtk2 - dialogy Perl (129) - Gtk2 - skládání widgetů Perl (130) - Gtk2 - menu a toolbary Perl (131) - Gtk2 - transparentní okna, tray ikona, výběr souborů Perl (132) - Gtk2 - drag&drop, druid Perl (133) - Gtk2 - úpravy vzhledu aplikací pomocí rc Perl (134) - Gtk2 - Glade Interface Designer Perl (135) - XML - čtení a zápis Perl (136) - XML - DOM a SAX přístupy Perl (137) - Vlákna Perl (138) - Memoizace - cachování podprogramů Perl (139) - Profilling - efektivní odhalování pomalých míst v programu Perl (140) - Profilling - píšeme si vlastní profiler / debugger Perl (141) - Formátování kódu, deparsování, perltidy Perl (142) - Způsoby konfigurování Perl (143) - Struktura datových typů, správa paměti Perl (144) - POE - událostmi řízené programování Perl (145) - POE - aplikace typu klient-server Perl (146) - Perl 6 - jazyk budoucnosti Perl (147) - Perl 6 - regulární výrazy, nové operátory Perl (148) - Perl Culture Perl (149) - Závěr Pozvánka na Český Perl Workshop Perl 5.22.0 a vše okolo Perl 5.24.0 a vše okolo Předchozí Celou kategorii (seriál) Další
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | |||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |