Tablice Tablica jest to struktura danych zawierająca pewien

advertisement
Tablice
Tablica jest to struktura danych zawierająca pewien uporządkowany zbiór obiektów tego samego typu. Tablice
jednowymiarowe odpowiadają wektorom, natomiast tablice dwuwymiarowe macierzom. Elementy tablicy oznakowane
są za pomocą indeksów. Tablica stanowi- więc pewien typ strukturalny, zwany typem tablicowym.
Tablicę tworzymy za pomocą słowa kluczowego ARRAY.
Zdefiniowanie typu tablicowego ma postać:
TYPE identyfikator tablicy = ARRAY [Indeksl,..., Indeksn] OF Typ;
Dany identyfikator_ tablicy można wykorzystać w deklaracji VAR:
VAR
Nazwa_zmiennej : identyfikator_ tablicy;
Indeks oznacza liczbę elementów. Zawiera on kres dolny i górny, czyli zakres tablicy. Jeśli podany jest tylko
jeden indeks, to tablica jest jednowymiarowa, na przykład:
TYPE Dane = ARRAY [1..10] OF INTEGER;
Zdefiniowano typ tablicowy identyfikujący tablicę jednowymiarową zawierającą 10 elementów. Dany
identyfikator tablicy Dane wykorzystany zostanie w deklaracji VAR:
VAR
TAB : Dane;
W powyższym zapisie jest zadeklarowana tablica TAB. Jeśli tablica zawiera więcej indeksów, na przykład dwa,
to jest ona dwuwymiarowa:
TYPE Dane_l = ARRAY [1..5,1..7] OF REAL;
(....)
VAR Liczby : Dane_l;
Zadeklarowano tablicę dwuwymiarową Liczby zawierającą 5 wierszy (1...5) i 7 kolumn (1...7) z elementami w
postaci liczb rzeczywistych.
Tablicę Liczby można zadeklarować również bezpośrednio za pomocą deklaracji VAR, jak to przedstawiono
poniżej:
VAR Dane_1 = ARRAY [1..5,1..7] OF REAL;
Jeśli oznaczymy wiersze jako zmienną i (i = l,...,i) oraz kolumny jako zmienną j (j= l,...,j), to element w tablicy na
przecięciu i-tego wiersza i j-tej kolumny ma oznaczenie:
Identyfikator_tablicy [i, j]
Dla określenia elementu znajdującego się w tablicy o identyfikatorze Liczby na przecięciu 2 wiersza i 3 kolumny
użyjemy następującego zapisu:
Liczby[2, 3]
Nadawanie wartości elementom tablicy odbywa się przez przypisanie im pewnej wartości, na przykład:
Liczby[3, 5]:=25;
W powyższym zapisie elementowi tablicy Liczby znajdującemu się na przecięciu 3 wiersza i 5 kolumny
przypisano wartość 25.
Nadawanie wartości elementom tablicy może również odbywać się poprzez wczytywanie tych wartości z
zewnątrz, np. za pomocą jednej z instrukcji powtórzeń. Bardzo często do tego celu wykorzystuje się instrukcję FOR.
Ćwiczenie 76
Napisać program realizujący wprowadzanie liczb całkowitych do tablicy jednowymiarowej o n elementach, a następnie
wydrukowanie jej zawartości. Przyjąć dla tablicy maksymalny rozmiar n_max=20 elementów. Do wprowadzania i
drukowania danych z tablicy zastosować procedury. Tytuł programu „Tablica_jednowymiarowa". Zapisać program na
dysku w pliku o nazwie table_1.pas.
W bloku deklaracyjnym po słowie kluczowym CONST określić należy maksymalny rozmiar tablicy, tj. n_max=20;
Po słowie kluczowym TYPE zdefiniować należy typ tablicowy identyfikujący tablicę jednowymiarową zawierającą
n_max elementów:
TYPE
Dane = ARRAY [l..n_max] OF INTEGER;
Następnie po słowie VAR zadeklarować należy zmienną n, służącą do sterowania wprowadzaniem liczby elementów
oraz tablicę TAB.
VAR
n
: INTEGER;
T_l :Dane;
Do wczytywania danych zastosujemy instrukcję FOR. Wczytujemy dane element po elemencie do tablicy
jednowymiarowej przy zastosowaniu procedury Wprowadzanie. Wyprowadzanie danych następuje w procedurze
Odczyt_tablicy wykorzystującej również instrukcję FOR. Obie procedury wykorzystują zmienną globalną n.
PROGRAM Tablica_jednowymiarowa; *
USES
Crt;
CONST
n_max=20; (* maksymalna liczba elementów *)
TYPE
Dane = ARRAY [l..n_max] OF INTEGER;
VAR
n : INTEGER;
T_1 :Dane;
(****************************************)
PROCEDURE Wprowadzanie (VAR T: Dane);
VAR
i : INTEGER; (* zmienna kontrolna *)
BEGIN
Writeln (' Wprowadzanie danych do tablicy ');
Writeln;
Write (' Podaj liczbę elementów (n<=20), n= ');
Readln (n);
Writeln;
Write (' Podaj elementy tablicy w kolejności');
Writeln;
Writeln;
FOR i:=1 TO n DO BEGIN
Write('element nr= ',i,', T_1[', i,' ] = ');
Readln (T[i]);
END;
END;
(******************************************)
PROCEDURE Odczyt_tablicy (VAR T: Dane);
VAR
i: INTEGER;
(* zmienna kontrolna *)
BEGIN Writeln;
Write (' Odczytaj elementy tablicy w kolejności');
Writeln;
Writeln;
FOR i:=1 TO n DO
BEGIN
Write (' element nr = *,i,', T_l[' ,i,' ] = ');
Writeln (T[i])
END;
END;
(***********************************)
BEGIN ClrScr;
Wprowadzanie (T_1);
Odczyt_tablicy (T_1);
Writeln;
REPEAT UNTIL KeyPressed END.
Ćwiczenie 77
Napisać program realizujący wprowadzanie liczb całkowitych do tablicy jednowymiarowej o n elementach, a następnie
wydrukowanie jej zawartości w odwrotnej kolejności. Do wprowadzania i drukowania danych z tablicy zastosować
procedury. Tytuł programu „Tablica_odwrotna". Zapisać program na dysku w pliku o nazwie table_2.pas.
Ćwiczenie 78
Napisać program sprawdzający czy w danej tablicy jednowymiarowej znajdują się jednakowe elementy. Program ma
drukować te elementy i podawać ich pozycję. Do wprowadzania i drukowania danych z tablicy oraz wyszukiwania
jednakowych elementów zastosować procedury. Tytuł programu „Tablica _elementy". Zapisać program na dysku w
pliku o nazwie table_3.pas.
Uwaga:
Przy sprawdzaniu elementów tablicy kolejność postępowania jest następująca: najpierw porównywana jest liczba
pierwsza z drugą, następnie pierwsza z trzecią itd. Jeśli porównamy liczbę pierwszą ze wszystkimi liczbami, to należy
również porównywać liczbę drugą ze wszystkimi liczbami, ale za wyjątkiem pierwszej. Operację porównywania
przeprowadza się dla każdej liczby porównując ją ze wszystkimi liczbami poczynając od liczby następnej.
Ćwiczenie 79
Napisać program realizujący wprowadzanie liczb całkowitych do tablicy o wymiarach m x n (m - liczba wierszy, n liczba kolumn) oraz wydrukowanie jej zawartości. Przyjąć dla tablicy następujące maksymalne rozmiary: w_max=10 i
k_max=10.
Do
wprowadzania
i
drukowania
danych
zastosować
procedury.
Tytuł
programu
„Tablica_dwuwymiarowa". Zapisać program na dysku w pliku o nazwie table _4.pas.
W bloku deklaracyjnym po słowie kluczowym CONST określamy maksymalny rozmiar tablicy, tj.
CONST
w_max=10; (* w_max - max liczba wierszy *) k_max=10; (* k max max liczba kolumn *)
Po słowie kluczowym TYPE definiujemy typ tablicowy. Tablica jest dwuwymiarowa o liczbie wierszy odpowiadającą
stałej w_max (10), zaś liczba kolumn odpowiada stałej k_max (10).
TYPE
Dane = ARRAY [1..w_max, 1..k_max] OF INTEGER;
Po uruchomieniu programu w pamięci komputera zostanie zarezerwowane miejsce dla tak określonej tablicy.
Następnie po słowie kluczowym VAR zadeklarować należy zmienne m oraz n, które służą do wprowadzania
aktualnych wartości liczb wierszy i kolumn wraz z typami oraz tablicę TAB.
VAR
m,n : INTEGER;
TAB :Dane;
Do wczytywania danych zastosujemy instrukcję FOR. Wczytujemy dane wiersz po wierszu do tablicy dwuwymiarowej
przy zastosowaniu procedury Wprowadzanie. Wyprowadzanie danych następuje w procedurze Odczyt_tablicy
wykorzystującej również instrukcję FOR. Obie procedury wykorzystują zmienne globalne m i n.
PROGRAM Tablica_dwuwymiarowa;
USES
Crt;
CONST
w max =10; (* maksymalna liczba wierszy *) k_max=10; (*
maksymalna liczba kolumn *) TYPE
Dane = ARRAY [l..w max, l..k max] OF INTEGER; VAR
m,n : INTEGER;
TAB :Dane;
(**********************************************************************)
PROCEDURE Wprowadzanie (VAR T:Dane);
VAR
i, j : INTEGER; (* zmienna kontrolna *) BEGIN
Writeln (' Wprowadzanie danych do tablicy ');
Writeln;
Write (' Podaj liczbę wierszy (m<=10), m= ');
Readln (m);
Write (' Podaj liczbę kolumn (n<=10), n= ');
Read (n); Writeln;
Write (' Podaj elementy tablicy w kolejności');
Writeln (' wiersz po wierszu ');
Writeln;
FOR i:=1 TO m DO
FOR j:=1 TO n DO BEGIN
Write (' w= ',i, ' k= ',j,', TAB[',i, ', ',j, ']= ');
Readln (T[i,j]); END;
END;
(*******************************************)
PROCEDURE Odczyt tablicy (VAR T:Dane);
VAR
i j :INTEGER; (* zmienna kontrolna *) BEGIN Writeln;
Write (' Odczytaj elementy tablicy w kolejności');
Writeln (' wiersz po wierszu ');
Writeln;
FOR i:=1 TO m DO
FOR j:=1 To n DO
BEGIN
Write(' w= ',i,', k= ',j,', TAB[',i,','j,'] = ');
Writeln (T[i,j])
END;
END;
(***********************************************)
BEGIN ClrScr;
Wprowadzanie (TAB);
Odczyt_tablicy (TAB);
Writeln;
REPEAT UNTIL KeyPressed END.
Ćwiczenie 80
Napisać program realizujący wprowadzanie liczb całkowitych do tablicy o wymiarach m x n (m - liczba wierszy, n liczba kolumn) oraz wydrukowanie jej zawartości w kolejności kolumna po kolumnie. Przyjąć dla tablicy następujące
maksymalne rozmiary: w_max=15 i k_max=15. Do wprowadzania i drukowania danych z tablicy zastosować
procedury. Tytuł programu „Kolumna_po_kolumnie". Zapisać program na dysku w pliku o nazwie table_5.pas.
Ćwiczenie 81
Napisać program realizujący znajdowanie sumy elementów w określonym wierszu tablicy dwuwymiarowej. Do
wprowadzania, obliczania sumy i drukowania danych z tablicy zastosować procedury. Tytuł programu
„Suma_elementow_w_wierszu". Zapisać program na dysku w pliku o nazwie tablejS.pas.
Ćwiczenie 82
Napisać program realizujący zamianę dwóch wskazanych wierszy tablicy dwuwymiarowej. Do wprowadzania, zamiany
wierszy i drukowania danych z tablicy zastosować procedury. Tytuł programu „Zamiana _wierszy". Zapisać program
na dysku w pliku o nazwie table_7.pas.
Uwaga:
Zamiany dwóch wskazanych wierszy można dokonać w pętli FOR. Jeśli przyjmie się oznaczenia:
•
j
- bieżąca kolumna,
•
n - liczba elementów wiersza,
•
wl - numer pierwszego wiersza do zamiany,
•
w2 - numer drugiego wiersza do zamiany,
•
z_p - zmienna pomocnicza,
to można już przedstawić zamianę wierszy za pomocą następującej konstrukcji:
FOR j:=1 TO n DO
BEGIN
p:=TAB[w1,j];
TAB[w1,j]:=TAB[w2,j];
TAB[w2,j] : = z _p; END;
Najpierw zostaje wzięty pierwszy element wiersza w1 i przepisany do zmiennej z_p. Następnie pierwszy element
wiersza w2 zostaje przepisany na pierwsze miejsce (wcześniej zwolnione) wiersza w1. Ze zmiennej pomocniczej z_p
wpisujemy element na miejsce pierwsze wiersza w2. Ten sposób działania powtarzany jest w pętli dla każdego
elementu zaznaczonych wierszy.
Funkcja losowa RANDOM
Funkcja losowa RANDOM wyprowadza wartość liczby losowej. W przypadku podania argumentu Zakres
wynikiem działania funkcji będzie liczba całkowita z przedziału O...Zakres -1. Jeżeli argument ten został pominięty,
wynikiem będzie liczba rzeczywista z przedziału 0...1.
Pierwsze wywołanie funkcji RANDOM musi być poprzedzone wywołaniem procedury RANDOMIZE.
Przykładowy zapis funkcji RANDOM:
RANDOMIZE;
i:=RANDOM (6);
Losujemy liczby całkowite z przedziału 0...5. Wylosowana liczba podstawiana jest pod zmienną i.
Ćwiczenie 91
Napisać program symulujący 20 rzutów monetą i obliczający liczbę wyrzuconych orłów i reszek. Program ma tytuł
„Rzut_moneta_1". Zapisać program na dysku w pliku o nazwie moneta_1.pas.
Przyjmijmy oznaczenia:
•
ORZEŁ - zmienna przechowywująca liczbę wyrzuconych orłów,
•
RESZKA - zmienna przechowywująca liczbę wyrzuconych reszek.
•
0 - 1 - przedział liczb całkowitych do losowania, gdzie 0 oznacza wylosowanego orła, a 1 wylosowaną reszkę.
Pierwsze wywołanie funkcji RANDOM poprzedzi wywołanie procedury RANDOMIZE.
Zapis funkcji RANDOM:
m:=RANDOM (2);
Cały program został przedstawiony poniżej:
PROGRAM Rzut_moneta;
USES
Crt;
VAR
i, ORZEŁ, RESZKA, x : INTEGER;
Tak_Nie
: CHAR;
CONST
n=20;
(******************************************************)
BEGIN
REPEAT
ClrScr;
RANDOMIZE ;
ORZEL:=0;
RESZKA:=0;
FOR i:=l TO n DO
BEGIN
x:=RANDOM(2);
IF x=0 THEN ORZEL:=ORZEL+l
ELSE
RESZKA:=RESZKA+1;
END;
Writeln (' Losowy rzut moneta ');
Writeln (' Moneta rzucano ', i,' razy ');
Writeln;
Writeln (' Wylosowano orla....', ORZEL:2 razy');
Writeln (' Wylosowano reszke..RESZKA:2,' razy');
Writeln;
Writeln (' Jeszcze raz ?(T)ak');
Tak Nie:=UpCase(ReadKey)
UNTIL NOT (Tak_Nie='T') END.
Ćwiczenie 92
Uruchomić program Turbo Pascal. Napisać program symulujący losowanie 20 liczb z 80. Program ma tytuł
„Multi_lotek_1". Zapisać program na dysku w pliku o nazwie multi_1.pas.
Z tablicy Liczby będą losowane liczby. Wylosowane zostaną usunięte, aby ich ponownie nie losować. Usuwanie
wylosowanej liczby odbywa się za pomocą konstrukcji:
FOR n:=nr_los TO 79-i DO
natomiast przesuwanie pozostałych liczb do przodu za pomocą konstrukcji:
Liczby [n]: =Liczby [n+1];
Cały program został przedstawiony poniżej:
PROGRAM Toto_Multi_Lotek;
USES
Crt;
TYPE
t_zakres = 0..80; (* zakres liczb w totku; zero dodatkowo z uwagi na sortowanie z
wartownikiem *)
CONST
(* Z tej tablicy będziemy losowali liczby;
wylosowane usuwamy, aby ich ponownie nie losować *)
Liczby : ARRAY[1..80] OF t_zakres =
(1, 2, 3, 4, 5, 6, 7, 8, 9,10,
11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,
51,52,53,54,55,56,57,58,59,60,
61,62,63,64,65,66,67,68,69,70,
71,72,73,74,75,76,77,78,79,80);
VAR
i, j, nr_los, n, x : t_zakres;
wylosowane : ARRAY [0..20] OF t_zakres;
(***************************************)
BEGIN
ClrScr;
Randomize;
(* losujemy liczby *)
FOR i:=1 TO 20 DO
BEGIN
nr_los:=RANDOM(80-i)+1;
(* losujemy numer liczby z tablicy 'Liczby' *)
wylosowane[i]:=Liczby [nr_los];
FOR n:=nr_los TO 79-i DO
Liczby[n]:=Liczby[n+l];
(* wylosowana liczbę usuwamy z tablicy 'Liczby' a pozostałe przesuwamy do przodu *)
END;
(* sortujemy wylosowane liczby *)
FOR i: =2 TO 20 DO
BEGIN
x:=wylosowane[i];
wylosowane [0]: =x;
(* wylosowane [0]' pełni role wartownika *)
j:=i-1;
WHILE x<wylosowane[j] DO
BEGIN
wylosowane(j+1 ]:=wylosowane[j ];
j:=j-l;
(* zmniejszamy j o 1 *)
END;
wylosowane[j+l]:=x
END;
WritelnC Wylosowano następujące liczby w MultiLotku: ');
Writeln;
FOR i:=l TO 20 DO
Write (wylosowane[i]:4);
Readln;
END.
Ćwiczenie 93
Napisać program symulujący rzuty kostką. Program zawiera funkcje DWA, której wynikiem jest liczba rzutów kostką,
jaką trzeba wykonać, aby wypadły dwa oczka. Program ma tytuł „Kostka_l". Zapisać program na dysku w pliku o
nazwie kostka _1.pas.
Ćwiczenie 94
Napisać program losujący tablicę jednowymiarową N liczb i wypisujący parę liczb sąsiednich o największej sumie.
Program ma tytuł „Para_liczb_1". Zapisać program na dysku w pliku o nazwie para.pas.
■
Ćwiczenie 95
Napisać program losujący tablicę jednowymiarową N liczb i porządkujący, tak aby na początku były liczby podzielne
przez 2, dalej podzielne przez 3, 5 i 7. Na końcu mają się znajdować pozostałe liczby. Program ma tytuł „
Ustawianie_liczb". Zapisać program na dysku w pliku o nazwie table_13.pas.
Działania na tekstach
Do przedstawienia wszelkich napisów, czyli łańcuchów, w Turbo Pascalu służy typ STRING, czyli zmienna
łańcuchowa. Wartością łańcucha jest dowolny ciąg znaków ujęty w apostrofy.
Łańcuch znaków może być traktowany jako specyficzna tablica, której typem jest CHAR:
TYPE STRING = ARRAY [0...255] OF CHAR;
W deklaracji: VAR Wyraz: STRING;
dla zmiennej Wyraz długość maksymalna ciągu wynosi 255 znaków. Turbo Pascal nie obsługuje dłuższych
łańcuchów.
W powyższej deklaracji wielkość zmiennej Wyraz została podana bez klamer i wartości ją określającej. Tak
zadeklarowana zmienna zajmuje w pamięci 256 bajtów.
W deklaracji w postaci: VAR Wyraz : STRING[30];
tak zdefiniowana zmienna może przechowywać najwyżej 30 znaków i każdy kolejny znak będzie po prostu
ignorowany.
Odczytywanie aktualnej długości łańcucha zapamiętanego w zmiennej odbywa się za pomocą funkcji LENGTH.
Funkcja LENGTH
Zapis ogólny funkcji: LENGTH(s);
Wynikiem jest długość łańcucha znaków s, czyli liczba przedstawiająca liczbę znaków, z których on się składa.
Wynik jest typu INTEGER.
W poniższym przykładzie zmienna Zdanie jest przydzielona do wprowadzonego tekstu w postaci wyrazu
„KOT".
Zdanie:=' KOT' LENGTH (Zdanie);
Odczytaną wartością funkcji LENGTH(Zdanie) jest 3. Tyle bowiem liter liczy wyraz „KOT".
Ćwiczenie 96
Napisać program sprawdzający długość wprowadzonego nazwiska i imienia. Program ma tytuł „Dlugosc_wyrazow".
Zapisać program na dysku w pliku o nazwie string_l.pas.
W programie zmiennymi jest Nazwisko oraz Imie. Odczyt długości nazwiska uzyskuje się konstrukcją:
Writeln (Length (Nazwisko));
zaś odczyt imienia
Writeln (Length (Imie));
Cały program został przedstawiony poniżej:
PROGRAM Długość_wyrazow;
USES
Crt;
VAR
Nazwisko : STRING [25];
Imie
: STRING [20];
(*******************)
BEGIN ClrScr;
WriteLn (' Wyznaczenie długości nazwiska i imienia ');
WriteLn;
Write (' Pisanie należy zakończyć naciśnięciem ');
WriteLn (' klawisza Enter');
WriteLn;
Write (' Podaj nazwisko....: ');
ReadLn (Nazwisko);
Write (' Podaj imie.................. : ');
ReadLn (Imie);
WriteLn;
WriteLn (' Imie ',Imie,' zawiera ',Length (Imie),' liter');
WriteLn (' Nazwisko ',Nazwisko ,' zawiera ',Length (Nazwisko),' liter');
REPEAT UNTIL KeyPressed
END.
Turbo Pascal umożliwia operacje nie tylko na całych łańcuchach, lecz również na poszczególnych znakach w
łańcuchu.
VAR Wyraz : STRING [30];
W powyższym zapisie jest zadeklarowana zmienna typu String. W zapisie Wyraz[3] oznacza trzeci znak
łańcucha zapamiętany w zmiennej Wyraz. Wyraz[3] jest typem CHAR, mimo że cały Wyraz jest typu String. Nie
wolno żądać dostępu do numeru znaków, których nie ma w danym łańcuchu. Dla bezpieczeństwa najlepiej jest
sprawdzić dany łańcuch funkcją LENGTH.
Ćwiczenie 97
Napisać program wyświetlający wprowadzony tekst z klawiatury jako rozstrzelony. Program ma tytuł
„Tekst_rozstrzelony". Zapisać program na dysku w pliku o nazwie string_2.pas.
Zmiennej tekst zostaje przypisany wprowadzony tekst z klawiatury.
Program wylicza liczbę znaków, a następnie w pętli FOR jest realizowane wyświetlenie kolejnego znaku i dopisanie
spacji.
PROGRAM Tekst_rozstrzelony;
USES
Crt;
VAR
tekst : STRING;
i
: INTEGER;
(******************************)
BEGIN
ClrScr;
Writeln (' Napisz krotki tekst i nacisnij ENTER');
Readln (tekst);
FOR i:=l TO LENGTH (tekst) DO
Write (tekst[i],* ');
Readln
END.
Ćwiczenie 98
Napisać program zamieniający we wprowadzonym tekście znak s na p. Program ma tytuł „ Tekst_zamiany". Zapisać
program na dysku w pliku o nazwie string_3.pas.
Funkcja COPY
Zapis ogólny funkcji:
COPY(s,Indeks,Licznik);
Funkcja ta powoduje wycięcie z łańcucha znaków s, od miejsca oznaczonego numerem Indeks liczby znaków
określonych przez Licznik. Wynik jest typu STRING.
W poniższym zapisie: COPY ('KOMPAKT', 5,3);
otrzymamy wyraz 'AKT'.
Do łączenia łańcuchów wykorzystuje się funkcję CONCAT.
Funkcja CONCAT
Zapis ogólny funkcji:
CONCAT(s l,s 2, ..........,s_n);
Funkcja ta powoduje połączenie łańcuchów s_l, s_2, s_n w jeden wspólny łańcuch. Jeśli wielkość powstałego
łańcucha przekroczy długość 256 znaków, wszystkie pozostałe znaki zostają obcięte. Wynik jest typu STRING.
Zapis:
CONCAT('ADAM',' ',I,' ','MICHAL'); umożliwia uzyskanie napisu 'ADAM I MICHAŁ'.
Funkcję CONCAT możemy zastąpić zwyczajnym dodawaniem: s:='KOMP'+'AKT';
Otrzymamy napis 'KOMPAKT'.
Do poszukiwania łańcucha s_l w łańcuchu s stosujemy funkcję POS.
Funkcja POS
Zapis ogólny funkcji: POS(s_1,s);
Funkcja ta powoduje wyszukiwanie łańcucha s_l w łańcuchu s. Wynikiem jest numer miejsca, w którym łańcuch
s_1 po raz pierwszy zostanie znaleziony w łańcuchu s. Wynik jest typu BYTE.
POS('PASCAL','TURBO PASCAL');
Powyższy zapis powoduje uzyskanie wyniku 7.
Ćwiczenie 99
Napisać program sprawdzający liczbę małych liter „a" w tekście. Program ma tytuł „Obecność_litery_a". Zapisać
program na dysku w pliku o nazwie string_4.pas.
W programie wyznaczana jest długość tekstu (liczba znaków), a następnie sprawdzany jest każdy znak, czy zgodność
jest z literą 'a'.
PROGRAM Obecność_litery_a;
USES
Crt;
VAR
tekst : STRING;
(* sprawdzany tekst *)
i : INTEGER;
ile : INTEGER; (* ile jest liter 'a' w tekście *)
(**********************************)
BEGIN
ClrScr;
Writeln (' Wyznaczenie liczby małych liter 'a' w tekście ');
Writeln;
Writeln (' Napisz tekst i nacisnij ENTER');
Readln (tekst);
ile:=0;
FOR i:=l TO LENGTH (tekst) DO
IF (tekst[i]= 'a') THEN ile:=ile+l;
Writeln (' Liczba małych liter "a" w tekście : ',ile);
REPEAT UNTIL KeyPressed
END.
Procedura DELETE
Zapis ogólny procedury:
DELETE (s, Indeks, Licznik);
Z łańcucha znaków s zostanie od miejsca oznaczonego numerem Indeks usunięta liczba znaków określona przez
zmienną Licznik.
Parametrem W musi być zmienna, a nie dowolne wyrażenie, ponieważ procedura DELETE zmienia zawartość s.
Dla przykładu:
s:='Kapela';
DELETE (s, 1, 3);
otrzymamy napis 'ela'.
Wstawianie danego łańcucha do innego łańcucha uzyskujemy korzystając z procedury INSERT.
Procedura INSERT
Zapis ogólny procedury:
INSERT (s_l,s, Indeks);
Do zmiennej s typu STRING zostaje wpisany od pozycji Indeks łańcuch znaków s_l.
Parametrem s musi być zmienna, a nie dowolne wyrażenie, ponieważ procedura INSERT zmienia zawartość s.
Dla przykładu:
s:='Stacja';
INSERT ('gna',s, 4);
otrzymamy napis 'Stagnacja1.
Ćwiczenie 100
Napisać program sprawdzający działanie podanych funkcji i procedur. Program ma tytuł „Przykłady_1". Zapisać
program na dysku w pliku o nazwie string_5.pas.
W poniższym programie sprawdzimy przykłady do podanych uprzednio funkcji i procedur.
PROGRAM Przykłady_1;
USES Crt;
VAR
Zdanie_1
: String[10];
Zdanie_2
: String[8];
Zdanie_3
: String[4];
Zdanie_4
: String[8];
Zdanie 5
: String[15];
Zdanie_6
: String[6];
Zdanie_7
: String[8];
Zdanie_8
: String[6];
Zd_1 :String[20];
Zd_2 : String[20];
(************************)
BEGIN
ClrScr;
Zdaniel := 'KOMPAKT';
Zdanie_2 := 'ADAM ';
Zdanie 3 := 'I ';
Zdanie 4 := 'MICHAŁ';
Zdanie_5 := 'TURBO PASCAL';
Zdanie_6 := 'PASCAL';
Zdanie_7 := 'Kapela';
Zdanie_8 := 'Stacja';
Writeln (' Przykładowe wyniki działania funkcji ');
Writeln;
Writeln ('
Funkcja COPY ');
Writeln;
Zd_l := COPY(Zdanie 1,5,3);
Writeln (' ',Zd_l);
Writeln;
Writeln ('
Funkcja CONCAT '); Writeln;
Zd_2 := CONCAT(Zdanie_2, Zdanie 3, Zdanie_4); WritelnC ',Zd_2);
Writeln; Writeln;
Writeln ('
Funkcja POS ');
Writeln;
Write (' ');
Writeln (POS(Zdanie 6,Zdanie_5));
Writeln;
Writeln ('
Funkcja DELETE ');
Writeln;
DELETE (Zdanie_7,1,3);
Write (' ');
Writeln(Zdanie_7); Writeln;
Writeln ('
Funkcja INSERT ');
INSERT ('gna',Zdanie_8,4);
Writeln;
Write(' '); Writeln (Zdanie_8);
REPEAT UNTIL KeyPressed
END.
Procedura STR oraz VAL są najczęściej wykorzystywanymi procedurami przy obróbce tekstu.
Procedura STR
Zapis ogólny procedury:
STR (x[:długość[:miejsca dziesiętne]],s);
Procedura ta przekształca wartość numeryczną argumentu x na wartość typu STRING, która zostaje zapamiętana
przez zmienną s będącą typu STRING.
Przy zapamiętywaniu w łańcuchu wartości 370.0 jako stałej typu REAL, zapis procedury przybierze postać:
STR (370.0,s); ■
W zmiennej s zostanie zapisana wartość 3.7000000000+E02
Dla liczby 370 jako stałej typu INTEGER będzie to: STR (370,s);
W zmiennej s zostanie zapisana wartość 370.
Dla liczby 370 jako 3.7E+02 będzie to: STR (3.7E+02: 3:l,s);
W zmiennej s zostanie zapisana wartość 370.0.
Liczbę 324.111123 należy odpowiednio zapisać (np. z trzema miejscami po kropce dziesiętnej):
STR (324.111123: 15:3,s);
W zmiennej s zostanie zapamiętana wartość 324.111.
Procedura VAL
Zapis ogólny procedury: VAL(s, x, Kod);
Procedura ta przekształca łańcuch znaków s na wartość numeryczną zapamiętaną w zmiennej numerycznej x
będącej typu REAL lub INTEGER. W zmiennej Kod zawarta jest informacja dotycząca przebiegu powyższej operacji.
Zmienna ta ma wartość 0, jeśli operacja zamiany wartości z łańcuchowej na wartość numeryczną nastąpiła bez błędów.
W innym przypadku zmienna ta otrzymuje liczbę pierwszego błędnego znaku w danym łańcuchu.
Dla zmiennej s (np. s=2) typu INTEGER otrzymamy: VAL(s, x, Kod); x=2 oraz Kod=0,
Ćwiczenie 101
Napisać program wczytujący promień kola jako wyrażenie typu STRING oraz obliczający pole koła. Program ma tytuł
„Promien_kola_1". Zapisać program na dysku w pliku o nazwie string_6.pas.
Cały program został przedstawiony poniżej:
PROGRAM Promien_kola_1;
USES
Crt;
VAR
PromienString : STRING[20];
Promien_Real : REAL ;
Polekola
: REAL ;
Ocena
: INTEGER ;
(*********************************)
BEGIN
ClrScr;
WriteLn (' Obliczenie pola kola - promien_string ');
WriteLn;
Write (' Podaj promień kola w cm : ');
ReadLn (Promien_String);
WriteLn;
(* zamiana na wartość numeryczna *)
VAL (Promien_String, Promien_Real, Ocena);
IF Ocena = 0 THEN
BEGIN
Pole_kola := Pi * Sqr(Promien_Real);
WriteLn;
Write (' Pole kola o promieniu r= ', Promien_String,' wynosi ',Pole_kola: 8:3,' cm kw.');
WriteLn;
END
ELSE
WriteLn('Bledny znak na miejscu ',Ocena);
REPEAT UNTIL KeyPressed
END.
Ćwiczenie 102
Napisać program przekształcający liczby całkowite na wyrażenie typu STRING o żądanym formacie. Program ma tytuł
„Przejrzysta_postac_liczb". Zapisać program na dysku w pliku o nazwie string_7.pas.
Liczby, którymi operuje Turbo Pascal, nie mogą zawierać w sobie żadnych niewidocznych znaków (spacji). Wartość
liczby w postaci 123456781 jest trudna do odczytu. Liczba napisana w sposób następujący: 123 456 781 jest bardziej
przejrzysta. Program będzie zamieniał wprowadzane liczby na taki właśnie format.
Po wprowadzeniu liczby do programu zostaje ona zamieniona procedurą STR na wartość typu STRING. Następuje
obliczenie jej długości i wstawienie do pozycji wyznaczonej przez licznik nowego łańcucha w postaci spacji
powodującej rozsunięcie liczb po każdych trzech cyfrach licząc od prawej strony.
PROGRAM Przejrzysta_postac_liczb;
USES . Crt;
VAR
LiczbaString : STRING[15];
Liczba
: LONGINT;
Licznik
: SHORTINT;
(*********************)
BEGIN
ClrScr;
Writeln (' Przejrzystość liczb');
Writeln;
Write (' Podaj liczbę całkowita (do 9 cyfr): ');
Readln (Liczba);
STR (Liczba, Liczba_String);
Licznik := Length(Liczba_String) - 2;
WHILE Licznik > 0 DO
BEGIN
Insert (' ',Liczba_String, Licznik);
Licznik := Licznik - 3
END;
Writeln;
Writeln (' Przejrzysta postać : ', Liczba_String);
REPEAT UNTIL KeyPressed
END.
Ćwiczenie 103
Napisać program przekształcający liczby całkowite większe niż 9-cyfrowe na wyrażenie typu STRING o żądanym
formacie (co trzy cyfry). Program ma tytuł „Przejrzystość_ liczb". Zapisać program na dysku w pliku string_8.pas.
Ćwiczenie 104
Napisać program wczytujący dany tekst i wypisujący z niego wszystkie wyrazy, których pierwszy znak jest równy
ostatniemu. Program ma tytuł „Znaki_rowne". Zapisać program na dysku w pliku o nazwie string_9.pas.
Ćwiczenie 105
Napisać program wczytujący dany tekst i wypisujący z niego wszystkie wyrazy o nieparzystej długości zaczynające się
na literę 'p'. Program ma tytuł „Wyrazy_nieparzyste".
Zapisać program na dysku w pliku o nazwie st_1.pas..
Ćwictenie 106
Napisać program sprawdzający, czy dany tekst jest palindromem (czytany od początku i od końca tworzy ten sam ciąg
znaków). Program ma tytuł „Palindromy". Zapisać program na dysku w pliku o nazwie st_2.pas.
Ćwiczenie 107
Napisać program tworzący wszystkie możliwe anagramy danego słowa. Anagram tworzy się przestawiając kolejność
liter w wyrazie. Program ma tytuł „Anagramy". Zapisać program na dysku w pliku o nazwie st_3.pas.
Ćwiczenie 108
Napisać program pozwalający wykonywać dodawanie bardzo dużych liczb naturalnych (liczba cyfr >9). Program ma
tytuł „Dodawanie_duzych_liczb". Zapisać program na dysku w pliku o nazwie st_4.pas.
Uwaga:
Jednym ze sposobów rozwiązania jest metoda polegająca na traktowaniu liczby jako ciągu cyfr, a więc jako zmiennej
łańcuchowej. Pozwala to na działania na liczbach o 255 cyfrach. Liczbę naturalną na zmienną łańcuchową zamienia
funkcja STR, zmienną łańcuchową na liczbę naturalną zamienia funkcja VAL.
Dodawanie przebiega tak jak w przypadku zwykłego dodawania pisemnego.
W metodzie drugiej przyjmuje się, że liczba jest tablicą zawierającą cyfry. Dodawanie przebiega podobnie jak w
metodzie pierwszej.
Ćwiczenie 109
Napisać program pozwalający wykonywać mnożenie bardzo dużych liczb całkowitych (liczba cyfr >9). Program ma
tytuł „Mnożenie_duzych_liczb". Zapisać program na dysku w pliku o nazwie st_5.pas.
Ćwiczenie 110
Napisać program pozwalający wykonywać obliczenie ilorazu i reszty z dzielenia bardzo dużych liczb naturalnych
(liczba cyfr >9). Program ma tytuł „Dzielenie_duzych_liczb". Zapisać program na dysku w pliku st_6.pas.
Download