Kezdőoldal » Számítástechnika » Programozás » Pascal-ban "szócserélgetős"...

Pascal-ban "szócserélgetős" programot írtam. Miként lehetne ezt a kódot jobbá tenni? (bővebben lent)

Figyelt kérdés

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.



2015. jan. 15. 14:46
1 2
 1/13 A kérdező kommentje:
Az "i" változó azért nem került felhasználásra, mert jelenleg a tömbnek csak két eleme van, de ha több lenne, akkor előbb végigmennék a tömbön "i" változót "1" értékről indítva és mindig kettővel növelve, találat esetén pedig szavak[i] értékét szavak[i+1] értékére cserélném a "s" változóban. Mindenféle ötlet érdekelne, mivel lehetne jobbá, egyszerűbbé, gyorsabbá tenni a programot.
2015. jan. 15. 15:16
 2/13 SimkoL ***** válasza:
100%
Röviden: A kód pocsék, az elgondolás rossz - a páros és páratlan indexek, ha nem megy a rekord típus akkor két tömb, vagy kétdimenziós tömb - és cserére a StringReplace() és egy string esetleg csak extrém esetben nem fér be 255 karakterbe.
2015. jan. 15. 16:04
Hasznos számodra ez a válasz?
 3/13 A kérdező kommentje:
Köszönöm a választ. A kód miért pocsék, szintaktikai hibák, vagy más miatt?
2015. jan. 15. 16:08
 4/13 A kérdező kommentje:
Rekordként is egy tömb lenne, rekord egyik mezője a keresendő, másik pedig amire cserélje, ezt jól gondolom?
2015. jan. 15. 16:10
 5/13 A kérdező kommentje:

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.

2015. jan. 15. 16:30
 6/13 A kérdező kommentje:

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.

2015. jan. 15. 16:52
 7/13 ejbenjaro ***** válasza:
Mi történik, ha olyan fájlt akarsz megnyitni, ami nincs? Mi van ha a fájl nevében, vagy elérési útjában ékezetes karakterek, szóközök vannak? :)
2015. jan. 15. 16:59
Hasznos számodra ez a válasz?
 8/13 A kérdező kommentje:

Akkor az történik, hogy hiba lesz, Runtime Error. :-)

Magam számára írom. :-)

2015. jan. 15. 17:01
 9/13 A kérdező kommentje:
Szerintem nem tudok olyan kódot írni - még ha ügyelek a kulcsszavak nagybetűvel történő írására és hasonlókra is - , amire ne mondaná valaki hogy háááát rossz, pocsék.
2015. jan. 15. 17:03
 10/13 A kérdező kommentje:

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.

2015. jan. 15. 17:24
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!