Malo kasnim, tek sam sad pregledao ove kodove.
U prvoj verziji rešenja (ovoj u kojoj se vrši zamena samo jednog pojavljivanja '[inlmath]\mathtt{and}[/inlmath]' unutar svake od unetih reči) promenljiva [inlmath]\mathtt{j}[/inlmath] je suvišna. Sve ostalo je OK.
U ovoj drugoj (poslednjoj) verziji uočio sam nekoliko propusta.
– Unutar procedure, [inlmath]\mathtt{j}[/inlmath] ne treba da ide do [inlmath]\mathtt{m-3}[/inlmath], već do [inlmath]\mathtt{m-2}[/inlmath]. Ako bi išlo do [inlmath]\mathtt{m-3}[/inlmath], ne bi bili zamenjeni oni '[inlmath]\mathtt{and}[/inlmath]'-ovi koji se nalaze na samom kraju reči (primeri: [inlmath]\mathtt{1and}[/inlmath], [inlmath]\mathtt{1and2and}[/inlmath] itd.);
– umesto uslova
- Kôd: Obeleži sve
If ((s[j]='a') and (s[j+1]='n')) and (s[j+2]='d')
može se iskoristiti funkcija [inlmath]\mathtt{copy}[/inlmath] radi pretrage pojavljivanja '[inlmath]\mathtt{and}[/inlmath]'-ova unutar reči:
- Kôd: Obeleži sve
If (copy(s,j,3)='and')
– prilikom ispisa rezultata, radi preglednosti, koristio bih komandu [inlmath]\mathtt{writeln(a[i])}[/inlmath] umesto [inlmath]\mathtt{write(a[i])}[/inlmath];
– takođe, prilikom ispisa rezultata, ne vidim razloga da se ne prikazuju one reči u kojima nije izvršena promena (tj. reči koje ne sadrže nijedno '[inlmath]\mathtt{and}[/inlmath]'), budući da se u tekstu zadatka ništa ne kaže o tome; zato mislim da je promenljiva '[inlmath]\mathtt{pisi}[/inlmath]' suvišna.
Evo mog predloga za rešenje ovog zadatka (koristio sam i promenljivu '[inlmath]\mathtt{pisi}[/inlmath]', ali ako nije potrebna, a ja mislim da nije, ista se može i izostaviti):
- Kôd: Obeleži sve
program domstring;
var a:array[1..50] of string;
i,n:integer; pisi:boolean;
Procedure Uradi(var s:string; var k:boolean);
var m,j:integer;
begin
m:=length(s); {u promenljivoj m čuvamo dužinu prvobitno
unete reči (tj. pre izvršene izmene)}
k:=false;
j:=1;
while j<=length(s)-2 do {ispitivanje da li se pojavljuje 'and' vršimo od
prve pozicije, pa do treće pozicije od kraja}
begin
if copy(s,j,3)='and' then {ako je na j-toj poziciji pronađen 'and'...}
begin
Delete(s,j,3);
Insert('&',s,j); {zamena 'and' znakom '&'}
end;
j:=j+1;
end;
if length(s)<m then k:=true; {ako je dužina nove reči manja od dužine
prvobitne reči, znači da je bilo izmena,
tj. da su bili pronađeni 'and'-ovi}
end;
Begin
write('Unesi n:');
readln(n);
For i:=1 to n do readln(a[i]);
writeln('Resenja:');
For i:=1 to n do
begin
Uradi(a[i],pisi);
If pisi=true then writeln(a[i]);
end;
end.
Glavna razlika ovog mog rešenja u odnosu na tvoje, to je što kod tvog rešenja petlja dvaput prolazi kroz svaku reč (prvi put da bi je skenirala i izbrojala pojavljivanja '[inlmath]\mathtt{and}[/inlmath]'-ova, a drugi put da bi se ti '[inlmath]\mathtt{and}[/inlmath]'-ovi izmenili u '[inlmath]\mathtt{\&}[/inlmath]'), dok se kod ovog rešenja koje sam predložio sve to obavlja u toku samo jednog prolaska kroz reč.