Veľkonočná akcia je tu a s ňou aj extra kredity ZADARMO na náš interaktívny e-learning. Dobij si teraz kredity a posuň sa vo svojej kariére vpred!
Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

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
Odpovedá na DarkCoder
Martin Russin:30.7.2021 17:27

Pomocou cyklu for sa prepísal kód

for(j=0; j<pocet_najdenych_prvocisel; j++)
            if(i%prvocisla[j] == 0)
                break;

na

for (j = 0; j < pocet_nalezenych_prvocisel && i % prvocisla[j] != 0; j++);

lenže cyklus for nemá v tele žiaden príkaz, ako si mám teda predstaviť jeho funkciu? Ako dôjde k ukončeniu cyklu bez príkazu break?
.
Rovnako sa tento kód

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

prepísal na

for (i = 0; i < pocet_nalezenych_prvocisel; printf("Prvocislo: %d\n", prvocisla[i++]));

Ako prvá hodnota sa vypíše hodnota na indexe 0? Pretože ak i=0 a príkaz je napísaný ako prvocisla[i++], tak príkaz i++ zinkrementuje premennú i na hodnotu 1 a teda sa vypíše hodnota na indexe 1?

 
Odpovedať
30.7.2021 17:27
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Martin Russin
DarkCoder:30.7.2021 17:53

Každý z cyklů (for, do-while, while) se vyhodnocuje v závislosti na vyhodnocení podmínky. Tedy na výsledku výrazu. Cyklus se opakuje dokud podmínka platí. U for a while cyklus je podmínka na začátku, u cyklu do-while je podmínka na konci.

V uvedeném for cyklu by rozhodně bylo dobré používat závorky pro větší přehlednost. Princip je stejný jako u běžného for cyklu - začne se inicializační částí, pak se otestuje podmínka, je-li pravdivá, neproběhne nic. Pak se provede inkrementační část, otestuje se podmínka, atd.. K ukončení cyklu dojde tehdy, stane-li se podmínka nepravdivá.. Což se stane předčasně u vyhodnocení logického součinu.

K druhému přepisu for cyklu řeknu napíšu akorát toto - Na takovéto zápisy uvnitř hlavičky cyklů úplně zapomeň! Takovýto zápis je velmi nepřehledný a narušuje chápaní činnosti daného bloku programu.

Zápisy ala

prvocisla[i++]

je dobré zpočátku nepoužívat, dokud se to nestane přirozené. Není ostudou si to rozepisovat na

prvocisla[i]
i++;

Je to mnohem čitelnější a méně často může dojít k chybě..

Odpovedať
+1
30.7.2021 17:53
"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 18:19

V lekcii je spomenutá nasledovná štruktúra

typedef struct {
    int val;
    NODE* dalsi;
} NODE;

// ...

NODE* posledni_node = prvni_node;
for(;posledni_node->dalsi != NULL; posledni_node = posledni_node->dalsi);

nemalo by deklarovanie funkcie byť prepísane takto?

typedef struct node {
    int val;
    struct node *dalsi;
} NODE;

.
Bola by chyba, ak by som prepísal for cyklus nasledovne?

NODE* posledni_node = NULL;
for(posledni_node = prvni_node; posledni_node->dalsi != NULL; posledni_node = posledni_node->dalsi);
 
Odpovedať
30.7.2021 18:19
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Martin Russin
DarkCoder:30.7.2021 18:43

Ano, definování nového typu NODE je chybné.

typedef struct {
    int val;
    NODE* dalsi;
} NODE;

Výše uvedený kód nelze takto napsat, neboť typ NODE není ještě v čase překladu řádky
NODE* dalsi; znám.

Správně by mělo být

typedef struct node {
        int val;
        struct node* dalsi;
} NODE;

Inicializace řídící proměnné může být uvnitř ale i vně hlavičky cyklu. Lze to tedy i takto zapsat.

Odpovedať
+1
30.7.2021 18:43
"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.

Zobrazené 4 správy z 14.