+ All Categories
Home > Documents > Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… ·...

Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… ·...

Date post: 15-Dec-2020
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
23
1 České vysoké učení technické Fakulta elektrotechnická Algoritmizace a programování Ver.1.10 Jazyk C – výrazy J. Zděnek 2015 A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 2 Struktura programu (1) Program v C se skládá z následujících součástí: Příkazy preprocesoru (Preprocessor commands) Definice typů (type definitions) Prototypy funkcí (function prototypes) kde je uvedena deklarace: Jména funkce Vstupních parametrů Návratové hodnoty funkce Proměnné (variables) Funkce (functions) (v C je procedura funkce bez návratové hodnoty)
Transcript
Page 1: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

1

České vysoké učení technické Fakulta elektrotechnická

Algoritmizace a programování

Ver.1.10

Jazyk C – výrazy

J. Zděnek 2015

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 2

Struktura programu (1)

Program v C se skládá z následujících sou částí:

• Příkazy preprocesoru (Preprocessor commands)

• Definice typů (type definitions)

• Prototypy funkcí (function prototypes) kde je uvedena deklarace:• Jména funkce• Vstupních parametrů

• Návratové hodnoty funkce

• Proměnné (variables)

• Funkce (functions) (v C je procedura funkce bez návratové hodnoty)

Page 2: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

2

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 3

Struktura programu (2)

Funkce v C mají tento tvar:

• Každý program musí obsahovat právě jednu funkci main()

• Všechny funkce (včetně main()) mají jednotný formát:

typ_navrat_hodnoty jmeno_fce (parametry_fce){lokalni promenneprikazy

}

• Uvnitř funkce nelze definovat lokální funkce (definice funkci nesmí být vnořené)

• Na formátování zdrojového textu překladači nezáleží. Formátování zlepšujeautorovi (i ostatním) čitelnost a potlačuje chyby.

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 4

Model kompilace (1)

Preprocessor

Compiler

Assembler

Linker

Source code

Header

Source code

Libraries

Executable code

Source codeAssembly code

Object codesoubor5.lib

soubor1.c

soubor2.h

soubor3.c

1)

2)

3)

4)

Zdroj.kód C

Spustitelný kód

Zdroj.kód ASM

Knihovny

soubor4.asm

Page 3: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

3

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 5

Model kompilace (2)

Vytvo ření spustitelného kódu (viz obr):• 1) Preprocesor:

• Čte zdrojový kód v C

• Odstraní komentáře• Upraví zdrojový text podle direktiv preprocesoru (řádky začínající #)

• Vloží do textu obsah jiného souboru #include ….

• Odebere text vymezený direktivami podmíněného překladu• Expanduje makra

• 2) Překladač C: • Čte výstup z preprocesoru • Kontroluje syntaktickou správnost textu

• Hlásí chyby a varování• Generuje text v assembleru (když nejsou chyby)

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 6

Model kompilace (3)

Vytvo ření spustitelného kódu (viz obr):• 3) Assembler:

• Čte výstup z překladače C

• Generuje relokovatelný object kód (kód s nevyřešenými odkazy mezi moduly)

• Přeloží případné moduly zapsané přímo v assembleru (mix programovacích jazyků)

• 4) Linker (spojovací program):• Čte object kód všech zůčastněných modulů programu• Připojí knihovní object moduly (přeložené dříve nebo dodané),

• Vyřeší odkazy mezi moduly• Generuje spustitelný kód (zjednodušené)

Page 4: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

4

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 7

Soubor platných znaků (ASCII) (1)

C - základní soubor znak ů:

• A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

• a b c d e f g h i j k l m h o p q r s t u v x y z

• 0 1 2 3 4 5 6 7 8 9

• ! “ # % & ‘ ( ) * + , - . / : ; < = > ? [ \ ] ^ ? _ { | } ~

• Oddělovače (whitespace characters)space, horizontal tab, vertical tab, newline, form feed

• \0 - null char (koncový znak řetězce)

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 8

Soubor platných znaků (ASCII) (2)

C - základní soubor znak ů (pokra č.):• Řídicí znaky pro řízení výstupních zařízení (escape sequences)

C - ostatní znaky:• Mohou se použít v komentářích, řetězcích a znakových konstantách

h…=šestnáctkovéčíslice (hex dig.)

\xh…( př: \x1008 )

Horizontal tab\t

Vertical tab\v

o=osmičkovéčíslice (octal dig)

\o \oo \ooo( př: \741 )

Carriage return\r

Znak \\\Newline \n

Znak ?\?Form feed\f

Znak “\”Backspace\b

Znak ‘\’Beep (pípnutí)\a

VýstupEscape sequenceVýstupEscape sequence

Page 5: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

5

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 9

Identifikátory

C - pravidla pro volbu identifikátor ů:• Obsahuje A,..,Y,a,..,z,0,..,9 a znak _ (underscore) • První znak není číslice

• Rozlišují se velká a malá písmena (case sensitive)• Délka identifikátoru není omezena, ale pouze 31 prvních znaků je

významných (může se lišit podle implementace)

C - rezervovaná slova (keywords):• Musí být zapsaná malými písmeny

void

unsigned

union

typedef

switch

struct

staticlongexterncontinue

sizeofintenumconst

signedifelsechar

shortgotodoublecase

whilereturnfordobreak

volatileregisterfloatdefaultauto

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 10

Datové typy

• Při návrhu algoritmů a psaní programů ve vyšších programovacích jazycích abstrahujeme od binární podoby paměti počítače

• S daty pracujeme jako s hodnotami různých datových typů, které jsou uloženy v datových objektech

• Datový typ (zkráceně jen typ) specifikuje:

• množinu hodnot (+ reprezentace)• množinu operací, které lze s hodnotami daného typu provádět

• Příklad typu: celočíselný typ int v jazyku C:

• množinou hodnot jsou celá čísla (interval je závislý na implementaci)• množinu operací tvoří

• aritmetické operace +, -, *, /, jejichž výsledkem je hodnota typu int

• relační operace ==, !=, >, >=, <, <=, jejichž výsledkem je logickáhodnota. V jazyce C není zavedena logický typ proměnné. Logický stav se vyhodnocuje dle hodnoty číselné proměnné kde:= 0 znamená "false", ≠ 0 znamená "true"

Page 6: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

6

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 11

Reprezentace dat v počítači

• bit (binary digit – dvojková číslice; angl. bit – drobek, kousek)• základní a nejmenší jednotky informace • nabývá hodnot 0 nebo 1

• byte (též bajt, česky - slabika) – uspořádaná osmice bitů

• Násobky

• 1 kB = 1 000 bajtů (dekadický kilobajt, malé „k“)• 1 KB = 1 024 bajtů = 210 (binární kilobajt, velké „K“)

• 1 MB = 1 048 576 bajtů = 220

• 1 GB = 1 073 741 824 bajtů = 230

0 1 1 0 0 1 1 1

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 12

Reprezentace celých čísel

• Číselné soustavy - polyadické

• Desítková soustava138,24 = 1*102+3*101+8*100+2*10-1+4*10-2

=1*100+3*10+8*1+2*0,1+4*0,01

• Dvojková soustava11010,01b = 1*24+1*23+0*22+1*21+0*20+0*2-1+1*2-2 =

1*16+1*8+0*4+1*2+0*1+0*1/2+1*1/4= 26,25

• Šestnáctková soustava (hexadecimal numeral system)• a = „0“, „1“, „2“,… „9“, „A“, „B“,… „F“; z = 16• Př: 07Dh = 0*162 + 7*161 + D*160 = 0 + 112 + 13 = 125

Page 7: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

7

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 13

Reprezentace čísel v počítači

• Celá kladná čísla – přímý binární kód• Př: 125d = 0*27+1*26+1*25+1*24+1*23+1*22+0*21+1*20 = 01111101b

= 0 + 64 + 32 + 16 + 8 + 4 + 0 + 1

• Celá záporná čísla – dvojkový doplněk (two’s complement)• Př: -125d = 10000011b

Výpočet:Kladné číslo: x = +125d = 0111 1101b

-------------------------------

NOT x = 1000 0010b (jednotkový doplněk)+1

--------------------------------

Záporné číslo: -x = -125d = 1000 0011b (dvojkový doplněk)znaménkový bit

velikost čísla (není to přímý binární kód!)

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 14

Nepřesnost v zobrazení reálných čísel

• Pokusme se v dekadické soustavě zapsat číslo 1/3 (jedna třetina)• 0,3• přesněji 0,33• lépe 0,333• ...• 0,333333333333333333333333333333333333

• Jelikož máme omezený paměťový prostor, nikdy neuložíme číslo 1/3 přesně (Jak by číslo 1/3 vypadalo v trojkové soustavě?)

0*31 + 0*30 + 1*3-1 = (0,1)3

Page 8: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

8

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 15

Nepřesnost v zobrazení reálných čísel

Reálná čísla X se zobrazují ve tvaru:

X= mantisa * základ exponent

Nepřesnosti způsobují

1. Iracionální čísla ( e , π, ,…. )

2. Čísla, jež mají v dané soustavě periodický rozvoj (1/3 ve dvojkovéči dekadické soustavě, 1/10 ve dvojkové)

3. Čísla, která mají příliš dlouhý zápisdouble (celkem 64 bit ů)

• 1 bit znaménko – dvě možnosti, +,-• 11 bitů exponent – 2048 možností• 52 bitů – 4 503 599 627 370 496 možností, tedy asi 4,5 biliardy

- není možné v typu double přesně uložit čísla se zápisem delším než 52 bitů!

2

exponent mantisa

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 16

Model reprezentace reálných čísel

Reálná čísla se zobrazují jako aproximace daná rozsahem paměťového místa vyhrazeného pro číslo.

Reálná čísla se zobrazují ve tvaru:X = mantisa*základ exponent = m*z exponent

Mantisa musí být normalizována:0,1 <= m < 1, důvod: jednoznačnost zobrazení

Model:• délka mantisy 3 pozice + znaménko• délka exponentu 2 pozice + znaménko

Příklad:X = 77.5 = +0.775*z+02

• lze zakódovat znaménko “+” = 0,” –” = 1• z je 10 (16, 2,..)

+|775+|02

0|775 0|02

Page 9: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

9

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 17

Model reprezentace reálných čísel

• Maximální zobrazitelné kladné číslo

• Minimální zobrazitelné kladné číslo

• Maximální zobrazitelné záporné číslo (v absolutní hodnotě)

• Minimální zobrazitelné záporné číslo (v absolutní hodnotě)

• Nula• Jak je to se zobrazitelnými hodnotami „okolo nuly“,

• Jak je to se „sousedy“ aproximací?

-|999 +|99

+|000?|??

0.000z??

0.100z-99

0.101z-99

-0.100z-99

-0.101z-99

0.999z 99-0.999z 99

+|999+|99

+|100 -|99

-|100 -|99

0

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 18

Model reprezentace reálných čísel

• Jaká je vzdálenost dvou aproximací??

• To závisí na hodnotě!!!

• Aproximace reálných čísel:• nejsou na číselné ose rozložené rovnoměrně!!

0.000z??

0.100z-99 0.101z-99 0.100z12

0.101z12

0.999z 99

NULA

+MAXIMUM

NULA +MAXIMUM

Page 10: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

10

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 19

Reálná čísla v C (typ double)

• Reálná čísla se zobrazují ve tvaru:X= mantisa*základ exponent = m*z exponent

• V C jsou reálná čísla reprezentována typem double na 64 bitů,

norma IEEE 754

znaménkový bit (s), exponent, mantisa

• nejmenší čísla v normalizovaném tvaru (v abs. hodnotě) ±2−1022 ≈ ±2.2250738585072020 × 10−308

• největší čísla

±(1-(1/2)53)21024 ≈ ±1.7976931348623157 × 10308

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 20

Datové typy (1)

Celočíselné datové typy:

• Velikost celočíselných typů určená implementací• Vždy ale platí (v byte): char <= short <= int <= long• Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true

Celá čísla-32.768 až +32.7672short

Kladná celá čísla0 až 4.294.967.2954unsigned long

Velká celá čísla-2.147.483.648 až +2.147.483.6474long

Kladná celá čísla0 až 65.5352unsigned short

Kladná celá čísla0 až 65.535 nebo0 až 4.294.967.295

2 nebo 4unsigned int

Celá čísla-32.768 až +32.767 nebo-2.147.483.648 až +2.147.483.647

2 nebo 4int

Malá čísla-128 až +1271signed char

Malá čísla0 až 2551unsigned char

Znaky-128 až +127 nebo 0 až 2551char

PoužitíRozsahVelikost [byte]Typ

Page 11: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

11

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 21

Datové typy (2)

C - reálná čísla (necelo číselné datové typy):• Velikost reálných čísel určená implementací• Většina překladačů se řídí standardem IEEE-754-1985, potom

jsou rozsahy reálných čísel dány následující tabulkou:

C - typ void:• void značí prázdnou hodnotu nebo proměnnou bez typu (jen ukazatelé)

• void funkce1 (….) - fukce bez návratové hodnoty (procedura)• int funkce2 (void) - funkce bez vstupních parametrů• void *ptr; - ukazatel bez určeného typu (viz dále)

19 desítkových číslic3.4E-4932 až 1.1E+493210long double

15 desítkových číslic2.3E-308 až 1.7E+3088double

6 desítkových číslic1.2E-38 až 3.4E+384float

PřesnostRozsah (uveden pro kladná č.)Velikost [byte]Typ

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 22

Konstanty (1)

6 typů konstant:

• Celočíselné (integer constants)

• Reálné (floating constants)

• Znakové (character constants)

• Řetězcové (literal constants) (literály)

• Výčtové (enumeration constants) (pojmenované prvky množiny)

• Symbolické (#define MAX 300)

Page 12: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

12

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 23

Konstanty - celočíselné (2)

Formát celo číselné konstanty:• Desítkový - nezačíná číslicí 0 (nula), př: 1024

• Osmičkový - začíná číslicí 0 (nula), př: 012• Šestnáctkový - začíná znaky 0x nebo 0X (nula x), př: 0x7F8A

• číslice a,..,f (A,..,F) mohou být velká i malá pismena

Typ celo číselné konstanty:• Není-li určen explicitně, přiřadí se nejbližší dostatečně veliký typ

• Desítkové konst. - int, long, unsigned long

• Šestnáctkové a osmičkové - int, unsigned int, long, unsigned long• Určí se explicitně znaky U nebo u (unsigned), L nebo l (long) jinak int

unsigned long0x1BUL0333ul27UL

long0x10L020L16L

unsigned int0xAU012U10U

int0x7FFF07777732767

int0xF01715

TypŠestnáctkov ěOsmi čkověDesítkov ě

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 24

Konstanty - reálné (3)

Formát reálné konstanty:• S řádovou tečkou př: 41.9• Mantisa a exponent př: 5.67E-3 // 5.67*10-3

nebo rovněž 5.67e-3

Typ reálné konstanty:• Není-li určen explicitně, pak je - double• Určí se explicitně znaky

• F nebo f - float

• L nebo l - long double

• V tabulce jsou všechny konstanty typu double

.4E-50.4e-54E-60.000004

0.37e63.7E+537e+4370000.0

12e0.12E212.012.

519E-20.0519e+20.519E15.19

Page 13: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

13

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 25

Konstanty - znakové (4)

Formát znakové konstanty :• Jeden nebo více znaků v jednoduchých apostrofech

• př: ‘B’, ‘g’, ‘ab’, ’9’

Hodnota znakové konstanty :• Jednoznaková konstanta má hodnotu odpovídajícího kódu znaku

• př: v ASCII kódu ‘0’ ~= 48, ‘A’ ~=65• Víceznaková konstanta - hodnota závisí na implementaci překladače C

Typ znakové konstanty:• Znaková konstanta je typu int

Pozn:• Řídicí znaky (escape sequences) mohou tvořit znakové konstanty

• př: ‘\n’

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 26

Konstanty - řetězcové (literály) (5)

Formát řetězcové konstanty (literálu) :• Posloupnost znaků a řídicích znaků (escape sequences)

uzavřená v uvozovkách• př: “Já jsem řetězcová konstanta ! \n”

Pozn:• Řetězcové konstanty oddělené pouze oddělovači (whitespace characters)

jsou sloučeny do konstanty jediné.• př: “Já jsem” “řetězcová konstanta ! \n”

se sloučí do “Já jsem řetězcová konstanta ! \n”

Typ řetězcové konstanty:• Řetězcová konstanta je uložená v poli typu char (array of char) a je

zakončená znakem ‘\0’• př: “Nazdar” se uloží v poli typu char takto:

‘\0’‘r’‘a’‘d’‘z’‘a’‘N’

Page 14: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

14

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 27

Konstanty - výčtové (enum type) (6)

Formát vý čtové konstanty :• enum { CERVENA, MODRA, BILA, CERNA};

• pak CERVENA=0 a každý další prvek má hodnotu o jedničku vyšší

• enum { MALY=5, VETSI, VELKY, NEJVETSI }• pak MALY=5, VETSI=6 a každý další prvek má hodnotu o jedničku vyšší

Typ vý čtové konstanty:• Výčtová konstanta je typu int

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 28

Konstanty - symbolické #define (7)

Formát symbolické konstanty #define:• Konstanta se založí příkazem preprocessoru #define

(je to makro bez parametrů, každé #define musí být na samostatné řádku)

př:#define CERVENA 0 /* Zde muze byt komentar */#define MODRA 1 / /Je zvykem jména konstant psát velkými písmeny

#define BILA 2

• Hodnotu konstanty je možné vyjádřit konstantním výrazem

př:#define MAX_1 (100*5)-12

• Symbolické konstanty mohou být vnořenépř:#define MAX_2 MAX_1+30

Page 15: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

15

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 29

Komentář

C používá dva zp ůsoby ozna čení komentá ře:• /* Toto je komentář */

• /* Toto je rovněž komentářrozdělený na několik řádků

*/

• // Toto je též komentář až do konce řádku

• /* Komentář nesmí být vnořený do jiného komentáře• /* to je chybný zápis komentáře */• */

• Preprocesor nahradí každý komentář jednou mezerou• // ….. tento způsob některé překladače nepodporují

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 30

Proměnné a přiřazení

• Proměnná je datový objekt, který je označen jménem a je v něm uložena hodnota nějakého typu, která se může měnit

• V jazyku C zavedeme výše uvedenou proměnnou deklaracíint alfa = 0;

• Hodnotu proměnné lze změnit přiřazovacím příkazem

alfa = 37;

0alfa

37alfa

0alfa

jméno proměnné datový objekt

hodnota proměnné

Page 16: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

16

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 31

Deklarace proměnných

• Proměnné se zavádějí deklaracemi• Příklady deklarací proměnných:

int i; // deklarace prom ěnné i typu int

double x; // deklarace prom ěnné x typu double

• Proměnná deklarovaná uvnitř funkce (lokální proměnná) nemá deklaracídefinovanou hodnotu

• Deklaraci proměnné lze doplnit o inicializaci proměnné:int x = 10; // deklarovaná prom ěnná má hodnotu 10

• Deklarací lze zavést několik proměnných stejného typu:int x, z;

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 32A0B36PRI „PROGRAMOVÁNÍ“ 02 32

Přiřazovací příkaz

• Slouží pro přiřazení hodnoty proměnné• Tvar přiřazovacího příkazu:

<proměnná> = <výraz>;

• Příklad:x = y + z;

proměnné x se přiřadí součet hodnot proměnných y a zx = x + 1;

hodnota proměnné x se zvětší o 1

• Příklady přiřazovacích příkazů:int i; double d; char c

i = 14;

d = 3.14;

c = 'A';

Page 17: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

17

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 33A0B36PRI „PROGRAMOVÁNÍ“ 02 33

Přiřazovací příkaz

• Přířazovací operátory:

<proměnná> = <proměnná> <OP> <výraz> ~ <proměnná> <OP>= <výraz>

Př.:j += 5; ~ j = j + 5;

• přiřazení je výraz !!!:Př.:int x, y;

x = 7; // má hodnotu 7 a lze tedy op ět p ři řadit!!

y = x = x + 6;// vyhodnotí se jako y = (x = (x + 6));

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 34A0B36PRI „PROGRAMOVÁNÍ“ 02 34

Příkaz výstupu - printf()

• printf("Cislo Pi = %6.3f \n ", Math.PI);

Výstup na obrazovku: Cislo Pi = 3.142

• Specifikace formátu %[$indexParametru][modifikátor][ší řka][.p řesnost]konverze

• konverze - povinný parametr• typ celé číslo d,o,x - dekadicky, oktalově a hexadecimálně• typ double f je desetinný zápis; e,E vědecký s exponentem

• šířka - počet sázených míst, zarovnání vpravo• přesnost - počet desetinných míst• modifikátor - v závislosti na typu konverze určuje další vlastnosti, například

pro konverzi f (typ double)• symbol + určuje, že má být vždy sázeno znaménko,• symbol - určuje zarovnání vlevo, • symbol 0 doplnění čísla zleva nulami.

• \n přechod na další řádek• a další…

Page 18: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

18

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 35

Příkaz vstupu – scanf()

• V dalších příkladech budeme potřebovat příkazy pro vstup číselných dat zadaných na klávesnici

• Použijeme standardní funkce scanf()

#include <stdio.h>

#include <stdlib.h>

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

int pocet;

scanf("%d", &pocet);

printf("Pocet = %d", pocet);

}

• Ve funkci scanf() je nutné uvést očekávaný formát vstup (zde %d znamenáceločíselný formát a proměnnou do které se má hodnota z klávesnice uložit. Pozor před hodnotou musí být znak & (znamená to volání odkazem viz dalšípřednášky)

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 36

Typové konverze

• Typová konverze je operace, která hodnotu nějakého typu převede na hodnotu jiného typu, důvod jiná reprezentace čísel

• Typová konverze může být implicitní (vyvolá se automaticky) nebo explicitní(v programu je třeba ji explicitně předepsat)

• Konverze typu int na double je v jazyku C implicitní:• kde se očekává hodnota typu double , může být uvedena hodnota typu

int, která se automaticky převede na hodnotu typu double

• Příklad:double x; int i = 1;x = i; //hodnota 1 typu int se automaticky p řevede

//na hodnotu 1.0 typu double

• Převod hodnoty typu double na int (odseknutím necelé části) je třeba explicitně předepsat

• Příklad:double x = 1.2; int i;i = (int)x; //hodnota 1.2 typu double se odseknutím

//necelé části p řevede na hodnotu 1 typu int

Page 19: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

19

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 37

Výrazy• Výraz předepisuje výpočet hodnoty určitého typu• Příklad výrazu: {14.6 + sin(3.14)} * a100

• Výraz může obsahovat:• proměnné• konstanty

• volání funkcí• binární operátory• unární operátory

• závorky• Pořadí operací předepsaných výrazem je dáno:

• prioritou operátorů

• asociativitou operátorů• Příklad:

výraz pořadí operací zdůvodněníx + y * z x + (y * z) * má vyšší prioritu nežx + y + z x + y) + z + je asociativní zleva

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 38

Aritmetické operátory

• Pro operandy typu int a double budeme požívat tyto aritmetické operátory (seřazeno sestupně podle priority):• unární – (změna znaménka)• binární *, /, % (násobení, dělení a zbytek po dělení)

• binární + a – (sčítání a odčítání)

• Jsou-li oba operandy stejného typu, výsledek aritmetické operace je téhožtypu

• Jsou-li operandy různého typu, operand typu int se implicitní konverzípřevede na hodnotu typu double a výsledkem operace je hodnota typu double

• Výsledkem dělení operandů typu int je celá část podílunapř. 7/3 je 2 -7/3 je -2

• Pro zbytek po dělení platí: x % y = x – ( x / y ) * y

např: 7%3 je 1; -7%3 je -1; 7%-3 je 1; -7%-3 je -1

• speciální inkrementační a dekrementační operátory:++x, x++, --x, x--

Page 20: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

20

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 39

Relační operátory• Hodnoty všech jednoduchých typů jsou uspořádané a lze je porovnávat

relačními operátory• Budeme používat tyto relační operátory (priorita je menší než priorita

aritmetických operátorů):• >, <, >=, <= (větší než, menší než, větší nebo rovno, menší nebo

rovno)

• ==, != (rovná se, nerovná se)

• Výsledek relační operace je (true , když relace označená operátorem platí, false v opačném případě)(true se v "C" hodnotí dle výsledku ≠ 0 a false dle výsledku = 0. V "C" není typ logické proměnné.

• Jestliže při porovnávání číselných hodnot jsou operandy různého typu, operand typu int se implicitní konverzí převede na hodnotu typu double

• Relační operátory mají menší prioritu, než aritmetické operátory

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 40

Logické operátory

• Logické operátory jsou unární a binární• unární ! (negace)• binární && resp. & (konjunkce, logický součin)• binární || resp. | (disjunkce, nevýhradní logický součet, OR)• binární ^ (disjunkce, výhradní logický součet, XOR)

x y !x x && y x || y x ^ yfalse false true false false falsefalse true true false true truetrue false false false true truetrue true false true true false

• Negace má stejnou prioritu, jako změna znaménka, logický součin má nižší prioritu nežrelační operátory

• Operace && a || se vyhodnocují zkráceným způsobem, tj. druhý operand se nevyhodnocuje, jestliže lze výsledek určit již z prvního operandu

Page 21: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

21

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 41

Standardní knihovny (1)

Standardní knihovny (ANSI C library – Standard Library) :• Vlastní jazyk C neobsahuje žádné prost ředky pro vstup a výstup dat, složit ější

matematické operace, práci s řetězci, t řídění, blokové p řesuny dat v pam ěti, práci s datem a časem, komunikaci s opera čním systémem,správu pam ěti pro dynamické p řidělování, vyhodnocení b ěhových chyb (run-time errors) apod.

• Tyto a další funkce jsou však obsaženy ve standardních knihovnách (ANSI C Library) dodávaných s p řekladači jazyka C.

• Uživatel dostává k dispozici p řeložený kód knihoven (který se p řipojuje – linkuje k uživatelovu kódu) a hlavi čkové soubory (headers) s prototypy funkcí, novými typy, makry a konstantami

• Hlavi čkové soubory (obdoba interface v Jav ě) se připojují k uživatelovu kódu direktivou preprocesoru #include <…>.

• Je zvykem , že hlavi čkové soubory mají rozší ření *.h , např. stdio.h

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 42

Standardní knihovny (2)

Standardní knihovny (ANSI C library – Standard Library) p okra č:• Standardní knihovny jsou rozd ěleny do následujících částí:

(uvedeno pro ANSI C95):

• Vstup a výstup (formátovaný i neformátovaný)• stdin.h

• Rozsahy čísel jednotlivých typ ů

• limits.h

• Matematické funkce• stdlib.h• math.h

• Zpracování b ěhových chyb (run-time errors)• errno.h• assert.h

Page 22: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

22

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 43

Standardní knihovny (3)

Standardní knihovny (ANSI C library – Standard Library) p okra č:• Standardní knihovny jsou rozd ěleny do následujících částí:

(uvedeno pro ANSI C95) pokra č:

• Klasifikace znak ů (typ char)• ctype.h

• Práce s řetězci (string handling)• string.h

• Internacionalizace (adaptace pro r ůzné jazykové mutace)• locale.h

• Vyhledávání a t řídění• stdlib.h

• Blokové p řenosy dat v pam ěti• string.h

A8B14ADP Algoritmizace a programovaní -Jazyk C - výr azy 44

Standardní knihovny (4)

Standardní knihovny (ANSI C library – Standard Library) p okra č:• Standardní knihovny jsou rozd ěleny do následujících částí:

(uvedeno pro ANSI C95) pokra č:

• Správa pam ěti (Dynamic Memory Management)• stdlib.h

• Datum a čas• time.h

• Komunikace s opera čním systémem• stdlib.h• signal.h

• Nelokální skok (lokální je sou částí jazyka, viz goto)• setjump.h

Page 23: Algoritmizace a programovánímotor.feld.cvut.cz/.../A8B14ADP/A8B14ADP-2015-04z-Jazyk-C-vyraz… · • Typ boolean není (až ANSI C99), = 0 ->false, != 0 -> true short 2-32.768

23

České vysoké učení technické Fakulta elektrotechnická

Algoritmizace a programování

Jazyk C – Jazyk C – výrazy

KONEC


Recommended