Kezdőoldal » Számítástechnika » Programozás » Alábbi C-ben írt kódot Pascal-...

Alábbi C-ben írt kódot Pascal-ra átírni mennyire lenne egyszerű? (bővebben lent)

Figyelt kérdés

Alábbi C kód átírása érdekelne Pascal-ba.

Én sajnos csak addig jutok, hogy egységesen "longint" változóként deklarálom a tömböt - és változókat.

Túl sok a bitművelet, meg mutatózás, melyeket nem tudok Pascal-ban megvalósítani, a C nyelv hiányos ismerete miatt.


#include <stdio.h>

#include <stdint.h>


int main(void) {

uint32_t mt[624];


mt[0] = 0; /* itt lehet állítani a kiindulási értéket */

for (int i = 1; i < 624; i += 1)

mt[i] = 0x6c078965 * (mt[i-1] ^ (mt[i-1] >> 30)) + i;


unsigned index = 0;

for (int j = 0; j < 10; j += 1) {

/* 624 kérésenként egy új tömböt keverünk ki*/

if (index == 0) {

for (int i = 0; i < 624; i += 1) {

uint32_t y = (mt[i] & (1 << 31)) | (mt[(i+1) % 624] & ~(1 << 31));

mt[i] = mt[(i + 397) % 624] ^ (y >> 1);

if ((y % 2) != 0)

mt[i] = mt[i] ^ 0x9908b0df;

}

}


/* a tömbből kivett számokat még tovább kavarjuk */

uint32_t y = mt[index];

y ^= (y >> 11);

y ^= (y << 7) & 0x9d2c5680;

y ^= (y << 15) & 0xefc60000;

y ^= (y >> 18);

index = (index + 1) % 624;


/* az előállt véletlenszám, 0..(1<<32)-1 */

printf("%08x\n", (unsigned) y);

}


return 0;

}



2019. jan. 2. 18:19
1 2
 1/13 anonim ***** válasza:
0%
5 perc.
2019. jan. 2. 18:27
Hasznos számodra ez a válasz?
 2/13 anonim ***** válasza:
0%

"Túl sok a bitművelet, meg mutatózás, melyeket nem tudok Pascal-ban megvalósítani, a C nyelv hiányos ismerete miatt."


Mi vaan???

2019. jan. 2. 18:41
Hasznos számodra ez a válasz?
 3/13 A kérdező kommentje:
Valaki tudna segíteni ezt megvalósítani Pascal-ban?
2019. jan. 2. 18:42
 4/13 A kérdező kommentje:

# 2 : olvass utána, hogy mi az a bitművelet.

[link]

2019. jan. 2. 18:43
 5/13 anonim ***** válasza:
0%
Mennyiért?
2019. jan. 2. 18:45
Hasznos számodra ez a válasz?
 6/13 anonim ***** válasza:
0%
Szerintem amúgy inkább Te olvass utána.
2019. jan. 2. 18:45
Hasznos számodra ez a válasz?
 7/13 anonim ***** válasza:
100%

Némi segítség:

* uint32_t helyett uint32 vagy longword vagy cardinal

* mt[624] helyett mt[0..623]

* for ciklusnál ügyelj:

j = 0; j < 10;

az

j := 0 to 9

* int helyett integer vagy smallint

* unsigned helyett word vagy uint16

* 0x helyett $

* ^ helyett xor

* >> helyett shr

* << helyett shl

* & helyett and

* | helyett or

* % helyett mod

* != helyett <>

* a ^= bonyolultabb, nincs értékadó operátor párja, szóval:

y ^= (y >> 18);

helyett

y := y xor (y shr 18);

* formázott kimenethez (sysutils kell hozzá):

format('%08x', [y])


Források:

* [link]

* [link]

* [link]

* [link]

2019. jan. 2. 23:33
Hasznos számodra ez a válasz?
 8/13 tabaki ***** válasza:
Biztatásul: [link]
2019. jan. 3. 00:01
Hasznos számodra ez a válasz?
 9/13 A kérdező kommentje:

Nagyon köszönöm a rendkívül precíz segítségnyújtást.

A "<<" és ">>" műveleteket nem kellett lecserélni, Pascal ezeket tudja.

A végén a kiiratásnál miképpen kaphatnám meg a számot normál, decimális értékével?

A sima "y" értéke lesz az, úgy sejtem.

Simán csak y értékét kell kiiratni kekkor, vagy csinálni kell vele még valamit?

Az "y" túl szabályosnak tűnik, lehet azért, mert 0 a kezdőérték. :-)

2019. jan. 3. 04:29
 10/13 A kérdező kommentje:

program szam;


uses SysUtils;


var

mt : array[0..623] of uint32;

i, j : integer;

y, index : uint16;

begin

mt[0] := 0; { itt lehet állítani a kiindulási értéket }

for i :=0 to 623 do

mt[i] := $6c078965 * (mt[i-1] xor (mt[i-1] >> 30)) + i;

index := 0;

for j := 0 to 9 do

begin

{ 624 kérésenként egy új tömböt keverünk ki}

if (index = 0) then begin

for i := 0 to 623 do

begin

y := (mt[i] and (1 << 31)) or (mt[(i+1) mod 624] and not (1 << 31));

mt[i] := mt[(i + 397) mod 624] xor (y >> 1);

if ((y mod 2) <> 0) then

mt[i] := mt[i] xor $9908b0df;

end;

end;

{ a tömbből kivett számokat még tovább kavarjuk }

y := mt[index];

y := y xor (y >> 11);

y := y xor (y << 7) and $9d2c5680;

y := y xor (y << 15) and $efc60000;

y := y xor (y >> 18);

index := (index + 1) mod 624;

{ az előállt véletlenszám, 0..(1<<32)-1 }

{printf(" mod 08x\n", (unsigned) y);}

WriteLn(format('%08x', [y]));

end;

end.

2019. jan. 3. 04:29
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!