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?
„(é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)”
tabaki, valószínűleg azért száll el a program, mert te az érettségis adatfájllal teszteled, de a program nem ahhoz íródott, lévén az akkor még nem volt nekem. Szerintem az érettségin nem feltétel, hogy csak az „alaprendszert” használd, tudod ha nem muszáj nem kell újra feltalálni a kereket ;).
@ejbenjaro:
Persze, hogy igazad van, és eszem ágában sincs dilettáns létemre téged kóstolgatni.
Egyrészt valóban az érettségi adatfájlján teszteltem, másrészt már értesültem Kérdező gondjairól a számára új függvényekkel kapcsolatban -- na ja, így könnyű okosnak lenni. Amúgy meg csakugyan senki nem tiltja az érettségizőknek, hogy másoknál okosabbak lévén kiaknázzák a unitokban rejlő lehetőségeket.
Itt közlök egy saját változatot, amelyik bezzeg az adott fájlhoz igazodik, úgyhogy adatellenőrzés nuku, egyébként a megoldásaiban a szuterénszinten szárnyal a unithasználattól való irtózás jegyében. A konstansok ilyetén használatát meg valamiért mulatságosnak találtam... és igen, a telefonszámot tulajdonképpen semmi értelme számmá alakítani, de eddig mindenki megtette, kínos lett volna kilógni a sorból :) Nálam ehhez longint kellett, a sima integerrel mínuszok csúsztak be.
Módosított változat, remélem, nem néztem el túl sokat. kissé már zizi vagyok:
Még valami, kritérium hogy egy vagy kétjegyű lehet a szám, tehát háromjegyű már nem? Ekkor elég lenne csak byte változókat használni az olvasáshoz (szerintem), illetve ha negatív számok is lehetnek, akkor a shortint-et.
Előző válaszban írtam hogy szóköz változót kellene bevezetni, nem tudom hogy én értem -e félre a feladatot...
@#25:
Ööö... az miért lenne hasznos?
SimkoL megoldásába építettem az enyémet, amit az utóbbi két válaszban fejtettem ki, ha -99 és +99 közti intervallumot kell csak átfogni (háromjegyű már nem lehet a szám) akkor ez megfelelő lesz:
program szamla;
type
THivas = record
ho, hp, hmp, bo, bp, bmp, t : shortint;
szokoz : char;
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].szokoz, tomb[i].hp, tomb[i].szokoz, tomb[i].hmp, tomb[i].szokoz, tomb[i].bo, tomb[i].szokoz, tomb[i].bp, tomb[i].szokoz, tomb[i].bmp, tomb[i].szokoz, 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.
Itt van az eredeti kódod ciklusban, ha még érdekel.
program project12345;
uses crt;
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
b,i,j,d,e: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;
e:=0;
repeat
val(COPY(S,1+2*e+d,1), b,j);
if ord(s[2+2*e+d])<>32 then begin
val(COPY(S,1+2*e+d,2), b,j);
inc(d);
end;
case e of
0:(k[i].ho):=b;
1:(k[i].hp):=b;
2:(k[i].hmp):=b;
3:(k[i].bo):=b;
4:(k[i].bp):=b;
5:(k[i].bmp):=b;
end;
inc(e);
until e=6;
readln(f, k[i].t);
inc(i);
end;
close(f);
readkey;
end.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, 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!