NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.
Mezi 10:00 až cca 10:30 proběhne odstávka sítě z důvodu aktualizace. Web bude po celou dobu nedostupný.

Diskuze – Lekce 5 - Podmínky (větvení) 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
Lukáš Rác
Člen
Avatar
Lukáš Rác:28.8.2017 15:59

Zdravím, mám problém nejspíš s kompilací.Vytvořil jsem tu kalkulačku přesně podle tohoto návodu, ale když ho chci debugovat a spustit, tak to přestane pracovat, nebo se nic nestane. Nevíte co s tím? Compiler mám samozřejmě nainstalovaný. Tady to mám ve videu: https://www.youtube.com/watch?…

zde je zdroják: https://www.itnetwork.cz/dev-lighter/964

 
Odpovědět
28.8.2017 15:59
Avatar
Marek Uhlik
Člen
Avatar
Odpovídá na Lukáš Rác
Marek Uhlik:28.8.2017 16:07

První bych zkusil dopsat & do scanf kde jsem koukal že ti to chybí a tím by to i mohlo být

 
Odpovědět
28.8.2017 16:07
Avatar
Lukáš Rác
Člen
Avatar
Lukáš Rác:28.8.2017 16:24

Super, pomohlo, Díkyyy moc!! :)

 
Odpovědět
28.8.2017 16:24
Avatar
Jan Jenda
Člen
Avatar
Jan Jenda:31.10.2017 22:54
#include <stdio.h>
#include <stdlib.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 = 0.0;
printf("Vitejte v kalkulacce \n");
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);
if (volba == 1)
        vysledek = a + b;
else if (volba == 2)
        vysledek = a - b;
else if (volba == 3)
        vysledek = a * b;
else if (volba == 4)
        vysledek = a / b;
if ((volba > 0) && (volba < 5))
        printf("Vysledek: %lf", vysledek);
else
        printf("Neplatna volba \n");
printf("\n");
printf("Dekuji za pouziti kalkulacky");
        return (EXIT_SUCCESS);
}

Ahoj rád bych kód pochopil , ale né vše mi je jasné

  1. Proč je na začátku za výsledkem to 0.0?
  2. else a else if znamená co?
 
Odpovědět
31.10.2017 22:54
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Jan Jenda
DarkCoder:31.10.2017 23:56
  1. Proměnná výsledek je v tomto příkladu nadbytečná, neboť výrazy mohou být přímo součástí argumentu funkce printf(). Chyba to ovšem není. Tento příklad je jednoduchý, ale u složitějších příkladů by se mohlo dále s proměnnou pracovat a pak by měla svůj význam. Proměnná vysledek je lokální proměnnou a bývá zvykem tyto proměnné před použitím inicializovat na nějakou hodnotu. Neinicializovaná lokální proměnná v sobě může obsahovat různé hodnoty a může tak být příčinou chyb v programu. Jelikož se jedná o číselnou proměnnou s desetinnou čárkou (double), je třeba překladači sdělit, že se jedná o číslo s desetinou čárkou, proto je proměnná správně inicializována hodnotou 0.0 a nikoli 0.
  2. if-else-if (schody, žebřík if-else-if) je druh podmíněného příkazu užívaného pro porovnání hodnot z několika variant. Používá se obvykle u menšího počtu těchto variant, u vyššího počtu switch, které ale zase má svá omezení. if-else-if je efektivnější nežli použití samotných if. Pro zpracování potřebuje méně strojových instrukcí a zároveň, pokud je nalezena shoda, ostatní if se přeskočí.
Odpovědět
31.10.2017 23:56
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Jan Jenda
Člen
Avatar
Jan Jenda:1.11.2017 8:54

Ahoj moc děkuji DarkCoder. Ale pořád mi to není úplně jasné zkusím začít hned na začátku.

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

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

int a = 0; // do a si přiřadíme na začátku 0

if (a == 0) // pokud je a 0, dáme do něj jedničku
        a = 1;
if (a == 1) // pokud je a 1, dáme do něj nulu
        a = 0;

printf("%d", a);
        return (EXIT_SUCCESS);
}

Pod tím je napsáno, že to nefunguje. Chápu správně, že se proměnná nezamění protože to jede postupně resp. platí první podmínka dá se tam jednička, tím pádem začne platit i druhá a skončí to zase druhou.

#include <stdio.h>
#include <stdlib.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 = 0.0;
printf("Vitejte v kalkulacce \n");
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);
if (volba == 1)
        vysledek = a + b;
else if (volba == 2)
        vysledek = a - b;
else if (volba == 3)
        vysledek = a * b;
else if (volba == 4)
        vysledek = a / b;
if ((volba > 0) && (volba < 5))
        printf("Vysledek: %lf", vysledek);
else
        printf("Neplatna volba \n");
printf("\n");
printf("Dekuji za pouziti kalkulacky");
        return (EXIT_SUCCESS);
}

jaký je rozdíl mezi čisté if, a else if, a existuje ješě if else?

vlastně kdybych měl jen if, if ,if ,if a né if, else if, else if, else if nebude to to samé? Protože pokud nebude platit podmínka 1 skočí na druhou, pokud to nebude ani 2 skočí na 3, která bude platit.

 
Odpovědět
1.11.2017 8:54
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Jan Jenda
DarkCoder:1.11.2017 13:05
  1. Přesně tak, ke změně proměnné nedojde. Tím, jak se jednotlivé příkazy vyhodnocují postupně, se provedou obě podmínky a proměnná tak zůstane nezměněna.
  2. Rozdíl jsem popsal na konci předchozího příspěvku. if-else-if je efektivnější nežli použití samotných if. Pro zpracování potřebuje méně strojových instrukcí a zároveň, pokud je nalezena shoda, ostatní if se přeskočí.

Mějme následující dva úryvky kódu a podívejme se co se stane, když volba bude 2.

if (volba == 1) vysledek = a + b;
if (volba == 2) vysledek = a - b;
if (volba == 3) vysledek = a * b;
if (volba == 4) vysledek = a / b;
if ((volba > 0) && (volba < 5)) printf("Vysledek: %lf", vysledek);
if ((volba <= 0) && (volba >= 5)) printf("Neplatna volba \n");

Zde se budou postupně provádět a vyhodnocovat všechny podmínky, i tehdy když už je výsledek známý. Přiřadí proměnné vysledek rozdíl dvou hodnot a zobrazí jej. Na tuto verzi zapomenout a neužívat - neefektivní.

kdežto:

if (volba == 1)         vysledek = a + b;
else if (volba == 2) vysledek = a - b;
else if (volba == 3) vysledek = a * b;
else if (volba == 4) vysledek = a / b;
if ((volba > 0) && (volba < 5)) printf("Vysledek: %lf", vysledek);
else printf("Neplatna volba \n");

Zde se budou postupně provádět a vyhodnocovat všechny podmínky, dokud není podmínka platná. Zbylé podmínky (test na rovnost 3 a 4) se přeskočí, kromě té kde vypisuji výsledek. Přiřadí proměnné vysledek rozdíl dvou hodnot a zobrazí jej.

pro srovnání:

switch(volba){
    case 1:
        printf("Vysledek: %f\n", a+b);
        break;
    case 2:
        printf("Vysledek: %f\n", a-b);
        break;
    case 3:
        printf("Vysledek: %f\n", a*b);
        break;
    case 4:
        printf("Vysledek: %f\n", a/b);
        break;
    default: printf("Neplatná volba \n");
}

Zde nepotřebuji proměnnou a ještě mi odpadlo vyhodnocování další podmínky.

Odpovědět
1.11.2017 13:05
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
DarkCoder:1.11.2017 20:46

Chyba v mém předchozím příspěvku. Pro výpis proměnné typu double se pochopitelně u funkce printf() používá specifikátor formátu %f nikoli %lf. Tato odlišnost je pouze u funkce scanf().

Odpovědět
1.11.2017 20:46
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Tomas Bahensky:9.2.2018 16:23

Ahoj mam dotaz ohledne funkce switch. U prikladu se Simpsonovymi je vzdy u "case" uvedena dana volba v jednoduchych zavorkach....case 'a'....case 'b'...atd. Pokud je tam nedam, hlasi mi to chybu a program se ani nespusti.
Kdyz dam mezi zvorky cislo, tak to funguje, ovsem cislo bez zavorek opet nefunguje respektive compiler to prechrousta, spusti se program, ale dana volba nezobrazi zadny vysledek.
No ale v kapitole 5 u prikladu s kalkulackou za vyuziti switch, je vzdy pouzito cislo (case 1, case 2) bez zavorek a vse funguje bez problemu.

Muzete mi prosim nekdo vysvetlit cim to je pripadne odkazat na nejaky clanek, kde je to vysvetleno?

Diky!

 
Odpovědět
9.2.2018 16:23
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Tomas Bahensky
DarkCoder:9.2.2018 17:08

Příklad se Simpsonovými jsem neviděl, nicméně vysvětlení lze podat i bez něj.

Příkaz switch pracuje s celočíselnými proměnnými (typ int a typ char). Typ char lze použít i tam kde postačí malé celé číslo. Každý znak má svoji hodnotu, v jazyce C se vychází s ASCII tabulky. Konkrétně:

case 1: není totéž co     case '1':

V prvním případě se porovnává řídící proměnná příkazu switch s hodnotou 1, ve druhém případě se řídící proměnná porovnává s hodnotou 49 (ASCII hodnota znaku '1' je 49);

Proto je důležité a je třeba rozlišovat to, zda v case použiji jednoduché uvozovky nebo ne.

Oba způsoby je možno kombinovat ale je třeba znát hodnotu znaku. Např. následující úryvek kódu není správný

char c;

switch(c) {
  case 'A': printf("Pismeno A"); break;
  case 65: printf("Cislo 65"); break;
}
Odpovědět
9.2.2018 17:08
"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 43.