Free Pascal: gyökvonás esetén miért nem egész számot kapok vissza eredményül? (bővebben lent)
Azt várnám, hogy ha beírom, hogy 9 akkor hármat írjon ki és ne valamiféle fix vagy lebegőpontos számábrázolással (nem értek hozzá) jelenjen meg a szám...
Nem értem hogy longint esetén hogy tud ilyesmi egyáltalánmegjelenni.
A kommentbe írt sorok meg nem is működnek egyáltalán, hogy miért, nem tudom.
program gyokvonas_pelda;
var
szam, eredmeny : longint;
begin
ReadLn (szam);
{eredmeny := Sqrt ( Trunc ( szam ) );}
{eredmeny := Sqrt ( szam );}
WriteLn (Sqrt ( szam ) );
WriteLn ( Sqrt (Trunc ( szam ) ) );
ReadLn;
end.
Ezt hogy csináljam?
9 gyöke 3
16 gyöke 4
Itt nem lehet kerekíteni, ez annyi és kész...
Mivel az Sqrt függvény visszatérési értéke Extended típusú ezért kap ilyen eredményt. A kiírással lehet trükközni:
program gyokvonas_pelda;
var szam : longint;
begin
Write('Kerem a szamot: ');
ReadLn (szam);
if Frac(Sqrt(szam)) > 0 then
WriteLn (Sqrt(szam):0:5) else WriteLn (Sqrt(szam):0:0);
ReadLn;
end.
Értem, az hogy lehet, hogy longint változóba is képes ilyen érték kerülni?
és a { } közti sorok miért nem működnek?
A Te prím függvényedben működik, itt miért nem?
Valamit elnézek?
Ha ilyen a visszatérési érték, tudok vele műveletet végezni mintha egész szám lenne?
Egy valamit tudatosíts: a gép azt csinálja, amire utasítják. Nem fog ő azon agyalni, hogy most a megadott szám négyzetgyöke vajon kerek egész-e, ő mindössze végrehajtja az sqrt függvényt. (Amit valaki valahogy megírt, méghozzá történetesen úgy, hogy az eredményt extended típusban adja vissza.) A függvényeknek pedig meg van határozva a visszatérési értéke. Nem fog azon gondolkozni a rendszer, hogy matematikailag milyen számhalmazba tartozik az eredmény. Mivel a függvénynek extended a visszatérési értéke, ezért akkor is extended-et ad vissza, ha az összes tizedesjegy nulla.
Két lehetőséged van "egészként" kiírni: vagy kerekíted, vagy adott számú tizedesjeggyel írod ki. ( writeln(sqrt(szam):0:0) )
'Értem, az hogy lehet, hogy longint változóba is képes ilyen érték kerülni?' Igen Trunc, Round, stb. után
'és a { } közti sorok miért nem működnek?' Értelemszerűen, nem egyezik a típusuk.
'A Te prím függvényedben működik, itt miért nem? ' Melyik volt az, írtam jópárat ?
'Valamit elnézek?' Valószínű
'Ha ilyen a visszatérési érték, tudok vele műveletet végezni mintha egész szám lenne?' Igen
Továbbá: ha te dinamikusan akarod változtatni a tizedesjegyek számát, pl. ha egész jön ki eredményül, akkor ne írjon ki tizedesjegyeket, de ha nem egész, akkor igen, azt már neked kell leprogramoznod.
" az hogy lehet, hogy longint változóba is képes ilyen érték kerülni"
Sehogy, ugyanis a függvény paraméterének használsz longint típusú változót, a visszatérési értéke, mint már elmondtuk, extended.
"és a { } közti sorok miért nem működnek? "
Mert az sqrt függvény visszatérési értéke extended, és te ezt az extended-et akarod belegyömöszölni egy longintbe, ami nem fog sikerülni. A Pascal erősen típusos nyelv, ha egy változóba más típusú értéket akarsz tenni, akkor előtte típusátalakítást kell végezned.
Javaslom, mielőtt a komolyabb dolgokba belevágsz, az alapokkal legyél tisztában! Anélkül szenvedés lesz minden további programozás.
Köszönöm a válaszokat.
Ebben a függvényben, amit alább bemásolok, említettem, hogy jól működik.
Ez azért van, mert a trunc van előbb és átalakítja?
function prim_e (szam : longint):boolean;
var v, i : longint;
prime : boolean ;
begin
v := Trunc(Sqrt(szam)) + 1;
prime := (szam mod 2) <> 0;
i := 3;
while(prime) and (i <= v) do
begin
prime := (szam mod i) <> 0;
Inc(i, 2);
end;
prim_e := prime;
end;
Most jövök rá hogy ez azt csinálja amit szeretnék, csak fordítva írtam a sorrendet és a Trunc-nak utána kellett volna olvasnom.
Szóval tulajdonképpen nem a kiírás volt a kérdés hanem a longint változóban való tárolás sikertelenségével kapcsolatos probléma.
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!