A kiválasztott változat és az aktuális verzió közötti különbségek a következők.
Előző változat mindkét oldalon Előző változat Következő változat | Előző változat | ||
tanszek:oktatas:szamitastechnika:egyszeru_mintapeldak [2022/09/05 21:24] superuser |
tanszek:oktatas:szamitastechnika:egyszeru_mintapeldak [2023/10/11 08:19] (aktuális) knehez |
||
---|---|---|---|
Sor 1: | Sor 1: | ||
+ | ==== A változók pontos megadása ==== | ||
+ | |||
+ | A következő érdekes példák a változók pontos típusmegadására figyelmeztetnek. | ||
+ | |||
**Feladat**: Változók definíciója és alapvető számolások | **Feladat**: Változók definíciója és alapvető számolások | ||
<sxh c> | <sxh c> | ||
Sor 21: | Sor 25: | ||
**Megjegyzés:** | **Megjegyzés:** | ||
- | Jegyezzük meg, hogy a 10 általában minden programozási nyelvben egész számot jelent, binárisan 32 biten kódolva: 00000000 00000000 00000000 00001010 lesz. | + | Jegyezzük meg, hogy a 10 általában minden programozási nyelvben egész számot jelent, binárisan 32 biten kódolva: |
- | A 10.0 jelenti a double típusú lebegőpontos számot ami 64 bites és így nézne ki: 0 10000000010 0100000000000000000000000000000000000000000000000000 és a 10.0f (igen, a végére egy f betűt írunk), jelenti a float típusú lebegőpontos számot ami ugyancsak 32 bites de így néz ki binárisan: 0 10000010 01000000000000000000000. A szóközök az előjel az exponens és a mantissza tagokat választják el egymástól. Látható tehát hogy a 10 10.0 10.0f három teljesen különböző módon van értelmezve kettes számrendszerben. | + | **00000000 00000000 00000000 00001010** lesz. |
+ | |||
+ | A 10.0 jelenti a double típusú lebegőpontos számot ami 64 bites és így nézne ki: | ||
+ | |||
+ | **0 10000000010 0100000000000000000000000000000000000000000000000000** | ||
+ | |||
+ | és a 10.0f (igen, a végére egy f betűt írunk), jelenti a //float// típusú lebegőpontos számot ami ugyancsak 32 bites, de így néz ki binárisan: | ||
+ | |||
+ | **0 10000010 01000000000000000000000** | ||
+ | |||
+ | A szóközök az előjel az exponens és a mantissza tagokat választják el egymástól. Látható tehát hogy a 10 10.0 10.0f három teljesen különböző módon van értelmezve kettes számrendszerben. | ||
**f = 70.0 / 3.0;** helyett ha ezt írjuk: **f = 70 / 3;** ezért fog más eredményt adni hiszen így elvesztjük a tizedesjegyeket. | **f = 70.0 / 3.0;** helyett ha ezt írjuk: **f = 70 / 3;** ezért fog más eredményt adni hiszen így elvesztjük a tizedesjegyeket. | ||
- | **Feladat**: Hibásan számol a c nyelv??? Mi lehet a hiba? | + | **1. Feladat**: Hibásan számol a c nyelv??? Mi lehet a hiba? |
<sxh c> | <sxh c> | ||
Sor 41: | Sor 55: | ||
} | } | ||
</sxh> | </sxh> | ||
+ | A 3 nem osztója a 13-nak. A 13 / 3 eredményét a c változóban egészként tároljuk, ilyenkor az eredmény egész részét aza a 4-et fogjuk eredményként kapni. | ||
- | **Feladat**: Az előző kódban változtassuk meg a c-t float-ra és a printf()-ben használjunk %f-et és próbáljuk ki úgy is. Segített? | + | Ahhoz hogy a tizedes jegyeket is megkapjuk, próbáljunk meg áttérni float adattípusra, a következő példa alapján. |
+ | |||
+ | **2. Feladat**: Az előző kódban változtassuk meg a c-t float-ra és a printf()-ben használjunk %f-et és próbáljuk ki úgy is. Segített? | ||
<sxh c> | <sxh c> | ||
Sor 57: | Sor 74: | ||
</sxh> | </sxh> | ||
- | **Feladat**: Hozzon létre egy **unsigned int** változót 2 illetve egy **int** változót -1 értékkel és végezzen összehasonlítást, hogy 2 > -1? Magyarázza meg, hogy mi történik és miért? | + | Azért nem segít, mert az a / b elvégzésekor, mivel mind a két érték egész, az eredmény megint 4 lesz. A c-t hiába adtuk meg float-ként, akkor is a 4-es kerül bele. |
+ | |||
+ | **3. Feladat**: Hozzon létre egy **unsigned int** változót 2 illetve egy **int** változót -1 értékkel és végezzen összehasonlítást, hogy 2 > -1? Magyarázza meg, hogy mi történik és miért? | ||
<sxh c> | <sxh c> | ||
Sor 68: | Sor 87: | ||
if ( b > a) | if ( b > a) | ||
{ | { | ||
- | printf("b nagyobb, mint a"); | + | printf("a 2 nagyobb, mint a -1"); |
+ | } | ||
+ | else | ||
+ | { | ||
+ | printf("a 2 kisebb, mint a -1 ???"); | ||
} | } | ||
- | printf("vege"); | ||
} | } | ||
</sxh> | </sxh> | ||
- | **Miért számol hibásan (pontatlanul) a következő kód?** | + | **4. Feladat: Miért számol hibásan (pontatlanul) a következő kód?** |
<sxh c> | <sxh c> | ||
#include <stdio.h> | #include <stdio.h> | ||
Sor 95: | Sor 117: | ||
Magyarázzuk meg miért nem működik a (double) (a/b) típuskonverzió? | Magyarázzuk meg miért nem működik a (double) (a/b) típuskonverzió? | ||
- | **Miért számol hibásan (pontatlanul) a következő kód?** | + | **5. Feladat: Miért számol hibásan (pontatlanul) a következő kód?** |
<sxh c> | <sxh c> | ||
#include <stdio.h> | #include <stdio.h> | ||
Sor 107: | Sor 129: | ||
</sxh> | </sxh> | ||
- | Az eredménynek 2 * 8 nak kellene lennie, de 11-et ír ki, mi lehet a hiba? Az a probléma, hogy a #define nem végez műveletet, hanem egyszerűen behlyettesít, így az a * N művelet a * 3 + 5 lesz, ami a precedencia (sorrendi) szabályok miatt 6 + 5 = 11 lesz. | + | Az eredménynek 2 * 8 nak kellene lennie, de 11-et ír ki, mi lehet a hiba? Az a probléma, hogy a #define nem végez műveletet, hanem egyszerűen behelyettesít, így az a * N művelet a * 3 + 5 lesz, ami a //precedencia// (sorrendi) szabályok miatt 6 + 5 = 11 lesz. |
==== Formátum leírók ==== | ==== Formátum leírók ==== |