Kezdőoldal » Számítástechnika » Programozás » Free Pascal: gyökvonás esetén...

Free Pascal: gyökvonás esetén miért nem egész számot kapok vissza eredményül? (bővebben lent)

Figyelt kérdés

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.



2015. szept. 15. 06:26
1 2
 1/12 anonim ***** válasza:
Én sem értek hozzá, kerekíts a műveletek végén.
2015. szept. 15. 06:39
Hasznos számodra ez a válasz?
 2/12 A kérdező kommentje:

Ezt hogy csináljam?

9 gyöke 3

16 gyöke 4

Itt nem lehet kerekíteni, ez annyi és kész...

2015. szept. 15. 06:44
 3/12 SimkoL ***** válasza:
55%

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.

2015. szept. 15. 07:28
Hasznos számodra ez a válasz?
 4/12 A kérdező kommentje:

É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?

2015. szept. 15. 07:57
 5/12 anonim ***** válasza:
74%

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) )

2015. szept. 15. 08:30
Hasznos számodra ez a válasz?
 6/12 SimkoL ***** válasza:
55%

'É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

2015. szept. 15. 08:37
Hasznos számodra ez a válasz?
 7/12 anonim ***** válasza:
55%

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.

2015. szept. 15. 08:39
Hasznos számodra ez a válasz?
 8/12 SimkoL ***** válasza:
55%
Ez talán az általános iskola 'minden négyzet téglalap, de nem minden téglalap négyzet' fogalma. Míg egy egész számot tudsz lebegőpontosan ábrázolni, visszafelé nem igaz.
2015. szept. 15. 08:44
Hasznos számodra ez a válasz?
 9/12 A kérdező kommentje:

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;

2015. szept. 15. 09:02
 10/12 A kérdező kommentje:

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.

2015. szept. 15. 09:08
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!