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

Pascal

Back to previous articleprevious Rekordy i wska¼niki
Go to main menuup Podstawy Pascala
Next articlenext Procedury i funkcje

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


Length
Budowa znaku, kod ASCII
Budowa napisu
Zmiana wielko¶ci liter
Kopiowanie czê¶ci napisu
Szkolne problemy



Length


Funkcja 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 ASCII


W 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.


kod ascii - znaki kodu odpowiadaj± liczbie obok

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 napisu


Ka¿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:


Nr bajtu
0

1

2

3

4

5

6

7

8

9

10

11

Co  przechowuje

D³ugo¶æ
napisu,
czyli
liczba
11

A

l

a


m

a


k

o

t

a


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 liter


W 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 napisu


Do 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 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.

ON-LINE scripts!

This website uses cookie files in order to provide Google services (advertisements, analitycs) and Facebook. If you want to block using cookies, turn them off in your browser settings. Need a help? Click me