NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 3 - Pokročilé cykly v jazyce C

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Odpovídá 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?

 
Odpovědět
30.7.2021 17:27
Avatar
DarkCoder
Člen
Avatar
Odpovídá 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ě..

Odpovědět
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
Odpovídá 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);
 
Odpovědět
30.7.2021 18:19
Avatar
DarkCoder
Člen
Avatar
Odpovídá 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.

Odpovědět
30.7.2021 18:43
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 14.