načítání...
nákupní košík
Košík

je prázdný
a
b

Kniha: C++ -- Výukový kurz - David Matoušek

C++ -- Výukový kurz
-13%
sleva

Kniha: C++ -- Výukový kurz
Autor:

Zaujal vás programovací jazyk C++? Hledáte ucelený zdroj informací, jak jej ovládnout? Výukový kurz vás provede jazykem C++ od úplných začátků až po pokročilé postupy a nově nabyté ... (celý popis)
Titul doručujeme za 4 pracovní dny
Vaše cena s DPH:  690 Kč 600
+
-
rozbalKdy zboží dostanu
20
bo za nákup
rozbalVýhodné poštovné: 29Kč
rozbalOsobní odběr zdarma

hodnoceni - 0%hodnoceni - 0%hodnoceni - 0%hodnoceni - 0%hodnoceni - 0%   celkové hodnocení
0 hodnocení + 0 recenzí

Specifikace
Nakladatelství: » Computer press
Médium / forma: Tištěná kniha
Rok vydání: 2018-03-06
Počet stran: 600
Rozměr: 167 x 225 mm
Úprava: 600 stran : ilustrace
Vydání: 1. vydání
Vazba: brožovaná lepená
ISBN: 9788025149065
EAN: 9788025149065
Ukázka: » zobrazit ukázku
Popis

Zaujal vás programovací jazyk C++? Hledáte ucelený zdroj informací, jak jej ovládnout? Výukový kurz vás provede jazykem C++ od úplných začátků až po pokročilé postupy a nově nabyté znalosti pak budete moct uplatnit ve vlastních projektech. Zkušený autor s bohatými zkušenostmi vás seznámí se všemi důležitými prostředky, které jazyk C++ programátorům nabízí. Naučíte se využívat datové typy, operátory, větvit program pomocí cyklů a podmínek, řídit tok programu, využívat možností objektově orientovaného programování a postupně budovat komplexní programy. Veškerý výklad probíhá na praktických příkladech, které si můžete hned sami vyzkoušet. V příloze najdete základní přehled řadicích algoritmů. Publikace vás mimo jiné seznámí s tématy: * Proměnné, datové typy, operátory a výrazy * Řídicí a iterační příkazy * Funkce, ukazatele a odkazy * Pole a ukazatelová aritmetika * Struktury a práce s řetězci * Direktivy, paměťové třídy a modulární programování * Dědičnost a zpracování výjimek * Přetěžování operátorů * Šablony a práce se soubory * Parametry a návratová hodnota O autorovi: David Matoušek se věnuje programování v jazyce C++ již více než 20 let. Programuje aplikace pro operační systém Windows pomocí nástrojů C++ Builder, Visual C++ a Dev-C++, kromě toho se zabývá i programováním mikrokontrolérů řad Atmel, PIC a 8051. V současné době působí na Fakultě elektrotechniky a informatiky Univerzity Pardubice. (výukový kurz)

Předmětná hesla
Kniha je zařazena v kategoriích
David Matoušek - další tituly autora:
Recenze a komentáře k titulu
Zatím žádné recenze.


Ukázka / obsah
Přepis ukázky

63

KAPITOLA 3

Datové typy

pro reálná čísla

V kapitole 2 jsme se seznámili s celočíselnými datovými typy. Pro uložení číselných hodnot

ve velkém rozsahu obvykle nepožadujeme tak velkou přesnost, jakou nám poskytují celá čísla.

Obvykle vystačíme s přesností například 6 desítkových číslic.

Pro reprezentaci reálných čísel pak používáme datové typy obecně označované jako čísla

v plovoucí řádové čárce (anglicky floatoint). Takové číslo je reprezentováno dvěmasložkami: mantisou a exponentem. Mantisa (M) je hodnota čísla, exponent (E) určuje řád. Viz tento

předpis (pro desítkovou soustavu):

E

10Mčísloreálné ⋅=

Příklady zápisů čísel v tomto formátu: 1,602·10

-19

(elementární náboj); 6,023·10

23

(Avogadrova konstanta).

Standard IEEE 754

Tento standard byl vyvinut již roku 1985 a stal se obecným standardem pro čísla v plovoucí

řádové čárce. Postupně bylo zavedeno několik formátů čísel v plovoucí řádové čárce. Běžně se

používají formáty šíře 16, 32, 64, 80, 128, 256 bitů. Na úrovni jazyka C/C++ se pak používají

formáty označované jako single, double a extended:

V této kapitole:

„ Vlastnosti datových typů

pro reálná čísla v jazyce C/

C++

„ Vstupně/výstupní operace

z pohledu reálných čísel

„ Aritmetické operace

s reálnými čísly

„ Implicitní a explicitní typové

konverze

„ Priorita a asociativita dosud

probraných operátorů

„ Funkce z matematické

knihovny


64

KAPITOLA 3 Datové typy pro reálná čísla

„ Single – jednoduchá přesnost, šíře 32 bitů, hodnotu čísla stanovíme pomocí vzorce:

E- 721S

2M1,1)(A ⋅⋅−= .

Obrázek 3.1 Formát 32bitového čísla v plovoucí řádové čárce (single)

„ Double – dvojnásobná přesnost, šíře 64 bitů, hodnotu čísla stanovíme pomocí vzorce:

E- 3201S

2M1,1)(A ⋅⋅−= .

Obrázek 3.2 Formát 64bitového čísla v plovoucí řádové čárce (double)

„ Extended – rozšířená dvojnásobná přesnost, šíře 80 bitů, hodnotu čísla stanovímepo

mocí vzorce:

E- 61483S

2M1,1)(A ⋅⋅−= .

Obrázek 3.3 Formát 80bitového čísla v plovoucí řádové čárce (extended)

V obrázcích 3.1 až 3.3 mají symboly následující význam:

„ s – znaménko čísla,

„ E – exponent uložený v posunutém kódu,

„ M – mantisa uložená v kódu se skrytou jedničkou (celá mantisa je 1,M), tímto způsobem

se rozsah mantisy zvýší o jeden bit.

Některé kombinace jsou vyhrazeny pro reprezentaci zvláštních stavů, například:

„ nekonečno – E = samé 1, M = samé 0, s = 0/1 (kladné i záporné nekonečno),

„ NaN (Not A Number, česky není číslo) – E = samé 1, M = nenulové číslo, používá se pro

uložení výsledku pro případy operací: 0/0, ∞/∞, √(–1), ...

Realizace operací s čísly v plovoucí řádové čárce vyžaduje značnou výpočetní podporu.

Připomeňme, že jednodušší procesory nemají podporu pro operace s čísly v plovoucí řádové

čárce implementovánu na hardwarové úrovni. Veškeré výpočty s těmito čísly jsou pakreali

zovány programově a představují pro procesor nezanedbatelné zpoždění.

Naproti tomu procesory doplněné koprocesorem nebo procesory s integrovanou jednotkou

FPU (floatoint unit, jednotka pro výpočty v plovoucí řádové čárce) mají pro práci s čísly

s E M

8 bitĤ 23 bitĤ1 b

Ĝádová þárka pro mantisu i exponent

s E M

11 bitĤ 52 bitĤ1 b

s E M

15 bitĤ 64 bitĤ1 b


Vlastnosti datových typů pro reálná čísla v jazyce C/C++

65

v  plovoucí řádové čárce hardwarovou podporu, takže doba výpočtu může být srovnatelná

s celočíselnou aritmetikou.

Vlastnosti datových typů pro reálná čísla

v jazyce C/C++

K dispozici jsou tři datové typy pro operace s čísly v plovoucí řádové čárce: fl oat, double a long

double, které se liší oborem hodnot. Tyto typy se také liší velikostí v bajtech a přesností, která

je určena počtem platných cifer (číslic).

Tabulka 3.1 Vlastnosti datových typů pro reálná čísla

Typ Přibližný obor hodnot

fl oat odpovídá single (viz obr. 3.1),

velikost: 4 bajty,

přesnost: 6 platných desítkových cifer

±1,2×10

–38

 až ±3,4×10

+38

double odpovídá double (viz obr. 3.2),

velikost: 8 bajtů,

přesnost: 15 platných desítkových cifer

±2,2×10

–308

 až ±1,8×10

+308

long double odpovídá extended (viz obr. 3.3),

velikost: 16 bajtů,

přesnost: 18 platných desítkových cifer

±3,4×10

–4932

 až ±1,2×10

+4932

Charakteristiky těchto typů jsou stručně shrnuty v tabulce 3.1. Jelikož jsou mantisa a exponent

uloženy v binární podobě, je uváděn pouze přibližný obor hodnot v desítkové soustavě.Podobně uváděná přesnost mantisy v počtu desítkových cifer je zaokrouhlena dolů na nejbližší

celé číslo. Rovněž můžeme vysledovat jistou nesymetrii oboru hodnot pro nejnižší a nejvyšší

hodnoty.

Poněkud zvláštní je typ long double. Řada implementací jazyka C/C++ používá pro realizaci

tohoto typu rozšířenou dvojitou přesnost (extended), která historicky pochází z koprocesoru

Intel 8087. Tento typ standardně zabírá 80 bitů, tedy 10 bajtů. Z principiálních důvodů je však

pro proměnnou long double tradičně alokováno ne 10, ale 16 bajtů. Důvodem je tzv. zarov-

návání paměti. Přístup procesoru do datové paměti totiž probíhá obvykle v blocích, které jsou

násobkem 4 bajtů.

Některé překladače řeší tento problém implementací dvou variant pro reálná čísla v přesnosti

větší než double. Například se můžeme setkat s typy __fl oat80 a __fl oat128. Typ __fl oat80

odpovídá přesnosti extended, přesto však v paměti zabírá 16 bajtů. Typ __fl oat128 odpovídá

přesnosti quadruple (čtyřnásobná přesnost), v paměti zabírá také 16 bajtů.


66

KAPITOLA 3 Datové typy pro reálná čísla

Zápis literálů a charakteristiky typů

Formát zápisu reálných literálů v desetinném tvaru se vyznačuje používáním tečky místoobvyklé desetinné čárky, například: 1.2345. Reálné literály lze také zapisovatv semilogaritmickém tvaru, například: 1.602E-19.

Literály reálných čísel jsou standardně brány ve dvojnásobné přesnosti (double). Pro rozlišení

literálů v různé přesnosti používáme přípony: F nebo f pro typ fl oat, D nebo d pro typ double

a L nebo l pro typ long double.

Přesné charakteristiky datových typů pro čísla v plovoucí řádové čárce lze získat pomocísymbolů z hlavičkového souboru FLOAT.H (resp. CFLOAT v jazyce C++). Vybrané symboly jsou

uvedeny v tabulce 3.2.

Tabulka 3.2 Vybrané charakteristiky čísel v plovoucí řádové čárce

Symbol Význam

FLT_DIG počet platných desítkových cifer typu fl oat

FLT_MIN minimální hodnota typu fl oat

FLT_MAX maximální hodnota typu fl oat

DBL_DIG počet platných desítkových cifer typu double

DBL_MIN minimální hodnota typu double

DBL_MAX maximální hodnota typu double

LDBL_DIG počet platných desítkových cifer typu long double

LDBL_MIN minimální hodnota typu long double

LDBL_MAX maximální hodnota typu long double Níže je doplněn krátký program, který pro každý z uvedených typů vypíše postupně: velikost v  bajtech, počet platných desítkových číslic, minimální a  maximální hodnotu. Můžete tyto údaje porovnat s tabulkou 3.1. Dále je deklarována globální konstanta pi (není deklarována v rámci žádné funkce, proto je k dispozici v celém zdrojovém souboru). Hodnota této konstanty odpovídá Ludolfovu číslu π. Nakonec jsou vypsány velikosti typů __fl oat80 a __fl oat128. PROG_01: #include <iostream> #include <fl oat.h> using namespace std; const double pi=3.14159265; int main(int argc, char** argv) { cout<<“sizeof(fl oat)=“<


Vlastnosti datových typů pro reálná čísla v jazyce C/C++

67

cout<<“FLT_MAX=“<

cout<

cout<<“sizeof(double)=“<

cout<<“DBL_DIG=“<

cout<<“DBL_MIN=“<

cout<<“DBL_MAX=“<

cout<

cout<<“sizeof(long double)=“<

cout<<“sizeof(__fl oat128)=“<

return 0;

}

Výpis programu v konzoli:

sizeof(fl oat)=4

FLT_DIG=6

FLT_MIN=1.17549e-038

FLT_MAX=3.40282e+038

sizeof(double)=8

DBL_DIG=15

DBL_MIN=2.22507e-308

DBL_MAX=1.79769e+308

sizeof(long double)=16

LDBL_DIG=18

LDBL_MIN=3.3621e-4932

LDBL_MAX=1.18973e+4932

pi=3.14159

sizeof(__fl oat80)=16

sizeof(__fl oat128)=16

Poznámka: Výpis proměnné pi je zaokrouhlen na 6 cifer přesto, že typ double má přesnost 15

cifer. Jedná se pouze o výchozí nastavení formátu pro výpis reálných čísel. Níže se dozvíme, jak

lze formát výpisu upravit.

Poznámka: Výpis proměnné pi je zaokrouhlen na 6 cifer přesto, že typdouble má přesnost 15

cifer. Jedná se pouze o výchozí nastavení formátu pro výpis reálných čísel. Níže se dozvíme, jak

lze formát výpisu upravit.


68

KAPITOLA 3 Datové typy pro reálná čísla

Vstupně-výstupní operace z pohledu

reálných čísel

Informace ke vstupně-výstupním operacím z kapitoly 2 můžeme nyní rozšířit o přehleddalších manipulátorů a doplnit informacemi, které platí pro reálná čísla.

Při výpisu hodnoty můžeme nastavit parametry, které určí, jak přesně výpis proběhne:

„ šířka – určuje minimální počet znaků, které se mají vypsat. Uvažujme například výpis

čísla 56 na 5 míst. V tomto případě je třeba přidat další 3 znaky, aby celková šířkavýpisu byla 5 znaků. Znak, který se použije jako výplň, je obvykle mezera (je možné jej ale

změnit pomocí parametru výplňový znak). Pokud uvažujeme výpis čísla 56 v šířce 0,vyíše se prostě 56 (výpis hodnoty nesmí být zkreslen). Šířku nastavuje manipulátor setw.

„ přesnost  –  určuje počet číslic za  desetinnou tečkou, které se zobrazí. Například výpis

čísla π (3,14159265 ...) při šířce 5 a přesnosti 3 vypadá takto: 3.142 (při výpisu probíhá

nezbytné zaokrouhlení); platí pro formáty fi xed a scientifi c. Přesnost nastavujemaniulátor setprecision.

„ výplňový znak  –  určuje znak, který se použije jako výplň při výpisu hodnoty ve větší

šířce; jako výchozí výplňový znak je použita mezera. Výplňový znak nastavujemanipulátor setfi ll.

„ zarovnávání – určuje způsob zarovnání výpisu hodnoty a místo, kam se budou vkládat

výplňové znaky. Rozlišujeme (uvažujme výpis čísla -1 při šířce 5):

… zarovnání doleva (left) – výpis hodnoty je zarovnán doleva, výplň se vkládázprava: -1□□□,

… zarovnání doprava (right)  –  výpis hodnoty je zarovnán doprava, výplň se vkládá

zleva: □□□-1,

… mezi znaménko a hodnotu (internal) – výpis znaménka je vlevo, následují výplňové

znaky a nakonec vypisovaná hodnota: -□□□1.

Přehled běžně používaných manipulátorů pro výpis uvádí tabulka 3.3. Na začátku jsoupřiomenuty dříve popsané manipulátory endl, dec, oct a hex.

Tabulka 3.3 Přehled manipulátorů

Manipulátor

Použitelnost

pro čísla

Význam

endl celá/reálná ukončí řádek a nastaví kurzor na začátek následujícího řádku

dec celá přepne zobrazení celých čísel do desítkové soustavy

oct celá přepne zobrazení celých čísel do osmičkové soustavy

hex celá přepne zobrazení celých čísel do šestnáctkové soustavy

showpos celá/reálná zajistí zobrazení znaménka i pro nezáporná čísla (kladná čísla včetně nuly)


Vstupně-výstupní operace z pohledu reálných čísel

69

Manipulátor

Použitelnost

pro čísla

Význam noshowpos celá/reálná

vypne zobrazení znaménka pro kladná čísla

(znaménko se zobrazuje pouze pro záporná čísla) left celá/reálná přepne na zarovnávání doleva (výplň zprava) right celá/reálná přepne na zarovnávání doprava (výplň zleva) internal celá/reálná přepne na vyplnění mezi znaménkem a hodnotou fi xed reálná přepne výpis reálných čísel do tvaru s pevnou pozicí desetinné tečky scientifi c reálná přepne výpis reálných čísel do exponenciálního tvaru uppercase celá/reálná

přepne výpis čísel tak, že znaky se zobrazují jako velká písmena (týká

se výpisu celých čísel v šestnáctkové soustavě a reálných číselv exponenciálním tvaru) nouppercase celá/reálná

přepne výpis čísel tak, že znaky se zobrazují jako malá písmena (týká

se výpisu celých čísel v šestnáctkové soustavě a reálných číselv exponenciálním tvaru) setw(w) celá/reálná

nastaví šířku následujícího výpisu dle w, chybějící znaky do požadovaného

počtu jsou realizovány zvolenou výplní (pokud zadání šířky nezopakujeme

před každým výpisem, bude mít následující výpis opět šířku 0) setfi ll(f) celá/reálná nastaví výplňový znak na f (znakové literáry píšeme mezi apostrofy) setprecision(p) reálná nastaví výpis reálných čísel na počet desetinných míst daných p

Poslední tři manipulátory jsou parametrické (jsou řízeny parametrem zapsaným v závorkách). Pro použití těchto manipulátorů je nutné do zdrojového textu vložit hlavičkovýsoubor iomanip:

#include <iomanip>

Pro lepší pochopení připojujeme několik příkladů použití výše popsaných manipulátorůpomocí tabulky 3.4.

Tabulka 3.4 Příklady formátování výpisu

Příklad Výpis Vysvětlení

cout<<56; 56

normální výpis kladné hodnoty (bez

znaménka +)

cout<<-56; -56

výpis záporné hodnoty musí vždyobsahovat znaménko –

cout<

cout<

šířka 5, zarovnání doleva: po výpisu čísla

se připojí 2 mezery

cout<

šířka 5, zarovnání doprava: před výpisem čísla se vloží 2 mezery

cout<

šířka 5, zarovnání mezi: mezi znaménko

a číslice se vloží 2 mezery


70

KAPITOLA 3 Datové typy pro reálná čísla

Příklad Výpis Vysvětlení

cout<

cout<

<<3.141519265;

3.142

zobrazí se 3 číslice za desetinnou tečkou (+zaokrouhlení) cout<

3.142e+000

výpis v  exponenciálním tvaru, zobrazí se 3 číslice za desetinnou tečkou

(+zaokrouhlení) cout<

3.14200000

výpis v desetinném tvaru, 3 platnéčíslice za desetinnou tečkou, zbytek sedolní nulami do  celkové šíře 10 znaků

(zarovnání doleva) cout<

000003.142

výpis v desetinném tvaru, 3 platnéčíslice za desetinnou tečkou, vlastní výpis

předchází nuly do celkové šíře 10 znaků

(zarovnání doprava)

Aritmetické operace s reálnými čísly

Pro reálná čísla lze používat běžné aritmetické operátory stejné jako pro celá čísla. Jsou zde

však dva drobné rozdíly:

1. Operátor % (modulo, zbytek po celočíselném dělení) nemá pro aritmetiku reálných čísel

smysl, jeho použití s reálným číslem je chápáno jako chyba.

2. Operátor / (dělení) má v reálné aritmetice smysl reálného dělení, tedy například výraz

5.0/2.0 má výsledek 2,5.

Přehled operátorů použitelných pro reálná čísla je uveden v tabulkách 3.5 a 3.6. V tabulce 3.5

jsou běžné binární operátory (mají levý a pravý operand), v tabulce 3.6 jsou unární operátory

(mají pouze jeden operand).

Tabulka 3.5 Základní aritmetické operátory

Operátor Příklad zápisu Význam

+ x+y součet dvou čísel uložených v proměnných x a y

– x–y rozdíl dvou čísel uložených v proměnných x a y

* x*y součin dvou čísel uložených v proměnných x a y

/ x/y podíl dvou čísel uložených v proměnných x a y

Tabulka 3.6 Unární aritmetické operátory

Operátor Příklad zápisu Význam

++x kladné znaménko čísla

––y záporné znaménko čísla (násobení –1)

++ x++ nebo ++x x++ postinkrement, ++x preinkrement

–– x–– nebo ––x x–– postdekrement, ––x predekrement


Implicitní a explicitní typové konverze

71

Implicitní a explicitní typové konverze

Při práci s různými datovými typy se často nevyhneme konstrukci, kde v rámci jednohový

razu použijeme proměnné nebo literáry různých číselných typů (doplníme nyní informace

ke kapitole 2). Vznikají pak tyto otázky:

„ Jak překladač tento problém řeší?

„ V jaké aritmetice se počítá?

„ Může dojít k chybnému vyhodnocení výrazu?

Překladač může provádět dva základní typy převodů (konverzí) dat:

„ Implicitní typová konverze – slovem implicitní označujeme případ, kdy k převodudochá

zí automaticky; překladač použije implicitní převod v případě, kdy je to nezbytně nutné.

„ Explicitní typová konverze – slovem explicitní označujeme případ, kdy je převodvy

nucen programátorem tak, že ho v programu předepíše pomocí operátoru přetypování.

Implicitní typové konverze

K implicitní typové konverzi dochází v níže uvedených případech:

1. Konverze samostatných operandů: Před vyhodnocením výrazu se samostatné operandy

převádějí takto:

… char nebo short se konvertují na int,

… unsigned char nebo unsigned short se konvertují na int (pokud int můžerepre

zentovat jejich hodnotu, tzn. nepřeteče) nebo na unsigned int (pokud se nezdařila

konverze na int).

2. Binární operace: Pokud mají operandy binární operace různý typ, konvertuje se typope

randu s nižší prioritou na typ operandu s vyšší prioritou. Priorita je pevně dána (typy char

a short se nejdříve konvertují na int), viz obrázek 3.4 (typ int má nejnižší prioritu):

int

unsigned int

long

unsigned long

long long

unsigned long long

fl oat

double

long double

Obrázek 3.4 Priorita pro konverzi operandů binární operace

3. Převod vynucený přiřazením: V přiřazovacích příkazech je typ na pravé straněkonver

tován na typ na levé straně. Pokud překladač takovou konverzi nedokáže provést, označí

daný řádek programu jako chybný.


72

KAPITOLA 3 Datové typy pro reálná čísla

Vysvětlující příklad – Uvažujeme tyto proměnné:

int a;

fl oat b=3.3;

short c=2;

A nyní, jak se vyhodnotí výraz:

a=b*c;

Bude se postupovat v těchto krocích:

1. Použije se pravidlo pro samostatné operandy. Operand b je typu short a proto sepřevede na hodnotu typu int. Operand c je typu fl oat a převádět se nebude.

2. Operátorem * je předepsána binární operace. Operand c je typu fl oat a má takvyšší prioritu. Proto se operand b dříve převedený na typ int převede ještě jednou a to

na typ fl oat. Výsledkem operace je hodnota 6.6.

3. Nyní se výsledek výrazu přiřazuje do proměnné a, která je typu int. Použije sepravidlo pro přiřazení. Reálná hodnota 6.6 se převede na celé číslo tak, že se odseknedesetinná část (pozor: nezaokrouhluje se!). Výsledek je tedy 6 a je to hodnota typu int.

Je-li třeba provést při převodu z reálného čísla na celé zaokrouhlení, přičtemek zaokrouhlovanému číslu 0,5. Například: a=b*c+0.5;. Hodnota 6,6 je tedy zvýšena na 7,1 a po odseknuté

desetinné části je výsledek zaokrouhlen na 7.

Možné problémy implicitních převodů

Převod z nižšího na vyšší typ (tzv. povýšení) je bez problémů. Nedochází ke ztrátě uložené

informace, pouze se změní datový typ uložené hodnoty.

Problémy přináší převod z vyššího typu na nižší typ. Zde může v některých případech dojít

ke ztrátě (zkreslení) údaje. Uvažujme níže uvedený příklad.

PROG_02:

#include <iostream>

using namespace std;

int main(int argc, char** argv)

{

int a=123456;

short b=a;

cout<

return 0;

}

Výpis programu v konzoli:

-7616




       
Knihkupectví Knihy.ABZ.cz - online prodej | ABZ Knihy, a.s.
ABZ knihy, a.s.
 
 
 

Knihy.ABZ.cz - knihkupectví online -  © 2004-2018 - ABZ ABZ knihy, a.s. TOPlist