NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!

Diskuze – Lekce 6 - Cykly v Céčku

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
Tomas Bahensky:21.2.2018 17:42

Cau, mam jeste jeden dotaz ohledne DO WHILE. Konkretne jde o prepsani kodu za pouziti WHILE (viz nize) na DO WHILE:

int i = 1;
while (i <= 10)
{
        printf("%d ", i);
        i++;
}

Dle infa z teto lekce jsem ho prepsal nasledovne:

int i;
    do
    {
        printf ("%d", i);
        i++;
    }
    while (i <= 10);

A moje otazka zni:

  • Kdyz u DO WHILE nemusime nastavovat vstupni hodnotu promenne, podle ceho si ji program urci? Tento kod mi vypise cisla 2-10, takze vstupni hodnota je 2? Proc?

Je to tim, ze na tento priklad je DO WHILE neaplikovatelny bez urceni vstupni hodnoty promenne?

Diky!
Tomas

 
Odpovědět
21.2.2018 17:42
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Tomas Bahensky
DarkCoder:21.2.2018 20:23

Takovéto přepsání cyklu do-while je chybné. Proměnná i použita jako argument funkce printf() není určena a tudíž úryvek kódu s do-while cyklem postrádá smysluplný výsledek. V příkladu s kalkulačkou počáteční hodnota proměnné pokracovat nemusí být určena. Sice je podmínka cyklu vyhodnocena na jeho konci stejně jako ve tvém přepisu, ale těsně předtím je proměnná pokracovat naplněna pomocí funkce scanf(). Takže se proměnná pokracovat porovnává s konkrétní (určenou) hodnotou a proto je tento kód správně.

Globální proměnné a statické lokální proměnné, které nejsou explicitně inicializovány, jsou automaticky nastaveny na nulu. Ostatní lokální proměnné, které nejsou inicializovány, mohou obsahovat libovolnou neznámou hodnotu. Některé překladače jazyka C mohou nastavovat neinicializované lokální proměnné na nulu, ale na to bych se rozhodně nespoléhal. Použití neurčené globální proměnné je možné ale není považováno za správné.

Odpovědět
+1
21.2.2018 20:23
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Rudolf Mak
Člen
Avatar
Rudolf Mak:10.4.2018 20:58

Zdravím, chcel by som sa spýtať aký je rozdiel medzi deklarovaním počítadla cyklu pred cyklom a v príkaze cyklu:

for (int i = 0;i<10;i++)
{

}

kedže aj táto forma funguje (aspoň mne).

 
Odpovědět
10.4.2018 20:58
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Rudolf Mak
David Hartinger:10.4.2018 21:02

Ahoj, zápis v článku je klasičtější, to co ti funguje jde až od standardu C99, můžeš se podívat jak moc je tato verze rozšířená. Vzpomínám si, že když jsem to řešil, došel jsem k tomu, že budu používat raději ten klasický zápis, ale třeba je dnes již situace jiná. Ve většině případů to je asi jedno.

Odpovědět
10.4.2018 21:02
New kid back on the block with a R.I.P
Avatar
Rudolf Mak
Člen
Avatar
Odpovídá na David Hartinger
Rudolf Mak:10.4.2018 21:25

Ďakujem za odpoveď, myslím že ostanem tiež pri klasickom zápise, kedže je viac podporovaný a rozdiel v zápise je minimálny.

 
Odpovědět
10.4.2018 21:25
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Rudolf Mak
DarkCoder:10.4.2018 22:03

Deklarací proměnné uvnitř cyklu zpřesňuješ rozsah viditelnosti proměnné. Nejen že deklaruješ proměnnou až tehdy když je třeba a šetříš tak pamětí, ale mnoho překladačů tak může lépe optimalizovat tvůj zdrojový kód. Drobnou nevýhodou je podpora od standardu C99, což už ale kvalitní překladače mají a čitelnost programu. Deklarace proměnných na začátku funkce či bloku je mnohem pohodlnější.

Odpovědět
10.4.2018 22:03
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Lukáš Gardoň:20.11.2019 14:36

Ahoj, měl bych jeden malý dotaz. Jednou se mi náhodou podařilo místo čísla zadat písmeno a program se mi zacyklil. Je to správně a nebo měl NetBeans vyhlasit nějakou chybu.Příklad níže :

double a;
printf("Zadejte prvni cislo: \n");
scanf("%lf, &a);

a ja místo hodnoty zadám písmeno. Poté mi to běží pořád dokola a nevypíše chybu. Je to správně ? Děkuji.

 
Odpovědět
20.11.2019 14:36
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Gardoň
DarkCoder:20.11.2019 14:57

V jazyce C lze snadno převádět znaky na malou číselnou hodnotu a obráceně. Číselná hodnota se odvíjí od ASCII hodnoty daného znaku. V C je tento způsob převodu naprosto korektní a překladač tak při překladu neohlásí žádnou chybu. Co se zobrazí závisí na použité funkci popřípadě specifikaci formátu u funkce printf(). Podívej se do ASCII tabulky, abys viděl, jaká hodnota kterému znaků odpovídá. Tvůj úryvek kódu je v pořádku. Pokud chceš vědět zda vše proběhlo v pořádku, otestuj si návratovou hodnotu funkce scanf(). Ano, program se může zacyklit pokud podmínka cyklu bude vždy pravdivá a ty nepouzijes mechanismus k ukončení cyklu (příkaz break nebo změna hodnoty proměnné řídící cyklus).

Odpovědět
20.11.2019 14:57
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Lukáš Gardoň:20.11.2019 15:18

Děkuji za odpověď a ještě se raději zeptám jednou jestli to správně chápu. Když teda mám datový typ double a zadám např. málé a (V ASCII by to měla být hodnota 97) tak mi program dosadí 97 ?

Např. v tomto kódě :

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char** argv)
{

double a;
double b;
int volba; // Mohli bychom použít char, abychom zbytečně nepoužívali moc místa
double vysledek;
int pokracovani;
printf("Vitejte v kalkulacce \n");

do
 {
    printf("Zadejte prvni cislo: \n");
    scanf("%lf", &a);
    printf("Zadejte druhe cislo: \n");
    scanf("%lf", &b);
    printf("Zvolte si operaci: \n");
    printf("1 - scitani \n");
    printf("2 - odcitani \n");
    printf("3 - nasobeni \n");
    printf("4 - deleni \n");
    scanf("%d", &volba);
    switch(volba)
        {
        case 1:
            vysledek = a + b;
            break;
        case 2:
            vysledek = a - b;
            break;
        case 3:
            vysledek = a * b;
            break;
        case 4:
            vysledek = a / b;
            break;
        }
    if ((volba > 0) && (volba < 5))
         printf("Vysledek: %lf\n", vysledek);
    else
    printf("Neplatna volba \n");
    printf("\n");
    printf("Pro pokracovani volba 1,ukoncit volba 0\n");
    scanf("%d", &pokracovani);

    }while (pokracovani==1);
printf("Dekuji za pouziti kalkulacky");
return (EXIT_SUCCESS);
}

Když mám zadávat první číslo a zadám a, tak výpisem je toto :

Vitejte v kalkulacce
Zadejte prvni cislo:
a
Zadejte druhe cislo:
Zvolte si operaci:
1 - scitani
2 - odcitani
3 - nasobeni
4 - deleni
Neplatna volba

Pro pokracovani volba 1,ukoncit volba 0
Dekuji za pouziti kalkulacky

, takže sem dosadil hodnotu 97 pro proměnou (a). Na další se mě ani nezeptá vypíše všechny funkce printf a skončí

 
Odpovědět
20.11.2019 15:18
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Gardoň
DarkCoder:20.11.2019 16:00

Zde to funguje jinak, specifikace formátu %lf říká, že funkce scanf() má očekávat desetinné číslo typu double. Jelikož písmeno 'a' není v setu znaků pro desetinné číslo, nebude načtení do proměnné úspěšné. Ve vstupním bufferu ti zůstane znak odřádkování který je načten následující vstupní funkcí. Proto dochází k přeskočení čtení druhého čísla. Zaměňování znaků za číselnou hodnotu lze využít ve switch nebo u funkce printf().

Jinak ještě pár doplňků k programu. Stdlib.h ani math.h nepotřebuješ. Specifikace formátu u printf() pro double je %f nikoli %lf. Oddel si příkazy v části else. Pouze první je jeho součástí.

Odpovědět
20.11.2019 16:00
"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 10 zpráv z 55.