Skočiť na obsah


Programovanie v jazyku C a C#

Návody pre začiatočníkov a pokročilých



Fórum: Škôlka jazyka C
- - - - -
Fotografia

6. lekcia C (Cykly) škôlka


Cyklus while, do while, for a príkazy ovplyvňujúce prevádzanie cyklov: continue a break.

Cyklus je postupnosť operácií opakovane uskutočňovaných v rovnakom poradí a opakujú sa do vtedy, kým nebude splnená nejaká podmienka.

Skôr ako sa pustíme do samotných cyklov, vysvetlím dva príkazy, ktoré ovplyvňujú ich prevádzanie.

break – ukončuje najvnútornejší neuzavretý cyklus – okamžite opúšťa cyklus
continue – skáče na koniec cyklu a tým vynúti rozbeh ďalšieho cyklu – cyklus neopúšťa

Príkaz while


Obrázok

Človek by čakal, že cyklus skončí pri i = 5, pretože j = 5 a skutočne je to pravda.
Ale keď sa splní podmienka, ďalší cyklus už neprebehne a i ako 5 sa už nevypíše, teda to skončí pri 4!


Keď vynechám i++;, stane sa nasledovné:
Zastavíš to dvojhmatom ctrl + c.

Obrázok

Môže sa stať, že cyklus vôbec neprebehne, pretože podmienka nie je splnená ani raz.

Obrázok

Príkaz do - while
Používa sa na vyhodnotenie podmienky na konci cyklu.

Obrázok

Tu, aj keď nie je podmienka nikdy splnená, cyklus prebehne aspoň jeden krát.

Obrázok

V praxi sa viac používa while, ale niekedy je vhodné (výhodné) použiť do - while.

Niekoľko príkladov:
Program číta znaky z klávesnice, tie čo sa dajú vytlačiť vypisuje na obrazovku, neviditeľných si nevšíma a zastaví sa pri prečítaní znaku 'z'.
{

int c;



while ((c = getchar()) != 'z') {

	if (c >= ' ')		/* znaky menšie ako medzera sú neviditeľné (ASCII tabuľka) */

	 putchar(c);	 /* tlač znaku */

}

printf("\nCitanie znakov bolo ukocene. \n");
Vstup bol "q w e r t z" a tu je výstup:

Obrázok

Ten istý príklad s ukážkou nekonečného cyklu a s využitím príkazov break a continue.
{

int c;



while (1){	 /* nekonecny cyklus */

	if ((c = getchar()) < ' ')

	 continue;	 /* zahodenie neviditelneho znaku, cyklus skočí na začiatok */

	if (c == 'z')

	 break;	 /* zastavenie po nacitani znaku 'z' */

	putchar(c);	 /* tlac znaku */

}

printf("\nCitanie znakov bolo ukocene. \n");

}
Výstup je rovnaký:

Obrázok

Poznámka:
Telo príkazu while môže byť prázdne, napr. často sa využíva toto vynechávanie medzier na vstupe:
while (getchar() == ' ')

;
alebo preskočenie všetkých bielych znakov na vstupe:
while ((c = getchar()) == ' ' || c == '\t' || c == '\n')

;
alebo zbavenie sa znaku '\n' (enter), ktorý sa zadá po každom vložení z klávesnice a v niektorých prípadoch spôsobuje problémy:
while (getchar() != '\n')

;
Ak je príkaz prázdny, je stredník ; osadený vždy na novom riadku. (štábna kultúra)

Príkaz for

Oproti while a do-while má tú veľkú výhodu, že všetky údaje potrebné na beh cyklu sú na jednom mieste (v jednej zátvorke)

for (výraz_štart; výraz_stop; príkaz_cyklu)

príkaz;

Teda program s použitím príkazu while:

#include <stdio.h>

int main()

{

int i;



i = 1;

while (i <= 10) {

	printf("%d\n", i);

	i++;

}

return 0;

}

robí to isté ako program príkazu for:

#include <stdio.h>

int main()

{

int i;



for (i = 1; i <= 10; i++)

printf("%d\n", i);

return 0;

}

Obrázok

Z toho je vidieť, že príkaz for je vlastne prehľadnejší a hlavne s a dá dosť ťažko zabudnúť na príkaz cyklu (napr. i++)
Ak je príkaz for zložitejší a sme na pochybách, je dobré si uvedomiť, že sa dá vždy prepísať pomocou while takto:
výraz_štart;

while (výraz_stop){

príkaz;

príkaz_cyklu;

}
Príklady:
Pre prvé štyri príklady vždy predpokladáme definíciu: int i = 0; a všetky vytlačia čísla 0 až 9.
1) Klasické (a doporučované) využitie for
for (i = 0; i < 10; i++)

printf("%d\n", i);
2) Využitie inicializácie pri definícii – nevhodné riešenie, pretože nie je všetko pohromade
for ( ; i < 10; i++)

printf("%d\n", i);
3) Riadiaca premenná je menená v tele cyklu – nevhodné riešenie
for ( ; i < 10; )

printf("%d\n", i++);
4) Využitie operátora čiarka – časté, ale opäť nie celkom vhodné použitie
for ( ; i < 10; printf("%d", i), i++)

;
5) Použitie operátora čiarka pri inicializácii (i = 1, sum = 0;) je vhodné, pri výpočte (sum += 1, i++) je nevhodné
int i, sum;

for (i = 1, sum = 0; i <= 10; sum +1= i, i++)

;
6) Cyklus for môže meniť riadiacu premennú ľubovoľným spôsobom
int i, sucin;

for (i = 3, sucin = 1; i <= 9; i += 2)

printf("%d\n", sucin *= i;
Výstup:

Obrázok

7) Je možné a niekedy nutné vkladať príkazy for do seba (môže byť mnohonásobné vkladanie):

#include <stdio.h>

int main()

{

int i,j,velkost;



printf("Zadaj velkost:");

scanf("%d", &velkost);

for ( i = 1; i <= velkost; i++ ) {

	for ( j = 1; j <= i; j++ ) {

	 putchar('*');

	}

	putchar('\n');

}

return 0;

}

Obrázok

Poznámka:
Často sa používa nekonečný cyklus:

for (;<img src='http://forum.freespace.sk/public/style_emoticons//wink.png' class='bbc_emoticon' alt=';)' /> {

...

...

}

V takom prípade sa na ukončenie behu cyklu zpravidla používa príkaz break.

Príkazy continue a break fungujú len v cykloch a break sa používa aj pri prepínači switch.

Príklady:

#include <stdio.h>



int main()

{

int i = 0;

for (;<img src='http://forum.freespace.sk/public/style_emoticons//wink.png' class='bbc_emoticon' alt=';)' /> {		/* nekonečný cyklus */

	putchar('*');

	if ( i == 10 ) /* podmienka */

	 break;		/* ak je splnená, cyklus sa ukončí */

	i++;

}

putchar('\n');

return 0;

}


#include <stdio.h>



int main()

{

int i;



for( i = 0; i <= 20; i++ ) { /* cyklus počíta od 0 do 20 */

	if (i % 2 == 0) /* podmienka je splnená, keď je i párne číslo */

	 continue;	 /* príkaz continue preskočí zvyšok cyklu a začne nový cyklus */

	printf("%d\n",i); /* teda sa vypíšu len nepárne čísla */

}

return 0;

}

Obrázok


Úlohy.

1. Napíš program a skompiluj ho. (úloha sa neodovzdáva) Čo to spraví, keď tomu povieš aby rátal, do 20? Skončí pri 20
alebo pri 19? Čo to spraví, keď tomu povieš, aby rátal do mínus ­7 ?
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++;

}
2. Napíš program, ktorý napíše za trest dvadsaťkrát: Nebudem zhadzovat operacny
system. (použi príkaz do - while)
Spoiler

3. Napíš program, ktorý do premennej poc načíta celé číslo z klávesnice a vypočíta súčet
1 + 2 + 3 + ... + poc . (použi príkaz while)
Spoiler

4. Napíš program ktorý vypíše do tabuľky ASCII kódy (hexadecimálne) všetkých veľkých písmen bez diakritiky, teda 'A' až 'Z'. (použi príkaz while)
Funkcia printf sa v ňom môže nachádzať maximálne dvakrát.
Spoiler

5. Uprav uvedený 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 psychického stavu jedinca za klávesnicou a skončí.

{

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");

}

Spoiler

6. Čítaj znaky z klávesnice až do '\n' a spočítaj počet veľkých a malých písmen. Ostatných znakov si nevšímaj.
Použi cyklus while.
Spoiler

7. Napíš program, ktorý prečíta n čísiel z klávesnice (n sa zadá tiež z klávesnice). Pre každý vstup vypíš napr.:
Zadaj i. cislo :
Z týchto čísiel urči, koľko z nich leží v intervale <25, 38>.
Použi cyklus for.
Spoiler

8. Napíš program, ktorý vypisuje prirodzené čísla (1, 2, 3, ...) vyskúšaj činnosť príkazov break a continue.
Použi cyklus for.
Spoiler

9. Napíš program, ktorý pre zadané číslo vypočíta faktoriál. Použi typ unsigned long int.

V matematike sa pojmom faktoriál kladného celého čísla n označuje súčin všetkých kladných celých čísel menších alebo rovných n. Zapisuje sa n! a číta sa „n faktoriál“. Napríklad:


Obrázok
Spoiler

10. Napíš program, ktorý prečíta dve kladné reálne čísla f a g a potom vypíše všetky párne čísla v intervale <f, g>.
Spoiler

11. S pomocou cyklu for napíš program, ktorý vypíše všetky nepárne čísla od 1 do 99.
Spoiler

12. S pomocou cyklu for napíš program, ktorý vypíše všetky čísla od 1 do 100 a ku
každému napíše, či je párne, alebo nepárne.
Spoiler

13. Napíš program, ktorý s pomocou načíta číslo z klávesnice a potom urobí štvorček
z hviezdičiek danej veľkosti. Napr. ak užívateľ zadá číslo 3, výsledok bude:
***
***
***
Spoiler

14. Napíš program, ktorý načíta číslo a potom spraví symetrický trojuholník danej veľkosti.
Pre vstup 4 to bude vyzerať takto:
   *
  ***
 *****
*******
Spoiler
  • 0

Popis: Cykly

- break, continue
- while
- do-while
- while (1){}
- for
- for (;;){}
- úlohy k lekcii
Poznámky: Ak chceš, aby ti niekto úlohy skontroloval, zabal ich do zip-u a zašli na e-mail:
libcosenior zavináč gmail botka com

Poprípade tam môžeš konzultovať, čo ti nie je jasné.
Odkazy:


-1 Komentárov


Najlepšie lekcie


Najnovšie pridané lekcie


Najnovšie komentáre


Najviac komentované lekcie


Najviac zobrazené lekcie


Náhodné lekcie


Na tejto stránke bolo užívateľ(ov) za posledných 30 minút

členov, návštevníkov