Mi a gond ezzel a Java kóddal?
public class Cone
{
private int r;
private int h;
public Cone(int r, int h)
{
this.r = r;
this.h = h;
}
public double getVolume()
{
double volume;
volume = 1/3 * Math.PI * Math.pow(r, 2) * h;
return volume;
}
}
Mondd meg te, neked nem működik. Legközelebb ha valami nem okés a kódoddal, akkor szíveskedj azt is elmondani, hogy mi a problémád vele, esetleg hibaüzenetet másolj be.
Most vettem a fáradságot, és megnéztem mi a probléma a kódoddal (sosem programoztam Java-ban, ezt leszögezném). Lefordul, tehát olyan hiba nincs benne, csak a getVolume() egy büdös 0.0-t ad vissza. Ez pedig annak okán van, hogy az értékadás elején egy 1/3 van. Ami integerként értékelődik ki. Tehát 0 lesz. Inenntől nullszorzóval megy végig az egész. Végérerakod egy sima /3 -ként és ez a probléma elhárul.
Köszönöm szépen, hogy vetted a fáradságot, hogy segíts.
Ez egy kezdő szintű online kurzusból való feladat, csak annyit láttam, hogy valamiért nem fogadja el a megoldásomat. Most átírtam a javaslatod szerint, és így már jó, tehát igazad van, és köszi tényleg.
Az indoklást viszont sajnos nem egészen értem ("az értékadás elején egy 1/3 van. Ami integerként értékelődik ki. Tehát 0 lesz.") Ha még ezt is segítenél megérteni, igazán hálás volnék.
Amikor a volume változódnak átadod azt a képletet, akkor az sorban kiértékelődik, kezdve az 1/3-al. Az 1/3-ot fogd fel úgy, mint egy divide(1,3) függvényt. A divide függvényednek mindkét paramétere int, ebben az esetben pedig maga is int-el fog visszatérni. Már pedig 1/3 egész osztással 0-t fog eredményezni.
Másik emgoldás lenne, ha 1/3 helyett 1.0/3.0 szerepelne, ekkor már két lebegőpontos számot osztasz, és az eredmény is lebegőpontos szám lesz.
Javaban ha a per jel mindkét 2 oldalán egész szám áll, akkor egész osztás fog troténni.
Az 1 és a 3 egész számok, tehát
1/3 = 0, mivel 1-ben nincs meg a 3 egyszer sem.
Ezt bármivel szorzod 0 lesz.
A Math.Pi és a Math.pow már nem egészeket ad vissza, így ha a sor végén lesz a /3, akkor az osztás bal oldala már nem egész, (a 3 még az, de itt már nem számít),, így sima osztás lesz.
Amúgy ha a sor elején akaord hagyni, akkor így írd:
volume = 1.0/3 * Math.PI * Math.pow(r, 2) * h;
vagy
volume = 1/3.0 * Math.PI * Math.pow(r, 2) * h;
vagy
volume = 1/(double)3 * Math.PI * Math.pow(r, 2) * h;
volume = (double)1/3 * Math.PI * Math.pow(r, 2) * h;
Az utolsó 2 esetben explicit megadod, hogy az egész 3-ast tekintse lebegőpontos számnak (vagyis castolja át...)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!