Programming
C++
Turbo Pascal
Delphi
Ver. 1.0 Beta, Don't have a compiler? Now you can write simple scripts ONLINE! This is a basic version -does not include all the Pascal statements. Only to learn basics
Odwracanie liter w napisie, odwracanie wyrazów w napisie, kasowanie s³owa, zmiana wielko¶ci liter. Oprogramowane w Turbo Pascalu i Delphi
Operacje na tekstach
LengthFunkcja Length zwraca d³ugo¶æ testowanego napisu. Za jej pomoc± mo¿esz oceniæ d³ugo¶æ s³owa wpisanego przez u¿ytkownika Twojego programu. Budowa znaku, kod ASCIIW pamiêci komputera pojedyncze znaki 'char' s± przechowywane jako jeden bajt. Jest 256 ró¿nych znaków. Ka¿dy z tych znaków ma swój kod liczbowy. W rzeczywisto¶ci w pamiêci s± przechowywane w³a¶nie te kody liczbowe zwane jako kod ASCII. W kodzie tym litera 'A' ma warto¶æ 65, 'B' 66, 'C' 67 itd. Ma³e litery zaczynaj± siê od 97. 'a' ma kod 97, 'b' 98, 'c' 99 itd. Poni¿szy program pozwala wy¶wietliæ znaki kodu Ascii program ascii; var i: Integer; begin for i:=0 to 255 do begin Write(i:3, ':', char(i),' '); if (i mod 12=0) then WriteLn; end; WriteLn; WriteLn('Proszê wcisn±æ ENTER'); ReadLn; end. Po co te kody? U³atwiaj± pracê. Np. pomagaj± sprawnie zmieniaæ wielko¶æ liter (do kodu znaku wystarczy dodaæ lub odj±æ 32). W³a¶ciwo¶ci te przydadz± Ci jeszcze pó¼niej. Budowa napisuKa¿dy napis -czyli zmienna typu string jest w pewien sposób zapisywana w pamiêci komputera. Sk³ada siê przewa¿nie z 256 bajtów. W Pascalu pierwszy z nich przechowuje d³ugo¶æ napisu, a reszta sam napis jako zbiór znaków typu 'char'. Dla zmiennej o nazwie: 'napis' o warto¶ci 'Ala ma kota' wygl±da to tak:
Programista ma dostêp do ka¿dej z tych liter za pomoc± odwo³ania takiego jak w tablicy. Gdy chce wy¶wietliæ pierwsz± literê w tej zmiennej, mo¿e napisaæ WriteLn(napis[1]); Gdyby napisaæ tzw. rzutowanie (zmianê typu: char na byte) elementu o indeksie 0 WriteLn(Byte(napis[0])); Otrzymamy 11, czyli to samo, co gdyby¶my napisali: WriteLn(Length(napis)); Gdyby¶my chcieli wiêc wy¶wietliæ ostatni± literê zmiennej napis, wystarczy napisaæ: WriteLn(napis[Length(napis)]); A dlaczego nie mo¿na wpisaæ WriteLn(napis[11]); ? To proste, mo¿emy, ale nie zawsze by to by³a ostatnia litera napisu, dlatego, bo zawarto¶æ zmiennej mo¿e przecie¿ byæ inna! Gdy piszemy programy, musz± byæ one zawsze elastyczne. Nie mog± dzia³aæ tylko dla jednego przez nas okre¶lonego za³o¿enia. Jak zbadaæ ostatni± literê wczytanego z klawiatury imienia? Teraz jest to proste ReadLn(napis); WriteLn(napis[Length(napis)]); Zmiana wielko¶ci literW niektórych programach zachodzi potrzeba zmiany wielko¶ci liter. Np. gdy u¿ytkownik wpisze swoje imiê ma³± liter±, mo¿e byæ mi³o zaskoczony, gdy komputer i tak wy¶wietli je wielk± liter±. Do zmiany wielko¶ci znaku s³u¿y funkcja UpCase(ch : char); Zmienia ona jednak wielko¶æ pojedynczego znaku a nie ca³ego napisu. ¯eby zmieniæ wielko¶æ ca³ego napisu musimy to zrobiæ rêcznie za pomoc± pêtli. Je¶li chcemy zmieniæ pierwsz± literê wczytanego napisu, mo¿na u¿yæ: ReadLn(napis); napis[1] := UpCase(napis[1]); WriteLn(napis); A co je¶li chcemy zmieniæ ca³y napis na du¿y? Wystarczy dodaæ pêtlê, a zamiast cyfry 1 w powy¿szym przyk³adzie, zmienn±, która bêdzie stopniowo zwiêkszana. ReadLn(napis); for i:=1 to Length(napis) do napis[i] := UpCase(napis[i]); WriteLn(napis); Kopiowanie czê¶ci napisuDo kopiowania fragmentów napisu s³u¿y funkcja Copy(napis : string; start, dlugosc : Integer; ). Oznacza to, ¿e gdy ze zmiennej 'napis' o warto¶ci 'Ala ma kota' chcemy skopiowaæ do innej zmiennej pierwsze 3 litery, u¿ywamy: Zmienna := Copy(napis, 1, 3); Mo¿emy oczywi¶cie wpisaæ WriteLn(Copy(napis, 1, 3)); Najczê¶ciej jednak, musimy najpierw sami wykryæ miejsce, od którego zaczniemy kopiowanie, potem d³ugo¶æ szukanego s³owa a dopiero zacz±æ kopiowaæ. Szkolne problemyOdwró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. |
ON-LINE scripts!