Pascal Lazarus programozás, miért nem írja ki az tömbelemeket?
program adatbazis;
VAR n,j,uj:integer;
TYPE Tember=record
nev:string;
varos:string;
fizetes:longint;
end;
Procedure beiras(VAR uj:Tember);
begin
write('Nev:',j,':');
readln(uj.nev);
write('varos:',j,':');
readln(uj.varos);
write('Fizetes:',j,':');
readln(uj.fizetes);
end;
VAR a,i,k:integer;
f:textfile;
seged:Tember;
tomb:array[1..20] of Tember;
begin
write('N:');
readln(n);
For j:=1 to n do begin
beiras(tomb[j]);
end;
For j:=1 to n-1 do begin
for k:=2 to n do begin
if tomb[j].nev>tomb[k].nev then
begin
seged:=tomb[j];
tomb[j]:=tomb[k];
tomb[k]:=seged;
end;
end;
end;
assign(f, 'C:\kimenet.txt');
rewrite(f);
writeln(f,n);
for i:=1 to n do begin
writeln(tomb[i].nev);
writeln(tomb[i].fizetes);
writeln(tomb[i].varos);
end;
close(f);
readln;
end.
assign(f, 'C:\kimenet.txt');
rewrite(f);
writeln(f,n);
for i:=1 to n do begin
writeln(f, tomb[i].nev);
writeln(f, tomb[i].fizetes);
writeln(f, tomb[i].varos);
end;
close(f);
Csak én nem értem, hogy mifenét akarsz a beiras procedúrával? Gyanítom, hogy oda egy function kéne, amelynek a visszatérési értéke lenne a tömbelem, amelyet később valahogy így kéne a tömbbe raknod:
for j := 1 to n do tomb[j] := beiras;
Most a procedure beolvas néhány adatot, aztán szevasz, nem csinál velük semmit. Ciklusban.
+ Ha az az izé a végén rendezés akar lenni, akkor hajítófát sem ér.
Egy kicsit fésültem a kódodon; Természetesen rengeteg teendő van még hátra, de olyasmit csinál, mint amit megcéloztál, és alkalmas lehet a továbblépésre:
Egyébként az előző kérdésednél SimkoL linkjében minden szükséges ott van. Én megtoldom még egy SimkoL-oldallal, hadd legyen formája is a programjaidnak (igen, a behúzásokat a GyK nyeli le, de akad még csinosítani való):
Ehhez még a következőt tenném hozzá:
A kód zsúfoltsága a lefordított program méretét semmilyen módon nem befolyásolja, ezért jobb, ha az áttekinthetőség jegyében szellősen, szóközökkel tagolva írod. Ez sok esetben a szerkesztő Keresés és Csere funkcióinak használatát is könnyíti. A begin az utána következő blokkhoz tartozik, értelmesebb azt is külön sorba tördelned. Itt az előző kód helytakarékosabb változata (a Lazarus sorhosszán belül maradva):
const MAXADAT=20;type Tember=record nev:string;varos:string;fizetes:dword;end;
var i,j,adatszam:integer;seged:Tember;tomb:array[1..MAXADAT]of Tember;f:text;
function Beiras:Tember;begin WriteLn(#10#13,j,'. ember');Write(' Nev: ');
ReadLn(beiras.nev);Write(' Telepules: ');ReadLn(beiras.varos);
Write(' Fizetes: ');ReadLn(beiras.fizetes);WriteLn;end;begin i:=0;
Write('Ird be a beolvasando adatok szamat (1-20): ');repeat ReadLn(adatszam);
if(adatszam>0)and(adatszam<=MAXADAT)then Inc(i)else Write('Hibas szám! Ujra: ');
until i>0;for j:=1 to adatszam do tomb[j]:=Beiras;for i:=adatszam-1 downto 1 do
for j:=1 to i do if UpCase(tomb[j].nev)>UpCase(tomb[j+1].nev) then begin
seged := tomb[j];tomb[j] := tomb[j+1];tomb[j+1]:=seged;end;
Assign(f,'kimenet.txt');{$I-}ReWrite(f){$I+};if IOResult=0 then begin
WriteLn(f,adatszam);for i:=1 to adatszam do begin WriteLn(f,tomb[i].nev);
WriteLn(f,tomb[i].fizetes);WriteLn(f,tomb[i].varos);end;Close(f);end else
WriteLn('Hiba! Nem jott letre a kimenet.txt fajl!');ReadLn;end.
Lefordítás után tapasztalsz méretbeli különbséget? Melyiket javítgatnád szívesebben?
@#9:
No igen, a minimum a try/except használata volna, talán tényleg nem sok értelme volt az {$mode objfpc} direktívát kerülgetnem, ráadásul egy ódivatú másiknak a használatával. Az input hibalehetőségeit egyelőre szándékosan hagytam benne, nem akartam egyszerre túl nagy átépítést, meg aztán jusson még Kérdezőnek felfedezni való a szűkebben vett feladaton túl is.
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!