Felhasználói eszközök

Eszközök a webhelyen


tanszek:oktatas:szamitastechnika:egyszeru_mintapeldak

Különbségek

A kiválasztott változat és az aktuális verzió közötti különbségek a következők.

Összehasonlító nézet linkje

Következő változat
Előző változat
tanszek:oktatas:szamitastechnika:egyszeru_mintapeldak [2022/09/05 21:09]
knehez létrehozva
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
-<code c>+<sxh c>
 #include <​stdio.h>​ #include <​stdio.h>​
  
Sor 18: Sor 22:
     printf("​f = %f \n", f);     printf("​f = %f \n", f);
 } }
-</code>+</sxh>
  
 **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 01000000000000000000000A 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 bitesde í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?
  
-<code c>+<sxh c>
 #include <​stdio.h>​ #include <​stdio.h>​
  
Sor 40: Sor 54:
     printf("​c = %d \n", c);     printf("​c = %d \n", c);
 } }
-</code>+</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 printf()-ben használjunk %f-et és próbáljuk ki úgy isSegített?+Ahhoz hogy a tizedes jegyeket is megkapjuk, próbáljunk ​meg áttérni ​float adattípusra, ​következő példa alapján.
  
-<code c>+**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>
 #include <​stdio.h>​ #include <​stdio.h>​
  
Sor 55: Sor 72:
     printf("​c = %f \n", c);     printf("​c = %f \n", c);
 } }
-</code>+</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ásthogy 2 > -1? Magyarázza ​meg, hogy mi történik és miért?+Azért nem segítmert 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éntakkor is a 4-es kerül bele.
  
-<code c>+**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>
 #include <​stdio.h>​ #include <​stdio.h>​
  
Sor 68: Sor 87:
     if ( b > a)     if ( b > a)
     {     {
-       ​printf("​nagyobb, mint a");+       ​printf("​a 2 nagyobb, mint a -1"​);​ 
 +    } 
 +    else 
 +    { 
 +       ​printf("​a 2 kisebb, mint a -1 ???");
     }     }
-    printf("​vege"​);​ 
 } }
-</code>+</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?** 
-<code c>+<sxh c>
 #include <​stdio.h> ​ #include <​stdio.h> ​
  
Sor 85: Sor 107:
     printf("​%f\n",​ a / b);     printf("​%f\n",​ a / b);
 } }
-</code>+</sxh>
  
 Nézzük meg hogyan ábrázoljuk a változókat:​ https://​www.h-schmidt.net/​FloatConverter/​IEEE754.html ​ Nézzük meg hogyan ábrázoljuk a változókat:​ https://​www.h-schmidt.net/​FloatConverter/​IEEE754.html ​
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?** 
-<code c>+<sxh c>
 #include <​stdio.h>​ #include <​stdio.h>​
 #define N 3 + 5 #define N 3 + 5
Sor 105: Sor 127:
     printf("​%d\n",​ a * N);     printf("​%d\n",​ a * N);
 } }
-</code>+</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 ====
tanszek/oktatas/szamitastechnika/egyszeru_mintapeldak.1662412166.txt.gz · Utolsó módosítás: 2022/09/05 21:09 szerkesztette: knehez