Kezdőoldal » Számítástechnika » Programozás » Helyes így ez a Pascal program?

Helyes így ez a Pascal program?

Figyelt kérdés

Sajnos nem vagyok olyan helyzetben, hogy le tudjam futtatni gépen úgyhogy nagy segítség lenne ha valaki ellenőrizné hogy van-e benne hiba :)


A feladat hogy egy 'b' állomány második sorából írassuk ki azokat a számokat melyek 2 hatványai. Köszönöm előre is! :)



var a,m,n:integer;

f:text;

t:boolean;

begin

assign(f,'b.txt');

reset(f);

t:true;

readln(f);

while not eol(f) do

begin

read(f,a);

n:=a;

while a>=2 do

begin

m:=n mod 2;

if m<>0 then t:false;

n:=n div 2;

end;

if t=true then write(a);

end;

close(f);

end.



2017. márc. 3. 19:45
1 2
 1/12 A kérdező kommentje:
*while n>=2 do
2017. márc. 3. 20:05
 2/12 SimkoL ***** válasza:
Röviden: NEM !!!
2017. márc. 3. 20:19
Hasznos számodra ez a válasz?
 3/12 SimkoL ***** válasza:
.. hemzseg a hibáktól ez a pár sorod minden szempontból.
2017. márc. 3. 20:37
Hasznos számodra ez a válasz?
 4/12 coopper ***** válasza:

Szia.


Nem futtatam le, csak ránézésre, szintaktikai hibák, szerintem :


- Értékadás : t:true; helyett t:=true; és ez máshol is hiba

- Első sor beolvasása : readln(f); helyett readln(f,a); de ha több adat van az első sorban akkor nem olvasódik be csak az első adat.


Nem szintaktikai hibák :


Nincs lekezelve, hogy csak a második sort olvasd be egyedűl. (Fájlvégig beolvasol minden adatot, a 3-dik, 4-dik, stb,stb sor adatait is).

Szerintem stringel kellene a beolvasást végrehajtani és a stringet szétszedni - adott szábályok alapján - és átalakítani számmá.


A "while a>=2 do" ciklusod végtelen ciklus lesz, mert "a" értékét nem változtatod a cikluson belül.


A többi szerintem jó.


Sok sikert.

üdv.

2017. márc. 3. 21:11
Hasznos számodra ez a válasz?
 5/12 SimkoL ***** válasza:

Javasolnám az alábbi függvény 'bevetését' és akkor már csak a beolvasásra kell koncentrálnod:


function _2_hatvanya_e(szam : Integer) : Boolean;

begin

Result := False;

// Kizárjuk a páratlanokat és kilépünk

if szam mod 2 = 1 then Exit;

Result := True;

while szam > 2 do

begin

szam := szam div 2;

if szam mod 2 <> 0 then Result := False;

end;

end;

2017. márc. 3. 21:29
Hasznos számodra ez a válasz?
 6/12 SimkoL ***** válasza:
A 'while'-be még a Result értéke is bevehető ami szintén csökkenti a futásidőt.
2017. márc. 3. 21:33
Hasznos számodra ez a válasz?
 7/12 SimkoL ***** válasza:

Talán még annyit, hogy

if t=true then write(a); helyett

if t then write(a); bár ez csak a szépség miatt.

A logikai változóknál nem kell kell összehasonlitást végezni.

if t = True → if t ...

if t = False → if not t ...

2017. márc. 3. 21:39
Hasznos számodra ez a válasz?
 8/12 A kérdező kommentje:
Köszönöm mindenkinek! :)
2017. márc. 4. 11:39
 9/12 tabaki ***** válasza:

Megint nem voltam itt, amikor az ég zengett...

Két kísérlet. SimkoL, ha erre jársz, megnéznéd, hogy van-e benne elvi hiba? Magam a következő három gyengeségét látom:

1. Nem foglalkozik a bemenet ellenőrzésével.

2. Nem zárja ki a negatív számokat.

3. Az egy értékét nem tekinti 2 (nulladik) hatványának.

A két utóbbi persze nagyon egyszerűen orvosolható, csak ezzel sem akartam bonyolítani.


program kettohatvany_fuggvennyel;


var

szam : integer;

f:text;


function kettohatvany_e(sz : integer) : boolean;

begin

      kettohatvany_e := sz and 1 = 0;

      while kettohatvany_e and (sz > 2) do

            begin

                  sz := sz shr 1;

                  kettohatvany_e := sz and 1 = 0;

            end;

end;


begin

Assign(f,'b.txt');

Reset(f);

while not Eof(f) do

      begin

            Read(f, szam);

            Write(szam:5);

            if kettohatvany_e(szam) then Write(' --> 2 hatványa!');

            WriteLn;

      end;

Close(f);

end.


// *** *** *** ***


program kettohatvany_fuggveny_nelkul;


var

szam : integer;

jo : boolean;

f:text;


begin

Assign(f,'b.txt');

Reset(f);

while not Eof(f) do

      begin

            Read(f, szam);

            Write(szam:5);

            jo := szam and 1 = 0;

            while jo and (szam > 2) do

            begin

                  szam := szam shr 1;

                  jo := szam and 1 = 0;

            end;

            if jo then Write(' --> 2 hatványa!');

            WriteLn;

      end;

Close(f);

end.

2017. márc. 4. 20:36
Hasznos számodra ez a válasz?
 10/12 tabaki ***** válasza:

+ megjegyzés:

{$MODE OBJFPC} direktívával a Result is használható a függvényben:


function kettohatvany_e(sz : integer) : boolean;

begin

      Result := sz and 1 = 0;

      while Result and (sz > 2) do

            begin

                  sz := sz shr 1;

                  Result := sz and 1 = 0;

            end;

end;

2017. márc. 4. 21:55
Hasznos számodra ez a válasz?
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!