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.

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