IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – 3. diel - Pokročilé cykly v jazyku C

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Josef Kuchař - Pepa489:25.8.2016 1:16

goto je podle mě přehlednější pokud potřebujete vyskočit z mnohonásobného cyklu :)

Odpovedať
25.8.2016 1:16
2x piš, jednou debuguj
Avatar
Jakub Faktoriál Dvořák:3.6.2019 12:39

v ternarnim porovnani 3 cisel je chyba,

int max = a > b ? a > c ? a : c : b > c : b : c;

obsahuje o jeden '?' mene a jedno ':' vice,
b > c : b : c ---------> b > c ? b : c
imho spravne to je (pisu zavorky, abych v tom ted taky neudelal chybu :D )

int max = a > b ? ( a > c ? a : c ) : ( b > c ? b : c) ;
 
Odpovedať
3.6.2019 12:39
Avatar
Odpovedá na Josef Kuchař - Pepa489
Patrik Pastor:4.9.2019 14:24

dej priklad, muze to byt prehlednejsi nebo nemusi. Dej priklad at je to jasnejsi.

 
Odpovedať
4.9.2019 14:24
Avatar
Patrik Pastor:4.9.2019 14:27

kdyz for cyklus by vypadal takhle:

for(int i =0;;i++)

  • tak nema zadnou podminku, ktera by ho vyhodila ven, je tedy nekonecny? (ekvivaletni k cyklu while(1))?

Nebo musi for cyklus obsahovat podminku. V clanku mas napsano ze je mozne nektere catsi for cyklu vynechat, lze vynechat opravud vsechny, nebo jsou nektere povinne (ze 3 casti)?

Editované 4.9.2019 14:29
 
Odpovedať
4.9.2019 14:27
Avatar
Odpovedá na Patrik Pastor
Patrik Valkovič:4.9.2019 14:33

Libovolnou se složek můžeš vynechat. Pokud vynecháš podmínku, bude cyklus nekonečný. Pokud vynecháš první složku, před začátkem cyklu se nic neprovede. Když vynecháš poslední složku, na konci cyklu se nic nebude provádět. Stejně tak to můžeš kombinovat. Například while(i > 0) a for(; i > 0;) jsou ekvivalentní zápisy.

Odpovedať
4.9.2019 14:33
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Patrik Pastor
DarkCoder:4.9.2019 15:21

Takováto podoba for cyklu je nebezpečná. For cyklus bude nekonečný pokud ho sám explicitně neukončíš. To nebezpečí spočívá v neustálé inkrementaci proměnné i. Pokud ji nebudeš uvnitř cyklu konktrolovat, přeteče její povolený rozsah a funkce programu pak bude minimálně chybná.

Pokud chceš vytvořit nekonečný cyklus for, používej následující podobu:

for(;;)

Tato podoba je ekvivalent while(1).

Inicializace nemusí být nutně uvnitř cyklu, může být vně. Cyklus tak bude normálně fungovat.

i = 100;
for( ; i > 0; i--) ...

Stejně tak inkrementovat můžeš uvnitř cyklu a tedy část inkrementace ve fory cyklu vynechat. Program bude provádět činnost jako obvykle.

Odpovedať
4.9.2019 15:21
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá na DarkCoder
Martin Russin:30.7.2021 14:54

Ahoj, chcel by som Ťa poprosiť o vysvetlenie príkladu z tejto lekcie.

#include <stdio.h>
#include <stdlib.h>
#define POCET_HLADANYCH_PRVOCISEL 10

int main(int argc, char** argv) {
    int prvocisla[POCET_HLADANYCH_PRVOCISEL] = {2};
    int pocet_najdenych_prvocisel = 1;
    int i = 2;
    int j = 0;

    while(1) {
        for(j=0; j<pocet_najdenych_prvocisel; j++)
            if(i%prvocisla[j] == 0)
                break;
// dosadím si hodnoty premenných a konštánt pre lepšie pochopenie
// for(j=0; j<1; j++)
//    if(2%2 == 0) -> platí táto podmienka
//    break; ->nasleduje príkaz break, ktorý ukončí cyklus for a program
// pokračuje ďalšími riadkami za cyklom for
        if(j == pocet_najdenych_prvocisel) {
// if(0 == 1) { -> neplatí podmienka, príkazy sa neuskutočnia
            prvocisla[j] = i;
            pocet_najdenych_prvocisel++;
        }
        if(pocet_najdenych_prvocisel == POCET_HLADANYCH_PRVOCISEL) {
// if(1 == 10) { -> neplatí podmienka, príkazy sa neuskutočnia
            break;
        }
        i++; // zvýši sa hodnota 2 na 3
    }
//
// cyklus while sa spustí od začiatku
//    for(j=0; j<pocet_najdenych_prvocisel(opäť 1); j++) {
//        if(i(3)%prvocisla[j](2) == 0) -> neplatí podmienka,
//            break; -> nenasleduje príkaz break, avšak cyklus for sa už nemôže zopakovať
// a ja proste neviem nájsť v programe, kde sa zvýši hodnota pocet_najdenych_prvocisel
//    }

    for(i=0; i<pocet_najdenych_prvocisel; i++) {
        printf("Prvočíslo: %d\n", prvocisla[i]);
    }
    return (EXIT_SUCCESS);
}

Vopred Ti ďakujem za odpoveď.

 
Odpovedať
30.7.2021 14:54
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Martin Russin
DarkCoder:30.7.2021 16:50

Ke změně proměnné pocet_najdenych_prvo­cisel dochází v následujícím bloku

if (j == pocet_najdenych_prvocisel) {
        prvocisla[j] = i;
        pocet_najdenych_prvocisel++;
}

a to tehdy, když test na zbytek po dělení pro všechny aktuální prvky v poli, neprošel. To se pak hodnota j stává rovna hodnotě pocet_najdenych_prvo­cisel a dojde tak k přidání dalšího prvočísla do pole a inkrementace hodnoty pocet_najdenych_prvo­cisel.

Pro názornost doporučuji si pustit program v režimu ladění - krokovat s vnořením (F11). Je zde krásně vidět kde se v programu aktuálně nacházíš a také hodnoty jednotlivým proměnných a to jak se mění.

Odpovedať
30.7.2021 16:50
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá na DarkCoder
Martin Russin:30.7.2021 17:07

To se pak hodnota j stává rovna hodnotě pocet_najdenych_prvo­cisel

Na základe čoho?

 
Odpovedať
30.7.2021 17:07
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Martin Russin
DarkCoder:30.7.2021 17:14

Na základě řídící proměnné for cyklu, který není ukončen příkazem break a dojede až nakonec. Ukončení for cyklu nastane, když bude platit podmínka j == pocet_najdenych_prvo­cisel.

Odpovedať
30.7.2021 17:14
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!