Szkolne problemy
Odwrócenie liter Jednym z czêsto spotykanych problemów jest napisanie programu, odwracaj±cego kolejno¶æ liter w napisie.
Wystarczy u¿yæ pêtli, która podmieni znak z pocz±tku na znak z koñca i na odwrót, potem zrobi to ze znakiem nastêpnym i nastêpnym a¿ do... koñca napisu? Nie! Gdyby pêtla przesz³a dalej ni¿ za po³owê napisu, zaczê³aby znowu odwracaæ znaki, które przecie¿ ju¿ zosta³y odwrócone. Efektem nic by siê nie zmieni³o, choæ program by³by napisany ogólnie poprawnie. Pêtla odwracaj±ca musi i¶æ od pierwszego znaku, tylko do po³owy napisu.
Inny problem pojawi siê z zamian± znaku z koñca na pocz±tkowy I na odwrót. Jaki to problem? Gdy za znak z pocz±tku podstawimy znak z koñca, to co wstawimy na koniec? Gdyby¶my wstawili teraz znak z pocz±tku, to ju¿ nie jest to znak, który by³ rzeczywi¶cie na poczatku. Trzeba po prostu najpierw zapamiêtaæ znak, który jest na pocz±tku, potem na pocz±tek wstawiæ znak z koñca, a na koniec, ten zapamiêtany.
var s : string;
tmp : char;
i : Integer;
begin
ReadLn(s);
for i := 1 to Length(s) div 2 do {pêtla tylko do po³owy napisu}
begin
tmp := s[i]; {kopiujemy znak z pocz±tku}
s[i] := s[Length(s) + 1 – i]; {wstawiamy znak z koñca na pocz±tek}
s[Length(s) + 1 – i] := tmp; {na koniec wstawiamy kopiê znaku z pocz±tku}
end;
WriteLn(s);
end.
Odwrócenie wyrazów ¯eby odwróciæ kolejno¶æ wyrazów w napisie bêdziemy musieli wyszukiwaæ spacje od koñca napisu. Gdy znajdziemy spacjê, kopiujemy wyraz, który bêdzie za ni± do miejsca, na którym skoñczyli¶my ostatnio i wstawiamy skopiowany wyraz na koniec naszej nowej zmiennej. Idziemy tak a¿ do pierwszego znaku w napisie.
var s, tmp : string;
i, koniec : Integer;
begin
ReadLn(s);
koniec := Length(s); {To jest numer ostatniego znaku na którym koñczymy kopiowanie}
tmp := '';
for i := Length(s) downto 1 do {pêtla od koñca napisu do pocz±tku}
begin
if s[i] = ' ' then {je¶li znajdziemy spacjê}
begin
tmp := tmp + Copy(s, i + 1, koniec – i) + ' '; {doklejanie wyrazu na koniec}
koniec := i – 1;
end;
end;
tmp := tmp + Copy(s, 1, koniec);
WriteLn(tmp);
end.
Kasowanie s³owa Gdy chcemy skasowaæ jakie¶ s³owo trzeba po prostu skopiowaæ wszystko inne.
var s, tmp, wyraz : string;
i, poczatek : Integer;
begin
WriteLn('Podaj napis:');ReadLn(s);
WriteLn('Ktory wyraz skasowac?');ReadLn(wyraz);
poczatek := 1; {To jest numer znaku od którego zaczynamy kopiowanie}
tmp := '';
for i := 1 to Length(s) do
begin
if s[i] = ' ' then
begin
if Copy(s, poczatek, i – poczatek)<> wyraz then {gdy nie kasowany}
tmp := tmp + Copy(s, poczatek, i – poczatek + 1); {kopiujemy}
poczatek := i + 1; {Bêdziemy zaraz kopiowaæ od znaku za spacj±}
end;
end;
if Copy(s, poczatek, Length(s) – poczatek + 1)<> wyraz then
tmp := tmp + Copy(s, poczatek, Length(s) – poczatek + 1);
WriteLn(tmp);
end.