Pascal programkód. Valaki rátudna nézni, hogy lehet-e rövidebben megoldani a feladatot?
A feladat az volt, hogy egy szöveges állományból olvassunk be egy-vagy két számjegyű számokat, amelyeket szóközök választanak el egymástól.
Az én megoldásom:
program project12345;
const c=100;
type
q=record
ho:integer;
hp:integer;
hmp:integer;
bo:integer;
bp:integer;
bmp:integer;
t:integer;
end;
tomb=array[1..c] of q;
var
r,i,j,d:integer;
f:text;
k:tomb;
s:string;
begin
assign(f,'hivasok.txt');
reset(f);
i:=1;
while not eof(f) do begin
readln(f,s);
d:=0;
r:=1;
val(COPY(S,d,r), (k[i].ho),j);
if ord(s[r+1])<>32 then begin
r:=2;
val(COPY(S,d,r), (k[i].ho),j);
inc(d);
end;
val(COPY(S,3+d,r), (k[i].hp),j);
if j<>0 then begin
r:=1;
val(COPY(S,3+d,r), (k[i].hp),j);
end;
if ord(s[3+d+1])<>32 then begin
r:=2;
val(COPY(S,3+d,r), (k[i].hp),j);
inc(d);
end;
val(COPY(S,5+d,r), (k[i].hmp),j);
if j<>0 then begin
r:=1;
val(COPY(S,5+d,r), (k[i].hmp),j);
end;
if ord(s[5+d+1])<>32 then begin
r:=2;
val(COPY(S,5+d,r), (k[i].hmp),j);
inc(d);
end;
val(COPY(S,7+d,r), (k[i].bo),j);
if j<>0 then begin
r:=1;
val(COPY(S,7+d,r), (k[i].bo),j);
end;
if ord(s[7+d+1])<>32 then begin
r:=2;
val(COPY(S,7+d,r), (k[i].bo),j);
inc(d);
end;
val(COPY(S,9+d,r), (k[i].bp),j);
if j<>0 then begin
r:=1;
val(COPY(S,9+d,r), (k[i].bp),j);
end;
if ord(s[9+d+1])<>32 then begin
r:=2;
val(COPY(S,9+d,r), (k[i].bp),j);
inc(d);
end;
val(COPY(S,11+d,r), (k[i].bmp),j);
if j<>0 then begin
r:=1;
val(COPY(S,11+d,r), (k[i].bmp),j);
end;
if ord(s[11+d+1])<>32 then begin
r:=2;
val(COPY(S,11+d,r), (k[i].bmp),j);
inc(d);
end;
readln(f, k[i].t);
inc(i);
end;
close(f);
readln;
end.
Nem lehetne valami ciklussal lerövidíteni?
A program, amit írtam nem foglalkozik vele, hogy egy vagy kétjegyű a beolvasott adat. A fájlból beolvas egy sort, amit a szóközök mentén felbont, majd az így szétbontott adatokat beleteszi a a tömbbe. Ha a beolvasott adatról ki kell deríteni, hogy hány jegyű, akkor a legegyszerűbb ha stringként olvasod be, majd a length függvénnyel megkapod, hogy hány karakter hosszú, azaz hány jegyű. Ha ez nem járható út, akkor marad az osztás. Osztod 10-el a számot, ha nagyobb mint 1, akkor kétjegyű, ha kisebb, akkor egyjegyű.
Az érettségi feladatot megtekintve amúgy erre semmi szükség nincsen.
Nem tudom megnézni ejbenjaro megoldását, mert nekem nem jön be a Pastie :(
Sok minden érthetetlen a számomra a kódodban, de a leginkább ez a heroikus égvívás talányos az egy-és kétkarakteres számokkal. Nem értem: szóköztől szóközig olvasol, kapsz egy szám-stringet, amelynek a hosszát egyértelműen megmondja a Length() függvény vagy a string 0. eleme. Ez is csak akkor fontos, ha vannak számon tartandó kezdő nullák, mert egyébként a Val() függvény a karakterek számától függetlenül számértékké alakítja, és ha ez kisebb 10-nél, nyilván egy jegyű, egyébként kétjegyű (ha feltételezzük, hogy nincs hiba a fájl adataiban).
Én nem bánnám, ha linkelnéd azt a bizonyos hivasok.txt fájlt is, hátha az megérteti velem a próbálkozásodnak legalább a többi furcsaságát.
Sajnos még nem értem.
Van egy alábbi sorunk:
26 1 45 89 5
Csak stringbe tudjuk beolvasni, mert csak egész sort tudunk olvasni és vannak benne szóközök. Azt nem értem, hogyan másképp lehetne meghatározni, hogy az első szám egy vagy két számjegyű, minthogy feltételezzük, hogy egy számjegyű, aztán leellenőrizzük, hogy a következő karakter szóköz-e. Ha nem akkor tudjuk, hogy kettő. És eddigi tanulmányaim alapján ezt minden számmal el kell játszani. Ugyanakkor valóban csúnya a kód és ha pl. ezer szám lenne a sorban akkor kissé nehezen alkalmazható. Ezért szerettem volna ciklusba tenni, de akárhogy törtem a fejemet nem tudtam kiküszöbölni, hogy minden szám hosszát vizsgálnom kell.
Nem néztem a megoldást, de klasszikus módszer, hogy beolvasunk egy sort, majd feltördeljük szóközök mentén.
Ilyenkor általában alapból egy tömböt kapunk vissza és ilyen fölösleges típusokra sincs szükség.
Nem kell mindent ennyire alacsony szinten lekódolni, a programozás nagy részében mások által már megírt kódot használunk újra.
Teljesen felesleges azon gyötrődni hány számjegyű a szám. Mivel tudjuk, hogy csak számokat tartalmaz a file, adott 'mennyiségben és elrendezésben' ezért tökéletes a Read:
program szamla;
type
THivas = record
ho, hp, hmp, bo, bp, bmp, t : integer;
end;
var tomb : array[1..200] of THivas;
f : text;
i : byte = 0;
k : byte;
begin
Assign(f,'c:\hivasok.txt');
Reset(f);
while not Eof(f) do
begin
Inc(i);
Read(f, tomb[i].ho, tomb[i].hp, tomb[i].hmp, tomb[i].bo, tomb[i].bp, tomb[i].bmp, tomb[i].t);
end;
for k := 1 to i do
begin
WriteLn(tomb[k].ho);
WriteLn(tomb[k].hp);
WriteLn(tomb[k].hmp);
WriteLn(tomb[k].bo);
WriteLn(tomb[k].bp);
WriteLn(tomb[k].bmp);
WriteLn(tomb[k].t);
end;
Close(f);
ReadLn;
end.
Hibakezelést a file létezésére illik beiktatni azért :)
„Sajnos még nem értem.
Van egy alábbi sorunk:
26 1 45 89 5
Csak stringbe tudjuk beolvasni, mert csak egész sort tudunk olvasni és vannak benne szóközök. Azt nem értem, hogyan másképp lehetne meghatározni, hogy az első szám egy vagy két számjegyű, minthogy feltételezzük, hogy egy számjegyű, aztán leellenőrizzük, hogy a következő karakter szóköz-e. ”
Mivel tudjuk, hogy 6 elemet kell beolvasni és mind a 6 szám, simán be lehet olvasni számonként is mindenféle stringművelet nélkül.
pl így:
program project12345;
{$mode objfpc}{$H+}
uses Classes,SysUtils;
type
THivas=record
ho:integer;
hp:integer;
hmp:integer;
bo:integer;
bp:integer;
bmp:integer;
t:integer;
end;
var
Hivasok: array of THivas;
i: integer;
f: text;
begin
Assign(f,'hivasok.txt');
reset(f);
i:=1;
While not eof(f) do
begin
Setlength(Hivasok,i);
readln(f,Hivasok[i-1].ho,Hivasok[i-1].hp,Hivasok[i-1].hmp,Hivasok[i-1].bo,Hivasok[i-1].bp,Hivasok[i-1].bmp);
writeln(Hivasok[i-1].ho,' ',Hivasok[i-1].hp,' ',Hivasok[i-1].hmp,' ',Hivasok[i-1].bo,' ',Hivasok[i-1].bp,' ',Hivasok[i-1].bmp);
Inc(i);
end;
SetLength(Hivasok,0);
close(f);
end.
Innen már csak egy lépés megnézni, hogy a beolvasott szám nagyobb e mint 10, hogy eldöntsd, hogy egy, vagy kétjegyű.
SimkoL, a tied jobban tetszik, mert csak az alaprendszert használja (érettségi feladat, ugyebár -- mellesleg ejbenjaro programja nekem „An unhandled exception occurred at $0806F400 : EStringListError : List index (1) out of bounds $0806F400” hibaüzenettel le is áll), mindazonáltal érdemes az adatfájlba is belepillantani:
Az eredeti forrás mellett ott a teljes feladat megoldása, azért nem azt linkeltem. Ha kérdező eddig esetleg nem találta volna meg, hadd gondolkozzon tovább...
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!