[Cvičení 6] [Obsah] [Cvičení 8]

Cvičení 7


Témata


Cyklus s podmínkou na začátku (cyklus while)

Cyklus typu while má v jazyku C následující syntaxi:
while (výraz) příkaz;
Chceme-li mít v těle cyklu více příkazů než jeden, uzavřeme je do bloku mezi složené závorky:
while (výraz)
{
  příkaz1;
  příkaz2;
}
Výraz v závorce ze klíčovým slovem while (česky zatímco) představuje podmínku a platí pro něj vše, co bylo napsáno o podmínkách v minulém cvičení.

Sémantika cyklu je jednoduchá a zřejmá: zatímco je podmínka splněna, provádějí se příkazy v těle cyklu. Nechť si čtenář uvědomí, že tělo cyklu nemusí proběhnout ani jednou. Pokud není již před vstupem do cyklu podmínka splněna, do těla cyklu se nevstupuje.

Příklad jednoduchého programu s cyklem while je výpis malé násobilky čísla 3. Řešení v pravém sloupci tabulky je kratší a efektivnější, využívá vlastnosti operátoru ++ v postfixové formě, kdy je hodnota řídicí proměnné cyklu i zvýšena až po vynásobení 3:

int i = 0;
while (i<=10)
{
  printf("%d ",i*3);
  i++;
}
int i = 0;
while (i<=10)
  printf("%d ",3*i++);

Úloha 7.1

Napište program, který vypočítá nejmenší společný násobek. Nejprve přečte z klávesnice dvě celá čísla a zkontroluje, zda jsou obě kladná. Pokud ne, program se ukončí pomocí funkce return 1.
(Návod: použijte cyklus while a operaci zbytek po celočíselném dělení "%").

Řešení:

Varianta 1:Dev C++:nsn1.dev, nsn1.c
 CodeBlocks:nsn1.cbp, nsn1.c
Varianta 2:Dev C++:nsn2.dev, nsn2.c
 CodeBlocks:nsn2.cbp, nsn2.c

Úloha 7.2

Napište program, který vypočítá ciferný součet zadaného přirozeného čísla. Číslo je zadáno jako typ int.

Příklad vstupu:
157

Příklad výstupu:
Ciferny soucet cisla 157 je 13.

Návod: použijte cyklus while, využijte operací zbytek po celočíselném dělení a celočíselné dělení.

Řešení:

Dev C++:cif_soucet.dev, cif_soucet.c
CodeBlocks:cif_soucet.cbp, cif_soucet.c

Úloha 7.3

Napište program, který čte posloupnost celých čísel ukončených nulou. Pak vypíše, kolik bylo čísel v intervalu 3 .. 10 (včetně hranic) a dále vypíše nejmenší číslo. Ukončující nula se mezi hodnoty posloupnosti již nepočítá.

Příklad vstupu:
2 -1 3 5 20 0

Příklad výstupu:
Pocet hodnot mezi 3 az 10: 3
Nejmensi cislo: -1
Návod: použijte cyklus while, k načítání hodnot využijte funkci scanf.

Řešení:

Dev C++:posloupnost.dev, posloupnost.c
CodeBlocks:posloupnost.cbp, posloupnost.c

Cyklus s podmínkou na konci (cyklus do while)

Cyklus s podmínkou na konci má v jazyce C syntaxi:
do příkaz; while (výraz);
Chceme-li mít v těle cyklu více příkazů než jeden, musíme je opět uzavřítdo bloku mezi složené závorky, i když je tělo ohraničeno klíčovými slovy do, while:
do
{
  příkaz1;
  příkaz2;
}
while (výraz);
Sémantika cyklu je obdobná cyklu s podmínkou na začátku: dokud je podmínka splněna, provádějí se příkazy v těle cyklu. V tomto případě tělo cyklu proběhne alespoň jednou.

Jako ukázku použití cyklu uvedeme kód, který vyzývá uživatele k zadání celého čísla tak dlouho, dokud není zadané číslo kladné.

do
{
  printf("Zadej kladne cele cislo: ");
  scanf("%d",&n);
  if (n < 0) printf("Zadane cislo musi byt kladne!");
}
while (n < 0);


Cyklus for

Cyklus for má v jazyku C poněkud odlišnou syntaxi i sémantiku než v jazycích typu Pascal nebo Basic. Jeho možnosti jsou mnohem bohatší oproti zmíněným jazykům. Obecný zápis cyklu vypadá takto:

for(výraz1;výraz2;výraz3) příkaz;

Chování cyklu for je ekvivaletní cyklu typu while s tímto zápisem:

výraz1;
while(výraz2)
{
  příkaz;
  výraz3;
}
Nejprve se vyhodnotí výraz1 (pouze jednou, před vstupem do cyklu!). Pak se provádí tělo cyklu, dokud je splněn výraz2. Na konci každého provedení těla cyklu je vždy ještě vyhodnocen výraz3. Typické využití cyklu for je ve tvaru cyklu s pevným počtem opakování, např.

for(i=1;i<=n;i++) příkaz;, resp. for(i=n;i>=1;i--) příkaz;

Na místě výrazů mohou být skutečně libovolné výrazy, tedy na místě výraz2 může být libovolně složitá podmínka, zvětšit hodnotu proměnné na konci cyklu je možné např. o 2 aj.

Příklad:

Napíšeme program, který vypočte součet přirozených čísel od 1 do n, číslo n se zadává z klávesnice.

Řešení:

int main()
{
  int n,s,i;
  printf("Zadej prirozene cislo: ");
  scanf("%d",&n);

  s = 0;
  for(i=1;i<=n;i++) s=s+i;
  printf("Soucet je %d",s);
}
Uvažujte, jak bude algoritmus pracovat, zadáme-li záporné n.
Poznámka: Proměnná i se nazývá řídicí proměnná cyklu.
Ekvivalence obou cyklů je ukázána na jednoduchém příkladě, který vypíše násobilku 3, viz tabulka 1.

Cyklus forCyklus while
int i;
 
for(i=1;i<=10;i++)
  printf("%d ",3*i);
int i;
 
i=1;
while(i<=10)
{
  printf("%d ",3*i);
  i++;
}  

Tabulka 1: Ekvivalence cyklů

Pro ověření, zda dobře rozumíte cyklu for, zkuste analyzovat následující příklad.

Úloha 7.4

Napište program pro výpočet celočíselné mocniny. Vstupem algoritmu je desetinné číslo x a celé číslo (záporné, nula, kladné) n - exponent. Výsledkem je hodnota xn. Nejprve uvažujte pouze kladné n, pak program rozšiřte o výpočet pro nulové a záporné n. Napište dvě varianty programu - s cyklem while a cyklem for.

Příklad vstupu:
1.5
2

Příklad výstupu:
1.5^2 = 2.25

Řešení:

Dev C++:mocnina.dev, mocnina.c
CodeBlocks:mocnina.cbp, mocnina.c

Úloha 7.5

Napište program pro výpočet faktoriálu přirozeného čísla. Otestujte, zda zadané číslo je větší nebo rovno 0, pokud je záporné, vypište chybové hlášení a ukončete program pomocí return -1. Proměnnou pro faktoriál deklarujte typu long, pro výpis hodnoty proměnné použijte ve formátovacím řetězci specifikaci %ld.

Řešení:

Dev C++:fakt.dev, fakt.c
CodeBlocks:fakt.cbp, fakt.c

Domácí úkol:

Napište program, který vypočítá přibližně Eulerovo číslo vyhodnocením limity

pro určité n. Číslo n zadávejte z klávesnice. Příklad: pro zadané číslo 1000 vypočítáte hodnotu výrazu (1+1/1000)1000.
Dávejte pozor na celočíselné dělení 1/n (do kódu musíte psát 1.0/n). Výsledek deklarujte jako proměnnou typu double, ve formátovacím řetězci funkce printf použijte specfikaci %lf.

Řešení:

Dev C++:euler.dev, euler.c
Dev C++:euler.cbp, euler.c

[Cvičení 6] [Obsah] [Cvičení 8]