c Farkas
Aritmetikai típusok Struktúrák Typedef
A C nyelv aritmetikai típusai. Struktúrák. A programozás alapjai I.
Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán
2016. október 3.
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
1 / 43
Aritmetikai típusok Struktúrák Typedef
Tartalom
1
A C nyelv aritmetikai típusai
Struktúrák
Bevezetés
Motiváció
Egészek
Deníció
Karakterek
Értékadás
Valósak
c Farkas
2
3
Típusnév-hozzárendelés
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
2 / 43
c Farkas
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
1. fejezet A C nyelv aritmetikai típusai
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
3 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Típusok Bevezetés
c Farkas
A típus Értékkészlet M¶veletek Ábrázolás Valódi számítógép véges értékkészlet Nem ábrázolhatunk tetsz®legesen nagy számokat Nem ábrázolhatunk tetsz®legesen pontos számokat
π 6= 3,141592654 Ismernünk kell az ábrázolható tartományokat, hogy adatainkat
információveszteség nélkül vagy elfogadható információveszteséggel de ne túl pazarlóan tárolhassuk B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
4 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
A C nyelv típusai
c Farkas
void skalár
aritmetikai egész: integer, karakter, felsorolás lebeg®pontos mutató függvény union összetett
tömb struktúra Ma ezekr®l lesz szó
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
5 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Egészek bináris ábrázolása
c Farkas
8 biten tárolt el®jel nélküli egészek bináris ábrázolása dec
2
7
2
6
2
5
4
2
3
2
2
2
1
2
0
2
hex
0
0
0
0
0
0
0
0
0
0x00
1
0
0
0
0
0
0
0
1
0x01
2
0
0
0
0
0
0
1
0
0x02
3
0
0
0
0
0
0
1
1
0x03
. . .
. . .
. . .
. . .
127
0
1
1
1
1
1
1
1
0x7F
128
1
0
0
0
0
0
0
0
0x80
129
1
0
0
0
0
0
0
1
0x81
. . .
. . .
. . .
. . .
253
1
1
1
1
1
1
0
1
0xFD
254
1
1
1
1
1
1
1
0
0xFE
255
1
1
1
1
1
1
1
1
0xFF
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
6 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
A túlcsordulás (overow)
c Farkas
overow 11..10
11..11 00..00
254
255
0
00..01 1
00..10 2 3
00..11
8 biten ábrázolt el®jel nélküli számok esetén
255+1 = 0 255+2 = 1 2-3 = 255 modulo 256 aritmetika
129 10..01
Mindig csak az eredmény 256-tal vett maradékát látom 128 127
10..00 01..11
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
7 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Egészek kettes komplemens ábrázolása
c Farkas
8 biten tárolt el®jeles egészek kettes komplemens ábrázolása dec
2
7
2
6
2
5
2
4
2
3
2
2
2
1
2
0
hex
0
0
0
0
0
0
0
0
0
0x00
1
0
0
0
0
0
0
0
1
0x01
2
0
0
0
0
0
0
1
0
0x02
3
0
0
0
0
0
0
1
1
0x03
. . .
. . .
. . .
. . .
127
0
1
1
1
1
1
1
1
0x7F
−128 −127
1
0
0
0
0
0
0
0
0x80
1
0
0
0
0
0
0
1
0x81
. . .
. . .
. . .
. . .
−3 −2 −1
1
1
1
1
1
1
0
1
0xFD
1
1
1
1
1
1
1
0
0xFE
1
1
1
1
1
1
1
1
0xFF
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
8 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
A túlcsordulás (overow)
c Farkas
11..10
11..11 00..00
−2
−1
0
00..01 1
00..10 2 3
00..11
8 biten ábrázolt el®jeles számok esetén
127+1 = -128 127+2 = -127 -127-3 = 126 viszont
−127 126 −128 127 01..10 10..01 10..00 01..11
2-3 = -1
overow B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
9 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Egész típusok C-ben
típus signed char unsigned char signed short int unsigned short int signed int unsinged int signed long int unsigned long int signed long long int2 unsigned long long int2
bit1 8 8 16 16 32 32 32 32 64 64
CHAR_MIN CHAR_MAX 0 UCHAR_MAX SHRT_MIN SHRT_MAX 0 USHRT_MAX INT_MIN INT_MAX 0 UINT_MAX LONG_MIN LONG_MAX 0 ULONG_MAX LLONG_MIN LLONG_MAX 0 ULLONG_MAX
printf %hhd2 %hhu2 %hd %hu %d %u %ld %lu %lld %llu
1 Tipikus 2 c Farkas
értékek, a szabvány csak a minimumot írja el® C99 szabvány óta
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
10 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Egészek deklarációja
Alapértelmezések
A signed el®jelmódosító elhagyható 1 2
int i; long int l ;
/* signed int */ /* signed long int */
Ha van el®jel- vagy hosszmódosító, az int elhagyható 1 2
c Farkas
unsigned u ; short s ;
/* unsigned int */ /* signed short int */
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
11 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Egész típusok Példa a táblázat használatához: egy igen sokáig futó program
1 2 3 4 5 6 7 8 9 10 11 12
c Farkas
3
# include < limits .h > /* eg é sz hat á rokhoz */ # include < stdio .h > /* printf - hez */ int main ( void ) { /* majdnem ö sszes long long int */ long long i ; for (i = LLONG_MIN ; i < LLONG_MAX ; i = i +1) printf ( " % lld \ n " , i ); }
return 0; link
3 feltéve, hogy long long int 64 bites, a program másodpercenként millió szám kiírásával 585 000 évig fut B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
12 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Egész számkonstansok Egész számkonstansok megadási módjai
1 2 3 4 5 6 7 8
int i1 =0 , i2 =123 , i4 = -33; int o1 =012 , o2 =01234567; int h1 =0 x1a , h2 =0 x7fff , h3 =0 xAa1B
/* decim á lis */ /* okt á lis */ /* hexadecim á lis */
long l1 =0 x1al , l2 = -33 L ;
/* l vagy L */
unsigned u1 =33 u , u2 =45 U ; /* u vagy U */ unsigned long ul1 =33 uL , ul2 =123 lU ; /* l é s u */ Ha nincs megadva u vagy l, akkor az els®, amibe belefér:
1 2 3 4
c Farkas
int unsigned int hexa és oktális esetén long unsigned long
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
13 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Miért kell ismerni az ábrázolás korlátait? Határozzuk meg a következ® értéket!
15
=
12
15! 12!
· (15 − 12)!
(Hányféleképpen választhatok ki 15 különböz® csoki közül 12-t?) A számláló értéke 15! A nevez® értéke 12!
=1
307 674 368 000
· 3! = 2
874 009 600
Egyik sem ábrázolható 32 bites
int-tel!
A kifejezést egyszer¶sítve 15
· 14 · 13 = ·2·1
3
2730 6
= 455
minden részletszámítás gond nélkül elvégezhet® már akár 12 biten is
c Farkas
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
14 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Karakterek ábrázolása Az ASCII karaktertáblázat
c Farkas
128 karakter, melyeket a
Kód +00 +01 +02 +03 +04 +05 +06 +07 +08 +09 +0a +0b +0c +0d +0e +0f
00 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
10 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
0x000x7f
20 ! " # $ % & ' ( ) * + , . /
30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
40 @ A B C D E F G H I J K L M N O
számokkal indexelhetünk
50 P Q R S T U V W X Y Z [ \ ] ^ _
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
60 ` a b c d e f g h i j k l m n o
70 p q r s t u v w x y z { | } ~ DEL
2016. október 3.
15 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Karakterek tárolása, kiírása, beolvasása Karaktereket (az ASCII tábla indexeit) a
char
típusban
tárolunk kiíratás/beolvasás
1 2 3 4
c Farkas
%c
formátumkóddal
char ch = 0 x61 ; /* hex 61 = dec 97 */ printf ( " % d : % c \ n " , ch , ch ); ch = ch +1; /* é rt é ke hex 62 = 98 lesz */ printf ( " % d : % c \ n " , ch , ch ); A program kimenete
97: 98:
a b Ezek szerint karakterek kiírásához meg kell tanulnunk az ASCII-kódokat?
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
16 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Karakterkonstansok Aposztrófok közé írt karakter ekvivalens az ASCII-kóddal
1 2 3 4
char ch = 'a '; /* ch - ba a 0 x61 ASCII - k ó d ker ü l */ printf ( " % d : % c \ n " , ch , ch ); ch = ch +1; printf ( " % d : % c \ n " , ch , ch );
97: 98:
a b Vigyázat!
1 2
c Farkas
'0' 6= 0
!
char n = '0 '; /* ch - ba a 0 x30 ASCII - k ó d ker ü l !!! */ printf ( " % d : % c \ n " , n , n );
48:
0
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
17 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Karakterkonstansok
c Farkas
Speciális karakterkonstansok amiket egyébként nehéz lenne beírni 0x00 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x22 0x27 0x5c
\0 \a \b \t \n \v \f \r \ \' \\
nullkarakter
null character (NUL)
hangjelzés
bell (BEL)
visszatörlés
backspace (BS)
tabulátor
tabulator (HT)
soremelés
line feed (LF)
függ®leges tabulátor
vertical tab (VT)
lapdobás
form feed (FF)
kocsi vissza
carriage return (CR)
idéz®jel
quotation mark
aposztróf
apostrophe
visszaper
backslash
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
18 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Karakter vagy egész szám?
C-ben a karakterek egész számokkal ekvivalensek Csak megjelenítéskor d®l el, hogy egy egész értéket számként vagy karakterként (%d vagy
%c)
ábrázolunk
Karaktereken ugyanolyan m¶veleteket végezhetünk, mint egészeken (összeadás, kivonás stb. . . ) De mi értelme lehet karaktereket összeadni-kivonni?
c Farkas
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
19 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
M¶veletek karakterekkel Írjunk programot, mely karaktereket olvas be mindaddig, míg az újsor karakter nem érkezik. Ezután a program írja ki a beolvasott számjegyek összegét.
1 2 3 4 5 6 7 8 9 10
c Farkas
char c ; int sum = 0; do { scanf ( " % c " , & c ); /* if ( c >= '0 ' && c <= '9 ') /* sum = sum + (c - '0 '); /* } while ( c != '\ n '); /* printf ( " Az ö sszeg : % d \ n " , sum );
beolvas á s */ ha sz á mjegy */ ö sszegz é s */ le á ll á si felt é tel */
Karambolozott a 12:35-ös gyors Az összeg: 11 B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
20 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
M¶veletek karakterekkel
Írjunk függvényt, mely az angol ábécé kisbet¶s karaktereit nagybet¶ssé alakítja, a többi karaktert változatlanul hagyja.
1 2 3 4 5 6 7 8
c Farkas
char toupper ( char c) { if ( c >= 'a ' && c <= 'z ') /* ha kisbet ¶ */ { return c - 'a ' + 'A '; } return c ; }
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
21 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Lebeg®pontos típusok
c Farkas
Normálalak
23,2457
−0,001822326
= (−1)0 · 2,3245700 · 10+001 = (−1)1 · 1,8223260 · 10−003
Normálalak ábrázolása Lebeg®pontos tört = el®jelbit + mantissza + exponens
1 el®jelbit: 0pozitív, 1negatív 2 mantissza: el®jel nélküli egész (a tizedesvessz®t elhagyva),
normalizálás miatt az els® számjegy ≥ 1
3 exponens (másként karakterisztika): el®jeles egész
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
22 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Lebeg®pontos típusok Bináris normálalak
5,0
= 1,25 · 4 = (−1)0 · 1,0100b · 2010b
0
0100
010
Bináris normálalak ábrázolása Lebeg®pontos tört = el®jelbit + mantissza + exponens
1 el®jelbit: 0pozitív, 1negatív 2 mantissza: el®jel nélküli egész (a
kettedesvessz®t elhagyva), normalizálás miatt az els® számjegy = 1, nem is tároljuk4 . 3 exponens: el®jeles egész 4 c Farkas
implicit bites ábrázolás
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
23 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Lebeg®pontos típusok C-ben
A C nyelv lebeg®pontos típusai
típus float double long double
bitszám 32 bit 64 bit 128 bit
tipikus értékek mantissza exponens 23 bit 8 bit 52 bit 11 bit 112 bit 15 bit
printf/scanf %f %f/%lf %Lf
Lebeg®pontos számkonstansok (tizedespont)
1 2 3
c Farkas
float f1 =12.3 f , f2 =12. F , f3 =.5 f , f4 =1.2 e -3 F ; double d1 =12.3 , d2 =12. , d3 =.5 , d4 =1.2 e -3 ; long double l1 =12.3 l , l2 =12. L , l3 =.5 l , l4 =1.2 e -3 L ;
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
24 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Egész típusok ábrázolási pontossága
0
1
2
3
4
5
6
Abszolút számábrázolási pontosság A maximális
hiba, ha egy tetsz®leges valós számot a hozzá
legközelebbi ábrázolt értékkel közelítünk
Az egész típusok abszolút ábrázolási pontossága 0,5
c Farkas
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
25 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
Lebeg®pontos típusok ábrázolási pontossága
c Farkas
expon. = 210 expon. =
20
mantissza
1024 8/8
1152 9/8
1280 10/8
1408 11/8
1536 12/8
1664 13/8
1,000b 1,001b 1,010b 1,011b 1,100b 1,101b
jelen példában
A mantissza (abszolút) ábrázolási pontossága 1/16 20 exponens mellett az ábrázolási pontosság 1/16 210 exponens mellett az ábrázolási pontosság 210 /16 = 64 Nem beszélhetünk abszolút, csak relatív ábrázolási pontosságról, ami jelen esetben 3 bit.
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
26 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
A véges számábrázolás következménye
c Farkas
Mivel a lebeg®pontos számábrázolás pontatlan, m¶veletek eredményét nem szabad egyenl®ségre összehasonlítani! 22 7
+
3 7
6=
25 7
helyette
22 + 7
3 7
−
<ε
25 7
A nagy számok sokkal pontatlanabbak, mint a kis számok. A nagy számok hibája megeheti a kicsiket:
A + a − A 6= a
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
27 / 43
Aritmetikai típusok Struktúrák Typedef
Bev. Egészek Karakterek Valósak
A bináris számábrázolás következménye Ami decimálisan véges, binárisan nem biztos, hogy az. pl: 0,1d
= 0,00011b
Hányszor fut le az alábbi ciklus?
1 2 3 4 5
double d ; for (d = 0.0; d < 1.0; d = d +0.1) /* 10? 11? */ { ... } Helyesen:
1 2 3 4 5 c Farkas
double d , eps = 1e -3; /* mekkora eps j ó ide ? */ for (d = 0.0; d < 1.0 - eps ; d = d +0.1) /* 10 - szer */ { ... } B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
28 / 43
c Farkas
Aritmetikai típusok Struktúrák Typedef
Motiváció Deníció Értékadás
2. fejezet Struktúrák
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
29 / 43
Aritmetikai típusok Struktúrák Typedef
Motiváció Deníció Értékadás
Felhasználói típusok
A C nyelv beépített típusai nem, vagy csak körülményesen felelnek meg a bonyolultabb, összetettebb adatok tárolására.
Felhasználó (programozó) által bevezetett típusok Felsorolás Struktúra
←
ma err®l lesz szó
Bitmez®k Unió
c Farkas
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
30 / 43
Aritmetikai típusok Struktúrák Typedef
Motiváció Deníció Értékadás
Logikailag összetartozó adatok
Dátum eltárolása
1 2 3
int ev ; int ho ; int nap ;
Hallgatói adatok tárolása
1 2 3
char neptun [6]; unsigned int kiszhpont ; unsigned int hianyzasok ; Sakkjátszma adatai (világos játékos, sötét játékos, mikor, hol, lépések, eredmény) Egy lépés adatai (gura, honnan, hová) A tábla egy mez®jének adatai (oszlop, sor)
c Farkas
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
31 / 43
Aritmetikai típusok Struktúrák Typedef
Motiváció Deníció Értékadás
Összetartozó adatok átadása Írjunk függvényt, amely 2D vektorok skalárszorzatát számítja!
1 2 3 4 5
double v_skalarszorzat ( double x1 , double y1 , double x2 , double y2 ) { return x1 * x2 + y1 * y2 ; } Hogyan adjuk át az összetartozó adatokat
(x1 , y1 )?
A függvényparaméterek száma túl sok lehet Írjunk függvényt, amely két vektor különbségét számítja!
1 2 3 4 5
?????? v_kulonbseg ( double x1 , double y1 , double x2 , double y2 ) { ... } Hogyan kapjuk vissza az összetartozó adatokat?
c Farkas
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
32 / 43
Aritmetikai típusok Struktúrák Typedef
Motiváció Deníció Értékadás
Egységbezárás (encapsulation)
Struktúra logikailag egy egységet alkotó, akár különböz® típusú adatokból álló, összetett adattípus
hallgató neptun kis zh pontok hiányzások
A részadatokat mez®knek vagy tagoknak hívjuk Egyetlen értékadással másolható Lehet függvény paramétere Lehet függvény visszatérési értéke
A C nyelv leghatékonyabb típusa
c Farkas
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
33 / 43
Aritmetikai típusok Struktúrák Typedef
Motiváció Deníció Értékadás
Struktúrák C-ben 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 c Farkas
struct vektor { /* strukt ú ra t í pusdefin í ci ó */ double x ; double y ; }; struct vektor v_kulonbseg ( struct vektor a , struct vektor b ) { struct vektor c ; c . x = a. x - b . x ; c . y = a. y - b . y ; return c ; } int main ( void ) { struct vector v1 , v2 , v3 ; v1 . x = 1.0; v1 . y = 2.0; v2 = v1 ; v3 = v_kulonbseg ( v1 , v2 ); return 0; } B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
34 / 43
Aritmetikai típusok Struktúrák Typedef
Motiváció Deníció Értékadás
Struktúrák szintaxisa Struktúra deníciója struct [<struktúra címke>]opt {<struktúra tag deklarációk>} []opt ; 1 2 3 4 5 6
/* egy d á tumot tá rol ó strukt ú ra tí pus */ struct datum { int ev ; int ho ; int nap ; } d1 , d2 ; /* k é t v á ltoz ó p é ld á ny */
[<struktúra címke>]opt
elhagyható olyan esetekben, amikor kés®bb nem hivatkozunk rá
[]opt
struktúra típusú változók deklarációja
c Farkas
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
35 / 43
Aritmetikai típusok Struktúrák Typedef
Motiváció Deníció Értékadás
Struktúrák szintaxisa Struktúra típus használata Változók deklarációja
struct <struktúra címke> ; Struktúra tagok elérése
<struktúra azonosító>. Struktúrataggal mindaz megtehet®, ami különálló változóval 1 2 3 4
struct datum d1 , d2 ; d1 . ev = 2012; d2 . ev = d1 . ev ; scanf ( " % d " , & d2 . ho ); A tömbökhöz hasonlóan struktúráknál is lehetséges a kezdetiérték-adás:
1
c Farkas
struct datum d3 = {2011 , 5 , 2}; B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
36 / 43
Aritmetikai típusok Struktúrák Typedef
Motiváció Deníció Értékadás
Értékadás struktúráknál
Struktúra típusú változó értéke (összes tagja) frissíthet® egyetlen értékadással.
1 2
c Farkas
struct datum d3 = {2013 , 10 , 8} , d4 ; d4 = d3 ;
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
37 / 43
c Farkas
Aritmetikai típusok Struktúrák Typedef
3. fejezet Típusnév-hozzárendelés
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
38 / 43
Aritmetikai típusok Struktúrák Typedef
Deníció C-ben átkeresztelhetjük típusneveinket
1 2 3 4 5 6 7
typedef int cica ; cica main () { cica i = 3; int b = 2; return i ; }
Típusnév-hozzárendelés A
typedef
egy álnevet rendel az adott típushoz.
Nem hoz létre új típust, az álnévvel bevezetett változók típusa az eredeti típus marad.
c Farkas
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
39 / 43
Aritmetikai típusok Struktúrák Typedef
Mire jó?
Beszédesebb forráskód, jobban átlátható
1 2 3 4 5
typedef float voltage ; /* kisebb kell */ voltage V1 = 1.0; double c = 2.0; voltage V2 = c * V1 ; Könnyen karbantartható Megszabadulhatunk többszavas típusneveinkt®l
1
c Farkas
typedef
struct vektor
vektor ;
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
40 / 43
Aritmetikai típusok Struktúrák Typedef
Vektoros feladat typedeffel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 c Farkas
typedef struct { /* ekkor a c í mke lehagyhat ó */ double x ; double y ; } vektor ; vektor v_kulonbseg ( vektor a , vektor b ) { vektor c ; c . x = a. x - b . x ; c . y = a. y - b . y ; return c ; } int main ( void ) { vektor v1 , v2 , v3 ; v1 . x = 1.0; v1 . y = 2.0; v2 = v1 ; v3 = v_kulonbseg ( v1 , v2 ); return 0; } B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
41 / 43
Aritmetikai típusok Struktúrák Typedef
Egy összetettebb struktúra
1 2 3 4 5 6 7 8 9
typedef struct { double x ; double y ; } vektor ;
1 2 3
kor k = {{3.0 , 2.0} , 1.5}; vektor v = k . kozeppont ; k . kozeppont . y = -2.0;
c Farkas
typedef struct { vektor kozeppont ; double sugar ; } kor ;
y v x k
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
42 / 43
c Farkas
Aritmetikai típusok Struktúrák Typedef
Köszönöm a gyelmet.
B., Fiala P., Vitéz A., Zsóka Z.A C nyelv aritmetikai típusai. Struktúrák.
2016. október 3.
43 / 43