Anglická verze
logolink

< Zpět na seznam lekcí

Cyklus while

AlgortimyObsah lekce:

  • Co je to cyklus
  • Syntaxe cyklu WHILE v jazyce C
  • Jednoduchý cyklus
  • Opakování programu dle přání uživatele
  • Zpracování libovolného počtu čísel

Co je to cyklus

V reálném životě se často setkáváme s cykly - opakujícími se činnostmi nebo pochody - například:

  • Například chůze po schodech je cyklus. Ten by se dal vyjádřit jako cyklus, kde se opakuje zdolání každého jednotlivého schodu dokud nezdoláme celé schodiště. Jinými slovy: "Dokud nejsi nahoře tak postup o schod výše." Jedná se tedy o cyklus neboli opakované akce (přesun o jeden schod výše), které po určitou dobu opakovaně (cyklicky) provádíme.
  • Chci koupit 5 rohlíků. Takže cyklem je skládání jednoho rohlíku po druhém do košíku. Akcí je vložení jednoho rohlíku do košíku. Tuto akci opakujeme přesně pětkrát. Pak máme v košíku pět rohlíků a tím cyklus končí.

Obecně řečeno: Dokud platí nějaká podmínka, tak opakuj následující kroky. Kroků v cyklu může být v podstatě libovolný konečný počet. A u podmínky cyklu platí to stejné co platilo u podmínky u příkazu IF ELSE - tedy, že může být v podstatě libovolně komplikovaná.

Syntaxe cyklu WHILE v jazyce C

V jazyce C (stejně jako v mnoha dalších programovacích jazycích) existuje příkaz WHILE. Syntaxe tohoto příkazu je následující:

Základní syntaxe příkazu WHILE v programovacím jazyce C
while (podmínka)
{
	posloupnost-příkazů
}

Jednoduchý příklad cyklu WHILE

WHILE v programovacím jazyce C
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	int cislo = 1;
	while (cislo <= 5)
	{
		printf("%d", cislo);
		cislo = cislo + 1;
	}
	fflush(stdin);
	getchar();
	return 0;
}

Program vypíše pět čísel od jedničky do pětky (na výstupu vidíme číslice 1,2,3,4,5 každou na zvláštním řádku) a pracuje takto:

  1. Do proměnné cislo přiřaď hodnotu 1.
  2. DOKUD je cislo menší nebo rovno 5 DĚLEJ následující dvě instrukce
  3.   Vypiš hodnotu proměnné cislo.
  4.   Zvyš hodnotu proměnné cislo o jedničku.
  • V prvním průchodu cyklu se vypíše číslo jedna (hodnota proměnné cislo) a hodnota proměnné cislo se zvětší o jedničku.
  • Po těchto dvou příkazech, které jsou uvnitř cyklu, se ověří, zda je cislo<=5. To bude pravda, protože proměnná číslo má hodnotu 2 a cyklus se spustí znovu.
  • V druhém průchodu cyklu se opět vypíše proměnná cislo (nyní již číslo dva) a hodnota proměnné cislo se zvětší o jedničku.
  • Předchozí se opakuje dokud platí podmínka, že hodnota proměnné cislo je menší nebo rovna číslu 5. Pak provádění cyklu skončí, program přejde na příkaz readln a čeká na stisk klávesy enter, aby mohl skončit.

Opakovaní program podle přání uživatele

Opakovaný součet dvou čísel

Pomocí cyklu již můžeme opakovat libovolnou činnost, kterou může být například opakovaní celého programu. Uvažujme, že uživatel spustí náš program a my se jej na konci programu zeptáme: "Chceš spustit program ještě jednou?". Uživatel dostane na výběr a tak buď stiskne klávesu 'a' a program se provede znovu nebo stiskne cokoli jiného a program skončí. K tomu, abychom mohli od uživatele načíst libovolný znak z klávesnice, potřebujeme proměnnou typu char. Do takové proměnné lze uložit právě jeden libovolný znak z klávesnice. Ukažme si toto na programu, který sčítá dvě čísla.

Opakovaný Součet Dvou Čísel
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	char odpoved;
	int a, b;
	odpoved = 'a';
	while (odpoved == 'a')
	{
		printf("Zadejte cislo a: ");
		scanf("%d", &a);
		printf("Zadejte cislo b: ");
		scanf("%d", &b);
		printf("Soucet zadanych cisel je %d!\n",(a+b));
		printf("Prejete si secist dalsi dve cisla? (a/n) ");
		scanf("%c",&odpoved);
	}
	fflush(stdin);
	getchar();
	return 0;
}

Program opakuje zadávání dvou čísel a výpis jejich součtu do té doby, dokud uživatel na dotaz, zda chce pokračovat, odpovídá stiskem klávesy se znakem 'a' (+enter). Všimněme si ještě prvního řádku programu (pod hlavičkou funkce main). Je na něm pouze pokyn, aby se do proměnné odpoved vložila hodnota 'a'. Proč?

Důvodem je, aby se program po spuštění dostal do cyklu while a začal jej vykonávat (což se stane pouze v případě, že je hodnota proměnné odpoved právě znak 'a'). Kdyby tam tento řádek nebyl, tak by proměnná odpoved hodnotu 'a' neměla, podmínka cyklu while by nebyla splněna a tak by se cyklus ani nezačal provádět a program by pokračoval až posledním příkazem getchar(); (spustil by se a jen by čekal než uživatel stiskne klávesu enter - to je takový smutný program ...).

Řekněme, že bychom chtěli vědět kolik součtů náš program uživateli celkem spočítal. Budeme tedy potřebovat ještě proměnnou pocet, která bude uchovávat počet realizovaných součtů. Princip bude takový, že jí na začátku programu nastavíme hodnotu 0 a s každým vyřešeným příkladem ji o jedničku zvedneme.

Opakovaný Součet Dvou Čísel
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	char odpoved;
	int a, b, pocet;
	odpoved = 'a';
	pocet = 0;
	while (odpoved == 'a')
	{
		printf("Zadejte cislo a: ");
		scanf("%d", &a);
		printf("Zadejte cislo b: ");
		scanf("%d", &b);
		printf("Soucet zadanych cisel je %d!\n",(a+b));
		printf("Prejete si secist dalsi dve cisla? (a/n) ");
		scanf("%c",&odpoved);
		pocet++;
	}
	printf("Pocet realizovanych prikladu: %d\n",pocet);
	fflush(stdin);
	getchar();
	return 0;
}

V tomto programu si můžeme všimnout ještě jednoho zajímavého zápisu, a to řádku pocet++. Tento řádek je zkráceným zápisem výrazu pocet = pocet + 1 (stejným způsobem můžeme zkrátit pocet = pocet – 1 na pocet--).

Součet libovolného množství čísel

Doposud jsme byli schopni psát pouze programy, které uměly načíst omezený počet čísel. Nyní si napíšeme program pro součet libovolného počtu čísel (například jako na kalkulačce).

Součet libovolného počtu čísel
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	char odpoved = 'a';
	int soucet = 0;
	while (odpoved == 'a')
	{
		printf("Zadejte cislo: ");
		scanf("%d", &cislo);
		soucet = soucet + cislo;
		printf("Soucet zadanych cisel je %d!\n",(a+b));
		printf("Prejete si nacist dalsi cislo? (a/n) ");
		scanf("%c",&odpoved);
	}
	printf("Soucet vsech zadanych cisel je %d.\n", soucet);
	fflush(stdin);
	getchar();
	return 0;
}

Pojďme tento program ještě vylepšit tak, že bude uživateli ještě oznamovat, kolikáté číslo uživatel právě zadává. Bude tedy uživatele informovat: "Zadej 1. číslo, .... Zadej 2. číslo" atd. K dosažení tohoto cíle budeme potřebovat proměnnou pocet.

Součet libovolného počtu čísel
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	char odpoved = 'a';
	int soucet = 0, pocet = 0;
	while (odpoved == 'a')
	{
		printf("Zadejte %d. cislo: ", pocet+1);
		scanf("%d", &cislo);
		soucet = soucet + cislo;
		pocet++;
		printf("Soucet zadanych cisel je %d!\n",(a+b));
		printf("Prejete si nacist dalsi cislo? (a/n) ");
		scanf("%c",&odpoved);
	}
	printf("Soucet vsech zadanych cisel je %d.\n", soucet);
	printf("Pocet zadanych cisel je %d.\n",pocet);
	fflush(stdin);
	getchar();
	return 0;
}

Domácí úkol

Napište program pro výpočet aritmetického průměru libovolného počtu zadaných čísel.

Domácí úkol

Napište program pro nalezení minima a maxima ze všech zadaných čísel.

Otázky

  1. Jaká je správná syntaxe cyklu while?
  2. Uveďte 3 příklady, kdy byste využili cyklus while.
  3. Zkuste najít způsob jak cyklus while přerušit úplně nebo jak přeskočit aktuální průběh.
webdesign, xhtml, css, php - Mgr. Michal Mikláš