menu
shopping_cart
0
KOSÁR

8. lecke

Valós változók

lightbulb_outlineA valós számok eltárolása

Az előző fejezet végén látott program egyelőre hibás kimenetet ad az osztás esetén:

#include<stdio.h>

int main()
{

    int a = 5,   b = 3,   e;

    e = a + b;   printf("osszeadas %d \n", e);
    e = a - b;   printf("kivonas %d \n", e);
    e = a * b;   printf("szorzas %d \n", e);
    e = a % b;   printf("maradekos osztas %d \n", e);
    e = a / b;   printf("osztas %d \n", e);

return 0;
}

muveletek.c c osszeadas 8 kivonas 2 szorzas 15 maradekos osztas 2 osztas 1

Az utolsó művelet azért jelent meg a konzolablakon rosszul, mert az osztás eredménye valós szám, pontosan 5/3 = 1.66666... és ezt szerettük volna beletuszkolni egy egész szám változóba (int). Természetesen nem fér bele - csak úgy, ha lenyessük a kilógó részeket, a törtrészt, és csak az egészrészt mentjük el. A C az eredmény egész részét veszi egy valós számnak, ha azt egy egész szám változóba akarjuk menteni.

A most említett probléma megoldása az, hogy ha nem egész szám (int) változókat használunk, hanem valós változókat, amiben egy valós számot lehet eltárolni. Valós változót a double kulcsszóval lehet létrehozni. Hozzunk létre valós ”a”, ”b” és ”e” változókat és végezzük el a problémás osztást. Az eredményt írjuk a konzolablakra. A valós változó hely-jelölője a %lf

#include<stdio.h>

int main()
{

    double a = 5,   b = 3,   e;

    e = a / b;

    printf("osztas %lf \n", e);

return 0;
}

osztas-ok.c c osztas 1.666666

Azt gondolná az ember, hogy az ”a” és ”b” változók maradhatnak egész szám (int) típusúak, és csak az eredmény változót kell valós számként (double) létrehozni, mert csak az lesz valós szám. Sajnos a C a részeredményeket olyan típusúvá konvertálja amilyen típusokkal végeztük a műveletet, azaz ha az ”a” és ”b” változókat int-ként hozzuk létre, akkor mielőtt az osztás eredménye, az 1.666 bekerülne az e változóba előbb átkonvertálódik int-té, így az eredmény hibásan 1 lesz. Szóval ez nem jó eredményt ad:

#include<stdio.h>

int main()
{

    int a = 5,   b = 3;
    double e;

    e = a / b;   

    printf("osztas %lf \n", e);

return 0;
}

osztas-nemok.c c osztas 1

Minden változót double-ként kell tárolni, ha pontos eredményt szeretnénk kapni az osztás során.

Jelentkezz be a hozzászóláshoz.

csajo76
Sziasztok! Ha mindent visszaírok double-re, akkor meg a maradékosztás nem fog működni (Hibaüzenet: [Error] invalid operands to binary % (have 'double' and 'int'), mivel a modulo operátor csak integer típuson működik!) Ha ún. typecast-olom (ráerőltetem az int típust - lásd lent - ), akkor meg a típuskonverzió mellett 'a' és 'b' értékét is nullára állítja és a maradékos osztás eredménye nulla lesz a kettő helyett. Ezt hogy lehet áthidalni, hogy minden számolás jól működjön? #include int main() { double a = 5, b = 3, e; e = a + b; printf("osszeadas %f \n", e); e = a - b; printf("kivonas %f \n", e); e = a * b; printf("szorzas %f \n", e); (int) e == (int)a % (int)b; printf("maradekos osztas %d\n", e); e = a / b; printf("osztas %f \n", e); return 0; } Köszönöm, Csaba