Obsah lekce:
V reálném životě se často setkáváme s cykly - opakujícími se činnostmi nebo pochody - například:
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á.
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í:
while (podmínka)
{
posloupnost-příkazů
}
#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:
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.
#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.
#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--).
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).
#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.
#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;
}
Napište program pro výpočet aritmetického průměru libovolného počtu zadaných čísel.
Napište program pro nalezení minima a maxima ze všech zadaných čísel.