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.