Helyes így ez a Pascal program?
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.
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.
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;
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 ...
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.
+ 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;
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!