helion kopia dla: Iwona Kruszynska technologia...

128
helion kopia dla: Iwona Kruszynska [email protected]

Transcript of helion kopia dla: Iwona Kruszynska technologia...

Page 1: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

helion kopia dla: Iwona Kruszynska [email protected]

Page 2: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całościlub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione.Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanieksiążki na nośniku filmowym, magnetycznym lub innym powoduje naruszeniepraw autorskich niniejszej publikacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymibądź towarowymi ich właścicieli.

Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawartew tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnejodpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualnenaruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELIONnie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłez wykorzystania informacji zawartych w książce.

Redaktor prowadzący: Ewelina Burska

Projekt okładki: Radosław Zbytniewski

Materiały graficzne na okładce zostały wykorzystane za zgodą iStockPhoto Inc.

Wydawnictwo HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: http://helion.pl (księgarnia internetowa, katalog książek)

Drogi Czytelniku!Jeżeli chcesz ocenić tę książkę, zajrzyj pod adreshttp://helion.pl/user/opinie?tpzada_pMożesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Kody wykorzystane w książce można znaleźć pod adresem:ftp://ftp.helion.pl/przyklady/tpzada.zip

ISBN: 978-83-246-3709-6Nr katalogowy: 6887

Copyright © Helion 2011

Printed in Poland.

• Poleć książkę na Facebook.com• Kup w wersji papierowej• Oceń książkę

• Księgarnia internetowa• Lubię to! » Nasza społeczność

helion kopia dla: Iwona Kruszynska [email protected]

Page 3: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

Spis treściOd autora 5

Rozdział 1. Proste operacje wejścia-wyjścia 7Instrukcje wyjścia 7Instrukcje wejścia 8

Rozdział 2. Podejmujemy decyzje w programie 17

Rozdział 3. Iteracje 29

Rozdział 4. Tablice 57Tablice jednowymiarowe 57Tablice dwuwymiarowe 61

Rozdział 5. Podprogramy 81Procedury 81Funkcje 101

Rozdział 6. Programowanie obiektowe 105

Rozdział 7. Pliki tekstowe 117

helion kopia dla: Iwona Kruszynska [email protected]

Page 4: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

4 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

helion kopia dla: Iwona Kruszynska [email protected]

Page 5: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

Od autoraTrójzbiór Zadania z programowania z rozwiązaniami to pierwszyw Polsce zbiór zadań adresowany do wszystkich osób zainteresowa-nych programowaniem, które w krótkim czasie, poprzez analizę zapro-ponowanych rozwiązań, chciałyby nauczyć się solidnych podstaw pro-gramowania w trzech językach: Turbo Pascalu, C++ oraz Javie.

Składa się on z trzech zbiorów zadań:

Turbo Pascal. Zadania z programowania z przykładowymirozwiązaniami.

C++. Zadania z programowania z przykładowymi rozwiązaniami.

Java. Zadania z programowania z przykładowymi rozwiązaniami.

Chociaż każda z powyższych książek tworzy odrębną całość, to zo-stały one napisane w taki sposób, aby ten sam lub bardzo podobnyproblem programistyczny (np. napisz program, który oblicza pole pro-stokąta) został rozwiązany w trzech językach programowania: TurboPascalu, C++ i Javie, strukturalnie i obiektowo. Tak skonstruowanytrójzbiór Zadania z programowania uzyskuje zupełnie nowy wymiardydaktyczny w nauce tych trzech języków.

Zadania z programowania można również wykorzystać jako uzupeł-nienie wiedzy zaczerpniętej z innych książek do nauki programowania.Zakres i stopień trudności zadań pokrywa się z tradycyjnym procesemnauczania wymienionych języków. Zbiór ten może też pełnić rolępodręcznej pomocy dla początkujących programistów, w której szybkoznajdą oni potrzebne im rozwiązanie.

helion kopia dla: Iwona Kruszynska [email protected]

Page 6: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

6 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Trójzbiór adresowany jest również do maturzystów, studentów, na-uczycieli informatyki oraz osób zainteresowanych programowaniem lubrozpoczynających naukę programowania w języku Turbo Pascal.

Uczniowie techników informatycznych mogą zbiory zadań wykorzy-stać do szybkiej powtórki przed egzaminem zawodowym.

W trakcie pisania tej książki korzystałem z tzw. aplikacji konsolowych(ang. console application) i kompilatora firmy Borland (Turbo Pascal).

Mirosław J. Kubiak

helion kopia dla: Iwona Kruszynska [email protected]

Page 7: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

1Proste operacjewejścia-wyjścia

W tym rozdziale zamieszczono proste zadania z przykładowymi rozwią-zaniami ilustrujące, w jaki sposób komputer komunikuje się z użyt-kownikiem w języku Turbo Pascal.

Każda aplikacja powinna posiadać możliwość komunikowania sięz użytkownikiem. Wykorzystując prosty przykład pokażemy, w jakisposób program napisany w języku Turbo Pascal komunikuje się z nimpoprzez standardowe operacje wejścia-wyjścia.

Instrukcje wyjściaDo wyprowadzania danych na ekran służą dwie instrukcje (procedury1

standardowe): Writeln i Write. Instrukcja Writeln powoduje wyprowa-dzenie danych na ekran monitora i automatyczne przejście kursorado nowej linii. Jej ogólna postać jest następująca:

Writeln(lista argumentów);

gdzie lista argumentów może być ciągiem znaków stałych, zmiennychlub wyrażeń oddzielonych od siebie przecinkami. 1 Więcej informacji o procedurach znajdzie czytelnik w rozdziale 5.

helion kopia dla: Iwona Kruszynska [email protected]

Page 8: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

8 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Instrukcja Write umożliwia wyprowadzenie danych na ekran monito-ra, nie powodując automatycznego przejścia kursora do nowej linii.Jej ogólna postać to:

Write(lista argumentów);

gdzie lista argumentów również może być ciągiem znaków stałych,zmiennych lub wyrażeń oddzielonych za pomocą przecinków.

Instrukcje wyjścia Writeln i Write umożliwiają przedstawienie liczbw postaci sformatowanej, tj. z określoną liczbą miejsc przed i po krop-ce dziesiętnej. Aby uzyskać sformatowaną postać liczby rzeczywistej,należy argument tych funkcji uzupełnić o określenie szerokości pólw następującej postaci:

: szerokość pola: liczba miejsc po kropce

Zapis Write(suma:6:2) oznacza, że wartość zmiennej suma zostaniewyświetlona w polu o szerokości sześciu znaków z dwoma cyframipo kropce.

Instrukcje wejściaDo wprowadzania zmiennych do uruchomionego programu w TurboPascalu służą dwie instrukcje (procedury standardowe): Read i Readln.Instrukcja Read umożliwia wprowadzenie do uruchomionego pro-gramu wartości zmiennych z klawiatury, nie powodując automa-tycznego przejścia kursora do nowej linii. Jej ogólna postać jest na-stępująca:

Read(lista argumentów);

gdzie lista argumentów może być ciągiem znaków stałych, zmiennychlub wyrażeń oddzielonych od siebie przecinkami.

Readln również jest instrukcją umożliwiającą wprowadzenie do uru-chomionego programu wartości zmiennych z klawiatury, powodujeona jednak (po wprowadzeniu danych) automatyczne przejście kur-sora do nowej linii. Jej ogólna postać jest następująca:

Readln(lista argumentów);

gdzie lista argumentów może być ciągiem znaków stałych, zmiennychlub wyrażeń oddzielonych od siebie przecinkami.

helion kopia dla: Iwona Kruszynska [email protected]

Page 9: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 1 . • P r o s t e o p e r a c j e w e j ś c i a - w y j ś c i a 9

Z A D A N I E

1.1 Napisz program, który oblicza pole prostokąta. Wartości bo-ków a i b wprowadzamy z klawiatury. W programie należyprzyjąć, że zmienne a i b oraz pole są typu Real (rzeczywistego).Dla zmiennych tych przyjmujemy format wyświetlania ich naekranie w polu czteroznakowym z dwoma miejscami po kropce.

Przykładowe rozwiązanie — listing 1.1

program Project1; // Zadanie 1.1

{$APPTYPE CONSOLE}

uses SysUtils;

var a, b, pole: Real; // deklarujemy zmienne typu Real

begin Writeln('Program oblicza pole prostokata.'); Writeln('Podaj bok a.'); Readln(a); Writeln('Podaj bok b.'); Readln(b); pole := a*b; // obliczamy pole prostokata Write('Pole prostokata o boku a = ', a:4:2, ' i boku b = ', b:4:2); Write(' wynosi ', pole:4:2, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Zmienne określonego typu deklarujemy w programie za pomocą słowakluczowego var. Linijki kodu

var a, b, pole: Real; // deklarujemy zmienne typu Real

umożliwiają deklarację zmiennych a, b i pole. Wszystkie te zmiennesą typu rzeczywistego — Real. Instrukcja

Writeln('Program oblicza pole prostokata.');

wyświetla na ekranie komputera komunikat Program oblicza poleprostokata. Instrukcja Readln(a) czeka na wprowadzenie z klawiaturyliczby, która następnie zostanie przypisana zmiennej a. Pole prosto-kąta zostaje obliczone w instrukcji

helion kopia dla: Iwona Kruszynska [email protected]

Page 10: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

10 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

pole := a*b; // obliczamy pole prostokata

Za wyświetlenie wartości zmiennych a, b oraz pole wraz z odpo-wiednim opisem odpowiedzialne są następujące linijki kodu:

Write('Pole prostokata o boku a = ', a:4:2, ' i boku b = ', b:4:2); Write(' wynosi ', pole:4:2, '.');

Instrukcja

Readln; // czeka na nacisniecie klawisza Enter

czeka na użycie klawisza Enter, aby po jego naciśnięciu zamknąćekran działającego programu. Komentarze oznaczamy w programiedwoma ukośnikami lub dwoma nawiasami klamrowymi:

// to jest komentarz do kodu{to też jest komentarz do kodu}

Komentarze są ignorowane przez kompilator w procesie kompilacji.

Rezultat działania programu można zobaczyć na rysunku 1.1.

Program oblicza pole prostokata.Podaj bok a.1Podaj bok b.2Pole prostokata o boku a = 1.00 i boku b = 2.00 wynosi 2.00.

Rysunek 1.1. Efekt działania programu Zadanie 1.1

Z A D A N I E

1.2 Napisz program, który wyświetla na ekranie komputera war-tość predefiniowanej stałej π = 3,14… Należy przyjąć formatwyświetlania jej w polu 10-znakowym z ośmioma miejscamipo kropce.

Przykładowe rozwiązanie — listing 1.2

program Project1; // Zadanie 1.2

{$APPTYPE CONSOLE}

uses SysUtils;

helion kopia dla: Iwona Kruszynska [email protected]

Page 11: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 1 . • P r o s t e o p e r a c j e w e j ś c i a - w y j ś c i a 11

begin Writeln('Program wyswietla wartosc predefiniowanej stalej pi'); Writeln('z dokladnoscia osmiu miejsc po kropce.'); Writeln('Pi = ', pi:10:8);

Readln; // czeka na nacisniecie klawisza Enterend.

Rezultat działania programu można zobaczyć na rysunku 1.2.

Program wyswietla wartosc predefiniowanej stalej piz dokladnoscia osmiu miejsc po kropce.Pi = 3.14159265

Rysunek 1.2. Efekt działania programu Zadanie 1.2

Z A D A N I E

1.3 Napisz program, który wyświetla na ekranie komputera pier-wiastek kwadratowy z wartości predefiniowanej π = 3,14…Należy przyjąć format wyświetlania wyniku w polu10-znakowym z ośmioma miejscami po kropce.

Przykładowe rozwiązanie — listing 1.3

program Project1; // Zadanie 1.3

{$APPTYPE CONSOLE}

uses SysUtils;

begin Writeln('Program wyswietla pierwiastek kwadratowy z wartosci predefiniowanej pi'); Writeln('z dokladnoscia osmiu miejsc po kropce.'); Writeln('Sqrt(pi) = ', Sqrt(pi):10:8);

Readln; // czeka na nacisniecie klawisza Enterend.

Pierwiastek kwadratowy ze stałej pi obliczamy za pomocą funkcjiSqrt().

Rezultat działania programu można zobaczyć na rysunku 1.3.

helion kopia dla: Iwona Kruszynska [email protected]

Page 12: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

12 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Program wyswietla pierwiastek kwadratowy z wartoscipredefiniowanej piz dokladnoscia osmiu miejsc po kropce.Sqrt(pi) = 1.77245385

Rysunek 1.3. Efekt działania programu Zadanie 1.3

Z A D A N I E

1.4 Napisz program, który oblicza objętość kuli o promieniu r.Wartość promienia wprowadzamy z klawiatury. W programienależy przyjąć, że promień r jest typu Real (rzeczywistego). Dlazmiennych r oraz objetosc przyjmujemy format wyświetlaniaich na ekranie w polu czteroznakowym z dwoma miejscamipo kropce.

Przykładowe rozwiązanie — listing 1.4

program Project1; // Zadanie 1.4

{$APPTYPE CONSOLE}

uses SysUtils;

var r, objetosc: Real;

begin Writeln('Program oblicza objetosc kuli o promieniu r.'); Writeln('Podaj promien r.'); Readln(r); objetosc := 4*Pi*r*r*r/3; Write('Objetosc kuli o promieniu r = ', r:4:2); Writeln(' wynosi ', objetosc:4:2,'.');

Readln; // czeka na nacisniecie klawisza Enterend.

Objętość kuli oblicza następująca linijka kodu:objetosc := 4*Pi*r*r*r/3;

gdzie potęgowanie zamieniono na mnożenie.

Rezultat działania programu można zobaczyć na rysunku 1.4.

helion kopia dla: Iwona Kruszynska [email protected]

Page 13: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 1 . • P r o s t e o p e r a c j e w e j ś c i a - w y j ś c i a 13

Program oblicza objetosc kuli o promieniu r.Podaj promien r.1Objetosc kuli o promieniu r = 1.00 wynosi 4.19.

Rysunek 1.4. Efekt działania programu Zadanie 1.4

Z A D A N I E

1.5 Napisz program obliczający wynik dzielenia całkowitego bezreszty dwóch liczb a = 37 i b = 11.

WskazówkaNależy zastosować operator dzielenia całkowitego bez reszty div.Umożliwia on uzyskanie całkowitej wartości liczbowej z wyniku dzielenia,podczas gdy reszta jest odrzucana.

Przykładowe rozwiązanie — listing 1.5

program Project1; // Zadanie 1.5

{$APPTYPE CONSOLE}

uses SysUtils;

const a = 37; b = 11;

begin Writeln('Program oblicza wynik dzielenia calkowitego bez reszty dwoch liczb.'); Writeln; // wyswietlenie pustej linii Writeln('Dla liczb a = ', a, ' i b = ', b); Writeln(a, ' div ', b, ' = ', a div b, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Stałe a i b definiujemy w programie za pomocą słowa kluczowegoconst, tak jak pokazują następujące linijki kodu:

const a = 37; b = 11;

helion kopia dla: Iwona Kruszynska [email protected]

Page 14: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

14 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Rezultat działania programu można zobaczyć na rysunku 1.5.

Program oblicza wynik dzielenia calkowitego bez resztydwoch liczb.

Dla liczb a = 37 i b = 1137 div 11 = 3.

Rysunek 1.5. Efekt działania programu Zadanie 1.5

Z A D A N I E

1.6 Napisz program, który oblicza resztę z całkowitego dzieleniadwóch liczb a = 37 i b = 11.

WskazówkaNależy zastosować operator reszty z całkowitego dzielenia mod (modulo).Umożliwia on uzyskanie tylko reszty z dzielenia, natomiast całkowitawartość liczbowa jest odrzucana.

Przykładowe rozwiązanie — listing 1.6

program Project1; // Zadanie 1.6

{$APPTYPE CONSOLE}

uses SysUtils;

const a = 37; b = 11;

begin Writeln('Program oblicza reszte z calkowitego dzielenia dwoch liczb.'); Writeln; Writeln('Dla liczb a = ', a, ' i b = ', b); Writeln(a, ' mod ', b, ' = ', a mod b, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Rezultat działania programu można zobaczyć na rysunku 1.6.

helion kopia dla: Iwona Kruszynska [email protected]

Page 15: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 1 . • P r o s t e o p e r a c j e w e j ś c i a - w y j ś c i a 15

Program oblicza reszte z calkowitego dzielenia dwoch liczb.

Dla liczb a = 37 i b = 1137 mod 11 = 4.

Rysunek 1.6. Efekt działania programu Zadanie 1.6

Z A D A N I E

1.7 Napisz program, który oblicza sumę, różnicę, iloczyn i ilorazdwóch liczb x i y wprowadzanych z klawiatury. W programienależy przyjąć, że liczby x i y są typu Real (rzeczywistego).Dla zmiennych x, y, suma, roznica, iloczyn i iloraz przyjmuje-my format wyświetlania ich na ekranie w polu czteroznako-wym z dwoma miejscami po kropce.

Przykładowe rozwiązanie — listing 1.7

program Project1; // Zadanie 1.7

{$APPTYPE CONSOLE}

uses SysUtils;

var x, y : Real; suma, roznica, iloczyn, iloraz : Real;

begin Writeln('Program oblicza sume, roznice, iloczyn i iloraz dwoch liczb.'); Writeln('Podaj x.'); Readln(x); Writeln('Podaj y.'); Readln(y);

suma := x+y; roznica := x-y; iloczyn := x*y; iloraz := x/y;

Writeln('Dla x = ', x:4:2, ' i y = ', y:4:2); Writeln; // wyswietlenie pustej linii Writeln('suma = ',suma:4:2, ','); Writeln('roznica = ', roznica:4:2, ',');

helion kopia dla: Iwona Kruszynska [email protected]

Page 16: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

16 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Writeln('iloczyn = ', iloczyn:4:2, ','); Writeln('iloraz = ', iloraz:4:2, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Za obliczenie w programie sumy, różnicy, iloczynu i ilorazu odpo-wiadają następujące linijki kodu:

suma := x+y; roznica := x-y; iloczyn := x*y; iloraz := x/y;

Rezultat działania programu można zobaczyć na rysunku 1.7.

Program oblicza sume, roznice, iloczyn i iloraz dwoch liczb.Podaj x.3Podaj y.2Dla x = 3.00 i y = 2.00

suma = 5.00,roznica = 1.00,iloczyn = 6.00,iloraz = 1.50.

Rysunek 1.7. Efekt działania programu Zadanie 1.7

helion kopia dla: Iwona Kruszynska [email protected]

Page 17: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

2Podejmujemy decyzje

w programieW tym rozdziale przedstawimy typowe zadania wraz z przykładowy-mi rozwiązaniami z wykorzystaniem instrukcji warunkowej if ...then oraz instrukcji wyboru case.

W języku Turbo Pascal istnieją dwie instrukcje warunkowe: instrukcja warunkowa if ... then, instrukcja wyboru case.

Instrukcja if ... then służy do sprawdzania poprawności wyrażeniawarunkowego i w zależności od tego, czy dany warunek jest praw-dziwy, czy nie, pozwala na wykonanie różnych bloków programu.Jej ogólna postać jest następująca:

if warunek then begin // instrukcje do wykonania, kiedy warunek jest prawdziwy end;

lub

if warunek then begin // instrukcje do wykonania, kiedy warunek jest prawdziwy end

helion kopia dla: Iwona Kruszynska [email protected]

Page 18: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

18 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

else begin // instrukcje do wykonania, kiedy warunek jest fałszywy end;

UwagaPo słowie kluczowym end znajdującym się bezpośrednio przed słowemkluczowym else nie występuje średnik.

Instrukcja wyboru case pozwala w wygodny i przejrzysty sposóbsprawdzić ciąg warunków i wykonywać kod w zależności od tego, czysą one prawdziwe, czy fałszywe. Jej ogólna postać jest następująca:

case wyrażenia of wybór_1; wybór_2; ............... wybór _nend;

lub

case wyrażenia of wybór_1; wybór_2; ............... wybór _nelse instrukcja;end;

Z A D A N I E

2.1 Napisz program, który dla trzech długości boków wprowa-dzonych z klawiatury sprawdza, czy tworzą one trójkąt pro-stokątny (zakładamy, że a > 0, b > 0, c > 0).

Przykładowe rozwiązanie — listing 2.1

program Project1; // Zadanie 2.1

{$APPTYPE CONSOLE}

uses SysUtils;

var a, b, c : Integer;

begin Writeln('Podaj bok a.');

helion kopia dla: Iwona Kruszynska [email protected]

Page 19: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 2 . • P o d e j m u je m y d e c y z j e w p r og r a m ie 19

Readln(a); Writeln('Podaj bok b.'); Readln(b); Writeln('Podaj bok c.'); Readln(c);

if (a*a+b*b) = (c*c) then Writeln('Boki a = ', a, ', b = ', b, ', c = ', c,' tworza trojkat prostokatny.') else Writeln('Boki a = ', a, ', b = ', b, ', c = ', c,' nie tworza trojkata prostokatnego.');

Readln; // czeka na nacisniecie klawisza Enterend.

Sprawdzenie twierdzenia Pitagorasa dla wczytanych boków a, b i czostało zawarte w następujących linijkach kodu:

if (a*a+b*b) = (c*c) then Writeln('Boki a = ', a, ', b = ', b, ', c = ', c,' tworza trojkat prostokatny.') else Writeln('Boki a = ', a, ', b = ', b, ', c = ', c,' nie tworza trojkata prostokatnego.');

Łatwo sprawdzić, że boki a = 3, b = 4, c = 5 są bokami trójkąta pro-stokątnego (liczby te spełniają twierdzenie Pitagorasa), i na ekraniepojawi się komunikat Boki… tworza trojkat prostokatny, natomiastboki a = 1, b = 2, c = 3 nie utworzą trójkąta prostokątnego (twierdze-nie Pitagorasa dla tych liczb nie jest spełnione), więc na ekranie zo-stanie wyświetlony komunikat Boki… nie tworza trojkata prostokatnego.

Rezultat działania programu dla a = 3, b = 4, c = 5 można zobaczyćna rysunku 2.1.

Podaj bok a.3Podaj bok b.4Podaj bok c.5Boki a = 3, b = 4, c = 5 tworza trojkat prostokatny.

Rysunek 2.1. Efekt działania programu Zadanie 2.1

helion kopia dla: Iwona Kruszynska [email protected]

Page 20: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

20 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Z A D A N I E

2.2 Napisz program, który z wykorzystaniem instrukcji warunkowejif oblicza pierwiastki równania kwadratowego ax2+bx+c = 0,gdzie zmienne a, b, c to liczby rzeczywiste wprowadzane z kla-wiatury. Dla zmiennych a, b, c, x1 oraz x2 należy przyjąć formatwyświetlania ich na ekranie w polu czteroznakowym z dwomamiejscami po kropce.

Przykładowe rozwiązanie — listing 2.2

program Project1; // Zadanie 2.2

{$APPTYPE CONSOLE}

uses SysUtils;

var a, b, c, delta, x1, x2: Real;

begin Writeln('Program oblicza pierwiastki rownania kwadratowego dla dowolnych wspolczynnikow a, b, c.'); Writeln('Podaj a.'); Readln(a); if (a = 0) then Writeln('Niedozwolona wartosc wspolczynnika a. Nacisnij klawisz Enter.') else begin Writeln('Podaj b.'); Readln(b); Writeln('Podaj c.'); Readln(c); Writeln('Dla wprowadzonych liczb:'); Writeln('a = ', a:4:2, ','); Writeln('b = ', b:4:2, ','); Writeln('c = ', c:4:2, ',');

delta := b*b-4*a*c;

if delta < 0 then Writeln('brak pierwiastkow rzeczywistych.') else begin if delta = 0 then begin x1 := -b/(2*a);

helion kopia dla: Iwona Kruszynska [email protected]

Page 21: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 2 . • P o d e j m u je m y d e c y z j e w p r og r a m ie 21

Writeln('trojmian ma jeden pierwiastek podwojny x1 = ', x1:4:2, '.'); end else begin x1 := (-b-sqrt(delta))/(2*a); x2 := (-b+sqrt(delta))/(2*a); Writeln('trojmian ma dwa pierwiastki:'); Writeln('x1 = ', x1:4:2, ','); Writeln('x2 = ', x2:4:2, '.'); end; end; end;

Readln; // czeka na nacisniecie klawisza Enterend.

W pierwszej części programu sprawdzamy, czy wartość współczyn-nika a jest równa zero. Ilustrują to następujące linijki kodu:

if (a = 0) then Writeln('Niedozwolona wartosc wspolczynnika a. Nacisnij klawisz Enter.')else begin ......... end;

Jeśli a = 0, to zostanie wyświetlony komunikat Niedozwolona war-tosc wspolczynnika a i program zostanie zakończony. Dla a różnegood zera program będzie oczekiwał na wprowadzenie wartości b i c.Po ich wpisaniu zostanie obliczona delta według wzoru

delta := b*b-4*a*c;

Jeśli delta < 0, zostanie wyświetlony komunikat brak pierwiastkowrzeczywistych.

W przypadku gdy delta = 0, równanie kwadratowe ma pierwiastekpodwójny, który obliczymy ze wzoru

x1 := -b/(2*a);

Jeśli delta > 0, równanie ma dwa pierwiastki, które zostaną obliczoneprzy użyciu wzorów

x1 := (-b-sqrt(delta))/(2*a);x2 := (-b+sqrt(delta))/(2*a);

Przykładowo dla a = 1, b = 5 i c = 4 wartości pierwiastków równaniato odpowiednio x1 = -4 i x2 = -1.

helion kopia dla: Iwona Kruszynska [email protected]

Page 22: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

22 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Dla a = 1, b = 4 i c = 4 trójmian ma z kolei jeden pierwiastek po-dwójny x1 = -2.

Dla współczynników a = 1, b = 2 oraz c = 3 trójmian nie ma pier-wiastków rzeczywistych.

Rezultat działania programu dla a = 1, b = 5, c = 4 można zobaczyćna rysunku 2.2.

Program oblicza pierwiastki rownania kwadratowego dladowolnych wspolczynnikow a, b, c.Podaj a.1Podaj b.5Podaj c.4Dla wprowadzonych liczb:a = 1.00,b = 5.00,c = 4.00,trojmian ma dwa pierwiastki:x1 = -4.00,x2 = -1.00.

Rysunek 2.2. Efekt działania programu Zadanie 2.2

Z A D A N I E

2.3 Napisz program, który z wykorzystaniem instrukcji wyborucase oblicza pierwiastki równania kwadratowego ax2+bx+c = 0,gdzie zmienne a, b, c to liczby rzeczywiste wprowadzane z kla-wiatury. Dla zmiennych a, b, c, x1 oraz x2 należy przyjąć formatwyświetlania ich na ekranie w polu czteroznakowym z dwomamiejscami po kropce.

WskazówkaNależy wprowadzić do programu zmienną pomocnicząLiczba_Pierwiastkow.

helion kopia dla: Iwona Kruszynska [email protected]

Page 23: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 2 . • P o d e j m u je m y d e c y z j e w p r og r a m ie 23

Przykładowe rozwiązanie — listing 2.3

program Project1; // Zadanie 2.3

{$APPTYPE CONSOLE}

uses SysUtils;

var a, b, c, delta, x1, x2 : Real; Liczba_Pierwiastkow : Byte; // zmienna pomocnicza

begin Writeln('Program oblicza pierwiastki rownania kwadratowego dla dowolnych wspolczynnikow a, b, c.'); Writeln('Podaj a.'); Readln(a); if (a = 0) then Writeln('Niedozwolona wartosc wspolczynnika a. Nacisnij klawisz Enter.') else begin Writeln('Podaj b.'); Readln(b); Writeln('Podaj c.'); Readln(c); Writeln('Dla wprowadzonych liczb:'); Writeln('a = ', a:4:2, ','); Writeln('b = ', b:4:2, ','); Writeln('c = ', c:4:2, ',');

delta := b*b-4*a*c;

if delta < 0 then Liczba_Pierwiastkow := 0; if delta = 0 then Liczba_Pierwiastkow := 1; if delta > 0 then Liczba_Pierwiastkow := 2;

case Liczba_Pierwiastkow of 0 : Writeln('brak pierwiastkow rzeczywistych.'); 1 : begin x1 := -b/(2*a); Writeln('trojmian ma jeden pierwiastek podwojny x1 = ', x1:4:2, '.'); end; 2 : begin x1 := (-b-sqrt(delta))/(2*a); x2 := (-b+sqrt(delta))/(2*a); Writeln('trojmian ma dwa pierwiastki:'); Writeln('x1 = ', x1:4:2, ','); Writeln('x2 = ', x2:4:2, '.');

helion kopia dla: Iwona Kruszynska [email protected]

Page 24: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

24 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

end; end; end;

Readln; // czeka na nacisniecie klawisza Enterend.

Rezultat działania programu dla a = 1, b = 4 i c = 4 można zobaczyćna rysunku 2.3.

Program oblicza pierwiastki rownania kwadratowego dladowolnych wspolczynnikow a, b, c.Podaj a.1Podaj b.4Podaj c.4Dla wprowadzonych liczb:a = 1.00,b = 4.00,c = 4.00,trojmian ma jeden pierwiastek podwojny x1 = -2.00.

Rysunek 2.3. Efekt działania programu Zadanie 2.3

Z A D A N I E

2.4 Napisz program, który oblicza wartość x z równania ax+b = c.Wartości a, b oraz c należą do zbioru liczb rzeczywistych i sąwprowadzane z klawiatury. Dodatkowo należy zabezpieczyćprogram na wypadek sytuacji, kiedy wprowadzona wartość ajest równa zero. Dla zmiennych a, b, c oraz x należy przyjąćformat wyświetlania ich na ekranie w polu czteroznakowymz dwoma miejscami po kropce.

Przykładowe rozwiązanie — listing 2.4

program Project1; // Zadanie 2.4

{$APPTYPE CONSOLE}

helion kopia dla: Iwona Kruszynska [email protected]

Page 25: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 2 . • P o d e j m u je m y d e c y z j e w p r og r a m ie 25

uses SysUtils;

var a, b, c, x : Real;

begin Writeln('Program oblicza wartosc x z rownania liniowego ax+b = c.'); Writeln('Podaj wartosc a.'); Readln(a);

if (a = 0) then Writeln('Niedozwolona wartosc a. Nacisnij klawisz Enter.') else begin Writeln('Podaj wartosc b.'); Readln(b); Writeln('Podaj wartosc c.'); Readln(c);

x := (c-b)/a;

Write('Dla: a = ', a:4:2, ','); Write(' b = ', b:4:2, ','); Write(' c = ', c:4:2, ','); Write(' wartosc x jest rowna ',x:4:2, '.'); end;

Readln; // czeka na nacisniecie klawisza Enterend.

Rezultat działania programu można zobaczyć na rysunku 2.4.

Program oblicza wartosc x z rownania liniowego ax+b = c.Podaj wartosc a.1Podaj wartosc b.2Podaj wartosc c.3Dla: a = 1.00, b = 2.00, c = 3.00, wartosc x jest rowna 1.00.

Rysunek 2.4. Efekt działania programu Zadanie 2.4

helion kopia dla: Iwona Kruszynska [email protected]

Page 26: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

26 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Z A D A N I E

2.5 Napisz program będący prostą grą komputerową, w którejużytkownik zgaduje liczbę losową z przedziału od 0 do 9 ge-nerowaną przez komputer.

WskazówkaW programie należy zastosować funkcję pseudolosową random().

Przykładowe rozwiązanie — listing 2.5

program Project1; // Zadanie 2.5

{$APPTYPE CONSOLE}

uses SysUtils;

var losuj_liczbe, zgadnij_liczbe : Integer;

begin Writeln('Program losuje liczbe od 0 do 9. Zgadnij ja.'); randomize(); losuj_liczbe := random(10); Readln(zgadnij_liczbe);

if zgadnij_liczbe = losuj_liczbe then Writeln('Gratulacje! Zgadles liczbe!') else Writeln('Bardzo mi przykro, ale wylosowana liczba to ', losuj_liczbe, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Za losowanie liczby przez komputer odpowiadają w programie na-stępujące linijki kodu:

randomize();losuj_liczbe := random(10);

Funkcja random(10) zwraca liczbę pseudolosową z zakresu od 0 do 9(tj. 10–1). Procedura randomize() inicjalizuje generator liczb pseudo-losowych (tzn. ustala jego wartość początkową).

helion kopia dla: Iwona Kruszynska [email protected]

Page 27: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 2 . • P o d e j m u je m y d e c y z j e w p r og r a m ie 27

Rezultat działania programu można zobaczyć na rysunku 2.5.

Program losuje liczbe od 0 do 9. Zgadnij ja.9Bardzo mi przykro, ale wylosowana liczba to 8.

Rysunek 2.5. Efekt działania programu Zadanie 2.5

helion kopia dla: Iwona Kruszynska [email protected]

Page 28: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

28 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

helion kopia dla: Iwona Kruszynska [email protected]

Page 29: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

3Iteracje

W tym rozdziale przedstawimy typowe zadania wraz z rozwiązaniamiz wykorzystaniem iteracji, czyli popularnych pętli. O ile młodzi pro-gramiści nie mają problemu z programami, w których zastosowanoinstrukcję for, to zamiana jej na repeat ... until oraz while nastręczapewnych trudności. Proste przykłady z użyciem instrukcji for zostaływięc rozwiązane zarówno z instrukcją repeat ... until, jak i while.

Iteracja (łac. iteratio — powtarzanie) to czynność powtarzania (naj-częściej wielokrotnego) tej samej albo wielu różnych instrukcji w pętli.

W języku Turbo Pascal istnieją trzy instrukcje iteracyjne: for ... to (downto) ... do (dla), repeat ... until (powtarzaj), while (dopóki).

Instrukcja for ... to ... do określa dokładnie, ile razy zostanie po-wtórzony dany ciąg instrukcji. Jej ogólna postać jest następująca:

for zmienna := wartość_początkowa to wartość_końcowa do begin // ciąg instrukcji end;

helion kopia dla: Iwona Kruszynska [email protected]

Page 30: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

30 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Zmienna nazywana jest zmienną sterującą pętlą for. Musi być ona typucałkowitego, znakowego lub logicznego1. Podczas wykonywania pętlifor instrukcja (prosta lub złożona) wyszczególniona po słowie kluczo-wym do powtarzana jest tyle razy, ile wartości znajduje się w przedziale

wartość_początkowa – wartość_końcowa

Instrukcja for może również przyjmować inną postać:for zmienna := wartość_początkowa downto wartość_końcowa do begin // ciąg instrukcji end;

Warto pamiętać, że zmienna sterująca przyjmuje tu kolejną wartośćmniejszą od wynikającej z przedziału

wartość_początkowa – wartość_końcowa

Kolejną instrukcją iteracyjną jest repeat ... until. Jej ogólna postaćjest następująca:

repeat instrukcja_1; instrukcja_2; .................... instrukcja_n;until warunek;

Cechą charakterystyczną tej pętli jest to, że bez względu na wartośćwarunku musi ona przynajmniej raz zostać wykonana. Wykonywa-nie instrukcji pomiędzy słowami kluczowymi repeat i until kończysię, jeśli warunek osiąga wartość true (prawda). W przeciwnym wy-padku instrukcje te są ponownie powtarzane.

Ostatnią instrukcją iteracyjną jest while ... do. Oto jej ogólna postać:

while warunek do begin instrukcja_1; instrukcja_2; .................... instrukcja_n; end;

1 Przykładowo w języku C++, w przeciwieństwie do Turbo Pascala, zmienna

sterująca pętlą for nie musi być typu całkowitego, znakowego lub logicznego.Może być ona również typu np. float.

helion kopia dla: Iwona Kruszynska [email protected]

Page 31: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 31

Jej cechą charakterystyczną jest sprawdzenie warunku jeszcze przedwykonaniem ciągu instrukcji poniżej:

begin instrukcja_1; instrukcja_2; .................... instrukcja_n;end;

W szczególnym przypadku pętla może nie zostać wcale wykonana.Instrukcja while ... do powoduje wykonywanie instrukcji

begin instrukcja_1; instrukcja_2; .................... instrukcja_n;end;

tak długo, dopóki warunek jest spełniony.

Z A D A N I E

3.1 Napisz program, który za pomocą instrukcji for dla danychwartości x zmieniających się od 0 do 10 oblicza wartośćfunkcji y = 3x.

Przykładowe rozwiązanie — listing 3.1

program Project1; // Zadanie 3.1

{$APPTYPE CONSOLE}

uses SysUtils;

var x, y : Integer;

begin Writeln('Program oblicza wartosc funkcji y = 3x dla x zmieniajacego sie od 0 do 10.');

for x := 0 to 10 do begin y := 3*x; Writeln('x = ', x, #9, 'y = ', y); end;

Readln; // czeka na nacisniecie klawisza Enterend.

helion kopia dla: Iwona Kruszynska [email protected]

Page 32: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

32 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

W pętli

for x := 0 to 10 do begin y := 3*x; Writeln('x = ', x, #9, 'y = ', y); end;

kolejne wartości x — zmieniające się automatycznie od 0 (wartość_początkowa) do 10 (wartość_końcowa) z krokiem równym 1 — będą

podstawiane do wzoru

y := 3*x;

a następnie zostaną wyświetlone na ekranie. #9 to znak tabulacji.

Rezultat działania programu można zobaczyć na rysunku 3.1.

Program oblicza wartosc funkcji y = 3x dla x zmieniajacegosie od 0 do 10.x = 0 y = 0x = 1 y = 3x = 2 y = 6x = 3 y = 9x = 4 y = 12x = 5 y = 15x = 6 y = 18x = 7 y = 21x = 8 y = 24x = 9 y = 27x = 10 y = 30

Rysunek 3.1. Efekt działania programu Zadanie 3.1

Z A D A N I E

3.2 Napisz program, który za pomocą instrukcji repeat ... untildla danych wartości x zmieniających się od 0 do 10 obliczawartość funkcji y = 3x.

Przykładowe rozwiązanie — listing 3.2

program Project1; // Zadanie 3.2

{$APPTYPE CONSOLE}

helion kopia dla: Iwona Kruszynska [email protected]

Page 33: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 33

uses SysUtils;

var x, y : Integer;

begin Writeln('Program oblicza wartosc funkcji y = 3x dla x zmieniajacego sie od 0 do 10.'); x := 0;

repeat y := 3*x; Writeln('x = ', x, #9, 'y = ', y); x := x+1; until x > 10;

Readln; // czeka na nacisniecie klawisza Enterend.

Pętla repeat ... until nie posiada wbudowanego mechanizmu zmianyzmiennej sterującej nią, dlatego musimy do niej ten mechanizm do-budować. Rolę zmiennej sterującej pełni tutaj zmienna x.

repeat y := 3*x; Writeln('x = ', x, ' y = ', y); x := x+1;until x > 10;

Tę zmienną powinniśmy przed pętlą wyzerować, zatem

x := 0;

Następnie zmienną x należy zwiększać o krok, który w naszym przy-padku wynosi 1. Ilustruje to poniższa linijka kodu.

x := x+1;

Pętla będzie powtarzana tak długo, aż zmienna x będzie większa od10. Zwróćmy uwagę, że warunek sprawdzający zakończenie działa-nia pętli, tzn. until x > 10, znajduje się na jej końcu.

Z A D A N I E

3.3 Napisz program, który za pomocą instrukcji while ... do dladanych wartości x zmieniających się od 0 do 10 oblicza war-tość funkcji y = 3x.

helion kopia dla: Iwona Kruszynska [email protected]

Page 34: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

34 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Przykładowe rozwiązanie — listing 3.3

program Project1; // Zadanie 3.3

{$APPTYPE CONSOLE}

uses SysUtils;

var x, y : Integer;

begin Writeln('Program oblicza wartosc funkcji y = 3x dla x zmieniajacego sie od 0 do 10.'); x := 0;

while x <= 10 do begin y := 3*x; Writeln('x = ', x, #9, 'y = ', y); x := x+1; end;

Readln; // czeka na nacisniecie klawisza Enterend.

Pętla while ... do, podobnie jak repeat ... until, nie posiada wbu-dowanego mechanizmu modyfikacji sterującej nią zmiennej, musimywięc go w nią wbudować. Rolę zmiennej sterującej pełni tutaj x.

while x <= 10 do begin y := 3*x; Writeln('x = ', x, ' y = ', y); x := x+1;end;

Zmienną x powinniśmy przed pętlą wyzerować, zatem

x := 0;

Następnie zmienną x należy zwiększać o krok, który w naszym przy-padku wynosi 1. Ilustruje to linijka kodu poniżej.

x := x+1;

Pętla będzie powtarzana tak długo, dopóki zmienna x będzie mniejszabądź równa 10. Zwróćmy uwagę, że warunek sprawdzający zakończe-nie działania pętli, tzn. while x <= 10 do, znajduje się na jej początku.

helion kopia dla: Iwona Kruszynska [email protected]

Page 35: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 35

Z A D A N I E

3.4 Napisz program, który za pomocą instrukcji for wyświetlaliczby całkowite od 1 do 20.

Przykładowe rozwiązanie — listing 3.4

program Project1; // Zadanie 3.4

{$APPTYPE CONSOLE}

uses SysUtils;

var i : Integer;

begin Writeln('Program wyswietla liczby calkowite od 1 do 20.');

for i := 1 to 20 do if i < 20 then Write(i, ', ') else Write(i, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Rezultat działania programu można zobaczyć na rysunku 3.2.

Program wyswietla liczby calkowite od 1 do 20.1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.

Rysunek 3.2. Efekt działania programu Zadanie 3.4

Z A D A N I E

3.5 Napisz program, który za pomocą instrukcji repeat ... untilwyświetla liczby całkowite od 1 do 20.

Przykładowe rozwiązanie — listing 3.5

program Project1; // Zadanie 3.5

{$APPTYPE CONSOLE}

helion kopia dla: Iwona Kruszynska [email protected]

Page 36: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

36 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

uses SysUtils;

var i : Integer;

begin Writeln('Program wyswietla liczby calkowite od 1 do 20.'); i := 0;

repeat i := i+1; if i < 20 then Write(i, ', ') else Write(i, '.'); until i >= 20;

Readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

3.6 Napisz program, który za pomocą instrukcji while ... do wy-świetla liczby całkowite od 1 do 20.

Przykładowe rozwiązanie — listing 3.6

program Project1; // Zadanie 3.6

{$APPTYPE CONSOLE}

uses SysUtils;

var i : Integer;

begin Writeln('Program wyswietla liczby calkowite od 1 do 20.'); i := 0;

while i < 20 do begin i := i+1; if i < 20 then Write(i, ', ') else

helion kopia dla: Iwona Kruszynska [email protected]

Page 37: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 37

Write(i, '.'); end;

Readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

3.7 Napisz program, który za pomocą instrukcji for sumuje liczbycałkowite w przedziale od 1 do 100.

Przykładowe rozwiązanie — listing 3.7

program Project1; // Zadanie 3.7

{$APPTYPE CONSOLE}

uses SysUtils;

var i, suma : Integer;

begin Writeln('Program sumuje liczby calkowite w przedziale od 1 do 100.'); suma := 0;

for i := 1 to 100 do suma := suma+i;

Writeln('Suma liczb calkowitych w przedziale od 1 do 100 wynosi ', suma, '.'); Readln; // czeka na nacisniecie klawisza Enterend.

Za sumowanie liczb całkowitych w przedziale od 1 do 100 odpowie-dzialne są następujące linijki kodu:

for i := 1 to 100 do suma := suma+i;

Oczywiście przed pętlą zmienna suma musi zostać wyzerowana.

suma := 0;

Rezultat działania programu można zobaczyć na rysunku 3.3.

helion kopia dla: Iwona Kruszynska [email protected]

Page 38: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

38 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Program sumuje liczby calkowite w przedziale od 1 do 100.Suma liczb calkowitych od 1 do 100 wynosi 5050.

Rysunek 3.3. Efekt działania programu Zadanie 3.7

Z A D A N I E

3.8 Napisz program, który za pomocą instrukcji repeat ... untilsumuje liczby całkowite w przedziale od 1 do 100.

Przykładowe rozwiązanie — listing 3.8

program Project1; // Zadanie 3.8

{$APPTYPE CONSOLE}

uses SysUtils;

var i, suma : Integer;

begin Writeln('Program sumuje liczby calkowite w przedziale od 1 do 100.'); suma := 0; i := 0;

repeat suma := suma+i; i := i+1; until i > 100;

Writeln('Suma liczb calkowitych w przedziale od 1 do 100 wynosi ', suma, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

3.9 Napisz program, który za pomocą instrukcji while ... do su-muje liczby całkowite w przedziale od 1 do 100.

Przykładowe rozwiązanie — listing 3.9

program Project1; // Zadanie 3.9

{$APPTYPE CONSOLE}

helion kopia dla: Iwona Kruszynska [email protected]

Page 39: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 39

uses SysUtils;

var i, suma : Integer;

begin Writeln('Program sumuje liczby calkowite w przedziale od 1 do 100.'); suma := 0; i := 0;

while i <= 100 do begin suma := suma+i; i := i+1; end;

Writeln('Suma liczb calkowitych w przedziale od 1 do 100 wynosi ', suma, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

3.10 Napisz program, który za pomocą instrukcji for sumuje liczbyparzyste w przedziale od 1 do 100.

WskazówkaNależy skorzystać z właściwości operatora modulo mod.

Przykładowe rozwiązanie — listing 3.10

program Project1; // Zadanie 3.10

{$APPTYPE CONSOLE}

uses SysUtils;

var i, suma : Integer;

begin Writeln('Program sumuje liczby parzyste w przedziale od 1 do 100.'); suma := 0;

helion kopia dla: Iwona Kruszynska [email protected]

Page 40: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

40 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

for i := 1 to 100 do if (i mod 2) = 0 then suma := suma+i;

Writeln('Suma liczb parzystych w przedziale od 1 do 100 wynosi ', suma, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Za sumowanie liczb parzystych z przedziału od 1 do 100 odpowie-dzialne są następujące linijki kodu:

for i := 1 to 100 do if (i mod 2) = 0 then suma := suma+i;

Do tego celu wykorzystaliśmy właściwości operatora modulo ozna-czonego jako mod. Zapis (i mod 2) = 0 oznacza, że w wyniku dziele-nia całkowitego i mod 2 reszta wynosi zero, a więc mamy do czynieniaz liczbą parzystą, którą następnie dodajemy do zmiennej suma.

Rezultat działania programu można zobaczyć na rysunku 3.4.

Program sumuje liczby parzyste w przedziale od 1 do 100.Suma liczb parzystych w przedziale od 1 do 100 wynosi 2550.

Rysunek 3.4. Efekt działania programu Zadanie 3.10

Z A D A N I E

3.11 Napisz program, który za pomocą instrukcji repeat ... untilsumuje liczby parzyste w przedziale od 1 do 100.

WskazówkaNależy skorzystać z właściwości operatora modulo mod.

Przykładowe rozwiązanie — listing 3.11

program Project1; // Zadanie 3.11

{$APPTYPE CONSOLE}

uses SysUtils;

helion kopia dla: Iwona Kruszynska [email protected]

Page 41: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 41

var i, suma : Integer;

begin Writeln('Program sumuje liczby parzyste w przedziale od 1 do 100.'); suma := 0; i := 0;

repeat if (i mod 2 = 0) then suma := suma+i; i := i+1; until i > 100;

Writeln('Suma liczb parzystych w przedziale od 1 do 100 wynosi ', suma, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

3.12 Napisz program, który za pomocą instrukcji while ... do su-muje liczby parzyste w przedziale od 1 do 100.

WskazówkaNależy skorzystać z właściwości operatora modulo mod.

Przykładowe rozwiązanie — listing 3.12

program Project1; // Zadanie 3.12

{$APPTYPE CONSOLE}

uses SysUtils;

var i, suma : Integer;

begin Writeln('Program sumuje liczby parzyste w przedziale od 1 do 100.'); suma := 0; i := 0;

while i <= 100 do begin

helion kopia dla: Iwona Kruszynska [email protected]

Page 42: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

42 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

if (i mod 2 = 0) then suma := suma+i; i := i+1; end;

Writeln('Suma liczb parzystych w przedziale od 1 do 100 wynosi ', suma, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

3.13 Napisz program, który za pomocą instrukcji for sumuje liczbynieparzyste z przedziału od 1 do 100.

WskazówkaNależy skorzystać z właściwości operatora modulo mod i operatoranegacji not.

Przykładowe rozwiązanie — listing 3.13

program Project1; // Zadanie 3.13

{$APPTYPE CONSOLE}

uses SysUtils;

var i, suma : Integer;

begin Writeln('Program sumuje liczby nieparzyste w przedziale od 1 do 100.'); suma := 0;

for i := 1 to 100 do if not (i mod 2 = 0) then suma := suma+i;

Writeln('Suma liczb nieparzystych w przedziale od 1 do 100 wynosi ', suma, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

helion kopia dla: Iwona Kruszynska [email protected]

Page 43: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 43

Za sumowanie liczb nieparzystych z przedziału od 1 do 100 odpo-wiedzialne są następujące linijki kodu:

for i := 1 to 100 do if not (i mod 2 = 0) then suma := suma+i;

Do tego celu wykorzystaliśmy właściwości operatora modulo ozna-czonego jako mod oraz operatora negacji oznaczonego jako not. Operatornot przekształca warunek prawdziwy w fałszywy, a fałszywy w praw-dziwy. Zapis not (i mod 2) = 0 oznacza, że w wyniku dzielenia całkowi-tego zmiennej i mod 2 reszta jest różna od zera, a więc mamy do czy-nienia z liczbą nieparzystą, którą następnie dodajemy do zmiennej suma.

Rezultat działania programu można zobaczyć na rysunku 3.5.

Program sumuje liczby nieparzyste w przedziale od 1 do 100.Suma liczb nieparzystych w przedziale od 1 do 100 wynosi 2500.

Rysunek 3.5. Efekt działania programu Zadanie 3.13

Z A D A N I E

3.14 Napisz program, który za pomocą instrukcji repeat ... untilsumuje liczby nieparzyste z przedziału od 1 do 100.

WskazówkaNależy skorzystać z właściwości operatora modulo mod i operatoranegacji not.

Przykładowe rozwiązanie — listing 3.14

program Project1; // Zadanie 3.14

{$APPTYPE CONSOLE}

uses SysUtils;

var i, suma : Integer;

begin Writeln('Program sumuje liczby nieparzyste w przedziale od 1 do 100.'); suma := 0; i := 0;

helion kopia dla: Iwona Kruszynska [email protected]

Page 44: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

44 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

repeat if not (i mod 2 = 0) then suma := suma+i; i := i+1; until i > 100;

Writeln('Suma liczb nieparzystych w przedziale od 1 do 100 wynosi ', suma, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

3.15 Napisz program, który za pomocą instrukcji while ... do su-muje liczby nieparzyste z przedziału od 1 do 100.

WskazówkaNależy skorzystać z właściwości operatora modulo mod i operatoranegacji not.

Przykładowe rozwiązanie — listing 3.15

program Project1; // Zadanie 3.15

{$APPTYPE CONSOLE}

uses SysUtils;

var i, suma : Integer;

begin Writeln('Program sumuje liczby nieparzyste w przedziale od 1 do 100.'); suma := 0; i := 0;

while i <= 100 do begin if not (i mod 2 = 0) then suma := suma+i; i := i+1; end;

helion kopia dla: Iwona Kruszynska [email protected]

Page 45: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 45

Writeln('Suma liczb nieparzystych w przedziale od 1 do 100 wynosi ', suma, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

3.16 Napisz program, który za pomocą instrukcji for znajduje naj-większą i najmniejszą liczbę ze zbioru n całkowitych liczb lo-sowych (w programie ilosc_liczb = 5) z przedziału od 0 do 99oraz oblicza średnią ze zbioru wszystkich wylosowanych liczb.

Przykładowe rozwiązanie — listing 3.16

program Project1; // Zadanie 3.16

{$APPTYPE CONSOLE}

uses SysUtils;

const ilosc_liczb = 5;

var i, liczba, suma, min, max : Integer;

begin Writeln('Program losuje ', ilosc_liczb, ' liczb calkowitych z przedzialu od 0 do 99,'); Writeln('a nastepnie znajduje najmniejsza i najwieksza'); Writeln('oraz oblicza srednia ze wszystkich wylosowanych liczb.'); suma := 0;

Randomize(); min := Random(100); Writeln; Write('Wylosowano liczby: '); Write(min, ', '); max := min; suma := suma+max;

for i := 1 to ilosc_liczb-1 do begin liczba := Random(100); if i < ilosc_liczb-1 then Write(liczba, ', ')

helion kopia dla: Iwona Kruszynska [email protected]

Page 46: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

46 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

else Write(liczba, '.'); if max < liczba then max := liczba; if liczba < min then min := liczba; suma := suma+liczba; end;

Writeln; Writeln('Najwieksza liczba to ', max, '.'); Writeln('Najmniejsza liczba to ', min, '.'); Writeln('Srednia wynosi ', suma/ilosc_liczb:4:2, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Najpierw losujemy w programie pierwszą liczbę i przypisujemy jejwartość min.

min := Random(100);

W kolejnym kroku wartości max nadajemy wartość min.

max := min;

Następnie w pętli pomniejszonej o 1 (pierwsza liczba została jużwylosowana):

for i := 1 to ilosc_liczb-1 do begin liczba := Random(100); if i < ilosc_liczb-1 then Write(liczba, ', ') else Write(liczba, '.'); if max < liczba then max := liczba; if liczba < min then min := liczba; suma := suma+liczba; end;

sprawdzamy, czy kolejna wylosowana liczba jest większa od po-przedniej. Jeśli tak, to staje się ona największą liczbą (max); w prze-ciwnym wypadku przypisujemy jej wartość min. Ilustrują to nastę-pujące linijki kodu:

helion kopia dla: Iwona Kruszynska [email protected]

Page 47: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 47

if max < liczba then max := liczba;if liczba < min then min := liczba;

Sumę wszystkich liczb wyliczają następujące linijki kodu: suma :=suma+max (przed pętlą) i suma := suma+liczba (w pętli). Średnia ze

wszystkich wylosowanych liczb jest natomiast obliczana i wyświe-tlana na ekranie przez następująca linijkę:

Writeln('Srednia wynosi ', suma/ilosc_liczb:4:2, '.');

Rezultat działania programu dla przykładowych wylosowanych liczbmożna zobaczyć na rysunku 3.6.

Program losuje 5 liczb calkowitych z przedzialu od 0 do 99,a nastepnie znajduje najmniejsza i najwiekszaoraz oblicza srednia ze wszystkich wylosowanych liczb.

Wylosowano liczby: 22, 57, 77, 29, 16.Najwieksza liczba to 77.Najmniejsza liczba to 16.Srednia wynosi 40.20.

Rysunek 3.6. Efekt działania programu Zadanie 3.16

Z A D A N I E

3.17 Napisz program, który za pomocą instrukcji repeat ... untilznajduje największą i najmniejszą liczbę ze zbioru n całkowi-tych liczb losowych (w programie ilosc_liczb = 5) z prze-działu od 0 do 99 oraz oblicza średnią ze zbioru wszystkichwylosowanych liczb.

Przykładowe rozwiązanie — listing 3.17

program Project1; // Zadanie 3.17

{$APPTYPE CONSOLE}

uses SysUtils;

const ilosc_liczb = 5;

helion kopia dla: Iwona Kruszynska [email protected]

Page 48: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

48 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

var i, liczba, suma, min, max : Integer;

begin Writeln('Program losuje ', ilosc_liczb, ' liczb calkowitych z przedzialu od 0 do 99,'); Writeln('a nastepnie znajduje najmniejsza i najwieksza'); Writeln('oraz oblicza srednia ze wszystkich wylosowanych liczb.'); suma := 0; i := 0;

Randomize(); min := Random(100); Writeln; Write('Wylosowano liczby: '); Write(min,', '); max := min; suma := suma+max;

repeat begin liczba := Random(100); if i < ilosc_liczb-2 then Write(liczba, ', ') else Write(liczba, '.'); if max < liczba then max:= liczba; if liczba < min then min := liczba; suma := suma+liczba; i := i+1; end; until (i = ilosc_liczb-1);

Writeln; Writeln('Najwieksza liczba to ', max, '.'); Writeln('Najmniejsza liczba to ', min, '.'); Writeln('Srednia wynosi ', suma/ilosc_liczb:4:2, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

helion kopia dla: Iwona Kruszynska [email protected]

Page 49: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 49

Z A D A N I E

3.18 Napisz program, który za pomocą instrukcji while ... doznajduje największą i najmniejszą liczbę ze zbioru n całkowi-tych liczb losowych (w programie ilosc_liczb = 5) z prze-działu od 0 do 99 oraz oblicza średnią ze zbioru wszystkichwylosowanych liczb.

Przykładowe rozwiązanie — listing 3.18

program Project1; // Zadanie 3.18

{$APPTYPE CONSOLE}

uses SysUtils;

const ilosc_liczb = 5;

var i, liczba, suma, min, max : Integer;

begin Writeln('Program losuje ', ilosc_liczb, ' liczb calkowitych z przedzialu od 0 do 99,'); Writeln('a nastepnie znajduje najmniejsza i najwieksza'); Writeln('oraz oblicza srednia ze wszystkich wylosowanych liczb.'); suma := 0; i := 1;

Randomize(); min := Random(100); Writeln; Write('Wylosowano liczby: '); Write(min, ', '); max := min; suma := suma+max;

while (i <= ilosc_liczb-1) do begin liczba:= Random(100); if i < ilosc_liczb-1 then Write(liczba, ', ') else Write(liczba, '.'); if max < liczba then max := liczba; if liczba < min then

helion kopia dla: Iwona Kruszynska [email protected]

Page 50: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

50 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

min := liczba; suma := suma+liczba; i := i+1; end;

Writeln; Writeln('Najwieksza liczba to ', max, '.'); Writeln('Najmniejsza liczba to ', min, '.'); Writeln('Srednia wynosi ', suma/ilosc_liczb:4:2, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

3.19 Napisz program wyświetlający tabliczkę mnożenia dla liczbod 1 do 100 z wykorzystaniem podwójnej pętli for.

Przykładowe rozwiązanie — listing 3.19

program Project1; // Zadanie 3.19

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 10;

var wiersze, kolumny : Integer;

begin Writeln('Program wyswietla tabliczke mnozenia dla liczb od 1 do 100.'); Writeln;

for wiersze := 1 to n do begin for kolumny := 1 to n do begin Write(wiersze*kolumny, #9); end; Writeln; end;

Readln; // czeka na nacisniecie klawisza Enterend.

helion kopia dla: Iwona Kruszynska [email protected]

Page 51: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 51

Rezultat działania programu można zobaczyć na rysunku 3.7.

Program wyswietla tabliczke mnozenia dla liczb od 1 do 100.

1 2 3 4 5 6 7 8 9 10

2 4 6 8 10 12 14 16 18 20

3 6 9 12 15 18 21 24 27 30

4 8 12 16 20 24 28 32 36 40

5 10 15 20 25 30 35 40 45 50

6 12 18 24 30 36 42 48 54 60

7 14 21 28 35 42 49 56 63 70

8 16 24 32 40 48 56 64 72 80

9 18 27 36 45 54 63 72 81 90

10 20 30 40 50 60 70 80 90 100

Rysunek 3.7. Efekt działania programu Zadanie 3.19

Z A D A N I E

3.20 Napisz program wyświetlający tabliczkę mnożenia dla liczbod 1 do 100 z wykorzystaniem podwójnej pętli repeat ... until.

Przykładowe rozwiązanie — listing 3.20

program Project1; // Zadanie 3.20

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 10;

helion kopia dla: Iwona Kruszynska [email protected]

Page 52: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

52 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

var wiersze, kolumny : Integer;

begin Writeln('Program wyswietla tabliczke mnozenia dla liczb od 1 do 100.'); Writeln; wiersze := 1;

repeat kolumny := 1; repeat Write(wiersze*kolumny, #9); kolumny := kolumny+1; until (kolumny > n); Writeln; wiersze := wiersze+1; until (wiersze > n);

Readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

3.21 Napisz program wyświetlający tabliczkę mnożenia dla liczbod 1 do 100 z wykorzystaniem podwójnej pętli while ... do.

Przykładowe rozwiązanie — listing 3.21

program Project1; // Zadanie 3.21

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 10;

var wiersze, kolumny : Integer;

begin Writeln('Program wyswietla tabliczke mnozenia dla liczb od 1 do 100.'); Writeln; wiersze := 1;

while (wiersze <= n) do begin kolumny := 1;

helion kopia dla: Iwona Kruszynska [email protected]

Page 53: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 53

while (kolumny <= n) do begin Write(wiersze*kolumny, #9); kolumny := kolumny+1; end; Writeln; wiersze := wiersze+1; end; Readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

3.22 Napisz program, który wyświetla duże litery alfabetu od A doZ i od Z do A z wykorzystaniem pętli for.

Przykładowe rozwiązanie — listing 3.22

program Project1; // Zadanie 3.22

{$APPTYPE CONSOLE}

uses SysUtils;

var znak : char;

begin Writeln('Program wyswietla duze litery alfabetu od A do Z i od Z do A.'); Writeln;

for znak := 'A' to 'Z' do if znak < 'Z' then Write(znak, ', ') else Write(znak, '.');

Writeln;

for znak := 'Z' downto 'A' do if znak >= 'B' then Write(znak, ', ') else Write(znak, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

helion kopia dla: Iwona Kruszynska [email protected]

Page 54: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

54 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Rezultat działania programu można zobaczyć na rysunku 3.8.

Program wyswietla duze litery alfabetu od A do Z i od Z do A.

A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V,W, X, Y, Z.Z, Y, X, W, V, U, T, S, R, Q, P, O, N, M, L, K, J, I, H, G, F, E, D,C, B, A.

Rysunek 3.8. Efekt działania programu Zadanie 3.22

Z A D A N I E

3.23 Napisz program, który wyświetla duże litery alfabetu od A doZ i od Z do A z wykorzystaniem pętli repeat ... until.

Przykładowe rozwiązanie — listing 3.23

program Project1; // Zadanie 3.23

{$APPTYPE CONSOLE}

uses SysUtils;

var znak : char;

begin Writeln('Program wyswietla duze litery alfabetu od A do Z i od Z do A.'); Writeln; znak := 'A'; Write(znak, ', ');

repeat znak := succ(znak); if znak < 'Z' then Write(znak, ', ') else Write(znak, '.'); until znak = 'Z';

Writeln;

znak := 'Z'; Write(znak, ', ');

helion kopia dla: Iwona Kruszynska [email protected]

Page 55: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 3 . • I t e r a c j e 55

repeat znak := pred(znak); if znak >= 'B' then Write(znak, ', ') else Write(znak, '.'); until znak = 'A';

Readln; // czeka na nacisniecie klawisza Enterend.

W programie skorzystaliśmy z dwóch standardowych funkcji: succ() —następnik (ang. successor), i pred() — poprzednik (ang. predecessor),gdzie

succ('A') = 'B'pred('Z') = 'Y'

Z A D A N I E

3.24 Napisz program, który wyświetla duże litery alfabetu od A doZ i od Z do A z wykorzystaniem pętli while ... do.

Przykładowe rozwiązanie — listing 3.24

program Project1; // Zadanie 3.24

{$APPTYPE CONSOLE}

uses SysUtils;

var znak : char;

begin Writeln('Program wyswietla duze litery alfabetu od A do Z i od Z do A.'); Writeln; znak := 'A'; Write(znak, ', ');

while znak < 'Z' do begin znak := succ(znak); if znak < 'Z' then Write(znak, ', ') else Write(znak, '.'); end;

helion kopia dla: Iwona Kruszynska [email protected]

Page 56: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

56 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Writeln;

znak := 'Z'; Write(znak, ', ');

while znak > 'A' do begin znak := pred(znak); if znak >= 'B' then Write(znak, ', ') else Write(znak, '.'); end;

Readln; // czeka na nacisniecie klawisza Enterend.

helion kopia dla: Iwona Kruszynska [email protected]

Page 57: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

4Tablice

W tym rozdziale przedstawimy typowe zadania wraz z rozwiązaniamiz wykorzystaniem tablic jedno- i dwuwymiarowych.

Tablica jest strukturą danych, która umożliwia przechowywanie w spo-sób zorganizowany wielu zmiennych tego samego typu (całkowitego,rzeczywistego itd.). Aby utworzyć taką strukturę, musimy dokonaćdeklaracji tablicy. W deklaracji tej określamy typ wartości, jaki maprzechowywać tablica, a także liczbę jej elementów. Tablice mogąbyć jednowymiarowe, dwuwymiarowe itd.

Tablice jednowymiaroweOto przykład zadeklarowania w języku Turbo Pascal tablicy jedno-wymiarowej:

type identyfikator_tablicy = array[rozmiar_tablicy] of typ

A to deklaracja związanej z nią zmiennej nazwa_zmiennej:

var nazwa_zmiennej : identyfikator_tablicy;

helion kopia dla: Iwona Kruszynska [email protected]

Page 58: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

58 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Przykład poniżej ilustruje deklarację tablicy jednowymiarowej typucałkowitego o nazwie tablica zawierającej 10 elementów.

type tablica = array[1..10] of integer;

Związana z nią zmienna o nazwie dane jest deklarowana następująco:

var dane : tablica;

Możliwy jest również inny poprawny zapis:

var dane : array[1..10] of integer;

Dostęp do elementów tablicy jest realizowany za pośrednictwem in-deksu, który wskazuje dany element. Dla deklaracji tablicy w językuTurbo Pascal w postaci

var dane : array[1..10] of integer;

pierwszy element tablicy dane ma indeks 1, drugi dostępny jest przezindeks 2 itd. Ostatni element tablicy ma indeks równy jej wymiarowi,czyli 10, co przedstawiono w reprezentacji graficznej poniżej.

1 2 3 4 5 6 7 8 9 10

Z A D A N I E

4.1 Napisz program, który w 10-elementowej tablicy jednowy-miarowej o nazwie dane umieszcza liczby od 1 do 10 (na na-stępnej stronie zobacz jej reprezentację graficzną).

Przykładowe rozwiązanie — listing 4.1

program Project1; // Zadanie 4.1

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 10;

helion kopia dla: Iwona Kruszynska [email protected]

Page 59: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 4 . • T a b l i c e 59

Inde

ks ta

blic

y

War

tość

tabl

icy

1 1

2 2

3 3

4 4

5 5

6 6

7 7

8 8

9 9

10 10

type tablica = array[1..n] of integer;

var i : integer; dane : tablica;

begin for i := 1 to n do begin dane[i] := i; Writeln('dane[',i,'] = ',dane[i]); end;

Readln; // czeka na nacisniecie klawisza Enterend.

Rezultat działania programu można zobaczyć na rysunku 4.1.

helion kopia dla: Iwona Kruszynska [email protected]

Page 60: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

60 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

dane[1] = 1dane[2] = 2dane[3] = 3dane[4] = 4dane[5] = 5dane[6] = 6dane[7] = 7dane[8] = 8dane[9] = 9dane[10] = 10

Rysunek 4.1. Efekt działania programu Zadanie 4.1

Z A D A N I E

4.2 Napisz program, który w 10-elementowej tablicy jednowy-miarowej o nazwie dane umieszcza liczby od 10 do 1 (zobaczponiżej jej reprezentację graficzną).

Inde

ks ta

blic

y

War

tość

tabl

icy

1 10

2 9

3 8

4 7

5 6

6 5

7 4

8 3

9 2

10 1

helion kopia dla: Iwona Kruszynska [email protected]

Page 61: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 4 . • T a b l i c e 61

WskazówkaZadanie to rozwiążemy poprawnie, zamieniając linijkę kodu

dane[i] := i;

w zadaniu 4.1 na następującą:

dane[i] := n-i+1;

Przykładowe rozwiązanie — listing 4.2

program Project1; // Zadanie 4.2

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 10;

type tablica = array[1..n] of integer;

var i : integer; dane : tablica;

begin for i := 1 to n do begin dane[i] := n-i+1; Writeln('dane[',i,'] = ',dane[i]); end;

Readln; // czeka na nacisniecie klawisza Enterend.

Rezultat działania programu można zobaczyć na rysunku 4.2.

Tablice dwuwymiaroweOgólna postać deklaracji tablicy dwuwymiarowej w języku TurboPascal jest następująca:

helion kopia dla: Iwona Kruszynska [email protected]

Page 62: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

62 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

dane[1] = 10dane[2] = 9dane[3] = 8dane[4] = 7dane[5] = 6dane[6] = 5dane[7] = 4dane[8] = 3dane[9] = 2dane[10] = 1

Rysunek 4.2. Efekt działania programu Zadanie 4.2

type identyfikator_tablicy = array[rozmiar_tablicy, rozmiar_tablicy] oftyp

Związaną z nią zmienną deklarujemy tak:

var nazwa_zmiennej : identyfikator_tablicy;

A oto przykład zadeklarowania tablicy dwuwymiarowej typu całko-witego o nazwie tablica zawierającej 10×10 elementów:

type tablica = array[1..10, 1..10] of integer;

Deklaracja związanej z nią zmiennej dane jest następująca:

var dane : tablica;

Możliwy jest również inny poprawny zapis:

var dane : array[1..10, 1..10] of integer;

Dostęp do elementów tablicy jest realizowany za pośrednictwem dwóchindeksów, które wskazują dany element. Dla deklaracji w języku TurboPascal w postaci

var dane : array[1..10, 1..10] of integer;

tablicę dwuwymiarową, jako produkt o wymiarze 10×10, możemysobie wyobrazić np. następująco:

helion kopia dla: Iwona Kruszynska [email protected]

Page 63: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 4 . • T a b l i c e 63

1 2 0 0 0 0 0 0 0 0

3 1 0 0 0 0 0 0 0 0

0 0 1 0 0 0 0 0 0 0

0 0 0 1 0 0 0 0 0 0

0 0 0 0 1 0 0 0 0 0

0 0 0 0 0 1 0 0 0 0

0 0 0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 1 0 0

0 0 0 0 0 0 0 0 1 0

0 0 0 0 0 0 0 0 0 7

Wartości liczbowe możemy wpisywać do tablicy wierszami lub ko-lumnami. Pierwszy element tablicy dane[1,1] jest równy 1, elementdane[1,2] to 2, element dane[2,1] wynosi 3 itd. Ostatni element tabli-cy ma indeks równy jej wymiarowi, czyli 10, i w naszym przypadkudane[10,10]:=7.

Z A D A N I E

4.3 Napisz program, który w zadeklarowanej tablicy dwuwymia-rowej 10×10 o nazwie tablica umieszcza na przekątnej cyfry 1,a poza przekątną 0. Program dodatkowo powinien obliczaćsumę elementów wyróżnionych, tj. znajdujących się na prze-kątnej tablicy.

1 0 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

0 0 1 0 0 0 0 0 0 0

0 0 0 1 0 0 0 0 0 0

0 0 0 0 1 0 0 0 0 0

0 0 0 0 0 1 0 0 0 0

0 0 0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 1 0 0

0 0 0 0 0 0 0 0 1 0

0 0 0 0 0 0 0 0 0 1

helion kopia dla: Iwona Kruszynska [email protected]

Page 64: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

64 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Przykładowe rozwiązanie — listing 4.3

program Project1; // Zadanie 4.3

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 10;

type macierz = array[1..n, 1..n] of integer;

var i, j, suma : integer; tablica : macierz;

begin {wpisywanie do tablicy liczby 1 na przekatnej, a 0 poza nia} for i := 1 to n do begin for j := 1 to n do begin if i = j then tablica[i,j] := 1 else tablica[i,j] := 0 end; {j} end; {i} {koniec wpisywania}

{wyswietlanie zawartosci tablicy} for i := 1 to n do begin for j := 1 to n do begin Write(tablica[i,j],' '); end; {j} writeln; end; {i} {koniec wyswietlania tablicy}

{obliczanie sumy elementow znajdujacych sie na przekatnej tablicy} suma := 0; for i := 1 to n do suma := suma+tablica[i,i]; Writeln; Writeln('Suma wyroznionych w zadaniu elementow wynosi ', suma, '.');

Readln; // czeka na nacisniecie klawisza Enter

helion kopia dla: Iwona Kruszynska [email protected]

Page 65: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 4 . • T a b l i c e 65

end.

Do wpisywania danych do tablicy użyliśmy dwóch pętli for:

for i := 1 to n do begin for j := 1 to n do begin …………. end; {j} end; {i}

Następujące linijki kodu instrukcji warunkowej if:

if i = j then tablica[i,j] := 1else tablica[i,j] := 0

odpowiadają za wpisywanie liczby 1 na przekątnej tablicy, a 0 poza nią.

Całość kodu wpisującego do tablicy liczby 1 na przekątnej, a 0 pozaprzekątną znajduje się poniżej.

begin for i := 1 to n do begin for j := 1 to n do begin if i = j then tablica[i,j] := 1 else tablica[i,j] := 0 end; {j} end; {i}

Za wyświetlenie zawartości tablicy na ekranie komputera odpowia-dają następujące linijki kodu:

for i := 1 to n do begin for j := 1 to n do begin Write(tablica[i,j],' '); end; {j} writeln; end; {i}

Obliczanie sumy elementów znajdujących się na przekątnej odbywasię w linijkach kodu przedstawionych poniżej.

helion kopia dla: Iwona Kruszynska [email protected]

Page 66: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

66 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

for i := 1 to n do suma := suma+tablica[i,i];

Oczywiście zmienną suma trzeba wcześniej wyzerować.

suma := 0;

Rezultat działania programu można zobaczyć na rysunku 4.3.

1 0 0 0 0 0 0 0 0 00 1 0 0 0 0 0 0 0 00 0 1 0 0 0 0 0 0 00 0 0 1 0 0 0 0 0 00 0 0 0 1 0 0 0 0 00 0 0 0 0 1 0 0 0 00 0 0 0 0 0 1 0 0 00 0 0 0 0 0 0 1 0 00 0 0 0 0 0 0 0 1 00 0 0 0 0 0 0 0 0 1

Suma wyroznionych w zadaniu elementow wynosi 10.

Rysunek 4.3. Efekt działania programu Zadanie 4.3

Z A D A N I E

4.4 Napisz program, który w zadeklarowanej tablicy dwuwymia-rowej 10×10 o nazwie tablica umieszcza na przekątnej cyfryod 1 do 10, a poza nią 0. Program dodatkowo powinien obli-czać sumę elementów wyróżnionych, tj. znajdujących się naprzekątnej tablicy.

1 0 0 0 0 0 0 0 0 0

0 2 0 0 0 0 0 0 0 0

0 0 3 0 0 0 0 0 0 0

0 0 0 4 0 0 0 0 0 0

0 0 0 0 5 0 0 0 0 0

0 0 0 0 0 6 0 0 0 0

0 0 0 0 0 0 7 0 0 0

0 0 0 0 0 0 0 8 0 0

helion kopia dla: Iwona Kruszynska [email protected]

Page 67: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 4 . • T a b l i c e 67

0 0 0 0 0 0 0 0 9 0

0 0 0 0 0 0 0 0 0 10

WskazówkaZadanie to rozwiążemy poprawnie, zamieniając w zadaniu 4.3 linijkękodu

tablica[i,j] := 1

na następującą:

tablica[i,j] := i

Przykładowe rozwiązanie — listing 4.4

program Project1; // Zadanie 4.4

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 10;

type macierz = array[1..n, 1..n] of integer;

var i, j, suma : integer; tablica : macierz;

begin{wpisywanie do tablicy liczb od 1 do 10 na przekatnej, a 0 poza nia} for i := 1 to n do begin for j := 1 to n do begin if i = j then tablica[i,j] := i else tablica[i,j] := 0 end; {j} end; {i} {koniec wpisywania}

{wyswietlanie zawartosci tablicy} for i := 1 to n do begin for j := 1 to n do begin

helion kopia dla: Iwona Kruszynska [email protected]

Page 68: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

68 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Write(tablica[i,j],' '); end; {j} writeln; end; {i}{koniec wyswietlania tablicy}

{obliczanie sumy elementow znajdujacych sie na przekatnej tablicy} suma := 0;

for i := 1 to n do suma := suma+tablica[i,i]; Writeln; Writeln('Suma wyroznionych w zadaniu elementow wynosi ',suma, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Rezultat działania programu można zobaczyć na rysunku 4.4.

1 0 0 0 0 0 0 0 0 00 2 0 0 0 0 0 0 0 00 0 3 0 0 0 0 0 0 00 0 0 4 0 0 0 0 0 00 0 0 0 5 0 0 0 0 00 0 0 0 0 6 0 0 0 00 0 0 0 0 0 7 0 0 00 0 0 0 0 0 0 8 0 00 0 0 0 0 0 0 0 9 00 0 0 0 0 0 0 0 0 10

Suma wyroznionych w zadaniu elementow wynosi 55.

Rysunek 4.4. Efekt działania programu Zadanie 4.4

Z A D A N I E

4.5 Napisz program, który w zadeklarowanej tablicy dwuwymia-rowej 10×10 o nazwie tablica umieszcza cyfry 1 i 0 w sposóbpodany w reprezentacji graficznej poniżej. Program dodatkowopowinien obliczać sumę wyróżnionych w tablicy elementów.

helion kopia dla: Iwona Kruszynska [email protected]

Page 69: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 4 . • T a b l i c e 69

0 0 0 0 0 0 0 0 0 1

0 0 0 0 0 0 0 0 1 0

0 0 0 0 0 0 0 1 0 0

0 0 0 0 0 0 1 0 0 0

0 0 0 0 0 1 0 0 0 0

0 0 0 0 1 0 0 0 0 0

0 0 0 1 0 0 0 0 0 0

0 0 1 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

1 0 0 0 0 0 0 0 0 0

WskazówkaZadanie to rozwiążemy poprawnie, zmieniając w zadaniu 4.3 linijki kodu

if i = j then tablica[i,j] := ielse tablica[i,j] := 0

na linijki znajdujące się poniżej.

if n = i+j-1 then tablica[i,j] := 1else tablica[i,j] := 0;

Sumę wyróżnionych elementów obliczymy, zastępując linijki kodu

for i := 1 to n do suma := suma+tablica[i,i];

z zadania 4.3 następującymi:

for i := 1 to n do suma := suma+tablica[i,n-i+1]; .

Przykładowe rozwiązanie — listing 4.5

program Project1; // Zadanie 4.5

{$APPTYPE CONSOLE}

uses SysUtils;

helion kopia dla: Iwona Kruszynska [email protected]

Page 70: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

70 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

const n = 10;

type macierz = array[1..n, 1..n] of integer;

var i, j, suma : integer; tablica : macierz;

begin{wpisywanie liczb do tablicy} for i := 1 to n do begin for j := 1 to n do begin if n = i+j-1 then tablica[i,j] := 1 else tablica[i,j] := 0; end; {j} end; {i} {koniec wpisywania}

{wyswietlanie zawartosci tablicy} for i := 1 to n do begin for j := 1 to n do begin Write(tablica[i,j],' '); end; {j} writeln; end; {i} {koniec wyswietlania tablicy}

{obliczanie sumy wyroznionych elementow} suma := 0; Writeln;

for i := 1 to n do suma := suma+tablica[i,n-i+1];

Writeln('Suma wyroznionych w zadaniu elementow wynosi ',suma, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

helion kopia dla: Iwona Kruszynska [email protected]

Page 71: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 4 . • T a b l i c e 71

Rezultat działania programu można zobaczyć na rysunku 4.5.

0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 1 00 0 0 0 0 0 0 1 0 00 0 0 0 0 0 1 0 0 00 0 0 0 0 1 0 0 0 00 0 0 0 1 0 0 0 0 00 0 0 1 0 0 0 0 0 00 0 1 0 0 0 0 0 0 00 1 0 0 0 0 0 0 0 01 0 0 0 0 0 0 0 0 0

Suma wyroznionych w zadaniu elementow wynosi 10.

Rysunek 4.5. Efekt działania programu Zadanie 4.5

Z A D A N I E

4.6 Napisz program, który w zadeklarowanej tablicy dwuwymia-rowej 10×10 o nazwie tablica umieszcza cyfry od 1 do 10 i 0(interpretacja graficzna tej tablicy poniżej). Program dodat-kowo powinien obliczać sumę wyróżnionych elementów.

0 0 0 0 0 0 0 0 0 1

0 0 0 0 0 0 0 0 2 0

0 0 0 0 0 0 0 3 0 0

0 0 0 0 0 0 4 0 0 0

0 0 0 0 0 5 0 0 0 0

0 0 0 0 6 0 0 0 0 0

0 0 0 7 0 0 0 0 0 0

0 0 8 0 0 0 0 0 0 0

0 9 0 0 0 0 0 0 0 0

10 0 0 0 0 0 0 0 0 0

helion kopia dla: Iwona Kruszynska [email protected]

Page 72: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

72 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

WskazówkaZadanie to rozwiążemy poprawnie, zamieniając następujące linijki koduw zadaniu 4.5:

if n = i+j-1 then tablica[i,j] := 1else tablica[i,j] := 0;

na linijki przedstawione poniżej.

if n = i+j-1 then tablica[i,j] := ielse tablica[i,j] := 0;

Przykładowe rozwiązanie — listing 4.6

program Project1; // Zadanie 4.6

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 10;

type macierz = array[1..n, 1..n] of integer;

var i, j, suma : integer; tablica : macierz;

begin {wpisywanie liczb do tablicy} for i := 1 to n do begin for j := 1 to n do begin if n = i+j-1 then tablica[i,j] := i else tablica[i,j] := 0; end; {j} end; {i} {koniec wpisywania}

{wyswietlanie zawartosci tablicy}

helion kopia dla: Iwona Kruszynska [email protected]

Page 73: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 4 . • T a b l i c e 73

for i := 1 to n do begin for j := 1 to n do begin Write(tablica[i,j]:2,' '); end; {j} writeln; end; {i} {koniec wyswietlania tablicy}

{obliczanie sumy wyroznionych elementow} suma := 0; Writeln;

for i := 1 to n do suma := suma+tablica[i,n-i+1];

Writeln('Suma wyroznionych w zadaniu elementow wynosi ',suma, '.');

Readln; // czeka na nacisniecie klawisza Enterend.

Rezultat działania programu można zobaczyć na rysunku 4.6.

0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 010 0 0 0 0 0 0 0 0 0

Suma wyroznionych w zadaniu elementow wynosi 55.

Rysunek 4.6. Efekt działania programu Zadanie 4.6

helion kopia dla: Iwona Kruszynska [email protected]

Page 74: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

74 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Z A D A N I E

4.7 Napisz program, który w zadeklarowanej tablicy dwuwymia-rowej 10×10 o nazwie tablica umieszcza w pierwszej ko-lumnie liczby od 1 do 10, w drugiej kwadraty tych liczb, na-tomiast w pozostałych kolumnach 0 (interpretacja graficznatablicy poniżej). Dodatkowo program powinien obliczać su-mę liczb znajdujących się w pierwszej kolumnie oraz sumęliczb z kolumny drugiej.

1 1 0 0 0 0 0 0 0 0

2 4 0 0 0 0 0 0 0 0

3 9 0 0 0 0 0 0 0 0

4 16 0 0 0 0 0 0 0 0

5 25 0 0 0 0 0 0 0 0

6 36 0 0 0 0 0 0 0 0

7 49 0 0 0 0 0 0 0 0

8 64 0 0 0 0 0 0 0 0

9 81 0 0 0 0 0 0 0 0

10 100 0 0 0 0 0 0 0 0

Przykładowe rozwiązanie — listing 4.7

program Project1; // Zadanie 4.7

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 10;

type macierz = array[1..n, 1..n] of integer;

var i, j, suma : integer; tablica : macierz;

begin {wpisywanie liczb do tablicy} for i := 1 to n do

helion kopia dla: Iwona Kruszynska [email protected]

Page 75: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 4 . • T a b l i c e 75

begin for j := 1 to n do begin if j = 1 then tablica[i,j] := i; if j = 2 then tablica[i,j] := i*i; if j > 2 then tablica[i,j] := 0; end; {j} end; {i} {koniec wpisywania}

{wyswietlanie zawartosci tablicy} for i := 1 to n do begin for j := 1 to n do begin Write(tablica[i,j]:3,' '); end; {j} writeln; end; {i} {koniec wyswietlania tablicy}

suma := 0; for i := 1 to 10 do suma := suma+tablica[i,1];

Writeln; Writeln('Suma liczb znajdujacych sie w pierwszej kolumnie wynosi ', suma,'.');

suma := 0; for i := 1 to 10 do suma := suma+tablica[i,2];

Writeln; Writeln('Suma liczb znajdujacych sie w drugiej kolumnie wynosi ', suma,'.');

Readln; // czeka na nacisniecie klawisza Enterend.

Następujące linijki kodu:

for i := 1 to n do begin for j := 1 to n do begin if j = 1 then tablica[i,j] := i; if j = 2 then tablica[i,j] := i*i; if j > 2 then tablica[i,j] := 0; end; {j} end; {i}

helion kopia dla: Iwona Kruszynska [email protected]

Page 76: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

76 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

są odpowiedzialne za wpisywanie liczb do tablicy. Do pierwszej ko-lumny wpisują one liczby od 1 do 10.

if j = 1 then tablica[i,j] := i;

W drugiej kolumnie umieszczają kwadraty tych liczb.

if j = 2 then tablica[i,j] := i*i;

Do pozostałych kolumn wpisywana jest liczba 0.

if j > 2 then tablica[i,j] := 0;

Za sumowanie liczb znajdujących się w pierwszej kolumnie odpo-wiedzialne są następujące linijki kodu:

for i := 1 to 10 do suma := suma+tablica[i,1];

Sumowaniem liczb z drugiej kolumny zajmują się poniższe linijki.

for i := 1 to 10 do suma := suma+tablica[i,2];

Rezultat działania programu można zobaczyć na rysunku 4.7.

1 1 0 0 0 0 0 0 0 0 2 4 0 0 0 0 0 0 0 0 3 9 0 0 0 0 0 0 0 0 4 16 0 0 0 0 0 0 0 0 5 25 0 0 0 0 0 0 0 0 6 36 0 0 0 0 0 0 0 0 7 49 0 0 0 0 0 0 0 0 8 64 0 0 0 0 0 0 0 0 9 81 0 0 0 0 0 0 0 0 10 100 0 0 0 0 0 0 0 0

Suma liczb znajdujacych sie w pierwszej kolumnie wynosi 55.

Suma liczb znajdujacych sie w drugiej kolumnie wynosi 385.

Rysunek 4.7. Efekt działania programu Zadanie 4.7

helion kopia dla: Iwona Kruszynska [email protected]

Page 77: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 4 . • T a b l i c e 77

Z A D A N I E

4.8 Dane są dwie tablice dwuwymiarowe 10×10 o nazwach a i b.Tablica a zawiera elementy przedstawione poniżej.

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

Tablica b zawiera same zera. Napisz program, który przepisuje za-wartość tablicy a do tablicy b, zamieniając kolumny na wiersze (in-terpretacja graficzna wyniku poniżej).

1 1 1 1 1 1 1 1 1 1

2 2 2 2 2 2 2 2 2 2

3 3 3 3 3 3 3 3 3 3

4 4 4 4 4 4 4 4 4 4

5 5 5 5 5 5 5 5 5 5

6 6 6 6 6 6 6 6 6 6

7 7 7 7 7 7 7 7 7 7

8 8 8 8 8 8 8 8 8 8

9 9 9 9 9 9 9 9 9 9

10 10 10 10 10 10 10 10 10 10

Przykładowe rozwiązanie — listing 4.8

program Project1; // Zadanie 4.8

{$APPTYPE CONSOLE}

uses SysUtils;

helion kopia dla: Iwona Kruszynska [email protected]

Page 78: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

78 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

const n = 10;

type macierz = array[1..n, 1..n] of integer;

var i, j : integer; a, b : macierz;begin {wpisywanie liczb do tablicy a} for i := 1 to n do begin for j := 1 to n do begin a[i,j] := j; end; {j} end; {i} {koniec wpisywania}

{przepisywanie liczb do tablicy b} for i := 1 to n do begin for j := 1 to n do begin b[i,j] := a[j,i]; // zamiana kolumn na wiersze end; {j} end; {i} {koniec przepisywania}

Writeln('Wyswietlenie tablicy a:');

{wyswietlanie zawartosci tablicy a} for i := 1 to n do begin for j := 1 to n do begin Write(a[i,j]:2,' '); end; {j} writeln; end; {i} {koniec wyswietlania tablicy a}

Writeln; Writeln('Wyswietlenie tablicy b:');

{wyswietlanie zawartosci tablicy b} for i := 1 to n do begin for j := 1 to n do begin Write(b[i,j]:2,' ');

helion kopia dla: Iwona Kruszynska [email protected]

Page 79: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 4 . • T a b l i c e 79

end; {j} writeln; end; {i} {koniec wyswietlania tablicy b}

Readln; // czeka na nacisniecie dowolnego klawiszaend.

Następująca linijka kodu:

b[i,j] := a[j,i];

jest odpowiedzialna za zamianę kolumn na wiersze.

Rezultat działania programu można zobaczyć na rysunku 4.8.

Wyswietlenie tablicy a: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10

Wyswietlenie tablicy b: 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 910 10 10 10 10 10 10 10 10 10

Rysunek 4.8. Efekt działania programu Zadanie 4.8

helion kopia dla: Iwona Kruszynska [email protected]

Page 80: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

80 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

helion kopia dla: Iwona Kruszynska [email protected]

Page 81: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

5Podprogramy

W tym rozdziale przedstawimy typowe zadania wraz z przykładowy-mi rozwiązaniami z użyciem podprogramów. Nabycie umiejętnościwykorzystywania ich w pisanych programach zwykle owocuje szybkimprzyswojeniem zasad programowania obiektowego.

Język Turbo Pascal umożliwia podział większego programu na kilkamniejszych zwanych podprogramami. Komunikacja pomiędzy podpro-gramami a pozostałą częścią programu odbywa się w ściśle określonysposób. Do tego celu wykorzystywane są stałe globalne bądź zmiennezadeklarowane w programie głównym lub parametry, w definicjipodprogramu nazywane parametrami formalnymi, a przy jego wy-wołaniu parametrami aktualnymi. W języku Turbo Pascal wystę-pują dwa rodzaje podprogramów: procedury i funkcje. Wybór spo-sobu przekazywania danych do podprogramu zależy od konkretnejsytuacji.

ProceduryOgólna postać procedury jest następująca:

procedure nazwa (lista parametrów formalnych);........................ // deklaracja stałych, zmiennych i typów............begin

helion kopia dla: Iwona Kruszynska [email protected]

Page 82: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

82 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

............

............ // treść procedury

............end;

Występująca po nazwie procedury lista parametrów formalnych jestopcjonalna. Procedurę wywołuje się w programie głównym, podającjej nazwę wraz z listą parametrów aktualnych (o ile takie istnieją).

Z A D A N I E

5.1 Napisz program, który oblicza pole prostokąta. Program powi-nien zawierać jeden podprogram: bezparametrową procedurępole_prostokata(), w której zawarty będzie algorytm oblicza-nia pola. Wartości boków a i b wprowadzamy z klawiatury.W programie należy założyć, że zmienne a i b oraz pole są typuReal (rzeczywistego) i są zmiennymi globalnymi. Należy dlanich przyjąć format wyświetlania ich na ekranie w polu czte-roznakowym z dwoma miejscami po kropce.

Przykładowe rozwiązanie — listing 5.1

program Project1; // Zadanie 5.1

{$APPTYPE CONSOLE}

uses SysUtils;

var a, b, pole: Real; // deklaracja zmiennych globalnych

procedure pole_prostokata(); // deklaracja i definicja procedury begin Writeln('Program oblicza pole prostokata.'); Writeln('Podaj bok a.'); Readln(a); Writeln('Podaj bok b.'); Readln(b); pole := a*b; Writeln('Pole prostokata o boku a = ', a:4:2, ' i boku b = ', b:4:2); Writeln('wynosi ', pole:4:2, '.'); end;

begin pole_prostokata(); // wywolanie procedury (podprogramu) w programie glownym

Readln; // czeka na nacisniecie klawisza Enterend.

helion kopia dla: Iwona Kruszynska [email protected]

Page 83: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 5 . • P o d p r o g r a m y 83

Zdefiniowane tu zmienne

var a, b, pole: Real;

są zmiennymi globalnymi, czyli są one widoczne w całym programiei w podprogramie.

Procedura pole_prostokata() zawiera algorytm obliczający pole pro-stokąta.

procedure pole_prostokata(); // deklaracja i definicja procedury begin Writeln('Program oblicza pole prostokata.'); Writeln('Podaj bok a.'); Readln(a); Writeln('Podaj bok b.'); Readln(b); pole := a*b; Writeln('Pole prostokata o boku a = ', a:4:2, ' i boku b = ', b:4:2); Writeln('wynosi ', pole:4:2, '.'); end;

Procedura ta wywołana zostaje w programie głównym.

begin pole_prostokata(); // wywolanie procedury (podprogramu) w programie glownym ....end.

Wywołanie procedury pole_prostokata() realizuje algorytm obliczającypole figury, który został w niej zamieszczony.

Rezultat działania programu można zobaczyć na rysunku 5.1.

Program oblicza pole prostokata.Podaj bok a.2.22Podaj bok b.3.33Pole prostokata o boku a = 2.22 i boku b = 3.33wynosi 7.39.

Rysunek 5.1. Efekt działania programu Zadanie 5.1

helion kopia dla: Iwona Kruszynska [email protected]

Page 84: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

84 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Z A D A N I E

5.2 Napisz program, który oblicza pole prostokąta. Powinien onzawierać jeden podprogram: bezparametrową procedurę pole_prostokata(), w której zawarty będzie algorytm obliczania

pola. Wartości boków a i b wprowadzamy z klawiatury. W pro-gramie należy założyć, że zmienne a i b oraz pole są typu Real(rzeczywistego) i są zmiennymi lokalnymi. Należy dla nichprzyjąć format wyświetlania ich na ekranie w polu cztero-znakowym z dwoma miejscami po kropce.

Przykładowe rozwiązanie — listing 5.2

program Project1; // Zadanie 5.2

{$APPTYPE CONSOLE}

uses SysUtils;

procedure pole_prostokata();var a, b, pole: Real; // deklaracja zmiennych lokalnych

begin Writeln('Program oblicza pole prostokata.'); Writeln('Podaj bok a.'); Readln(a); Writeln('Podaj bok b.'); Readln(b); pole := a*b; Writeln('Pole prostokata o boku a = ', a:4:2, ' i boku b = ', b:4:2); Writeln('wynosi ', pole:4:2,'.'); end;

begin pole_prostokata(); // wywolanie procedury

Readln; // czeka na nacisniecie klawisza Enterend.

W tym zadaniu zmienne

var a, b, pole: Real;

zostały zdefiniowane jako zmienne lokalne, czyli widoczne tylkow podprogramie. Reszta zadania została rozwiązana jak wyżej.

helion kopia dla: Iwona Kruszynska [email protected]

Page 85: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 5 . • P o d p r o g r a m y 85

Z A D A N I E

5.3 Napisz program, który oblicza pole prostokąta. Powinien onzawierać jeden podprogram: procedurę pole_prostokata(), doktórej parametry przekazywane są przez wartość. Wartościboków a i b wprowadzamy z klawiatury. W programie należyzałożyć, że zmienne a i b oraz pole są typu Real (rzeczywiste-go) i są zmiennymi globalnymi. Należy przyjąć dla nich formatwyświetlania ich na ekranie w polu czteroznakowym z dwomamiejscami po kropce.

Przykładowe rozwiązanie — listing 5.3

program Project1; // Zadanie 5.3

{$APPTYPE CONSOLE}

uses SysUtils;

var a, b, pole: Real;

procedure pole_prostokata(x,y:Real); // przekazywanie parametrow przez wartosc begin pole := x*y; Writeln('Pole prostokata o boku a = ', x:4:2, ' i boku b = ', y:4:2); Writeln('wynosi ', pole:4:2, '.'); end;

begin Writeln('Program oblicza pole prostokata.'); Writeln('Podaj bok a.'); Readln(a); Writeln('Podaj bok b.'); Readln(b);

pole_prostokata(a,b); // wywolanie procedury z parametrami

Readln; // czeka na nacisniecie klawisza Enterend.

Procedura pole_prostokata(x,y:Real) zawiera dwa parametry formal-ne x i y typu Real, których używamy tylko do jej opisu. Cała postaćprocedury jest następująca:

helion kopia dla: Iwona Kruszynska [email protected]

Page 86: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

86 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

procedure pole_prostokata(x,y:Real); // przekazywanie parametrow przez wartosc begin pole := x*y; Writeln('Pole prostokata o boku a = ', x:4:2, ' i boku b = ', y:4:2); Writeln('wynosi ', pole:4:2, '.'); end;

Wywołując tę procedurę w programie głównym, wywołujemy ją z pa-rametrami aktualnymi, których wartości wprowadzamy z klawiatury.

begin ....... pole_prostokata(a,b); .......end.

Z A D A N I E

5.4 Napisz program, który oblicza pole prostokąta. Powinien onzawierać jeden podprogram: procedurę pole_prostokata(). Prze-kazywanie danych do procedury odbywa się przez zmienne.Wartości boków a i b wprowadzamy z klawiatury. W programienależy przyjąć, że zmienne a, b oraz pole są typu Real (rzeczywi-stego) i są zmiennymi globalnymi. Należy przyjąć dla nichformat wyświetlania ich na ekranie w polu czteroznakowymz dwoma miejscami kropce.

Przykładowe rozwiązanie — listing 5.4

program Project1; // Zadanie 5.4

{$APPTYPE CONSOLE}

uses SysUtils;

var a, b, pole: Real;

procedure pole_prostokata(x,y:Real; var wynik:Real);// przekazywanie parametrow przez zmienne begin wynik := x*y; Writeln('Pole prostokata o boku a = ', x:4:2, ' i boku b = ', y:4:2); Writeln('wynosi ', wynik:4:2, '.'); end;

begin Writeln('Program oblicza pole prostokata.');

helion kopia dla: Iwona Kruszynska [email protected]

Page 87: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 5 . • P o d p r o g r a m y 87

Writeln('Podaj bok a.'); Readln(a); Writeln('Podaj bok b.'); Readln(b); pole_prostokata(a,b,pole); // wywolanie procedury

Readln; // czeka na nacisniecie klawisza Enterend.

Łatwo zauważyć, że większość zadań z programowania z wykorzy-staniem podprogramów da się rozwiązać według następującego sche-matu1:

program Project1;

{$APPTYPE CONSOLE}

uses SysUtils;

procedure czytaj_dane(); // deklaracja i definicja procedury czytaj_dane() begin .......; end;

procedure przetworz_dane(); // deklaracja i definicja procedury przetworz_dane() begin ......; end;

procedure wyswietl_wynik(); // deklaracja i definicja procedury wyswietl_wynik() begin .....; end;

begin czytaj_dane(); // wywolanie procedury czytaj_dane() przetworz_dane(); // wywolanie procedury przetworz_dane() wyswietl_dane(); // wywolanie procedury wyswietl_wynik()

Readln; // czeka na nacisniecie klawisza Enterend.

1 Schemat ten jest bardzo przydatny w programowaniu strukturalnym, kiedy

operujemy pojęciem podprogramu, oraz w programowaniu obiektowym,kiedy operujemy pojęciem obiektu — zobacz rozdział 6.

helion kopia dla: Iwona Kruszynska [email protected]

Page 88: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

88 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Procedura czytaj_dane() zajmuje się tylko czytaniem danych. Za ichprzetworzenie odpowiedzialna jest procedura przetworz_dane(). Ostatniaz procedur, wyswietl_wynik(), pokazuje, np. na ekranie monitora,przetworzone dane (wyniki). Procedury mogą być z parametrem lubbezparametrowe w zależności od upodobań programisty. Powyższyschemat zilustrujemy poznanym wcześniej przykładem programu,który oblicza pole prostokąta.

Z A D A N I E

5.5 Napisz program, który oblicza pole prostokąta. Powinien onzawierać trzy procedury: czytaj_dane(), przetworz_dane()oraz wyswietl_wynik(). Wartości boków a i b wprowadzamyz klawiatury. W programie należy założyć, że zmienne a, b orazpole są typu Real (rzeczywistego) i są zmiennymi globalnymi.Należy przyjąć dla nich format wyświetlania ich na ekraniew polu czteroznakowym z dwoma miejscami po kropce.

Przykładowe rozwiązanie — listing 5.5

program Project1; // Zadanie 5.5

{$APPTYPE CONSOLE}

uses SysUtils;

var a, b, pole : Real;

procedure czytaj_dane(); // deklaracja i definicja procedury czytaj_dane() begin Writeln('Program oblicza pole prostokata.'); Writeln('Podaj bok a.'); Readln(a); Writeln('Podaj bok b.'); Readln(b); end;

procedure przetworz_dane(); // deklaracja i definicja procedury przetworz_dane() begin pole := a*b; end;

procedure wyswietl_wynik(); // deklaracja i definicja procedury wyswietl_wynik() begin Writeln('Pole prostokata o boku a = ', a:4:2, ' i boku b = ', b:4:2);

helion kopia dla: Iwona Kruszynska [email protected]

Page 89: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 5 . • P o d p r o g r a m y 89

Writeln('wynosi ', pole:4:2, '.'); end;

begin czytaj_dane(); // wywolanie procedury czytaj_dane() przetworz_dane(); // wywolanie procedury przetworz_dane() wyswietl_wynik(); // wywolanie procedury wyswietl_wynik()

Readln; // czeka na nacisniecie klawisza Enterend.

W naszym programie procedura czytaj_dane():

procedure czytaj_dane(); // deklaracja i definicja procedury czytaj_dane() begin Writeln('Program oblicza pole prostokata.'); Writeln('Podaj bok a.'); Readln(a); Writeln('Podaj bok b.'); Readln(b); end;

wczytuje z klawiatury wartość boku a oraz wartość boku b.

Procedura przetworz_dane():

procedure przetworz_dane(); // deklaracja i definicja procedury przetworz_dane() begin pole := a*b; end;

przetwarza wczytane dane i oblicza pole prostokąta.

Natomiast procedura wyswietl_wynik():

procedure wyswietl_wynik(); // deklaracja i definicja procedury wyswietl_wynik() begin Writeln('Pole prostokata o boku a = ', a:4:2, ' i boku b = ', b:4:2); Writeln('wynosi ', pole:4:2, '.'); end;

wyświetla wartości boków a i b oraz zmiennej pole. W programiegłównym zostają wywołane wszystkie trzy procedury.

begin czytaj_dane(); // wywolanie procedury czytaj_dane() przetworz_dane(); // wywolanie procedury przetworz_dane() wyswietl_wynik(); // wywolanie procedury wyswietl_wynik()

.......end.

helion kopia dla: Iwona Kruszynska [email protected]

Page 90: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

90 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Prawda, że wszystko jest jasne i proste? Następne zadanie w tymrozdziale spróbujemy rozwiązać według powyższego schematu.

Z A D A N I E

5.6 Napisz program, który z wykorzystaniem instrukcji wyborucase oblicza pierwiastki równania kwadratowego ax2+bx+c = 0,gdzie zmienne a, b oraz c to liczby rzeczywiste wprowadzanez klawiatury. Dla zmiennych a, b, c, x1 oraz x2 należy przyjąćformat wyświetlania ich na ekranie w polu czteroznakowymz dwoma miejscami po kropce. Program powinien zawieraćtrzy procedury:

czytaj_dane() — procedura jest odpowiedzialna zawczytanie danych do programu oraz obsłużenie sytuacji,kiedy a jest równe zero.

przetworz_dane() — odpowiada za wykonanie niezbędnychobliczeń.

wyswietl_wynik() — procedura wyświetla wyniki na ekraniemonitora.

Przykładowe rozwiązanie — listing 5.6

program Project1; // Zadanie 5.6

{$APPTYPE CONSOLE}

uses SysUtils;

var a, b, c, delta, x1, x2: Real; Liczba_Pierwiastkow: Byte;

procedure czytaj_dane(); begin Writeln('Program oblicza pierwiastki rownania kwadratowego dla dowolnych wspolczynnikow a, b, c.'); Writeln('Podaj a.'); Readln(a); if (a = 0) then begin Writeln('Niedozwolona wartosc wspolczynnika a. Nacisnij klawisz Enter.'); Readln; // czeka na nacisniecie klawisza Enter Exit(); // wyjscie z programu end

helion kopia dla: Iwona Kruszynska [email protected]

Page 91: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 5 . • P o d p r o g r a m y 91

else begin Writeln('Podaj b.'); Readln(b); Writeln('Podaj c.'); Readln(c); end; end;

procedure przetworz_dane(); begin delta := b*b-4*a*c;

if delta < 0 then Liczba_Pierwiastkow := 0; if delta = 0 then Liczba_Pierwiastkow := 1; if delta > 0 then Liczba_Pierwiastkow := 2;

case Liczba_Pierwiastkow of 1 : begin x1 := -b/(2*a); end; 2 : begin x1 := (-b-sqrt(delta))/(2*a); x2 := (-b+sqrt(delta))/(2*a); end; end; end;

procedure wyswietl_wynik(); begin Writeln('Dla wprowadzonych liczb:'); Writeln('a = ',a:4:2, ','); Writeln('b = ',b:4:2, ','); Writeln('c = ',c:4:2, ','); case Liczba_Pierwiastkow of 0 : Writeln('brak pierwiastkow rzeczywistych.'); 1 : begin Writeln('trojmian ma jeden pierwiastek podwojny x1 = ', x1:4:2, '.'); end; 2 : begin Writeln('trojmian ma dwa pierwiastki:'); Writeln('x1 = ', x1:4:2, ','); Writeln('x2 = ', x2:4:2, '.'); end; end; end;

begin czytaj_dane();

helion kopia dla: Iwona Kruszynska [email protected]

Page 92: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

92 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

przetworz_dane(); wyswietl_wynik();

Readln; // czeka na nacisniecie klawisza Enterend.

Procedura czytaj_dane() jest odpowiedzialna za wczytanie danych doprogramu oraz obsłużenie sytuacji, kiedy a jest równe zero. Jej postaćjest następująca:

procedure czytaj_dane(); begin Writeln('Program oblicza pierwiastki rownania kwadratowego dla dowolnych wspolczynnikow a, b, c.'); Writeln('Podaj a.'); Readln(a); if (a = 0) then begin Writeln('Niedozwolona wartosc wspolczynnika a. Nacisnij klawisz Enter.'); Readln; // czeka na nacisniecie klawisza Enter Exit(); // wyjscie z programu end else begin Writeln('Podaj b.'); Readln(b); Writeln('Podaj c.'); Readln(c); end; end;

Kiedy wartość wprowadzonego z klawiatury współczynnika a będziewynosiła zero, procedura ta wyświetli komunikat: Niedozwolonawartosc wspolczynnika a. Nacisnij klawisz Enter i po wciśnięciu klawi-sza Enter nastąpi wyjście z podprogramu (procedura Exit()), a następniezakończenie programu. Współczynniki b i c nie zostaną wprowadzone.Kiedy jednak wartość wprowadzonego z klawiatury współczynnikaa będzie różna od zera, wówczas będziemy mogli wprowadzić doprogramu pozostałe współczynniki.

Procedura przetworz_dane() jest odpowiedzialna za wykonanie nie-zbędnych obliczeń. Ma ona następującą postać:

procedure przetworz_dane(); begin delta := b*b-4*a*c;

helion kopia dla: Iwona Kruszynska [email protected]

Page 93: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 5 . • P o d p r o g r a m y 93

if delta < 0 then Liczba_Pierwiastkow := 0; if delta = 0 then Liczba_Pierwiastkow := 1; if delta > 0 then Liczba_Pierwiastkow := 2;

case Liczba_Pierwiastkow of 1 : begin x1 := -b/(2*a); end; 2 : begin x1 := (-b-sqrt(delta))/(2*a); x2 := (-b+sqrt(delta))/(2*a); end; end; end;

Procedura wyswietl_wynik() odpowiada natomiast za wyświetleniewyników na ekranie monitora.

procedure wyswietl_wynik(); begin Writeln('Dla wprowadzonych liczb:'); Writeln('a = ',a:4:2, ','); Writeln('b = ',b:4:2, ','); Writeln('c = ',c:4:2, ','); case Liczba_Pierwiastkow of 0 : Writeln('brak pierwiastkow rzeczywistych.'); 1 : begin Writeln('trojmian ma jeden pierwiastek podwojny x1 = ', x1:4:2, '.'); end; 2 : begin Writeln('trojmian ma dwa pierwiastki:'); Writeln('x1 = ', x1:4:2, ','); Writeln('x2 = ', x2:4:2, '.'); end; end; end;

Rezultat działania programu dla a = 0 można zobaczyć na rysunku 5.2.

Program oblicza pierwiastki rownania kwadratowego dladowolnych wspolczynnikow a, b, c.Podaj a.0Niedozwolona wartosc wspolczynnika a. Nacisnij klawiszEnter.

Rysunek 5.2. Efekt działania programu Zadanie 5.6

helion kopia dla: Iwona Kruszynska [email protected]

Page 94: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

94 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Z A D A N I E

5.7 Napisz program, który w tablicy 10×10 umieszcza losowo naprzekątnej cyfry od 0 do 9, a poza przekątną zera. Dodatkowoma on obliczać sumę liczb znajdujących się na przekątnej. Pro-gram powinien zawierać trzy procedury:

czytaj_dane() — umieszcza dane w tablicy; przetworz_dane() — oblicza sumę liczb znajdujących się

na przekątnej; wyswietl_wynik() — wyświetla zawartość tablicy na

ekranie monitora.

Przykładowe rozwiązanie — listing 5.7

program Project1; // Zadanie 5.7

{$APPTYPE CONSOLE}

uses SysUtils;

const rozmiar = 10;

type macierz = array[1..rozmiar,1..rozmiar] of integer;

var tablica : macierz;

procedure czytaj_dane(var tablica:macierz;rozmiar:integer); var i,j:integer; begin randomize; for i := 1 to rozmiar do begin for j := 1 to rozmiar do begin if i = j then tablica[i,j] := random(10) else tablica[i,j] := 0; end; end; end;

helion kopia dla: Iwona Kruszynska [email protected]

Page 95: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 5 . • P o d p r o g r a m y 95

procedure przetworz_dane(var tablica:macierz;rozmiar:integer); var i,suma:integer; begin suma := 0; for i := 1 to rozmiar do suma := suma+tablica[i,i]; writeln; writeln('Suma elementow na przekatnej wynosi ', suma,'.'); end;

procedure wyswietl_wynik(var tablica:macierz;rozmiar:integer); var i,j:integer; begin writeln('Wydruk zawartosci tablicy:'); writeln; for i := 1 to rozmiar do begin for j := 1 to rozmiar do write(tablica[i,j],' '); writeln; end; end;

begin czytaj_dane(tablica,rozmiar); przetworz_dane(tablica,rozmiar); wyswietl_wynik(tablica,rozmiar);

readln; // czeka na nacisniecie klawisza Enterend.

Procedura czytaj_dane() umieszcza dane w tablicy. Ilustrują to na-stępujące linijki kodu:

procedure czytaj_dane(var tablica:macierz;rozmiar:integer); var i,j:integer; begin randomize; for i := 1 to rozmiar do begin for j := 1 to rozmiar do begin if i = j then tablica[i,j] := random(10) else tablica[i,j] := 0;

helion kopia dla: Iwona Kruszynska [email protected]

Page 96: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

96 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

end; end; end;

przetworz_dane() oblicza i wyświetla sumę liczb znajdujących się naprzekątnej.

procedure przetworz_dane(var tablica:macierz;rozmiar:integer); var i,suma:integer; begin suma := 0; for i := 1 to rozmiar do suma := suma+tablica[i,i]; writeln; writeln('Suma elementow na przekatnej wynosi ', suma,'.'); end;

Procedura wyswietl_wynik() wyświetla natomiast zawartość tablicy naekranie monitora.

procedure wyswietl_wynik(var tablica:macierz;rozmiar:integer); var i,j:integer; begin writeln('Wydruk zawartosci tablicy:'); writeln; for i := 1 to rozmiar do begin for j := 1 to rozmiar do write(tablica[i,j],' '); writeln; end; end;

Rezultat działania programu można zobaczyć na rysunku 5.3.

Z A D A N I E

5.8 Napisz program, który sortuje n liczb (w zadaniu jest ich sześć).Powinien on zawierać trzy procedury:

czytaj_dane() — czyta dane wprowadzone z klawiaturyi umieszcza je w tablicy o nazwie liczby;

przetworz_dane() — sortuje dane według wybranegoalgorytmu (w programie wykorzystano algorytmsortowania bąbelkowego);

wyswietl_wynik() — wyświetla zawartość posortowanejtablicy o nazwie liczby na ekranie monitora.

helion kopia dla: Iwona Kruszynska [email protected]

Page 97: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 5 . • P o d p r o g r a m y 97

Suma elementow na przekatnej wynosi 42.Wydruk zawartosci tablicy:

8 0 0 0 0 0 0 0 0 00 7 0 0 0 0 0 0 0 00 0 2 0 0 0 0 0 0 00 0 0 9 0 0 0 0 0 00 0 0 0 3 0 0 0 0 00 0 0 0 0 3 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 4 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 6

Rysunek 5.3. Efekt działania programu Zadanie 5.7

Przykładowe rozwiązanie — listing 5.8

program Project1; // Zadanie 5.8

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 6; // ilosc liczb

var liczby:array[1..n] of integer; x, i, j:integer;

procedure czytaj_dane();beginwriteln('Podaj ', n, ' liczb calkowitych.'); for i := 1 to n do readln(liczby[i]);

writeln; write('Wprowadzone liczby to: '); for i := 1 to n do

helion kopia dla: Iwona Kruszynska [email protected]

Page 98: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

98 T u r b o P as c a l . Z ad an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

if i < n then write(liczby[i], ', ') else write(liczby[i], '.');end;

procedure przetworz_dane(); // algorytm sortowania babelkowego begin for i := 2 to n do begin for j := n downto i do if liczby[j-1] > liczby[j] then begin x := liczby[j-1]; liczby[j-1] := liczby[j]; liczby[j] := x; end; end; end;

procedure wyswietl_wynik(); begin writeln; write('Liczby posortowane to: '); for i := 1 to n do if i < n then write(liczby[i], ', ') else write(liczby[i], '.'); end;

begin czytaj_dane(); przetworz_dane(); wyswietl_wynik();

readln; // czeka na nacisniecie klawisza Enterend.

W procedurze przetworz_dane():

procedure przetworz_dane(); begin for i := 2 to n do begin for j := n downto i do if liczby[j-1] > liczby[j] then begin x := liczby[j-1];

helion kopia dla: Iwona Kruszynska [email protected]

Page 99: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 5 . • P o d p r o g r a m y 99

liczby[j-1] := liczby[j]; liczby[j] := x; end; end; end;

wykorzystano popularny algorytm sortowania bąbelkowego. W ra-mach dodatkowych ćwiczeń można zastosować inny algorytm.

Rezultat działania programu można zobaczyć na rysunku 5.4.

Podaj 6 liczb calkowitych.2312945782

Wprowadzone liczby to: 23, 12, 9, 45, 78, 2.Liczby posortowane to: 2, 9, 12, 23, 45, 78.

Rysunek 5.4. Efekt działania programu Zadanie 5.8

Z A D A N I E

5.9 Napisz program, który losuje 10 liczb całkowitych z przedziałuod 0 do 99, a następnie znajduje najmniejszą i największą z nich.Program powinien zawierać trzy procedury:

czytaj_dane() — losuje 10 liczb całkowitych z przedziałuod 0 do 99;

przetworz_dane() — porównuje liczby i ustala, która z nichjest najmniejsza lub największa;

wyswietl_wynik() — wyświetla największą i najmniejsząze zbioru wylosowanych liczb.

Przykładowe rozwiązanie — listing 5.9

program Project1; // Zadanie 5.9

{$APPTYPE CONSOLE}

uses SysUtils;

helion kopia dla: Iwona Kruszynska [email protected]

Page 100: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

100 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

const n = 10; // ilosc liczb

var liczba, min, max:integer;

procedure czytaj_dane(); begin writeln('Program losuje 10 liczb calkowitych z przedzialu od 0 do 99,'); writeln('a nastepnie znajduje najmniejsza i najwieksza.'); randomize; min := random(100); max := min; Write('Wylosowane liczby to: '); write(max, ', '); end;

procedure przetworz_dane();var i: integer; begin for i := 1 to n-1 do begin liczba := random(100); if i < n-1 then write(liczba, ', ') else write(liczba, '.'); if max < liczba then max := liczba; if liczba < min then min := liczba; end; end;

procedure wyswietl_wynik(); begin writeln; writeln('Najwieksza liczba to ', max, '.'); writeln('Najmniejsza liczba to ', min, '.'); end;

begin czytaj_dane(); przetworz_dane(); wyswietl_wynik();

readln; // czeka na nacisniecie klawisza Enterend.

helion kopia dla: Iwona Kruszynska [email protected]

Page 101: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 5 . • P o d p r o g r a m y 101

Rezultat działania programu można zobaczyć na rysunku 5.5.

Program losuje 10 liczb calkowitych z przedzialu od 0 do 99,a nastepnie znajduje najmniejsza i najwieksza.Wylosowane liczby to: 56, 35, 18, 4, 73, 12, 57, 1, 38, 8.Najwieksza liczba to 73.Najmniejsza liczba to 1.

Rysunek 5.5. Efekt działania programu Zadanie 5.9

FunkcjeOgólna postać funkcji jest następująca:

function nazwa_funkcji (lista parametrów formalnych): typ wyniku........................ // deklaracja stałych, zmiennych i typów............begin........................ // treść funkcji............end;

Po słowie kluczowym function i po nazwie funkcji następuje lista pa-rametrów formalnych zawierająca ich nazwy oraz nazwy ich typów.W treści funkcji musi być umieszczone przypisanie

nazwa_funkcji := wynik;

Oto przykład:

function oblicz(var a:real):real; begin oblicz := a*a+1; end;

Powyższe przypisanie funkcji oblicz nadaje przekazywaną wartość.W odróżnieniu od procedury w nagłówku funkcji musi wystąpić typwyniku.

function oblicz(var a:real):real;

helion kopia dla: Iwona Kruszynska [email protected]

Page 102: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

102 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Wywołanie funkcji odbywa się poprzez przypisanie nazwy tej funk-cji wraz z listą jej parametrów aktualnych pewnej zmiennej.

zmienna := nazwa_funkcji(lista parametrów aktualnych);

Oto przykład:

y := oblicz(x);

Można też dokonać tego przez umieszczenie nazwy_funkcji w okre-ślonym wyrażeniu. Daje to możliwość przekazania wartości funkcjido miejsca jej wywołania. Funkcja pełni wtedy rolę zmiennej.

Z A D A N I E

5.10 Napisz program, który dla x zmieniającego się od 0 do 5 z kro-kiem 0,5 oblicza wartość funkcji y = x2+1.

UwagaW programie należy skorzystać z podprogramu function.

Przykładowe rozwiązanie — listing 5.10

program Project1; // Zadanie 5.10

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 10; krok = 0.5;

var i:integer; x,y:real;

function oblicz(var a:real):real; // definicja i deklaracja funkcji oblicz() begin oblicz := a*a+1; end;

begin write(' x | '); writeln(' y '); writeln('--------------------');; for i := 0 to n do begin

helion kopia dla: Iwona Kruszynska [email protected]

Page 103: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 5 . • P o d p r o g r a m y 103

y := oblicz(x); // wywolanie funkcji oblicz() i przypisanie jej wartosci zmiennej y write(x:6:2,' | '); writeln(y:6:2); x := x+krok; end;

readln; // czeka na nacisniecie klawisza Enterend.

Rezultat działania programu można zobaczyć na rysunku 5.6.

x | y-------------------- 0.00 | 1.00 0.50 | 1.25 1.00 | 2.00 1.50 | 3.25 2.00 | 5.00 2.50 | 7.25 3.00 | 10.00 3.50 | 13.25 4.00 | 17.00 4.50 | 21.25 5.00 | 26.00

Rysunek 5.6. Efekt działania programu Zadanie 5.10

helion kopia dla: Iwona Kruszynska [email protected]

Page 104: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

104 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

helion kopia dla: Iwona Kruszynska [email protected]

Page 105: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

6Programowanie obiektowe

W tym rozdziale przedstawimy typowe zadania wraz z przykładowymirozwiązaniami z wykorzystaniem zasad programowania obiektowego.

Język Turbo Pascal umożliwia programowanie obiektowe od wersji 5.5.Programowanie obiektowe (ang. object-oriented programming) to takiparadygmat programowania, w którym programy definiuje się za pomo-cą obiektów — elementów łączących stan (są to dane nazywane pola-mi) i zachowanie (są to metody — w Turbo Pascalu są nimi proceduryi funkcje służące do wykonywania na tych danych określonych zadań,których deklaracja występuje w ramach obiektu). W języku TurboPascal podstawowym pojęciem programowania obiektowego jest klasa(ang. class), która definiuje projekt i strukturę obiektu. Jej szkieletma następującą postać:

typenazwa_klasy = class // pola // metodyend;

W klasach możemy wyróżnić między innymi następujące elementy:stałe, zmienne składowe, zmienne statyczne, metody, konstruktoryi destruktory.

Konstruktor jest specjalną metodą stosowaną przy tworzeniu obiektudanej klasy. Jest on używany do inicjalizacji zmiennych składowychobiektu oraz do przydzielania pamięci potrzebnej do jego działania.

helion kopia dla: Iwona Kruszynska [email protected]

Page 106: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

106 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Destruktor to natomiast specjalna metoda wywoływana tuż przedzwolnieniem obiektu. Jest on przeciwieństwem konstruktora i jest uży-wany do zwolnienia pamięci zajmowanej przez obiekt.

Język Turbo Pascal posiada następujące trzy poziomy dostępu (nada-wane przez modyfikatory lub specyfikatory) do swoich składników:

prywatny (ang. private) — słowo kluczowe private definiujepola i metody klasy dostępne tylko dla jej składników, co oznacza,że metody znajdujące się w innych klasach nie mają dostępudo tak zadeklarowanych elementów;

publiczny (ang. public) — słowo kluczowe public definiuje polai metody dostępne z dowolnego miejsca programu, co oznacza,że metody w innych klasach mają dostęp do składnikówzadeklarowanych z użyciem tego specyfikatora;

chroniony (ang. protected) — słowo kluczowe protected stosowanejest tylko w przypadku dziedziczenia.

Większość zadań z programowania obiektowego przedstawionychw dalszej części tej książki będziemy rozwiązywali według schematuznajdującego się poniżej.

program Zadanie;

{$APPTYPE CONSOLE}

uses SysUtils;

typenazwa_klasy = class // deklaracja klasy public deklaracja zmiennych; procedure czytaj_dane(); // deklaracja metody czytaj_dane() procedure przetworz_dane(); // deklaracja metody przetworz_dane() procedure wyswietl_wynik(); // deklaracja metody wyswietl_wynik()end;

procedure nazwa_klasy.czytaj_dane(); // definicja metody czytaj_dane() begin ...... end;

procedure nazwa_klasy.przetworz_dane(); // definicja metody przetworz_dane() begin ...... end;

helion kopia dla: Iwona Kruszynska [email protected]

Page 107: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 6 . • P r o g r a m o w an i e o b i e k t o w e 107

procedure nazwa_klasy.wyswietl_wynik(); // definicja metody wyswietl_wynik() begin ...... end;

var zmienna : nazwa_klasy;

begin zmienna := nazwa_klasy.Create; // konstruktor tworzy obiekt i przydziela mu pamiec zmienna.czytaj_dane; // wywolanie metody czytaj_dane() zmienna.przetworz_dane; // wywolanie metody przetworz_dane() zmienna.wyswietl_wynik; // wywolanie metody wyswietl_wynik() zmienna.Free; // destruktor niszczy obiekt i zwalnia pamiecend.

Klasa o nazwie nazwa_klasy zawiera oprócz deklaracji zmiennych trzymetody. Metoda czytaj_dane() zajmuje się tylko odczytem danych. Zaich przetworzenie odpowiedzialna jest metoda przetworz_dane(). Ostat-nia z metod, wyswietl_wynik(), pokazuje np. na ekranie monitora prze-tworzone dane (wyniki). Metody mogą być z parametrem lub bezpa-rametrowe w zależności od upodobań programisty.

Powyższy schemat zilustrujemy przykładem znanego nam wcześniejprogramu, który oblicza pole prostokąta.

Z A D A N I E

6.1 Napisz zgodnie z zasadami programowania obiektowego pro-gram, który oblicza pole prostokąta. Klasa powinna zawieraćtrzy metody:

czytaj_dane() — metoda umożliwia wprowadzenie doprogramu wartości boków a i b z klawiatury. Należyprzyjąć, że zmienne a i b oraz zmienna pole są typu Real(rzeczywistego).

przetworz_dane() — metoda oblicza pole prostokątawedług wzoru pole := a*b.

wyswietl_wynik() — metoda wyświetla wartości boków a i boraz zmiennej pole w określonym formacie. Dla zmiennycha, b oraz pole należy przyjąć format wyświetlania ich naekranie w polu czteroznakowym z dwoma miejscami pokropce.

helion kopia dla: Iwona Kruszynska [email protected]

Page 108: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

108 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Przykładowe rozwiązanie — listing 6.1

program Project1; // Zadanie 6.1

{$APPTYPE CONSOLE}

uses SysUtils;

typepole_prostokata = class // deklaracja klasy pole_prostokata public a,b,pole:Real; procedure czytaj_dane(); // deklaracja metody czytaj_dane() procedure przetworz_dane(); // deklaracja metody przetworz_dane() procedure wyswietl_wynik(); // deklaracja metody wyswietl_wynik()end;

procedure pole_prostokata.czytaj_dane(); // definicja metody czytaj_dane() begin Writeln('Program oblicza pole prostokata.'); Writeln('Podaj bok a.'); Readln(a); Writeln('Podaj bok b.'); Readln(b); end;

procedure pole_prostokata.przetworz_dane(); // definicja metody przetworz_dane() begin pole := a*b; end;

procedure pole_prostokata.wyswietl_wynik(); // definicja metody wyswietl_wynik() begin Writeln('Pole prostokata o boku a = ', a:4:2, ' i boku b = ', b:4:2); Writeln('wynosi ', pole:4:2, '.');end;

var pole1:pole_prostokata;

begin pole1 := pole_prostokata.Create; // konstruktor tworzy obiekt i przydziela mu pamiec pole1.czytaj_dane(); // wywolanie metody czytaj_dane() pole1.przetworz_dane(); // wywolanie metody przetworz_dane() pole1.wyswietl_wynik(); // wywolanie metody wyswietl_wynik() pole1.Free; // destruktor niszczy obiekt i zwalnia pamiec

Readln; // czeka na nacisniecie klawisza Enterend.

helion kopia dla: Iwona Kruszynska [email protected]

Page 109: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 6 . • P r o g r a m o w an i e o b i e k t o w e 109

W naszym programie metoda czytaj_dane():

procedure pole_prostokata.czytaj_dane(); // definicja metody czytaj_dane() begin Writeln('Program oblicza pole prostokata.'); Writeln('Podaj bok a.'); Readln(a); Writeln('Podaj bok b.'); Readln(b); end;

wczytuje z klawiatury wartości boków a i b. Metoda przetworz_dane():

procedure pole_prostokata.przetworz_dane(); // definicja metody przetworz_dane() begin pole := a*b; end;

oblicza pole prostokąta według wzoru pole := a*b. Z kolei metodawyswietl_wynik():

procedure pole_prostokata.wyswietl_wynik(); // definicja metody wyswietl_wynik() begin Writeln('Pole prostokata o boku a = ', a:4:2, ' i boku b = ',b:4:2); Writeln('wynosi ', pole:4:2, '.'); end;

wyświetla wartości boków a i b oraz wartość zmiennej pole w określo-nym formacie. W programie głównym zostają wywołane wszystkie trzymetody:

begin pole1 := pole_prostokata.Create; // konstruktor tworzy obiekt i przydziela mu pamiec pole1.czytaj_dane(); // wywolanie metody czytaj_dane() pole1.przetworz_dane(); // wywolanie metody przetworz_dane() pole1.wyswietl_wynik(); // wywolanie metody wyswietl_wynik() pole1.Free; // destruktor niszczy obiekt i zwalnia pamiec .......end.

Poniższa linijka to konstruktor — tworzy ona obiekt i przydziela mupamięć.

pole1 := pole_prostokata.Create;

Destruktor Free niszczy obiekt i zwalnia pamięć, która została muprzydzielona.

pole1.Free;

helion kopia dla: Iwona Kruszynska [email protected]

Page 110: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

110 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Prawda, że wszystko jest jasne i bardzo proste? Następne zadaniaspróbujemy rozwiązać według powyższego schematu.

Z A D A N I E

6.2 Napisz zgodnie z zasadami programowania obiektowego pro-gram, który oblicza pierwiastki równania kwadratowegoax2+bx+c = 0 z wykorzystaniem instrukcji wyboru case. Klasapowinna zawierać trzy metody:

czytaj_dane() — metoda jest odpowiedzialna za wczytaniedanych do programu oraz obsłużenie sytuacji, kiedy a = 0.Zmienne a, b oraz c to liczby rzeczywiste wprowadzanez klawiatury.

przetworz_dane() — metoda odpowiada za wykonanieniezbędnych obliczeń.

wyswietl_wynik() — metoda wyświetla wyniki na ekraniemonitora. Dla zmiennych a, b, c, x1 oraz x2 należy przyjąćformat wyświetlania ich w polu czteroznakowym z dwomamiejscami po kropce.

Przykładowe rozwiązanie — listing 6.2

program Project1; // Zadanie 6.2

{$APPTYPE CONSOLE}

uses SysUtils;

typetrojmian = class a, b, c, delta, x1, x2: Real; Liczba_Pierwiastkow: Byte; procedure czytaj_dane(); procedure przetworz_dane(); procedure wyswietl_wynik();end;

procedure trojmian.czytaj_dane();begin Writeln('Program oblicza pierwiastki rownania kwadratowego dla dowolnych wspolczynnikow a, b, c.'); Writeln('Podaj a.'); Readln(a); if (a = 0) then begin

helion kopia dla: Iwona Kruszynska [email protected]

Page 111: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 6 . • P r o g r a m o w an i e o b i e k t o w e 111

Writeln('Niedozwolona wartosc wspolczynnika a. Nacisnij klawisz Enter.'); Readln; // czeka na nacisniecie klawisza Enter Exit(); // wyjscie z programu end else begin Writeln('Podaj b.'); Readln(b); Writeln('Podaj c.'); Readln(c); end;end;

procedure trojmian.przetworz_dane();begin delta := b*b-4*a*c; if delta < 0 then Liczba_Pierwiastkow := 0; if delta = 0 then Liczba_Pierwiastkow := 1; if delta > 0 then Liczba_Pierwiastkow := 2;

case Liczba_Pierwiastkow of 1 : begin x1 := -b/(2*a); end; 2 : begin x1 := (-b-sqrt(delta))/(2*a); x2 := (-b+sqrt(delta))/(2*a); end; end;end;

procedure trojmian.wyswietl_wynik();begin Writeln('Dla wprowadzonych liczb:'); Writeln('a = ',a:4:2,','); Writeln('b = ',b:4:2,','); Writeln('c = ',c:4:2, ','); case Liczba_Pierwiastkow of 0 : Writeln('brak pierwiastkow rzeczywistych.'); 1 : begin Writeln('trojmian ma jeden pierwiastek podwojny x1 = ', x1:4:2, '.'); end; 2 : begin Writeln('trojmian ma dwa pierwiastki:'); Writeln('x1 = ', x1:4:2,','); Writeln('x2 = ', x2:4:2,'.'); end;

helion kopia dla: Iwona Kruszynska [email protected]

Page 112: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

112 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

end;end;

var trojmian1:trojmian;

begin trojmian1 := trojmian.Create; // konstruktor trojmian1.czytaj_dane(); trojmian1.przetworz_dane(); trojmian1.wyswietl_wynik(); trojmian1.Free; // destruktor

Readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

6.3 Napisz zgodnie z zasadami programowania obiektowego pro-gram, który w tablicy 10×10 umieszcza losowo na przekątnejliczby od 0 do 9, a poza przekątną zera. Dodatkowo programoblicza sumę liczb znajdujących się na przekątnej. Klasa powin-na zawierać trzy metody:

czytaj_dane() — umieszcza dane w tablicy; przetworz_dane() — oblicza i wyświetla sumę liczb

znajdujących się na przekątnej; wyswietl_wynik() — wyświetla zawartość tablicy na

ekranie monitora.

Przykładowe rozwiązanie — listing 6.3

program Project1; // Zadanie 6.3

{$APPTYPE CONSOLE}

uses SysUtils;

const rozmiar = 10;

type macierz = array[1..rozmiar,1..rozmiar] of integer;

matrix = class procedure czytaj_dane(var tablica:macierz;rozmiar:integer);

helion kopia dla: Iwona Kruszynska [email protected]

Page 113: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 6 . • P r o g r a m o w an i e o b i e k t o w e 113

procedure przetworz_dane(var tablica:macierz;rozmiar:integer); procedure wyswietl_wynik(var tablica:macierz;rozmiar:integer);end;

procedure matrix.czytaj_dane(var tablica:macierz;rozmiar:integer); var i,j:integer; begin randomize; for i := 1 to rozmiar do begin for j := 1 to rozmiar do begin if i = j then tablica[i,j] := random(10) else tablica[i,j] := 0; end; end; end;

procedure matrix.przetworz_dane(var tablica:macierz;rozmiar:integer); var i,suma:integer; begin suma := 0; for i := 1 to rozmiar do suma := suma+tablica[i,i]; writeln; writeln('Suma elementow na przekatnej = ', suma, '.'); end;

procedure matrix.wyswietl_wynik(var tablica:macierz;rozmiar:integer); var i,j:integer; begin writeln('Wyswietlenie zawartosci tablicy:'); writeln; for i := 1 to rozmiar do begin for j := 1 to rozmiar do write(tablica[i,j],' '); writeln; end; end;

var tablica:macierz; matrix1:matrix;

helion kopia dla: Iwona Kruszynska [email protected]

Page 114: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

114 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

begin matrix1 := matrix.Create; // konstruktor matrix1.czytaj_dane(tablica,rozmiar); matrix1.przetworz_dane(tablica,rozmiar); matrix1.wyswietl_wynik(tablica,rozmiar); matrix1.Free; // destruktor

readln; // czeka na nacisniecie klawisza Enterend.

Z A D A N I E

6.4 Napisz zgodnie z zasadami programowania obiektowego pro-gram, który sortuje n liczb (w programie jest ich sześć). Klasapowinna zawierać trzy metody:

czytaj_dane() — czyta dane i umieszcza je w tablicyo nazwie liczby;

przetworz_dane() — sortuje dane według wybranegoalgorytmu (w programie wykorzystano algorytmsortowania bąbelkowego);

wyswietl_wynik() — wyświetla zawartość posortowanejtablicy o nazwie liczby na ekranie monitora.

Przykładowe rozwiązanie — listing 6.4

program Project1; // Zadanie 6.4

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 6;

var liczby : array[1..n] of integer;

typesortowanie = class procedure czytaj_dane(); procedure przetworz_dane(); procedure wyswietl_wynik();end;

procedure sortowanie.czytaj_dane();

helion kopia dla: Iwona Kruszynska [email protected]

Page 115: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 6 . • P r o g r a m o w an i e o b i e k t o w e 115

var i:integer;begin liczby[1] := 274; liczby[2] := 303; liczby[3] := 34; liczby[4] := 125; liczby[5] := 81; liczby[6] := 23;

write('Liczby nieposortowane: '); for i := 1 to n do if i < n then write(liczby[i],', ') else write(liczby[i],'. '); writeln;end;

procedure sortowanie.przetworz_dane(); // algorytm sortowania babelkowegovar i,j,x:integer;begin for i := 2 to 6 do begin for j := 6 downto i do begin if liczby[j-1] > liczby[j] then begin x := liczby[j-1]; liczby[j-1] := liczby[j]; liczby[j] := x; end; end; end;end;

procedure sortowanie.wyswietl_wynik();var i:integer;begin write('Liczby posortowane : '); for i := 1 to n do if i < n then write(liczby[i],', ') else write(liczby[i],'. '); writeln;end;

helion kopia dla: Iwona Kruszynska [email protected]

Page 116: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

116 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

var babelki:sortowanie;

begin babelki:=sortowanie.Create; // konstruktor babelki.czytaj_dane(); babelki.przetworz_dane(); babelki.wyswietl_wynik(); babelki.Free; // destruktor

readln;// czeka na nacisniecie klawisza Enterend.

helion kopia dla: Iwona Kruszynska [email protected]

Page 117: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

7

Pliki tekstoweW tym rozdziale przedstawimy typowe zadania wraz z przykładowy-mi rozwiązaniami z wykorzystaniem plików tekstowych.

Pliki tekstowe zwierają informację niezakodowaną, bezpośrednio czy-telną i mają rozszerzenie *.txt. Zmienną plikową nazwa_pliku dla plikutekstowego deklarujemy w sposób następujący:

varnazwa_pliku: text;

Do zmiennej plikowej wykorzystywanej w programie należy przypo-rządkować nazwę pliku dyskowego. Do tego celu służy procedurastandardowa Assign(). Jej ogólna postać jest następująca:

Assign(nazwa_pliku, nazwa_pliku_dyskowego);

gdzie nazwa_pliku_dyskowego jest nazwą rzeczywistą pliku na dyskuwraz ze ścieżką dostępu do niego.

Plik tekstowy otwieramy za pomocą jednej ze standardowych procedur: Reset(nazwa pliku) — otwiera już istniejący plik. Rewrite(nazwa pliku) — otwiera nie tylko nowy plik, ale również

plik już istniejący (w którym kasuje istniejące dane). Append(nazwa pliku) — otwiera wyłącznie do zapisu plik, w którym

dane będą dopisywane na końcu.

Plik zamykamy, stosując procedurę standardową Close(nazwa pliku). Dozapisywania danych do plików tekstowych i odczytywania ich służąnastępujące procedury standardowe:

helion kopia dla: Iwona Kruszynska [email protected]

Page 118: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

118 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Write(nazwa pliku, lista_argumentów);Read(nazwa pliku, lista_argumentów);

na przykład

Write(f, dane); — zapisanie danych do pliku f;

Read(f, dane); — odczytanie danych z pliku f.

Za pomocą funkcji Eof (ang. end of file — koniec pliku) można łatwookreślić, czy plik znajduje się w pozycji końcowej, co ilustruje po-niższy fragment programu.

while not Eof(f) do begin Read(f, dane1); // czytamy dane1 z pliku Writeln(dane1); end;

Z A D A N I E

7.1 Napisz zgodnie z zasadami programowania obiektowego pro-gram, który wczytuje z klawiatury imię i nazwisko, zapisujete dane do pliku tekstowego dane.txt, a następnie odczytuje jez tego pliku i wyświetla na ekranie komputera. Klasa powinnazawierać trzy metody:

czytaj_dane() — wczytuje z klawiatury imię i nazwisko; zapisz_dane_do_pliku() — zapisuje imię i nazwisko do

pliku tekstowego dane.txt; czytaj_dane_z_pliku() — odczytuje dane z pliku dane.txt

i wyświetla je na ekranie komputera.

Przykładowe rozwiązanie — listing 7.1

program Project1; // Zadanie 7.1

{$APPTYPE CONSOLE}

uses SysUtils;

typeplik = class dane, dane1: String[20]; f: Text; procedure czytaj_dane(); // deklaracja metody czytaj_dane() procedure zapisz_dane_do_pliku(); // deklaracja metody zapisz_dane_do_pliku() procedure czytaj_dane_z_pliku(); // deklaracja metody czytaj_dane_z_pliku()end;

helion kopia dla: Iwona Kruszynska [email protected]

Page 119: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 7 . • P l i k i t e k s t o we 119

procedure plik.czytaj_dane(); // definicja metody czytaj_dane() begin Writeln('Podaj imie i nazwisko.'); Readln(dane); end;

procedure plik.zapisz_dane_do_pliku(); // definicja metody zapisz_dane_do_pliku() begin Writeln('Zapis danych do pliku dane.txt.'); Assign(f,'dane.txt'); // skojarzenie zmiennej plikowej z plikiem dane.txt Rewrite(f); // tworzymy i otwieramy plik Write(f,dane); //zapisujemy dane do pliku Close(f); // zamkniecie pliku end;

procedure plik.czytaj_dane_z_pliku(); // definicja metody czytaj_dane_z_pliku() begin Writeln('Odczyt danych z pliku dane.txt:'); Assign(f,'dane.txt'); // skojarzenie zmiennej plikowej z plikiem dane.txt Reset(f); // otwarcie istniejacego juz pliku

while not Eof(f) do begin Read(f,dane1); // czytamy dane1 z pliku Writeln(dane1); end;

Close(f); // zamkniecie pliku end;

var plik1:plik;

begin plik1 := plik.Create; // konstruktor tworzy obiekt i przydziela mu pamiec plik1.czytaj_dane(); // wywolanie metody czytaj_dane() plik1.zapisz_dane_do_pliku(); // wywolanie metody zapisz_dane_do_pliku() plik1.czytaj_dane_z_pliku(); // wywolanie metody czytaj_dane_z_pliku() plik1.Free; // destruktor niszczy obiekt i zwalnia pamiec

Readln; // czeka na nacisniecie klawisza Enterend.

Zwróćmy uwagę, że w programie zadeklarowano dwie zmienne łań-cuchowe:

dane, dane1: String[20];

Zmienna o nazwie dane przechowuje dane przed ich zapisaniem do pli-ku, natomiast dane1 przechowuje dane, które zostały z niego odczytane.

helion kopia dla: Iwona Kruszynska [email protected]

Page 120: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

120 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Metoda czytaj_dane():

procedure plik.czytaj_dane(); // definicja metody czytaj_dane() begin Writeln('Podaj imie i nazwisko.'); Readln(dane); end;

wczytuje dane z klawiatury. Metoda zapisz_dane_do_pliku():

procedure plik.zapisz_dane_do_pliku(); // definicja metodyzapisz_dane_do_pliku() begin Writeln('Zapis danych do pliku dane.txt.'); Assign(f,'dane.txt'); // skojarzenie zmiennej plikowej z plikiem dane.txt Rewrite(f); // tworzymy i otwieramy plik Write(f,dane); // zapisujemy dane do pliku Close(f); // zamkniecie pliku end;

zapisuje dane do pliku dane.txt. Ostatnia z metod, czytaj_dane_z_pliku():

procedure plik.czytaj_dane_z_pliku(); // definicja metody czytaj_dane_z_pliku() begin Writeln('Odczyt danych z pliku dane.txt:'); Assign(f,'dane.txt'); // skojarzenie zmiennej plikowej z plikiem dane.txt Reset(f); // otwarcie istniejacego juz pliku

while not Eof(f) do begin Read(f,dane1); // czytamy dane1 z pliku Writeln(dane1); end; Close(f); // zamkniecie pliku end;

odczytuje dane1 z pliku i wyświetla je na ekranie monitora.

Rezultat działania programu można zobaczyć na rysunku 7.1.

Podaj imie i nazwisko.Jan NowakZapis danych do pliku dane.txt.Odczyt danych z pliku dane.txt:Jan Nowak

Rysunek 7.1. Efekt działania programu Zadanie 7.1

helion kopia dla: Iwona Kruszynska [email protected]

Page 121: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 7 . • P l i k i t e k s t o we 121

Z A D A N I E

7.2 Napisz zgodnie z zasadami programowania obiektowego pro-gram, który tablicę 10×10 w postaci

1 0 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

0 0 1 0 0 0 0 0 0 0

0 0 0 1 0 0 0 0 0 0

0 0 0 0 1 0 0 0 0 0

0 0 0 0 0 1 0 0 0 0

0 0 0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 1 0 0

0 0 0 0 0 0 0 0 1 0

0 0 0 0 0 0 0 0 0 1

zapisuje do pliku tekstowego dane.txt, a następnie odczytuje z niegozapisane dane i wyświetla je na ekranie komputera. Klasa powinnazawierać trzy metody:

czytaj_dane() — tworzy tablicę 10×10; zapisz_dane_do_pliku() — zapisuje tablicę 10×10 do pliku

tekstowego dane.txt; czytaj_dane_z_pliku() — odczytuje tablicę 10×10 z pliku

dane.txt i wyświetla ją na ekranie komputera.

Przykładowe rozwiązanie — listing 7.2

program Project1; // Zadanie 7.2

{$APPTYPE CONSOLE}

uses SysUtils;

const rozmiar = 10;type macierz = array[1..rozmiar,1..rozmiar] of integer;

helion kopia dla: Iwona Kruszynska [email protected]

Page 122: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

122 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

matrix = class tablica, tablica1 : macierz; f:Text; // zmienna plikowa procedure czytaj_dane(); procedure zapisz_dane_do_pliku(); procedure czytaj_dane_z_pliku();end;

procedure matrix.czytaj_dane(); var i,j:integer; begin for i := 1 to rozmiar do // tworzymy tablice 10x10 begin for j := 1 to rozmiar do begin if i = j then tablica[i,j] := 1 else tablica[i,j] := 0 end; {j} end; {i} {koniec wpisywania} end;

procedure matrix.zapisz_dane_do_pliku(); var i,j:integer; begin Writeln('Zapis danych do pliku dane.txt.'); Assign(f,'dane.txt'); // skojarzenie zmiennej plikowej z plikiem dane.txt Rewrite(f); // tworzymy i otwieramy plik for i := 1 to rozmiar do begin for j := 1 to rozmiar do begin Write(tablica[i,j]:2); // wyswietlamy tablice na ekranie Write(f,tablica[i,j]:2); // zapisujemy dane do pliku end; {j} Writeln; end; {i} Close(f); // zamkniecie pliku end;

procedure matrix.czytaj_dane_z_pliku(); var i,j:integer;

helion kopia dla: Iwona Kruszynska [email protected]

Page 123: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 7 . • P l i k i t e k s t o we 123

begin Writeln; Writeln('Odczyt danych z pliku dane.txt:'); Assign(f,'dane.txt'); // skojarzenie zmiennej plikowej z plikiem dane.txt Reset(f); // otwarcie pliku, ktory juz istnieje

for i := 1 to rozmiar do begin for j := 1 to rozmiar do begin Read(f,tablica1[i,j]); // czytamy tablice z pliku Write(tablica1[i,j]:2); // wyswietlamy tablice na ekranie end; Writeln; end; Close(f); // zamkniecie pliku end;

var matrix1:matrix;

begin matrix1 := matrix.Create; // konstruktor matrix1.czytaj_dane(); matrix1.zapisz_dane_do_pliku(); matrix1.czytaj_dane_z_pliku(); matrix1.Free; // destruktor

Readln; // czeka na nacisniecie klawisza Enterend.

Zwróćmy uwagę na fakt zadeklarowania w programie dwóch tablic:

tablica, tablica1 : macierz;

Tablica o nazwie tablica przechowuje dane przed zapisaniem ich dopliku, natomiast tablica1 przechowuje dane, które zostały z niegoodczytane.

Rezultat działania programu można zobaczyć na rysunku 7.2.

Z A D A N I E

7.3 Napisz zgodnie z zasadami programowania obiektowego pro-gram, który tablicę a o wymiarach 10×10 i postaci, jaką możnazobaczyć pod rysunkiem 7.2,

helion kopia dla: Iwona Kruszynska [email protected]

Page 124: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

124 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Zapis danych do pliku dane.txt. 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1

Odczyt danych z pliku dane.txt: 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1

Rysunek 7.2. Efekt działania programu Zadanie 7.2

0 0 0 0 0 0 0 0 0 0

1 1 1 1 1 1 1 1 1 1

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

helion kopia dla: Iwona Kruszynska [email protected]

Page 125: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 7 . • P l i k i t e k s t o we 125

przekształca w następującą tablicę b:

0 1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

i zapisuje ją do pliku tekstowego dane.txt, a następnie odczytuje jąz niego i wyświetla na ekranie. Klasa powinna zawierać cztery metody:

czytaj_dane() — tworzy tablicę a o wymiarach 10×10; przetworz_dane() — przepisuje zawartość tablicy a o wymiarach

10×10 do tablicy b o takiej samej wielkości; zapisz_dane_do_pliku() — zapisuje tablicę b o wymiarach 10×10

do pliku; czytaj_dane_z_pliku() — odczytuje z pliku tablicę c o wymiarach

10×10 i wyświetla ją na ekranie.

Przykładowe rozwiązanie — listing 7.3

program Project1; // Zadanie 7.3

{$APPTYPE CONSOLE}

uses SysUtils;

const n = 10;

type macierz = array[1..n, 1..n] of integer;

matrix = classa, b, c : macierz;f:Text; // zmienna plikowa

helion kopia dla: Iwona Kruszynska [email protected]

Page 126: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

126 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

procedure czytaj_dane();procedure przetworz_dane();procedure zapisz_dane_do_pliku();procedure czytaj_dane_z_pliku();end;

procedure matrix.czytaj_dane(); var i, j:integer;

begin {wpisywanie liczb do tablicy a} Writeln; Writeln('Tworzymy tablice a[i,j].'); for i := 1 to n do begin for j := 1 to n do begin if i = 2 then a[i,j] := 1 else a[i,j] := 0; Write(a[i,j]:2); // wyswietlamy tablice a[i,j] na ekranie end; {j} Writeln; end; {i} {koniec wpisywania} end;

procedure matrix.przetworz_dane(); var i, j:integer;

begin {przepisywanie elementow z tablicy a do tablicy b} Writeln; Writeln('Wyswietlamy tablice b[i,j] na ekranie.'); for i := 1 to n do begin for j := 1 to n do begin b[i,j] := a[j,i]; Write(b[i,j]:2); // wyswietlamy tablice b[i,j] na ekranie end; {j} Writeln; end; {i} {koniec przepisywania} end;

procedure matrix.zapisz_dane_do_pliku(); var i, j:integer;

helion kopia dla: Iwona Kruszynska [email protected]

Page 127: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

R o z d z i a ł 7 . • P l i k i t e k s t o we 127

begin Writeln('Zapisujemy tablice b[i,j] do pliku dane.txt.'); Assign(f,'dane.txt'); // skojarzenie zmiennej plikowej z plikiem dane.txt Rewrite(f); // tworzymy i otwieramy plik for i := 1 to n do begin for j := 1 to n do begin Write(f,b[i,j]:2); // zapisujemy tablice b[i,j] do pliku dane.txt end; {j} end; {i} Close(f); // zamkniecie pliku end;

procedure matrix.czytaj_dane_z_pliku(); var i,j:integer;

begin Writeln; Writeln('Odczytujemy tablice c[i,j] z pliku dane.txt.'); Assign(f,'dane.txt'); // skojarzenie zmiennej plikowej z plikiem dane.txt Reset(f); // otwarcie pliku, ktory juz istnieje for i := 1 to n do begin for j := 1 to n do begin Read(f,c[i,j]); // odczytujemy tablice c[i,j] z pliku Write(c[i,j]:2); // wyswietlamy tablice c[i,j] na ekranie end; {j} Writeln; end; {i} Close(f); // zamkniecie pliku end;

var matrix1:matrix;

begin matrix1 := matrix.Create; // konstruktor matrix1.czytaj_dane(); matrix1.przetworz_dane(); matrix1.zapisz_dane_do_pliku(); matrix1.czytaj_dane_z_pliku(); matrix1.Free; // destruktor

Readln; // czeka na nacisniecie klawisza Enterend.

helion kopia dla: Iwona Kruszynska [email protected]

Page 128: helion kopia dla: Iwona Kruszynska technologia inf@wpzsokwidzyn.pl/wp-content/uploads/2016/11/turbo-pascal-zadania-z... · Proste operacje wejścia-wyjścia 7 Instrukcje wyjścia

c962a78eb15dc22ccc30b22be7b0aa45

128 T u r b o P as c a l . Z a d an i a z p r o g r am o w a n i a z p r z y k ła d o w y m i r o z w ią z a n i a m i

Rezultat działania programu można zobaczyć na rysunku 7.3.

Tworzymy tablice a[i,j]. 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Wyswietlamy tablice b[i,j] na ekranie. 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0Zapisujemy tablice b[i,j] do pliku dane.txt.

Odczytujemy tablice c[i,j] z pliku dane.txt. 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0

Rysunek 7.3. Efekt działania programu Zadanie 7.3

helion kopia dla: Iwona Kruszynska [email protected]