Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

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
Posledné komentáre sú na spodnej časti poslednej stránky.
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?

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ť
"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);
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ť
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Posledné komentáre sú na spodnej časti poslednej stránky.
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.