Kezdőoldal » Számítástechnika » Programozás » Pascal-ban egy függvényt...

Pascal-ban egy függvényt szeretnék írni, ami a kapott számban felcseréli a számjegyeket. Miként lehet ezt megoldani?

Figyelt kérdés

Matematikai műveletekkel kellene megoldani a számjegyek cseréjét és nem string-be konvertálással, "val", "str", "inttostr", "strtoint" eljárásokkal...

Ezeket a fentebbieket szeretném kizárni és csak számolással, matematikai műveletekkel szeretném a cserét megoldani, van erre valamilyen lehetőség?



2015. ápr. 15. 17:58
1 2 3
 11/30 tabaki ***** válasza:
2015. ápr. 15. 19:39
Hasznos számodra ez a válasz?
 12/30 tabaki ***** válasza:
Ja, bocs, semmit sem tettem hozzá az előzőkhöz, csak kis színesként linkeltem be, de amíg méláztam, meg is írtad... csuda hasznosan szóltam hozzá megint.
2015. ápr. 15. 19:46
Hasznos számodra ez a válasz?
 13/30 A kérdező kommentje:

A kétjegyűt írtam meg, úgy gondoltam azért linkelted be, hogy megértsem a C kódos megoldást is, vagy elgondolkodjak rajta. :-)

Nagyon hasznos ha hozzászólsz a dolgokhoz. :-)

2015. ápr. 15. 19:53
 14/30 tabaki ***** válasza:

Hát, a linkem alapján aligha érted meg a C-s dolgot, mert az is ugyanazt csinálja, mint a tied, csak basicben. De elgondolkodni attól még lehet...

A programod teljesen jó, de ha csak ennyi a feladat, elhagyhatod a függvényt:


Program szamjegycsere;

var szam : integer;

begin

Write('Kerem a szamot : '); ReadLn(szam);

WriteLn('A felcserelt szam: ', szam mod 10*10 + szam div 10);

ReadLn;

end.

2015. ápr. 15. 20:03
Hasznos számodra ez a válasz?
 15/30 anonim ***** válasza:

Talán így kicsit érthetőbb, ha nem olvasható másold be az IDE -be. C és C++ nyelven is lefordul.


int Reverse(int x)

{

int szamKaraktereinekSzama = -1; // -1 -el incializáljuk, mert a nulladik hatványra is szükség van

for(int i = x; i != 0; i /= 10, ++szamKaraktereinekSzama)

{

// Tegyük fel x = 123 - mivel int így osztásoknál lefelé lesznek kerekítve

// 123 / 10 = 12,3

// 12 / 10 = 1,2

// 1 / 10 = 0,1 - i egyenlő 0 -val így a ciklus megáll és kideült 3 számjegyes

}


int eredmeny = 0;

for(; x != 0; --szamKaraktereinekSzama)

{

eredmeny += (x % 10) * pow(10, szamKaraktereinekSzama);

x /= 10;

// 123 % 10 = 3 * 100 = 300

// 12 % 10 = 2 * 10 = 20

// 1 % 10 = 1 * 1 = 1

}

return eredmeny;

}

2015. ápr. 15. 20:09
Hasznos számodra ez a válasz?
 16/30 A kérdező kommentje:

Három vagy többjegyűeknél ez ciklusban működne ahogy a C kósban van és akkor a length változót gondolom úgy kell beállítani, hogy:

10 - 99 intervallum esetén 2

100 - 999 intervallum esetén 3

1000 - 9999 esetén 4

stb?

2015. ápr. 15. 20:12
 17/30 A kérdező kommentje:
Hopsz, túl korán írtam a módosított C kódot nem láttam amikor az előző választ írtam, majd átnézem mégegyszer. :-)
2015. ápr. 15. 20:13
 18/30 tabaki ***** válasza:

#6 alapján megpróbáltam pascalból is előgyötörni valami hasonlót. Az az igazság, hogy már túl álmos vagyok ahhoz, hogy értsem is, ezért jó eséllyel belecsúszhatott bármiféle, holnapra vállalhatatlan marhaság. Próbálgatva mindenesetre úgy tűnik, hogy működik. A longint miatt csak maxiumum 9 számjegyen nem kéne hibáznia vagy megdöglenie. A hibás adat ellen nem tesz semmit -- a dolog iróniája, hogy a hibaszűrést szöveges adatbevitellel lehetne megoldani, ami pont értelmetlenné tenné az egész ügyeskedést, mivel a string sokkal lezserebben megfordítható + akármilyen hosszú lehet...


program reverse;

uses math;


var szam : longint;


function Reverse(x : longint) : longint;

var

i : longint;

hossz : integer;

num : extended;

begin

hossz := 0; i := x;

repeat

i := Trunc(i / 10);

Inc(hossz);

until i = 0;

num := 0;

for i:= 0 to hossz-1 do

begin

num := num + (x mod 10) * intpower(10, hossz - i - 1);

x := Trunc(x / 10);

end;

Reverse := Trunc(num);

end;


BEGIN

repeat

WriteLn('Kérem a számot: '); ReadLn(szam);

WriteLn('Forditva: ', Reverse(szam));

WriteLn;

until szam = 0;

END.

2015. ápr. 15. 22:56
Hasznos számodra ez a válasz?
 19/30 SimkoL ***** válasza:

tabaki kolléga megoldást picit kiterjesztve pozitív egész számokra 18446744073709551615-ig - csak Free Pascal alatt - és egy egyszerű hibakezelés:


program project1;


uses

SysUtils, Math;


var

szam: QWord;

tovabb : boolean;


function Reverse( x: QWord): QWord;

var

i: QWord;

n : byte;

hossz: byte = 0;

num: extended = 0;

begin

i := x;

repeat

i := i div 10;

Inc(hossz);

until i = 0;

for n := 0 to hossz - 1 do

begin

num := num + (x mod 10) * IntPower(10, hossz - n - 1);

x := x div 10;

end;

Result := Trunc(num);

end;


begin

repeat

try

tovabb := true;

Write(#10#13,'Kérem a számot (1..18446744073709551615, 0: kilép): ');

ReadLn(szam);

except

on e: exception do

begin

WriteLn(#10#13, 'Hiba !');

tovabb := false;

szam := 1;

end;

end;

if tovabb then WriteLn(#10#13, 'Forditva: ', Reverse(szam), #10#13);

until szam = 0;

end.

2015. ápr. 16. 11:58
Hasznos számodra ez a válasz?
 20/30 SimkoL ***** válasza:
Még mielőtt lepontoznátok vagy megszólnátok, nem azért 'rondítok' bele a Pascal és Delphi kódokba, hogy 'hű de okos vagyok' hanem a nyelv lehetőségeit próbálom, szeretném megmutatni. - Lehet valakinek később jól jön.
2015. ápr. 16. 12:10
Hasznos számodra ez a válasz?
1 2 3

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!