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 – 5. diel - Podmienky (vetvenia) 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
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

Avatar
Marek Uhlik
Člen
Avatar
Odpovedá 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

Avatar
Lukáš Rác
Člen
Avatar
Lukáš Rác:28.8.2017 16:24

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

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?
Avatar
DarkCoder
Člen
Avatar
Odpovedá 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čí.
Odpovedať
"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.

Avatar
DarkCoder
Člen
Avatar
Odpovedá 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.

Odpovedať
"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().

Odpovedať
"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!

Avatar
DarkCoder
Člen
Avatar
Odpovedá 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;
}
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é 10 správy z 43.