Ver. 1.0 Beta, Nie masz kompilatora? Teraz mo瞠sz pisa skrypty ONLINE! Wersja podstawowa -nie zawiera wszystkich polece Pascala. S逝篡 do nauki podstaw

Odwracanie liter w napisie, odwracanie wyraz闚 w napisie, kasowanie s這wa, zmiana wielko軼i liter. Oprogramowane w Turbo Pascalu i Delphi

Pascal

Wsteczwstecz Rekordy i wska幡iki
W g鏎w g鏎 Podstawy Pascala
Dalejdalej Procedury i funkcje

Odwracanie liter w napisie, odwracanie wyraz闚 w napisie, kasowanie s這wa, zmiana wielko軼i liter. Oprogramowane w Turbo Pascalu i Delphi

Operacje na tekstach


Length
Budowa znaku, kod ASCII
Budowa napisu
Zmiana wielko軼i liter
Kopiowanie cz窷ci napisu
Szkolne problemy



Length


Funkcja Length zwraca d逝go嗆 testowanego napisu. Za jej pomoc mo瞠sz oceni d逝go嗆 s這wa wpisanego przez u篡tkownika Twojego programu.



Budowa znaku, kod ASCII


W pami璚i komputera pojedyncze znaki 'char' s przechowywane jako jeden bajt. Jest 256 r騜nych znak闚. Ka盥y z tych znak闚 ma sw鎩 kod liczbowy. W rzeczywisto軼i w pami璚i s przechowywane w豉郾ie te kody liczbowe zwane jako kod ASCII. W kodzie tym litera 'A' ma warto嗆 65, 'B' 66, 'C' 67 itd. Ma貫 litery zaczynaj si od 97. 'a' ma kod 97, 'b' 98, 'c' 99 itd.


Poni窺zy program pozwala wy鈍ietli 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豉twiaj prac. Np. pomagaj sprawnie zmienia wielko嗆 liter (do kodu znaku wystarczy doda lub odj望 32). W豉軼iwo軼i te przydadz Ci jeszcze p騧niej.




Budowa napisu


Ka盥y napis -czyli zmienna typu string jest w pewien spos鏏 zapisywana w pami璚i komputera. Sk豉da si przewa積ie z 256 bajt闚. W Pascalu pierwszy z nich przechowuje d逝go嗆 napisu, a reszta sam napis jako zbi鏎 znak闚 typu 'char'.


Dla zmiennej o nazwie: 'napis' o warto軼i 'Ala ma kota' wygl康a to tak:


Nr bajtu
0

1

2

3

4

5

6

7

8

9

10

11

Co  przechowuje

D逝go嗆
napisu,
czyli
liczba
11

A

l

a


m

a


k

o

t

a


Programista ma dost瘼 do ka盥ej z tych liter za pomoc odwo豉nia takiego jak w tablicy. Gdy chce wy鈍ietli pierwsz liter w tej zmiennej, mo瞠 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鄉y napisali:


WriteLn(Length(napis));

Gdyby鄉y chcieli wi璚 wy鈍ietli ostatni liter zmiennej napis, wystarczy napisa:


WriteLn(napis[Length(napis)]);

A dlaczego nie mo積a wpisa WriteLn(napis[11]); ? To proste, mo瞠my, ale nie zawsze by to by豉 ostatnia litera napisu, dlatego, bo zawarto嗆 zmiennej mo瞠 przecie by inna! Gdy piszemy programy, musz by one zawsze elastyczne. Nie mog dzia豉 tylko dla jednego przez nas okre郵onego za這瞠nia.


Jak zbada ostatni liter wczytanego z klawiatury imienia? Teraz jest to proste


ReadLn(napis);
WriteLn(napis[Length(napis)]);


Zmiana wielko軼i liter


W niekt鏎ych programach zachodzi potrzeba zmiany wielko軼i liter. Np. gdy u篡tkownik wpisze swoje imi ma陰 liter, mo瞠 by mi這 zaskoczony, gdy komputer i tak wy鈍ietli je wielk liter.


Do zmiany wielko軼i znaku s逝篡 funkcja UpCase(ch : char); Zmienia ona jednak wielko嗆 pojedynczego znaku a nie ca貫go napisu. 疾by zmieni wielko嗆 ca貫go napisu musimy to zrobi r璚znie za pomoc p皻li.


 

Je郵i chcemy zmieni pierwsz liter wczytanego napisu, mo積a u篡:


ReadLn(napis);
napis[1] := UpCase(napis[1]);
WriteLn(napis);

A co je郵i chcemy zmieni ca造 napis na du篡? Wystarczy doda p皻l, a zamiast cyfry 1 w powy窺zym przyk豉dzie, zmienn, kt鏎a b璠zie stopniowo zwi瘯szana.


ReadLn(napis);
for i:=1 to Length(napis) do
  napis[i] := UpCase(napis[i]);
WriteLn(napis);


Kopiowanie cz窷ci napisu


Do kopiowania fragment闚 napisu s逝篡 funkcja Copy(napis : string; start, dlugosc : Integer; ).


Oznacza to, 瞠 gdy ze zmiennej 'napis' o warto軼i 'Ala ma kota' chcemy skopiowa do innej zmiennej pierwsze 3 litery, u篡wamy:


Zmienna := Copy(napis, 1, 3);

Mo瞠my oczywi軼ie wpisa


WriteLn(Copy(napis, 1, 3));

Najcz窷ciej jednak, musimy najpierw sami wykry miejsce, od kt鏎ego zaczniemy kopiowanie, potem d逝go嗆 szukanego s這wa a dopiero zacz望 kopiowa.



Szkolne problemy


Odwr鏂enie liter

Jednym z cz瘰to spotykanych problem闚 jest napisanie programu, odwracaj帷ego kolejno嗆 liter w napisie.


Wystarczy u篡 p皻li, kt鏎a podmieni znak z pocz徠ku na znak z ko鎍a i na odwr鏒, potem zrobi to ze znakiem nast瘼nym i nast瘼nym a do... ko鎍a napisu? Nie! Gdyby p皻la przesz豉 dalej ni za po這w napisu, zacz窸aby znowu odwraca znaki, kt鏎e przecie ju zosta造 odwr鏂one. Efektem nic by si nie zmieni這, cho program by豚y napisany og鏊nie poprawnie. P皻la odwracaj帷a musi i嗆 od pierwszego znaku, tylko do po這wy napisu.


Inny problem pojawi si z zamian znaku z ko鎍a na pocz徠kowy I na odwr鏒. Jaki to problem? Gdy za znak z pocz徠ku podstawimy znak z ko鎍a, to co wstawimy na koniec? Gdyby鄉y wstawili teraz znak z pocz徠ku, to ju nie jest to znak, kt鏎y by rzeczywi軼ie na poczatku. Trzeba po prostu najpierw zapami皻a znak, kt鏎y jest na pocz徠ku, potem na pocz徠ek wstawi znak z ko鎍a, a na koniec, ten zapami皻any.



var s : string;
   tmp : char;
   i : Integer;
begin
 ReadLn(s);
 for i := 1 to Length(s) div 2 do {p皻la tylko do po這wy napisu}
   begin
     tmp := s[i]; {kopiujemy znak z pocz徠ku}
     s[i] := s[Length(s) + 1 – i]; {wstawiamy znak z ko鎍a na pocz徠ek}
     s[Length(s) + 1 – i] := tmp; {na koniec wstawiamy kopi znaku z pocz徠ku}
   end;
  WriteLn(s);
end.

Odwr鏂enie wyraz闚

疾by odwr鏂i kolejno嗆 wyraz闚 w napisie b璠ziemy musieli wyszukiwa spacje od ko鎍a napisu. Gdy znajdziemy spacj, kopiujemy wyraz, kt鏎y b璠zie za ni do miejsca, na kt鏎ym sko鎍zyli鄉y 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鏎ym ko鎍zymy kopiowanie}
  tmp := '';

  for i := Length(s) downto 1 do {p皻la od ko鎍a napisu do pocz徠ku}
    begin
      if s[i] = ' ' then {je郵i 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這wa

Gdy chcemy skasowa jakie s這wo 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鏎ego 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璠ziemy 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.

Programy ON-LINE!

Strona korzysta z plik闚 cookie w celu 鈍iadczenia us逝g Google (reklamy, statytyki) oraz Facebook. Je郵i chcesz zablokowa pliki cookies wy豉cz je w swojej przegl康arce. Potrzebujesz pomocy? kliknij