tanszek:oktatas:szamitastechnika:adat_tipusok
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| tanszek:oktatas:szamitastechnika:adat_tipusok [2022/09/05 21:08] – létrehozva knehez | tanszek:oktatas:szamitastechnika:adat_tipusok [2026/10/21 17:39] (current) – knehez | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ==== C nyelv adattípusai ==== | + | ==== A C nyelv alapvető |
| + | |||
| + | === Miért kell megadni az adat típusát? === | ||
| + | |||
| + | Egy mérnöki program különböző adatokat kezelhet: például munkadarabok számát, hőmérsékletet, | ||
| + | |||
| + | Az **adattípus** meghatározza, | ||
| + | |||
| + | ^ Tárolandó adat ^ Példa ^ Célszerű típus ^ | ||
| + | | Munkadarabok száma | 120 | '' | ||
| + | | Hőmérséklet °C-ban | -12.5 | '' | ||
| + | | Feszültség V-ban | 3.28 | '' | ||
| + | | Egy egyszerű karakter | ' | ||
| + | | Bekapcsolt állapot | igaz vagy hamis | '' | ||
| + | |||
| + | A típus megválasztását a várható értéktartomány, | ||
| + | |||
| + | === Változó létrehozása és kezdőértéke === | ||
| + | |||
| + | A **változó** egy névvel elérhető tárolóhely, | ||
| + | |||
| + | <code c> | ||
| + | int darabszam = 120; | ||
| + | double homerseklet = 23.5; | ||
| + | char jeloles = ' | ||
| + | </ | ||
| + | |||
| + | Az első sorban: | ||
| + | |||
| + | * az '' | ||
| + | * a '' | ||
| + | * a '' | ||
| + | * a pontosvessző lezárja a deklarációt. | ||
| + | |||
| + | Később új értéket adhatunk a változónak: | ||
| + | |||
| + | <code c> | ||
| + | darabszam = 125; | ||
| + | </ | ||
| + | |||
| + | Az '' | ||
| + | |||
| + | **A függvényen belül létrehozott egyszerű helyi változónak használat előtt adjunk értéket!** A kezdőérték nélküli helyi '' | ||
| + | |||
| + | === Memória, bit és bájt === | ||
| + | |||
| + | A memória bitekből épül fel. Egy bit két értéket vehet fel: 0-t vagy 1-et. A szokásos mai számítógépeken **1 bájt = 8 bit**. | ||
| + | |||
| + | Nyolc bitnek 2^8 = 256 különböző mintázata van. Ugyanezt a 256 mintázatot különböző módokon értelmezhetjük: | ||
| + | |||
| + | **A több memória általában nagyobb értéktartományt vagy nagyobb pontosságot tesz lehetővé, de önmagában nem mondja meg, hogyan értelmezzük az adatot.** | ||
| + | |||
| + | Fontos C-sajátosság: | ||
| === Egész típusok === | === Egész típusok === | ||
| - | | **Adat típus** | + | Az egész típusok törtrész nélküli számokat tárolnak. Például munkadarabok, |
| - | | **char** | + | |
| - | | **signed char** | 1 | 8 | + | == Előjeles és előjel nélküli számok == |
| - | | **unsigned char** | + | |
| - | | **short** | + | Az **előjeles** típus negatív és nemnegatív értékeket is tárolhat. Az **előjel nélküli**, azaz '' |
| - | | **signed | + | |
| - | | **unsigned | + | Nyolc bit esetén, a szokásos kettes komplemens ábrázolással: |
| - | | **int** | + | |
| - | | **signed int** | 4 | 32 | -2147483648 | + | ^ Típus ^ Legkisebb |
| - | | **unsigned int** | + | | Előjeles, |
| - | | **long** | 4 | + | | Előjel nélküli, 8 bites egész | 0 | 255 | 256 | |
| - | | **signed long** | 4 | + | |
| - | | **unsigned | + | Az '' |
| - | | **long long** | 8 | 64 | -9223372036854775808 | + | |
| - | | **signed | + | === Gyakori egész típusok === |
| - | | **unsigned long long** | 8 | 64 | 0 | 18446744073709551615 | + | |
| + | **Az alábbi méretek és tartományok gyakori megvalósításokat mutatnak, nem minden C-rendszerre érvényes előírások.** Kisebb mikrovezérlőkön például az '' | ||
| + | |||
| + | ^ Típus ^ Gyakori méret bájtban ^ Bitszám ^ Legkisebb érték ^ Legnagyobb érték ^ printf() formátum ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | Az '' | ||
| + | |||
| + | A '' | ||
| + | |||
| + | Az egyszerű '' | ||
| + | |||
| + | == Példa: darabszám és készletváltozás == | ||
| + | |||
| + | <code c> | ||
| + | int darabszam = 120; | ||
| + | int keszletvaltozas = -8; | ||
| + | unsigned int meresek_szama = 500; | ||
| + | </ | ||
| + | |||
| + | A készletváltozás negatív is lehet, ezért ehhez előjeles típus szükséges. | ||
| + | |||
| + | **A pozitívnak szánt mennyiséghez nem kötelező | ||
| + | |||
| + | === Mi történik, ha nem fér el az eredmény? === | ||
| + | |||
| + | Egy típusnak véges az értéktartománya. Az előjeles egész művelet túlcsordulásának nincs a C nyelv által meghatározott eredménye. | ||
| + | |||
| + | Az előjel nélküli számítás és az előjel nélküli típusba alakítás körbeforduló szabályt követ. Ha például az '' | ||
| + | |||
| + | <code c> | ||
| + | unsigned char szamlalo = 255; | ||
| + | szamlalo = szamlalo + 1; | ||
| + | </ | ||
| + | |||
| + | Ekkor a változó új értéke 0. Az összeadás itt előbb '' | ||
| + | |||
| + | A programban a körbefordulás gyakran hibás számlálást eredményez. A típust ezért a várható legnagyobb érték és a köztes számítások alapján válasszuk ki. | ||
| + | |||
| + | === Lebegőpontos típusok === | ||
| + | |||
| + | Hosszúság, | ||
| + | |||
| + | <code c> | ||
| + | double hossz = 1.25; | ||
| + | double ido = 0.08; | ||
| + | double homerseklet = -12.5; | ||
| + | </ | ||
| + | |||
| + | **A C forráskódjában a tizedesjel pont, nem vessző.** | ||
| + | |||
| + | == Értéktartomány és pontosság == | ||
| + | |||
| + | A két fogalom különbözik: | ||
| + | |||
| + | * Az **értéktartomány** azt mutatja meg, milyen kicsi és milyen nagy nagyságrendű számokat tudunk tárolni. | ||
| + | * A **pontosság** azt mutatja meg, hány értékes számjegyet tudunk megőrizni. | ||
| + | |||
| + | Az értékes számjegyeket nem csak a tizedesjel után számoljuk. Például az 1234.56 és a 0.00123456 szám egyaránt hat értékes számjegyet tartalmaz. | ||
| + | |||
| + | **A „6 számjegy pontosság” nem azt jelenti, hogy mindig hat tizedesjegyet tárolunk.** Nagyobb nagyságrendnél a szomszédos ábrázolható számok távolabb vannak egymástól. | ||
| + | |||
| + | == Gyakori lebegőpontos típusok == | ||
| + | |||
| + | A '' | ||
| + | |||
| + | ^ Típus ^ Gyakori méret bájtban ^ Legkisebb pozitív normál érték, közelítőleg ^ Legnagyobb véges pozitív érték, közelítőleg ^ Jellemző decimális pontosság ^ printf() formátum ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | Mindegyik típus tárolhat nullát és negatív értékeket is. Például a szokásos '' | ||
| + | |||
| + | A „legkisebb pozitív normál érték” **nem a legnegatívabb érték**, és nem is feltétlenül a legkisebb pozitív tárolható szám. Az IEEE 754 formátumok ennél kisebb pozitív, úgynevezett szubnormális számokat is tárolnak, csökkenő relatív pontossággal. A legkisebb pozitív binary32 érték körülbelül 1.401 × 10^-45, binary64 esetén körülbelül 4.941 × 10^-324. | ||
| + | |||
| + | A '' | ||
| + | |||
| + | === Melyiket használjuk mérnöki számításhoz? | ||
| + | |||
| + | **Általános mérnöki számításoknál jó alapválasztás a double.** | ||
| + | |||
| + | A '' | ||
| + | |||
| + | A számítás pontosságát nem csak a választott típus, hanem a mérési adatok minősége és az alkalmazott számítási módszer is befolyásolja. | ||
| + | |||
| + | === Példa: mérési felbontás nagy értéknél === | ||
| + | |||
| + | A szokásos 32 bites '' | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | int main(void) | ||
| + | { | ||
| + | float a = 100000000.0f; | ||
| + | double b = 100000000.0; | ||
| + | |||
| + | a = a + 1.0f; | ||
| + | b = b + 1.0; | ||
| + | |||
| + | printf(" | ||
| + | printf(" | ||
| + | |||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Szokásos IEEE 754 ábrázolással és a legközelebbi értékre kerekítéssel a kiírás: | ||
| + | |||
| + | < | ||
| + | float: | ||
| + | double: 100000001 | ||
| + | </ | ||
| + | |||
| + | Az 1 nagyságú növekmény a '' | ||
| + | |||
| + | Az '' | ||
| + | |||
| + | Korábban már bemutattuk, hogy sok hétköznapi tizedes tört, például a 0.1, kettes számrendszerben nem írható le véges számú számjeggyel. Ezért lebegőpontos tároláskor kerekítésre lehet szükség. A '' | ||
| + | |||
| + | === A művelet típusa is számít === | ||
| + | |||
| + | == Egészosztás: | ||
| + | |||
| + | Tegyük fel, hogy egy munkadarab 5 méter utat tesz meg 2 másodperc alatt. | ||
| + | |||
| + | <code c> | ||
| + | int ut = 5; | ||
| + | int ido = 2; | ||
| + | double sebesseg = ut / ido; | ||
| + | </ | ||
| + | |||
| + | A '' | ||
| + | |||
| + | Ennek oka, hogy az osztás mindkét operandusa egész típusú, ezért **egészosztás** történik. A hányados törtrésze elmarad; pontosabban az eredmény nulla felé csonkolódik. A kapott 2 csak ezután alakul '' | ||
| + | |||
| + | **Az eredményt tároló változó típusa nem változtatja meg visszamenőleg a már elvégzett műveletet.** | ||
| + | |||
| + | A helyes megoldás például: | ||
| + | |||
| + | <code c> | ||
| + | double sebesseg = (double)ut / ido; | ||
| + | </ | ||
| + | |||
| + | A '' | ||
| + | |||
| + | Ha a távolság és az idő mért mennyiség, célszerű már eleve lebegőpontos változókat használni: | ||
| + | |||
| + | <code c> | ||
| + | double ut = 5.0; | ||
| + | double ido = 2.0; | ||
| + | double sebesseg = ut / ido; | ||
| + | </ | ||
| + | |||
| + | == Lebegőpontos érték átalakítása egésszé == | ||
| + | |||
| + | <code c> | ||
| + | double homerseklet = 23.9; | ||
| + | int egesz_homerseklet = (int)homerseklet; | ||
| + | </ | ||
| + | |||
| + | Az eredmény 23. Az átalakítás **nem a legközelebbi egészre kerekít**, hanem nulla felé csonkol: a -23.9 értékből -23 lesz. Ez akkor használható így, ha a csonkolt érték elfér a célként választott egész típusban. | ||
| + | |||
| + | === Karakterek és logikai értékek === | ||
| + | |||
| + | == Karakter: char == | ||
| + | |||
| + | A '' | ||
| + | |||
| + | <code c> | ||
| + | char jeloles = ' | ||
| + | printf(" | ||
| + | </ | ||
| + | |||
| + | A karaktert **aposztrófok** közé írjuk. A '' | ||
| + | |||
| + | **Egy char nem feltétlenül elegendő egy megjelenített karakter tárolására.** UTF-8 kódolásban például sok ékezetes betű több bájtot foglal. A '' | ||
| + | |||
| + | == Logikai érték: bool == | ||
| + | |||
| + | Igaz/hamis állapothoz C99–C17 környezetben a ''< | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | bool motor_bekapcsolva = true; | ||
| + | bool tulmelegedes = false; | ||
| + | </ | ||
| + | |||
| + | A '' | ||
| + | |||
| + | === Értékek kiírása: printf() === | ||
| + | |||
| + | A '' | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | int main(void) | ||
| + | { | ||
| + | int darabszam = 120; | ||
| + | double feszultseg = 3.276; | ||
| + | |||
| + | printf(" | ||
| + | printf(" | ||
| + | |||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | A kiírás: | ||
| + | |||
| + | < | ||
| + | Darabszam: 120 | ||
| + | Feszultseg: 3.28 V | ||
| + | </ | ||
| + | |||
| + | A '' | ||
| + | |||
| + | ^ Formátum ^ Felhasználás ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | Például a '' | ||
| + | |||
| + | A '' | ||
| + | |||
| + | **A scanf() szabálya eltér:** '' | ||
| + | |||
| + | === Hogyan ellenőrizzük a tényleges méreteket? === | ||
| + | |||
| + | A '' | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | int main(void) | ||
| + | { | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | |||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | |||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | |||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | A ''< | ||
| + | |||
| + | == Kiegészítés: | ||
| + | |||
| + | Adatátvitelnél, | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | uint8_t meresi_bajt = 200; | ||
| + | int16_t nyers_meres = -1200; | ||
| + | uint32_t impulzusok = 100000; | ||
| + | </ | ||
| + | |||
| + | A '' | ||
| + | |||
| + | === Típusválasztás mérnöki feladatokban === | ||
| + | |||
| + | ^ Feladat ^ Jó kiinduló választás ^ Mire figyeljünk? | ||
| + | | Darabszám, cikluslépések száma | '' | ||
| + | | Előjeles változás, eltérés | '' | ||
| + | | Hossz, idő, erő, feszültség | '' | ||
| + | | Sok, korlátozott pontosságú mérési adat | '' | ||
| + | | Nagy egész számláló | '' | ||
| + | | Egy adatbájt | ||
| + | | Egy egyszerű karakter | '' | ||
| + | | Igen/nem állapot | '' | ||
| + | |||
| + | **A változó típusa nem tárol mértékegységet.** Ha '' | ||
| + | |||
| + | === Önellenőrző kérdések === | ||
| + | |||
| + | - Miért célszerű a munkadarabok számát egész, a hőmérsékletet pedig lebegőpontos típusban tárolni? | ||
| + | - Több különböző értéket tárol-e egy 8 bites előjel nélküli típus, mint egy 8 bites előjeles típus? | ||
| + | - Mennyi lesz a '' | ||
| + | - Miben különbözik a '' | ||
| + | - Mennyi lesz az '' | ||
| + | - Mit jelent a '' | ||
| + | - Biztosan 8 bájtos-e a '' | ||
| + | - Miért veszhet el egy kis növekmény, | ||
| + | |||
| + | == Rövid válaszok == | ||
| + | |||
| + | - A darabszám törtrész nélküli mennyiség; a hőmérsékletnél gyakran törtrészt is meg kell őrizni. | ||
| + | - Nem. Mindkettőnek 256 bitmintázata van; az értéktartományuk különbözik. | ||
| + | - 3.0, mert előbb egészosztás történik. | ||
| + | - Az első eredménye egész 3, a másodiké lebegőpontos 3.5. | ||
| + | - 8, mert az átalakítás nulla felé csonkol. | ||
| + | - Két tizedesjegyet ír ki; a tárolt érték nem változik meg. | ||
| + | - Nem. A '' | ||
| + | - A nagy érték környezetében az ábrázolható szomszédos számok közötti távolság meghaladhatja a növekményt. | ||
| + | |||
| + | === Oktatói megjegyzés és szakmai háttér === | ||
| + | Ez a jegyzet az alapvető számszerű típusokra, valamint a karakter- és logikai értékekre összpontosít. A tömbök, szövegek, mutatók, struktúrák, | ||
| + | A példák C11/C17 környezetben használhatók. A méret- és pontosságadatok megvalósításfüggőségét a táblázatok jelzik. Az első órán a típusválasztásra, | ||
| - | === Lebegőpontos | + | Szakmai háttér: [[https:// |
| - | | **Adat typus** | ||
| - | | **float** | ||
| - | | **double** | ||
| - | | **long double** | 10 | 3.4E-4932 | ||
| === Összefoglalás === | === Összefoglalás === | ||
| {{tanszek: | {{tanszek: | ||
tanszek/oktatas/szamitastechnika/adat_tipusok.1662412107.txt.gz · Last modified: by knehez
