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

Diskuze – Lekce 3 - Proměnné a typový systém 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
DarkCoder
Člen
Avatar
Odpovídá na Samuel Kodytek
DarkCoder:5.10.2016 20:55

Více méně první díl výkladu jazyka C a hned v něm spousta nepřesností, neúplných informací a učení špatným návykům! Některé už zde padly v diskuzi, přesto nebyly opraveny. Nováček tak už na začátku pobírá informace, které ho učí nesprávným postupům a zvykům, což by se stávat nemělo.

Takže pojďme na to:

Proměnné
To co zpracovává informace ohledně datových typů není jazyk C ale překladač jazyka C. Jazyk C a obecně programovací jazyk je pouze soubor pravidel a prostředek pro zápis algoritmů.

Program vypisující proměnnou
Už to zde v diskuzi padlo a za více než dva roky to nebylo opraveno. Zadání programu by se nemělo lišit od toho, co se skutečně v programu vypisuje (viz hodnota 8 a 56).
Pokud pracujeme s konstantami, je třeba hlídat si datové typy. Hodnota 56.6 sama o sobě není hodnotou float ale double, která je ovšem konvertována v přiřazovacím příkaze na typ float. Pokud chci zadat konstantu jako float, je třeba ji zapsat jako 56.6F. Program se však chová správně neboť typ pravé strany se převádí na typ levé strany.
Pro výpis proměnné typu float se užívá %f nikoli %g. %g popřípadě %G se používá pro výpis normálního nebo semilogaritmického tvaru, podle toho, který je kratší.

program papoušek
Zde je toho opravdu dost špatně. Funkce scanf() se nepoužívá pro načítání znaků! Důvodem je, že načítání se provádí dokud nestiskneme klávesu Enter. Na obrazovce se vypíše první znak ale ostatní znaky zůstávají ve vstupním buferu, což může být a dost často je, nežádoucí pro další vstupní operace. Pro načítání znaků se užívají funkce getchar(), getche(), getch(). Dále proměnná a je definována jako znaková proměnná, ne jako pole znaků!!! Jak do této proměnné, kam se vejde pouze jeden znak, chcete uložit řetězec znaků?! Dále nepřesnosti v popise, celé číslo místo znakové proměnné a /n místo \n pro výpis nového řádku.

Program zdvojnásobovač
Existuje pouze ASCII (American Standard Code for Information Interchange) ne ASCI.

Jednoduchá kalkulačka
Pokud inicializujeme proměnnou s desetinnou čárkou typu float, nelze psát

float a = 12; // spatne

ale

float a = 12.0F;

je třeba udávat číslo s desetinnou tečkou a případným sufixem. Ve vašem případě dochází v příkazu k implicitnímu přetypování z typu int na float! O použití escape sekvence %g a %f viz výše v odstavci - Program vypisující proměnnou.

Při výkladu je třeba být důsledný, vyvarovat se chybných informací a špatným návykům.

Odpovědět
5.10.2016 20:55
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na DarkCoder
David Hartinger:13.2.2017 18:33

Program Papoušek jsem odstranil, Monarezio se jej snažil portovat z příkladů z vyšších jazyků, kde se dá rozumně načítat i text, ale bohužel tady byl spíše matoucí. Nějaké tvé připomínky jsem zapracoval, ale dost z nich mi přijde zbytečných a určitě bych neoznačoval to, že se někde přetypuje hodnota za špatný návyk, vždyť se to kompiluje.

Odpovědět
13.2.2017 18:33
New kid back on the block with a R.I.P
Avatar
DarkCoder
Člen
Avatar
Odpovídá na David Hartinger
DarkCoder:13.2.2017 19:39

Je skvělé, že se zapracovalo na korektuře. Je mi jasné, že není v silách pročítat a opravovat vše co se zde na fóru napíše. Příspěvků je opravdu hodně, což je jedině dobře. Ale pro výukové bloky, jakými tutoriály bezesporu jsou, je to nezbytné. Nováčci to jistě ocení a rozhodně to přispěje ke zlepšení jejich dovedností v daném tématu.

K programu Papoušek, myšleno to bylo určitě dobře, ale přesně jak píšeš, bylo to matoucí. Co se týká implicitního přetypování, ano, kompiluje se to, ale programátor by měl vědět, že dochází k manipulaci s jeho proměnnou. Je to důležité a to hned ze dvou důvodů. Tím prvním je, že v určitých situacích může dojít k určité ztrátě informace, která může být důležitá a tato chyba se pak velmi těžko dohledává. Ta druhá je naučit programátora pozornosti a korektnímu přebírání argumentů funkci správných typů. Jak tak totiž sleduji příspěvky a zejména zdrojové kódy zde na fóru, je to neřest, která se vyskytuje opravdu v hojné míře. Vskutku málokdo si uvědomuje, jak důležité je odladění. Varovné hlášky kompilátoru mají svůj účel, proto jsem se o tom ve svém příspěvku zmínil.

Zde bych chtěl určitě vyzdvihnout uživatele Martin Dráb, který opravdu této problematice věnuje zvýšenou pozornost, bez které by funkčnost skutečného (náročného) projektu byla velmi nestabilní.

Každopádně skvělé, že si se do toho pustil a díky za reakci.

Odpovědět
13.2.2017 19:39
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Filip Kapajčík:18.2.2018 19:54

Zdravím, chcel by som poďakovať tvorcom za tento web, som akurát v prvom ročníku na aplikovanej informatike a vaše lekcie mi veľmi pomáhajú. Teší ma že sú na svete ľudia ktorý chcú odovzdať svoje vedomosti aj nám ostatným :)

 
Odpovědět
18.2.2018 19:54
Avatar
0
Člen
Avatar
0:20.10.2019 8:52

Nevíte někdo co dělám špatně???

 
Odpovědět
20.10.2019 8:52
Avatar
Odpovídá na 0
Neaktivní uživatel:20.10.2019 10:39

Řekl bych, že se snažíš spustit .ico

Odpovědět
20.10.2019 10:39
Neaktivní uživatelský účet
Avatar
Guláš
Člen
Avatar
Guláš:1.12.2019 19:50

Proč se ukazuje operace: sčítaní,dělení atd před výsledkem ,když jsme to napsaly u pritnf na konec?

 
Odpovědět
1.12.2019 19:50
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Guláš
DarkCoder:1.12.2019 20:20

Funkce printf() je tvořena formátovacím řetězcem a dalšími argumenty. Počet dalších argumentů musí odpovídat počtu specifikací formátu ve formátovacím řetězci.

Máme-li např.

printf("Soucet: %f \n", soucet);

Tak to říká, že se vypíše slovo Soucet: a poté se očekává výraz s desetinnou čárkou. soucet na konci říká, že právě tato proměnná se vypíše na pozici kde se specifikace formátu %f nachází.

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

Dík už to chápu.

 
Odpovědět
2.12.2019 16:07
Avatar
Petricek58
Člen
Avatar
Petricek58:10.1.2020 23:06

Dobrý den,
opsal jsem kód kalkulačky a nefungoval mi, tak po několika minutách hledání jsem zkopíroval váš kód a vložil jej místo toho svého a zase chyba.
https://ctrlv.cz/xqrt

 
Odpovědět
10.1.2020 23:06
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 70.