Office week Slevový týden - Květen
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
30 % bodů zdarma na online výuku díky naší Slevové akci!

Lekce 3 - Proměnné a typový systém v Céčku

Z minulé lekce, Instalace NetBeans a kompilátoru C, již umíme pracovat s NetBeans IDE a vytvořit konzolovou aplikaci. Dnes se v tutoriálu podíváme na tzv. typový systém, ukážeme si základní datové typy a práci s proměnnými. Výsledkem budou 3 jednoduché programy včetně kalkulačky.

Proměnné

Než začneme řešit datové typy, pojďme se shodnout na tom, co je to proměnná (programátoři mi teď jistě odpustí zbytečné vysvětlování). Určitě znáte z matematiky proměnnou (např. x), do které jsme si mohli uložit nějakou hodnotu, nejčastěji číslo. Proměnná je v informatice naprosto to samé, je to místo v paměti počítače, kam si můžeme uložit nějaká data (jméno uživatele, aktuální čas nebo databázi článků). Toto místo má podle typu proměnné také vyhrazenou určitou velikost, kterou proměnná nesmí přesáhnout (např. číslo nesmí být větší než 32 000).

Proměnná má vždy nějaký datový typ, může to být číslo, znak, text a podobně. Záleží na tom, k čemu ji chceme používat. Většinou musíme před prací s proměnnou tuto proměnnou nejdříve tzv. deklarovat, čili říci jazyku jak se bude jmenovat a jakého datového typu bude (jaký v ní bude obsah). Jazyk ji v paměti založí a teprve potom s ní můžeme pracovat. Podle datového typu proměnné si ji jazyk dokáže z paměti načíst, modifikovat, případně ji v paměti založit. O každém datovém typu jazyk ví, kolik v paměti zabírá místa a jak s tímto kusem paměti pracovat.

Typový systém

Existují dva základní typové systémy: statický a dynamický:

  • Dynamický typový systém nás plně odstiňuje od toho, že proměnná má vůbec nějaký datový typ. Ona ho samozřejmě vnitřně má, ale jazyk to nedává najevo. Dynamické typování jde mnohdy tak daleko, že proměnné nemusíme ani deklarovat. Jakmile do nějaké proměnné něco uložíme a jazyk zjistí, že nebyla nikdy deklarována, sám ji založí. Do té samé proměnné můžeme ukládat text, potom strukturu uživatele a potom desetinné číslo. Jazyk se s tím sám popere a vnitřně automaticky mění datový typ. V těchto jazycích jde vývoj rychleji díky menšímu množství kódu. Zástupci jsou např. PHP nebo Ruby.
  • Statický typový systém naopak striktně vyžaduje definovat typ proměnné a tento typ je dále neměnný. Jakmile proměnnou jednou deklarujeme, není možné její datový typ změnit. Jakmile se do čísla pokusíme uložit strukturu uživatel, dostaneme vynadáno.

Céčko je staticky typovaný jazyk, všechny proměnné musíme nejprve deklarovat s jejich datovým typem. Nevýhodou je, že díky deklaracím je zdrojový kód poněkud objemnější a vývoj pomalejší. Obrovskou výhodou však je, že nám kompilátor před spuštěním zkontroluje, zda všechny datové typy sedí. Dynamické typování sice vypadá jako výhodné, ale zdrojový kód není možné automaticky kontrolovat a když někde očekáváme objekt uživatel a přijde nám tam místo toho desetinné číslo, odhalí se chyba až za běhu a interpret program shodí. Naopak céčko nám nedovolí program ani zkompilovat a na chybu nás upozorní (to je další výhoda kompilace).

Pojďme si nyní něco naprogramovat, ať si nabyté znalosti trochu osvojíme, s teorií budeme pokračovat až příště. Řekněme si nyní tři základní datové typy:

  • Celá čísla: int
  • Desetinná čísla: float
  • Znak (písmeno, text se naučíme později): char

Program vypisující proměnnou

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Zkusíme si nadeklarovat celočíselnou proměnnou a, dosadit do ní číslo 56 a její obsah vypsat do konzole. Založte si nový projekt a pojmenujte ho Vypis (i ke všem dalším příkladům si vždy založte nový projekt). Kód samozřejmě píšeme jako minule do těla funkce main(), čili ji zde již nebudu opisovat.

int a;
a = 8;
printf("%d", a);

První příkaz nám nadeklaruje novou proměnnou a datového typu int, proměnná tedy bude sloužit pro ukládání celých čísel. Druhý příkaz provádí přiřazení hodnoty do proměnné, slouží k tomu operátor "rovná se". Poslední příkaz je nám známý, vypíše do konzole obsah proměnné a. Všimněte si %d v uvozovkách, tím definujeme jaký typ proměnné to má vypsat, %d označuje celá čísla (jako decimal).

Konzolová aplikace
8

Pro desetinnou proměnnou by kód vypadal takto:

float a;
a = 56.6F;
printf("%f", a);

Je to téměř stejné jako s celočíselnou, ovšem za hodnoty float píšeme ještě znak F. Jako desetinný oddělovač používáme tečku a změníme %d na %f (jako float), abychom řekli počítači, že chceme vypisovat desetinné číslo.

Program zdvojnásobovač

Minulý program byl poněkud nudný, zkusme nějak reagovat na vstup od uživatele.

Z konzole jsme ještě nezkoušeli nic načítat. Slouží k tomu funkce scanf(), která uživateli umožní zadat do konzole řádku textu a nám do naší proměnné uloží zadanou hodnotu. Abychom si to zkusili, založíme si nový projekt s názvem Zdvojnasobovac. Nyní se přesuňme k samotnému kódu programu a do funkce main() píšeme:

int a;
printf("Zadejte číslo k zdvojnásobení: ");
scanf("%d", &a);
a = a * 2;
printf("%d", a);

To už je trochu zábavnější :) Zdvojnásobovač si vyžádá na vstupu číslo a to poté zdvojnásobí a vypíše. První řádek je jasný, deklaruje proměnnou a typu celé číslo. V céčku bychom všechny proměnné měli definovat na začátku.

Konzolová aplikace
Zadejte číslo k zdvojnásobení: 1024
2048

Do a se přiřadila hodnota z funkce scanf() z konzole, tedy to, co uživatel zadal. Znak & si vysvětlíme později, prozatím se spokojíme s tím, že ho funkce scanf() vyžaduje, aby hodnotu mohla uložit do nějaké proměnné. Opět jsme využili sekvenci %d, čímž říkáme, že vstup se má načíst jako celé číslo. Jen tak mimochodem, znak bychom načetli nebo vypsali pomocí sekvence %c (jako char).

Jednoduchá kalkulačka

Ještě jsme nepracovali s desetinnými čísly, zkusme si napsat slibovanou kalkulačku. Bude velmi jednoduchá, na vstup přijdou dvě čísla, program poté vypíše výsledky pro sčítání, odčítání, násobení a dělení.

float a;
float b;
float soucet;
float rozdil;
float soucin;
float podil;
printf("Vítejte v kalkulačce \n");
printf("Zadejte první číslo: \n");
scanf("%f", &a);
printf("Zadejte druhé číslo: \n");
scanf("%f", &b);
soucet = a + b;
rozdil = a - b;
soucin = a * b;
podil = a / b;
printf("Součet: %f \n", soucet);
printf("Rozdíl: %f \n", rozdil);
printf("Součin: %f \n", soucin);
printf("Podíl: %f \n", podil);

Konzolová aplikace
Vítejte v kalkulačce
Zadejte první číslo:
5
Zadejte druhé číslo:
7
Součet: 12.000000
Rozdíl: -2.000000
Součin: 35.000000
Podíl: 0.714286

Vidíme, že v C můžeme použít nám známé aritmetické operace (+, -, \, *, /). C navíc definuje další operaci (%), která značí zbytek po celočíselným dělení. Všimněte si, že místo %c nebo %d používáme %f. To značí, že chceme použít float neboli desetinná čísla. Pokud by vás zajímaly všechny znaky, které můžete použít, najdete vysvětlení v dokumentaci.

Všechny programy máte samozřejmě opět v příloze, zkoušejte si vytvářet nějaké podobné, znalosti již k tomu máte :)

V příští lekci, Řešené úlohy k 1.-3. lekci Céčka, se budeme datovým typům věnovat podrobněji.

V následujícím cvičení, Řešené úlohy k 1.-3. lekci Céčka, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Stáhnout

Staženo 1763x (105.2 kB)

 

 

Článek pro vás napsal Samuel Kodytek
Avatar
Jak se ti líbí článek?
14 hlasů
Autor se věnuje všem jazykům okolo JVM. Rád pomáhá lidem, kteří se zajímají o programování. Věří, že všichni mají šanci se naučit programovat, jen je potřeba prorazit tu bariéru, který se říká lenost.
Předchozí článek
Instalace NetBeans a kompilátoru C
Všechny články v sekci
Základní konstrukce jazyka C
Miniatura
Následující článek
Řešené úlohy k 1.-3. lekci Céčka
Aktivity (20)

 

 

Komentáře
Zobrazit starší komentáře (45)

Avatar
Reaktivní uživatel:20.10.2019 10:39

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

Odpovědět
20.10.2019 10:39
Kdo je připraven, toho zaskočí něco jiného
Avatar
Vojta Opravil: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 Vojta Opravil
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
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Odpovídá na DarkCoder
Vojta Opravil: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. ledna 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. ledna 23:06
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Virlupus
Překladatel
Avatar
Odpovídá na Petricek58
Virlupus:11. ledna 16:04

Ať koukám, jak koukám, tak v kódu chyba není. Možná návratovou konstantu nezná překladač. Každopádně si zkus vypsat hodnoty proměnných po scanf("%f", &data).

Editováno 11. ledna 16:05
 
Odpovědět
11. ledna 16:04
Avatar
Petricek58
Člen
Avatar
Odpovídá na Virlupus
Petricek58:11. ledna 19:20

Děkuji za radu, nevím kde byla chyba, ale reinstaloval jsem všechny programy a projel internet jestli někdo neměl stejný problém. Nakonec jsem si otevřel projekt HelloWorld a smazal ten jeden řádek kódu a zkopíroval jsem do něj tu kalkulačku a potom to už běželo, takže jsem pravděpodobně udělal chybu při vytváření projektu. Ještě jednou děkuji za radu.

 
Odpovědět
11. ledna 19:20
Avatar
Virlupus
Překladatel
Avatar
Odpovídá na Petricek58
Virlupus:11. ledna 19:36

Není zač, je jsem se pokusil najít nějaký překlep v kódu a marně. Tedy chyba musela být jinde.

Osobně používám pro C i C++ QtCreator, kde mám záruku přesné kompilace a žádných konfliktů s ostatními projekty. Apache NetBeans je bezva prostředí, ale spíše jej užívám pro PHP na lokálním serveru.

Pravdou je, že MS "W" občas dělá potíže a možná proto by bylo fajn používat jejich IDE -- Visual Studio nechci dělat propagaci, ale bohužel musím. Tedy jestli nechceš platit za dost dobrý IDE od JetBrains

No jo no, moc jsem nepomohl :-D

 
Odpovědět
11. ledna 19:36
Avatar
Vojta Opravil:21. ledna 5:37

jak a co přesně dělá funkce scanf??

 
Odpovědět
21. ledna 5:37
Avatar
Odpovídá na Vojta Opravil
Matěj Přerovský:22. ledna 10:58
scanf()

Funguje, že načte vstup a převede do požadovaného typu.

Odpovědět
22. ledna 10:58
42
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. Zobrazit vše