Cyklus while alebo "kým to nebude hotové, ostaneš tu".

Pri programovaní sa človek často dostáva do situácie, že potrebuje, aby sa nejaký kus programu opakoval. Vo väčšine počítačových hier sa dookola opakuje postupnosť "zisti si, čo hráč urobil (napr. či stlačil klávesu alebo pohol myšou), vyhodnoť to a prekresli obrazovku". Program, ktorý tlačí výplatné pásky musí tú istú činnosť zopakovať pre každého zamestnanca. Program na prehrávanie hudby musí opakovať činnosť "prečítaj trochu údajov zo súboru alebo z disku, niečo s tým urob a pošli to do reproduktorov" až kým nezahrá celú skladbu.

Na programovanie takýchto vecí slúžia cykly. Céčko pozná viacero spôsobov, ako cyklus napísať. Jedným z nich je príkaz while. Ľudia v angličtine zbehlí vedia, že to znamená "kým". Kus kódu uzavretý v cykle sa teda bude opakovať, kým je splnená podmienka cyklu. Dajú sa tak robiť roztodivné veci -- pozrite si nasledujúci príklad. (Znovu -- omáčičku ako include si napíšte sami.)

    int i = 1, dokolko;
    
    printf("Ja som mudry pocitac a viem pocitat.\n");
    printf("Do kolko mam napocitat? ");
    scanf("%d", &dokolko);
    
    while (i <= dokolko)
    {
        printf("%d\n", i);
        i++;
    }
V premennej i je na začiatku 1. Vo vnútri cyklu sa vždy vypíše, čo je v i-čku a zväčší sa to o 1. To sa opakuje, kým (while) je hodnota v i-čku menšia alebo rovná hodnote v premennej dokolko. Keď táto podmienka prestane byť splnená, cyklus sa skončí.

Podobne ako pri príkaze if musí byť podmienka v zátvorke a nepíše sa za ňou bodkočiarka. Kučeravé zátvorky označujú kus kódu, ktorý sa má opakovať a ak sa má opakovať len jeden príkaz, tak tam byť nemusia.0.11

Úloha č.1 Napíšte to a skompilujte. Čo so spraví, keď tomu poviete aby rátal, do 20? Skončí pri 20 alebo pri 19? Čo to spraví, keď tomu poviete, aby rátal do -7?

Ako môžete vidieť z výsledkov úlohy č.1 (teda konkrétne z tej mínus sedmičky), podmienka cyklu while sa vyhodnotí ešte pred tým, než program vôbec do cyklu vstúpi. Ak nie je splnená hneď na začiatku, telo cyklu sa nevykoná vôbec. To sa nám ale nie vždy hodí. Niekedy by sme boli radi, aby sa podmienka neoverovala na začiatku, ale až na konci cyklu. Skrátka aby cyklus aspoň raz prebehol a až na konci sa zisťovalo, či sa to má znovu opakovať.

Aby sme také niečo vedeli urobiť, musíme v programe nejakým kľúčovým slovom vyznačiť, kde ten cyklus začína. Slovom while to nepôjde -- to sa bude vyskytovať až na konci cyklu pri podmienke. Na začiatku takéhoto cyklu bude stáť slovíčko do (po anglicky "rob"). Ako to funguje, si môžete pozrieť na nasledujúcom príklade:

    char pis;

    printf("Napis A!\n");
    do
    {
        pis = getchar();
        if (pis != 'A')
            printf("Hovoril som A!!! Takze znovu: Napis A!\n");
    } while (pis != 'A');
    
    printf("Hura, naozaj je to A!\n");
Tento program načíta do premennej pis znak z klávesnice. Ak to nie je A, vypíše varovanie a túto činnosť bude opakovať dovtedy, kým v tej premennej pis bude niečo iné než A.

Oproti predošlej variante while je tu ešte jeden rozdiel -- keďže celý cyklus podmienkou za while končí, píše sa za ňou bodkočiarka!!!

Takže úlohy:

Úloha č.2 Napíšte program, ktorý napíše za trest stokrát Nebudem zhadzovat operacny system.

Úloha č.3 Napíšte program, ktorý do premennej poc načíta celé číslo z klávesnice a vypočíta súčet 1 + 2 + 3 + ... + poc. (Spraví sa to jednoduchou úpravou prvej úlohy -- pridajte tam ďalšiu premennú a ukladajte do nej medzisúčet.)

Úloha č.4 Napíšte program, ktorý vypíše do tabuľky asciikódy všetkých veľkých písmen. (Funkcia printf sa v ňom môže nachádzať maximálne dvakrát.)

Úloha č.5 (nepovinná pre guruov) Upravte druhý vzorový program tak, aby si to A pýtal maximálne trikrát a ak sa človek trikrát netrafí, tak vypíše nejaký komentár psychikého stavu jedinca za klávesnicou a skončí.

Anino Belan 2003-10-26