Pascal-ban "szócserélgetős" programot írtam. Miként lehetne ezt a kódot jobbá tenni? (bővebben lent)
A program úgy működik, hogy string-et olvas be, majd megnézi a tömbben, hogy adott szó található-e az adott string-ben.
Azt godnoltam ki, hogy a tömb páratlan indexén a figyelendő szavakat, páros indexén pedig az adott szó helyére illesztendő szavakat tárolom.
Szeretném azt is, hogy pl. lehetőleg bármilyen hosszú stringgel elboldoguljon, ehhez ansi string-et kellene használni? (ha probléma lenne valami miatt a 255 méretű stringgel), pl. sortörések miatt);
Egyetlen szóval is háááááát jó lassúnak tűnik a program. :-)
Mondjuk a tömb méretét is lehetne limitálni a leghosszabb szó méretére, de ez szerintem nem gyorsítana semmit rajta.
program szo_csere;
var
inf,outf:text;
s:string;
szavak:array[1..2] of string;
i,poz:byte;
begin
assign(inf,paramstr(1));
reset(inf);
assign(outf,paramstr(2));
rewrite(outf);
szavak[1]:='alma';
szavak[2]:='körte';
while not eof (inf) do
begin
readln(inf,s);
poz:=pos(szavak[1],s);
if poz>0 then begin
delete(s,poz,length(szavak[1]));
insert(szavak[2],s,poz);
end;
writeln(outf,s);
end;
close(inf);
close(outf);
end.
Valóban, rekord típussal jelentősen egyszerűbb volt...
Egyedül a "StringReplace" beépítése nem sikerült, amit javasoltál.
Most így, átírás után milyennek találod?
Program Szo_csere;
Type
sz=record
keresendo:string;
mire:string;
end;
Var
InF, OutF : Text;
S : String;
Szavak : Array[1..2] of sz;
I,Poz:byte;
Begin
Assign(InF,ParamStr(1));
Reset(InF);
Assign(OutF,ParamStr(2));
ReWrite(OutF);
Szavak[1].keresendo:='alma';
Szavak[1].mire:='körte';
While Not Eof (InF) do
Begin
ReadLn(inf,s);
poz:=Pos(szavak[1].keresendo,s);
If poz > 0 then
Begin
Delete(s, poz, Length(szavak[1].keresendo));
Insert(szavak[1].mire,s,poz);
End;
WriteLn(outf,s);
End;
Close(inf);
Close(outf);
End.
Megtaláltam a StringReplace példát a net-en, beépítettem ezt is.
Program Szo_csere;
Uses SysUtils;
type
sz=record
keresendo:string;
mire:string;
end;
Var
InF, OutF : Text;
S : String;
Szavak : Array[1..2] of sz;
I:byte;
Begin
Assign(InF,ParamStr(1));
Reset(InF);
Assign(OutF,ParamStr(2));
ReWrite(OutF);
Szavak[1].keresendo:='alma';
Szavak[1].mire:='körte';
While Not Eof (InF) Do
Begin
ReadLn(inf,s);
s := StringReplace(s, szavak[1].keresendo, szavak[1].mire, [rfReplaceAll]);
WriteLn(outf,s);
End;
Close(inf);
Close(outf);
End.
Akkor az történik, hogy hiba lesz, Runtime Error. :-)
Magam számára írom. :-)
Javítva a fájl megnyitási probléma is.
Algoritmust vagy bármit illető javaslatokat örömmel várok.
Természetesen ha több elemű lesz a tömb, a "i" változó használatba kerül.
Program Szo_csere;
Uses SysUtils;
Type
sz = Record
keresendo : String;
mire : String;
End;
Var
InF, OutF : Text;
S : String;
Szavak : Array [1..2] of sz;
I : Byte;
Begin
Assign(InF,ParamStr(1));
{$I-}
Reset(InF);
If IOResult <> 0 Then
Begin
WriteLn('Hiba a bemeneti fájl megnyitásakor.');
Halt;
End;
{$I+}
Assign(OutF,ParamStr(2));
{$I-}
ReWrite(OutF);
If IOResult <> 0 Then
Begin
WriteLn('Hiba a kimeneti fájl megnyitásakor.');
Halt;
End;
{$I+}
Szavak[1].keresendo:='alma';
Szavak[1].mire:='körte';
While Not Eof (InF) do
Begin
ReadLn(inf,s);
s := StringReplace(s, szavak[1].keresendo, szavak[1].mire, [rfReplaceAll]);
WriteLn(outf,s);
End;
Close(inf);
Close(outf);
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!