962a78eb15d2230b22be7b0aa45 Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszehnianie ałośi lub fragmentu niniejszej publikaji w jakiejkolwiek postai jest zabronione. Wykonywanie kopii metodą kserografizną, fotografizną, a także kopiowanie książki na nośniku filmowym, magnetyznym lub innym powoduje naruszenie praw autorskih niniejszej publikaji. Wszystkie znaki występująe w tekśie są zastrzeżonymi znakami firmowymi bądź towarowymi ih właśiieli. Autor oraz Wydawnitwo HELION dołożyli wszelkih starań, by zawarte w tej książe informaje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialnośi ani za ih wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowyh lub autorskih. Autor oraz Wydawnitwo HELION nie ponoszą również żadnej odpowiedzialnośi za ewentualne szkody wynikłe z wykorzystania informaji zawartyh w książe. Redaktor prowadząy: Ewelina Burska Projekt okładki: Radosław Zbytniewski Materiały grafizne na okłade zostały wykorzystane za zgodą istokphoto In. Wydawnitwo HELION ul. Kośiuszki 1, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli hesz oenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie?tpzada_p Możesz tam wpisać swoje uwagi, spostrzeżenia, reenzję. Kody wykorzystane w książe można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/tpzada.zip ISBN: 978-83-246-3709-6 Nr katalogowy: 6887 Copyright Helion 2011 Printed in Poland. Poleć książkę na Faebook.om Kup w wersji papierowej Oeń książkę Księgarnia internetowa Lubię to!» Nasza społezność
962a78eb15d2230b22be7b0aa45 Spis treśi Od autora 5 Rozdział 1. Proste operaje wejśia-wyjśia 7 Instrukje wyjśia 7 Instrukje wejśia 8 Rozdział 2. Podejmujemy deyzje w programie 17 Rozdział 3. Iteraje 29 Rozdział 4. Tablie 57 Tablie jednowymiarowe 57 Tablie dwuwymiarowe 61 Rozdział 5. Podprogramy 81 Proedury 81 Funkje 101 Rozdział 6. Programowanie obiektowe 105 Rozdział 7. Pliki tekstowe 117
962a78eb15d2230b22be7b0aa45 4 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami
962a78eb15d2230b22be7b0aa45 Od autora Trójzbiór Zadania z programowania z rozwiązaniami to pierwszy w Polse zbiór zadań adresowany do wszystkih osób zainteresowanyh programowaniem, które w krótkim zasie, poprzez analizę zaproponowanyh rozwiązań, hiałyby nauzyć się solidnyh podstaw programowania w trzeh językah: Turbo Pasalu, C++ oraz Javie. Składa się on z trzeh zbiorów zadań: Turbo Pasal. Zadania z programowania z przykładowymi rozwiązaniami. C++. Zadania z programowania z przykładowymi rozwiązaniami. Java. Zadania z programowania z przykładowymi rozwiązaniami. Choiaż każda z powyższyh książek tworzy odrębną ałość, to zostały one napisane w taki sposób, aby ten sam lub bardzo podobny problem programistyzny (np. napisz program, który obliza pole prostokąta) został rozwiązany w trzeh językah programowania: Turbo Pasalu, C++ i Javie, strukturalnie i obiektowo. Tak skonstruowany trójzbiór Zadania z programowania uzyskuje zupełnie nowy wymiar dydaktyzny w naue tyh trzeh języków. Zadania z programowania można również wykorzystać jako uzupełnienie wiedzy zazerpniętej z innyh książek do nauki programowania. Zakres i stopień trudnośi zadań pokrywa się z tradyyjnym proesem nauzania wymienionyh języków. Zbiór ten może też pełnić rolę podręznej pomoy dla pozątkująyh programistów, w której szybko znajdą oni potrzebne im rozwiązanie.
962a78eb15d2230b22be7b0aa45 6 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Trójzbiór adresowany jest również do maturzystów, studentów, nauzyieli informatyki oraz osób zainteresowanyh programowaniem lub rozpozynająyh naukę programowania w języku Turbo Pasal. Uzniowie tehników informatyznyh mogą zbiory zadań wykorzystać do szybkiej powtórki przed egzaminem zawodowym. W trakie pisania tej książki korzystałem z tzw. aplikaji konsolowyh (ang. onsole appliation) i kompilatora firmy Borland (Turbo Pasal). Mirosław J. Kubiak
962a78eb15d2230b22be7b0aa45 1 Proste operaje wejśia-wyjśia W tym rozdziale zamieszzono proste zadania z przykładowymi rozwiązaniami ilustrująe, w jaki sposób komputer komunikuje się z użytkownikiem w języku Turbo Pasal. Każda aplikaja powinna posiadać możliwość komunikowania się z użytkownikiem. Wykorzystują prosty przykład pokażemy, w jaki sposób program napisany w języku Turbo Pasal komunikuje się z nim poprzez standardowe operaje wejśia-wyjśia. Instrukje wyjśia Do wyprowadzania danyh na ekran służą dwie instrukje (proedury 1 standardowe): Writeln i Write. Instrukja Writeln powoduje wyprowadzenie danyh na ekran monitora i automatyzne przejśie kursora do nowej linii. Jej ogólna postać jest następująa: Writeln(lista argumentów); gdzie lista argumentów może być iągiem znaków stałyh, zmiennyh lub wyrażeń oddzielonyh od siebie przeinkami. 1 Więej informaji o proedurah znajdzie zytelnik w rozdziale 5.
962a78eb15d2230b22be7b0aa45 8 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Instrukja Write umożliwia wyprowadzenie danyh na ekran monitora, nie powodują automatyznego przejśia kursora do nowej linii. Jej ogólna postać to: Write(lista argumentów); gdzie lista argumentów również może być iągiem znaków stałyh, zmiennyh lub wyrażeń oddzielonyh za pomoą przeinków. Instrukje wyjśia Writeln i Write umożliwiają przedstawienie lizb w postai sformatowanej, tj. z określoną lizbą miejs przed i po krope dziesiętnej. Aby uzyskać sformatowaną postać lizby rzezywistej, należy argument tyh funkji uzupełnić o określenie szerokośi pól w następująej postai: : szerokość pola: lizba miejs po krope Zapis Write(suma:6:2) oznaza, że wartość zmiennej suma zostanie wyświetlona w polu o szerokośi sześiu znaków z dwoma yframi po krope. Instrukje wejśia Do wprowadzania zmiennyh do uruhomionego programu w Turbo Pasalu służą dwie instrukje (proedury standardowe): Read i Readln. Instrukja Read umożliwia wprowadzenie do uruhomionego programu wartośi zmiennyh z klawiatury, nie powodują automatyznego przejśia kursora do nowej linii. Jej ogólna postać jest następująa: Read(lista argumentów); gdzie lista argumentów może być iągiem znaków stałyh, zmiennyh lub wyrażeń oddzielonyh od siebie przeinkami. Readln również jest instrukją umożliwiająą wprowadzenie do uruhomionego programu wartośi zmiennyh z klawiatury, powoduje ona jednak (po wprowadzeniu danyh) automatyzne przejśie kursora do nowej linii. Jej ogólna postać jest następująa: Readln(lista argumentów); gdzie lista argumentów może być iągiem znaków stałyh, zmiennyh lub wyrażeń oddzielonyh od siebie przeinkami.
962a78eb15d2230b22be7b0aa45 Rozdział 1. Proste operaje wejś ia-wyjś ia 9 Z A D A N I E 1.1 Napisz program, który obliza pole prostokąta. Wartośi boków a i b wprowadzamy z klawiatury. W programie należy przyjąć, że zmienne a i b oraz pole są typu Real (rzezywistego). Dla zmiennyh tyh przyjmujemy format wyświetlania ih na ekranie w polu zteroznakowym z dwoma miejsami po krope. Przykładowe rozwiązanie listing 1.1 program Projet1; // Zadanie 1.1 {$APPTYPE CONSOLE} uses SysUtils; a, b, pole: Real; // deklarujemy zmienne typu Real Writeln('Program obliza pole prostokata.'); Writeln('Podaj bok a.'); Readln(a); Writeln('Podaj bok b.'); Readln(b); pole := a*b; // oblizamy pole prostokata Write('Pole prostokata o boku a = ', a:4:2, ' i boku b = ', b:4:2); Write(' wynosi ', pole:4:2, '.'); Readln; // zeka na naisnieie klawisza Enter Zmienne określonego typu deklarujemy w programie za pomoą słowa kluzowego. Linijki kodu a, b, pole: Real; // deklarujemy zmienne typu Real umożliwiają deklaraję zmiennyh a, b i pole. Wszystkie te zmienne są typu rzezywistego Real. Instrukja Writeln('Program obliza pole prostokata.'); wyświetla na ekranie komputera komunikat Program obliza pole prostokata. Instrukja Readln(a) zeka na wprowadzenie z klawiatury lizby, która następnie zostanie przypisana zmiennej a. Pole prostokąta zostaje oblizone w instrukji
962a78eb15d2230b22be7b0aa45 10 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami pole := a*b; // oblizamy pole prostokata Za wyświetlenie wartośi zmiennyh a, b oraz pole wraz z odpowiednim opisem odpowiedzialne są następująe linijki kodu: Instrukja Write('Pole prostokata o boku a = ', a:4:2, ' i boku b = ', b:4:2); Write(' wynosi ', pole:4:2, '.'); Readln; // zeka na naisnieie klawisza Enter zeka na użyie klawisza Enter, aby po jego naiśnięiu zamknąć ekran działająego programu. Komentarze oznazamy w programie dwoma ukośnikami lub dwoma nawiasami klamrowymi: // to jest komentarz do kodu {to też jest komentarz do kodu} Komentarze są ignorowane przez kompilator w proesie kompilaji. Rezultat działania programu można zobazyć na rysunku 1.1. Program obliza pole prostokata. Podaj bok a. 1 Podaj bok b. 2 Pole 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 wartość predefiniowanej stałej π = 3,14 Należy przyjąć format wyświetlania jej w polu 10-znakowym z ośmioma miejsami po krope. Przykładowe rozwiązanie listing 1.2 program Projet1; // Zadanie 1.2 {$APPTYPE CONSOLE} uses SysUtils;
962a78eb15d2230b22be7b0aa45 Rozdział 1. Proste operaje wejś ia-wyjś ia 11 Writeln('Program wyswietla wartos predefiniowanej stalej pi'); Writeln('z dokladnosia osmiu miejs po krope.'); Writeln('Pi = ', pi:10:8); Readln; // zeka na naisnieie klawisza Enter Rezultat działania programu można zobazyć na rysunku 1.2. Program wyswietla wartos predefiniowanej stalej pi z dokladnosia osmiu miejs po krope. 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 pierwiastek kwadratowy z wartośi predefiniowanej π = 3,14 Należy przyjąć format wyświetlania wyniku w polu 10-znakowym z ośmioma miejsami po krope. Przykładowe rozwiązanie listing 1.3 program Projet1; // Zadanie 1.3 {$APPTYPE CONSOLE} uses SysUtils; Writeln('Program wyswietla pierwiastek kwadratowy z wartosi predefiniowanej pi'); Writeln('z dokladnosia osmiu miejs po krope.'); Writeln('Sqrt(pi) = ', Sqrt(pi):10:8); Readln; // zeka na naisnieie klawisza Enter Pierwiastek kwadratowy ze stałej pi oblizamy za pomoą funkji Sqrt(). Rezultat działania programu można zobazyć na rysunku 1.3.
962a78eb15d2230b22be7b0aa45 12 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Program wyswietla pierwiastek kwadratowy z wartosi predefiniowanej pi z dokladnosia osmiu miejs po krope. 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 obliza objętość kuli o promieniu r. Wartość promienia wprowadzamy z klawiatury. W programie należy przyjąć, że promień r jest typu Real (rzezywistego). Dla zmiennyh r oraz objetos przyjmujemy format wyświetlania ih na ekranie w polu zteroznakowym z dwoma miejsami po krope. Przykładowe rozwiązanie listing 1.4 program Projet1; // Zadanie 1.4 {$APPTYPE CONSOLE} uses SysUtils; r, objetos: Real; Writeln('Program obliza objetos kuli o promieniu r.'); Writeln('Podaj promien r.'); Readln(r); objetos := 4*Pi*r*r*r/3; Write('Objetos kuli o promieniu r = ', r:4:2); Writeln(' wynosi ', objetos:4:2,'.'); Readln; // zeka na naisnieie klawisza Enter Objętość kuli obliza następująa linijka kodu: objetos := 4*Pi*r*r*r/3; gdzie potęgowanie zamieniono na mnożenie. Rezultat działania programu można zobazyć na rysunku 1.4.
962a78eb15d2230b22be7b0aa45 Rozdział 1. Proste operaje wejś ia-wyjś ia 13 Program obliza objetos kuli o promieniu r. Podaj promien r. 1 Objetos 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 oblizająy wynik dzielenia ałkowitego bez reszty dwóh lizb a = 37 i b = 11. Wskazówka Należy zastosować operator dzielenia ałkowitego bez reszty div. Umożliwia on uzyskanie ałkowitej wartośi lizbowej z wyniku dzielenia, podzas gdy reszta jest odrzuana. Przykładowe rozwiązanie listing 1.5 program Projet1; // Zadanie 1.5 {$APPTYPE CONSOLE} uses SysUtils; onst a = 37; b = 11; Writeln('Program obliza wynik dzielenia alkowitego bez reszty dwoh lizb.'); Writeln; // wyswietlenie pustej linii Writeln('Dla lizb a = ', a, ' i b = ', b); Writeln(a, ' div ', b, ' = ', a div b, '.'); Readln; // zeka na naisnieie klawisza Enter Stałe a i b definiujemy w programie za pomoą słowa kluzowego onst, tak jak pokazują następująe linijki kodu: onst a = 37; b = 11;
962a78eb15d2230b22be7b0aa45 14 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Rezultat działania programu można zobazyć na rysunku 1.5. Program obliza wynik dzielenia alkowitego bez reszty dwoh lizb. Dla lizb a = 37 i b = 11 37 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 obliza resztę z ałkowitego dzielenia dwóh lizb a = 37 i b = 11. Wskazówka Należy zastosować operator reszty z ałkowitego dzielenia mod (modulo). Umożliwia on uzyskanie tylko reszty z dzielenia, natomiast ałkowita wartość lizbowa jest odrzuana. Przykładowe rozwiązanie listing 1.6 program Projet1; // Zadanie 1.6 {$APPTYPE CONSOLE} uses SysUtils; onst a = 37; b = 11; Writeln('Program obliza reszte z alkowitego dzielenia dwoh lizb.'); Writeln; Writeln('Dla lizb a = ', a, ' i b = ', b); Writeln(a, ' mod ', b, ' = ', a mod b, '.'); Readln; // zeka na naisnieie klawisza Enter Rezultat działania programu można zobazyć na rysunku 1.6.
962a78eb15d2230b22be7b0aa45 Rozdział 1. Proste operaje wejś ia-wyjś ia 15 Program obliza reszte z alkowitego dzielenia dwoh lizb. Dla lizb a = 37 i b = 11 37 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 obliza sumę, różnię, ilozyn i iloraz dwóh lizb x i y wprowadzanyh z klawiatury. W programie należy przyjąć, że lizby x i y są typu Real (rzezywistego). Dla zmiennyh x, y, suma, roznia, ilozyn i iloraz przyjmujemy format wyświetlania ih na ekranie w polu zteroznakowym z dwoma miejsami po krope. Przykładowe rozwiązanie listing 1.7 program Projet1; // Zadanie 1.7 {$APPTYPE CONSOLE} uses SysUtils; x, y : Real; suma, roznia, ilozyn, iloraz : Real; Writeln('Program obliza sume, roznie, ilozyn i iloraz dwoh lizb.'); Writeln('Podaj x.'); Readln(x); Writeln('Podaj y.'); Readln(y); suma := x+y; roznia := x-y; ilozyn := 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('roznia = ', roznia:4:2, ',');
962a78eb15d2230b22be7b0aa45 16 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Writeln('ilozyn = ', ilozyn:4:2, ','); Writeln('iloraz = ', iloraz:4:2, '.'); Readln; // zeka na naisnieie klawisza Enter Za oblizenie w programie sumy, różniy, ilozynu i ilorazu odpowiadają następująe linijki kodu: suma := x+y; roznia := x-y; ilozyn := x*y; iloraz := x/y; Rezultat działania programu można zobazyć na rysunku 1.7. Program obliza sume, roznie, ilozyn i iloraz dwoh lizb. Podaj x. 3 Podaj y. 2 Dla x = 3.00 i y = 2.00 suma = 5.00, roznia = 1.00, ilozyn = 6.00, iloraz = 1.50. Rysunek 1.7. Efekt działania programu Zadanie 1.7
962a78eb15d2230b22be7b0aa45 2 Podejmujemy deyzje w programie W tym rozdziale przedstawimy typowe zadania wraz z przykładowymi rozwiązaniami z wykorzystaniem instrukji warunkowej if... then oraz instrukji wyboru ase. W języku Turbo Pasal istnieją dwie instrukje warunkowe: instrukja warunkowa if... then, instrukja wyboru ase. Instrukja if... then służy do sprawdzania poprawnośi wyrażenia warunkowego i w zależnośi od tego, zy dany warunek jest prawdziwy, zy nie, pozwala na wykonanie różnyh bloków programu. Jej ogólna postać jest następująa: lub if warunek then // instrukje do wykonania, kiedy warunek jest prawdziwy if warunek then // instrukje do wykonania, kiedy warunek jest prawdziwy end
962a78eb15d2230b22be7b0aa45 18 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami else // instrukje do wykonania, kiedy warunek jest fałszywy Uwaga Po słowie kluzowym end znajdująym się bezpośrednio przed słowem kluzowym else nie występuje średnik. Instrukja wyboru ase pozwala w wygodny i przejrzysty sposób sprawdzić iąg warunków i wykonywać kod w zależnośi od tego, zy są one prawdziwe, zy fałszywe. Jej ogólna postać jest następująa: lub ase wyrażenia of wybór_1; wybór_2;... wybór _n ase wyrażenia of wybór_1; wybór_2;... wybór _n else instrukja; Z A D A N I E 2.1 Napisz program, który dla trzeh długośi boków wprowadzonyh z klawiatury sprawdza, zy tworzą one trójkąt prostokątny (zakładamy, że a > 0, b > 0, > 0). Przykładowe rozwiązanie listing 2.1 program Projet1; // Zadanie 2.1 {$APPTYPE CONSOLE} uses SysUtils; a, b, : Integer; Writeln('Podaj bok a.');
962a78eb15d2230b22be7b0aa45 Rozdział 2. Podejmujemy deyzje w programie 19 Readln(a); Writeln('Podaj bok b.'); Readln(b); Writeln('Podaj bok.'); Readln(); if (a*a+b*b) = (*) then Writeln('Boki a = ', a, ', b = ', b, ', = ',,' tworza trojkat prostokatny.') else Writeln('Boki a = ', a, ', b = ', b, ', = ',,' nie tworza trojkata prostokatnego.'); Readln; // zeka na naisnieie klawisza Enter Sprawdzenie twierdzenia Pitagorasa dla wzytanyh boków a, b i zostało zawarte w następująyh linijkah kodu: if (a*a+b*b) = (*) then Writeln('Boki a = ', a, ', b = ', b, ', = ',,' tworza trojkat prostokatny.') else Writeln('Boki a = ', a, ', b = ', b, ', = ',,' nie tworza trojkata prostokatnego.'); Łatwo sprawdzić, że boki a = 3, b = 4, = 5 są bokami trójkąta prostokątnego (lizby te spełniają twierdzenie Pitagorasa), i na ekranie pojawi się komunikat Boki tworza trojkat prostokatny, natomiast boki a = 1, b = 2, = 3 nie utworzą trójkąta prostokątnego (twierdzenie Pitagorasa dla tyh lizb nie jest spełnione), wię na ekranie zostanie wyświetlony komunikat Boki nie tworza trojkata prostokatnego. Rezultat działania programu dla a = 3, b = 4, = 5 można zobazyć na rysunku 2.1. Podaj bok a. 3 Podaj bok b. 4 Podaj bok. 5 Boki a = 3, b = 4, = 5 tworza trojkat prostokatny. Rysunek 2.1. Efekt działania programu Zadanie 2.1
962a78eb15d2230b22be7b0aa45 20 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Z A D A N I E 2.2 Napisz program, który z wykorzystaniem instrukji warunkowej if obliza pierwiastki równania kwadratowego ax 2 +bx+ = 0, gdzie zmienne a, b, to lizby rzezywiste wprowadzane z klawiatury. Dla zmiennyh a, b,, x1 oraz x2 należy przyjąć format wyświetlania ih na ekranie w polu zteroznakowym z dwoma miejsami po krope. Przykładowe rozwiązanie listing 2.2 program Projet1; // Zadanie 2.2 {$APPTYPE CONSOLE} uses SysUtils; a, b,, delta, x1, x2: Real; Writeln('Program obliza pierwiastki rownania kwadratowego dla dowolnyh wspolzynnikow a, b,.'); Writeln('Podaj a.'); Readln(a); if (a = 0) then Writeln('Niedozwolona wartos wspolzynnika a. Naisnij klawisz Enter.') else Writeln('Podaj b.'); Readln(b); Writeln('Podaj.'); Readln(); Writeln('Dla wprowadzonyh lizb:'); Writeln('a = ', a:4:2, ','); Writeln('b = ', b:4:2, ','); Writeln(' = ', :4:2, ','); delta := b*b-4*a*; if delta < 0 then Writeln('brak pierwiastkow rzezywistyh.') else if delta = 0 then x1 := -b/(2*a);
962a78eb15d2230b22be7b0aa45 Rozdział 2. Podejmujemy deyzje w programie 21 Writeln('trojmian ma jeden pierwiastek podwojny x1 = ', x1:4:2, '.'); end else 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, '.'); Readln; // zeka na naisnieie klawisza Enter W pierwszej zęśi programu sprawdzamy, zy wartość współzynnika a jest równa zero. Ilustrują to następująe linijki kodu: if (a = 0) then Writeln('Niedozwolona wartos wspolzynnika a. Naisnij klawisz Enter.') else... Jeśli a = 0, to zostanie wyświetlony komunikat Niedozwolona wartos wspolzynnika a i program zostanie zakońzony. Dla a różnego od zera program będzie ozekiwał na wprowadzenie wartośi b i. Po ih wpisaniu zostanie oblizona delta według wzoru delta := b*b-4*a*; Jeśli delta < 0, zostanie wyświetlony komunikat brak pierwiastkow rzezywistyh. W przypadku gdy delta = 0, równanie kwadratowe ma pierwiastek podwójny, który oblizymy ze wzoru x1 := -b/(2*a); Jeśli delta > 0, równanie ma dwa pierwiastki, które zostaną oblizone przy użyiu wzorów x1 := (-b-sqrt(delta))/(2*a); x2 := (-b+sqrt(delta))/(2*a); Przykładowo dla a = 1, b = 5 i = 4 wartośi pierwiastków równania to odpowiednio x1 = -4 i x2 = -1.
962a78eb15d2230b22be7b0aa45 22 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Dla a = 1, b = 4 i = 4 trójmian ma z kolei jeden pierwiastek podwójny x1 = -2. Dla współzynników a = 1, b = 2 oraz = 3 trójmian nie ma pierwiastków rzezywistyh. Rezultat działania programu dla a = 1, b = 5, = 4 można zobazyć na rysunku 2.2. Program obliza pierwiastki rownania kwadratowego dla dowolnyh wspolzynnikow a, b,. Podaj a. 1 Podaj b. 5 Podaj. 4 Dla wprowadzonyh lizb: a = 1.00, b = 5.00, = 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 instrukji wyboru ase obliza pierwiastki równania kwadratowego ax 2 +bx+ = 0, gdzie zmienne a, b, to lizby rzezywiste wprowadzane z klawiatury. Dla zmiennyh a, b,, x1 oraz x2 należy przyjąć format wyświetlania ih na ekranie w polu zteroznakowym z dwoma miejsami po krope. Wskazówka Należy wprowadzić do programu zmienną pomonizą Lizba_Pierwiastkow.
962a78eb15d2230b22be7b0aa45 Rozdział 2. Podejmujemy deyzje w programie 23 Przykładowe rozwiązanie listing 2.3 program Projet1; // Zadanie 2.3 {$APPTYPE CONSOLE} uses SysUtils; a, b,, delta, x1, x2 : Real; Lizba_Pierwiastkow : Byte; // zmienna pomoniza Writeln('Program obliza pierwiastki rownania kwadratowego dla dowolnyh wspolzynnikow a, b,.'); Writeln('Podaj a.'); Readln(a); if (a = 0) then Writeln('Niedozwolona wartos wspolzynnika a. Naisnij klawisz Enter.') else Writeln('Podaj b.'); Readln(b); Writeln('Podaj.'); Readln(); Writeln('Dla wprowadzonyh lizb:'); Writeln('a = ', a:4:2, ','); Writeln('b = ', b:4:2, ','); Writeln(' = ', :4:2, ','); delta := b*b-4*a*; if delta < 0 then Lizba_Pierwiastkow := 0; if delta = 0 then Lizba_Pierwiastkow := 1; if delta > 0 then Lizba_Pierwiastkow := 2; ase Lizba_Pierwiastkow of 0 : Writeln('brak pierwiastkow rzezywistyh.'); 1 : x1 := -b/(2*a); Writeln('trojmian ma jeden pierwiastek podwojny x1 = ', x1:4:2, '.'); 2 : 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, '.');
962a78eb15d2230b22be7b0aa45 24 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Readln; // zeka na naisnieie klawisza Enter Rezultat działania programu dla a = 1, b = 4 i = 4 można zobazyć na rysunku 2.3. Program obliza pierwiastki rownania kwadratowego dla dowolnyh wspolzynnikow a, b,. Podaj a. 1 Podaj b. 4 Podaj. 4 Dla wprowadzonyh lizb: a = 1.00, b = 4.00, = 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 obliza wartość x z równania ax+b =. Wartośi a, b oraz należą do zbioru lizb rzezywistyh i są wprowadzane z klawiatury. Dodatkowo należy zabezpiezyć program na wypadek sytuaji, kiedy wprowadzona wartość a jest równa zero. Dla zmiennyh a, b, oraz x należy przyjąć format wyświetlania ih na ekranie w polu zteroznakowym z dwoma miejsami po krope. Przykładowe rozwiązanie listing 2.4 program Projet1; // Zadanie 2.4 {$APPTYPE CONSOLE}
962a78eb15d2230b22be7b0aa45 Rozdział 2. Podejmujemy deyzje w programie 25 uses SysUtils; a, b,, x : Real; Writeln('Program obliza wartos x z rownania liniowego ax+b =.'); Writeln('Podaj wartos a.'); Readln(a); if (a = 0) then Writeln('Niedozwolona wartos a. Naisnij klawisz Enter.') else Writeln('Podaj wartos b.'); Readln(b); Writeln('Podaj wartos.'); Readln(); x := (-b)/a; Write('Dla: a = ', a:4:2, ','); Write(' b = ', b:4:2, ','); Write(' = ', :4:2, ','); Write(' wartos x jest rowna ',x:4:2, '.'); Readln; // zeka na naisnieie klawisza Enter Rezultat działania programu można zobazyć na rysunku 2.4. Program obliza wartos x z rownania liniowego ax+b =. Podaj wartos a. 1 Podaj wartos b. 2 Podaj wartos. 3 Dla: a = 1.00, b = 2.00, = 3.00, wartos x jest rowna 1.00. Rysunek 2.4. Efekt działania programu Zadanie 2.4
962a78eb15d2230b22be7b0aa45 26 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Z A D A N I E 2.5 Napisz program będąy prostą grą komputerową, w której użytkownik zgaduje lizbę losową z przedziału od 0 do 9 generowaną przez komputer. Wskazówka W programie należy zastosować funkję pseudolosową random(). Przykładowe rozwiązanie listing 2.5 program Projet1; // Zadanie 2.5 {$APPTYPE CONSOLE} uses SysUtils; losuj_lizbe, zgadnij_lizbe : Integer; Writeln('Program losuje lizbe od 0 do 9. Zgadnij ja.'); randomize(); losuj_lizbe := random(10); Readln(zgadnij_lizbe); if zgadnij_lizbe = losuj_lizbe then Writeln('Gratulaje! Zgadles lizbe!') else Writeln('Bardzo mi przykro, ale wylosowana lizba to ', losuj_lizbe, '.'); Readln; // zeka na naisnieie klawisza Enter Za losowanie lizby przez komputer odpowiadają w programie następująe linijki kodu: randomize(); losuj_lizbe := random(10); Funkja random(10) zwraa lizbę pseudolosową z zakresu od 0 do 9 (tj. 10 1). Proedura randomize() inijalizuje generator lizb pseudolosowyh (tzn. ustala jego wartość pozątkową).
962a78eb15d2230b22be7b0aa45 Rozdział 2. Podejmujemy deyzje w programie 27 Rezultat działania programu można zobazyć na rysunku 2.5. Program losuje lizbe od 0 do 9. Zgadnij ja. 9 Bardzo mi przykro, ale wylosowana lizba to 8. Rysunek 2.5. Efekt działania programu Zadanie 2.5
962a78eb15d2230b22be7b0aa45 28 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami
962a78eb15d2230b22be7b0aa45 3 Iteraje W tym rozdziale przedstawimy typowe zadania wraz z rozwiązaniami z wykorzystaniem iteraji, zyli popularnyh pętli. O ile młodzi programiśi nie mają problemu z programami, w któryh zastosowano instrukję for, to zamiana jej na repeat... until oraz while nastręza pewnyh trudnośi. Proste przykłady z użyiem instrukji for zostały wię rozwiązane zarówno z instrukją repeat... until, jak i while. Iteraja (ła. iteratio powtarzanie) to zynność powtarzania (najzęśiej wielokrotnego) tej samej albo wielu różnyh instrukji w pętli. W języku Turbo Pasal istnieją trzy instrukje iterayjne: for... to (downto)... do (dla), repeat... until (powtarzaj), while (dopóki). Instrukja for... to... do określa dokładnie, ile razy zostanie powtórzony dany iąg instrukji. Jej ogólna postać jest następująa: for zmienna := wartość_pozątkowa to wartość_końowa do // iąg instrukji
962a78eb15d2230b22be7b0aa45 30 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Zmienna nazywana jest zmienną sterująą pętlą for. Musi być ona typu ałkowitego, znakowego lub logiznego 1. Podzas wykonywania pętli for instrukja (prosta lub złożona) wyszzególniona po słowie kluzowym do powtarzana jest tyle razy, ile wartośi znajduje się w przedziale wartość_pozątkowa wartość_końowa Instrukja for może również przyjmować inną postać: for zmienna := wartość_pozątkowa downto wartość_końowa do // iąg instrukji Warto pamiętać, że zmienna sterująa przyjmuje tu kolejną wartość mniejszą od wynikająej z przedziału wartość_pozątkowa wartość_końowa Kolejną instrukją iterayjną jest repeat... until. Jej ogólna postać jest następująa: repeat instrukja_1; instrukja_2;... instrukja_n; until warunek; Cehą harakterystyzną tej pętli jest to, że bez względu na wartość warunku musi ona przynajmniej raz zostać wykonana. Wykonywanie instrukji pomiędzy słowami kluzowymi repeat i until końzy się, jeśli warunek osiąga wartość true (prawda). W przeiwnym wypadku instrukje te są ponownie powtarzane. Ostatnią instrukją iterayjną jest while... do. Oto jej ogólna postać: while warunek do instrukja_1; instrukja_2;... instrukja_n; 1 Przykładowo w języku C++, w przeiwieństwie do Turbo Pasala, zmienna sterująa pętlą for nie musi być typu ałkowitego, znakowego lub logiznego. Może być ona również typu np. float.
962a78eb15d2230b22be7b0aa45 Rozdział 3. Iteraje 31 Jej ehą harakterystyzną jest sprawdzenie warunku jeszze przed wykonaniem iągu instrukji poniżej: instrukja_1; instrukja_2;... instrukja_n; W szzególnym przypadku pętla może nie zostać wale wykonana. Instrukja while... do powoduje wykonywanie instrukji instrukja_1; instrukja_2;... instrukja_n; tak długo, dopóki warunek jest spełniony. Z A D A N I E 3.1 Napisz program, który za pomoą instrukji for dla danyh wartośi x zmieniająyh się od 0 do 10 obliza wartość funkji y = 3x. Przykładowe rozwiązanie listing 3.1 program Projet1; // Zadanie 3.1 {$APPTYPE CONSOLE} uses SysUtils; x, y : Integer; Writeln('Program obliza wartos funkji y = 3x dla x zmieniajaego sie od 0 do 10.'); for x := 0 to 10 do y := 3*x; Writeln('x = ', x, #9, 'y = ', y); Readln; // zeka na naisnieie klawisza Enter
962a78eb15d2230b22be7b0aa45 32 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami W pętli for x := 0 to 10 do y := 3*x; Writeln('x = ', x, #9, 'y = ', y); kolejne wartośi x zmieniająe się automatyznie od 0 (wartość_ pozątkowa) do 10 (wartość_końowa) z krokiem równym 1 będą podstawiane do wzoru y := 3*x; a następnie zostaną wyświetlone na ekranie. #9 to znak tabulaji. Rezultat działania programu można zobazyć na rysunku 3.1. Program obliza wartos funkji y = 3x dla x zmieniajaego sie od 0 do 10. x = 0 y = 0 x = 1 y = 3 x = 2 y = 6 x = 3 y = 9 x = 4 y = 12 x = 5 y = 15 x = 6 y = 18 x = 7 y = 21 x = 8 y = 24 x = 9 y = 27 x = 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 pomoą instrukji repeat... until dla danyh wartośi x zmieniająyh się od 0 do 10 obliza wartość funkji y = 3x. Przykładowe rozwiązanie listing 3.2 program Projet1; // Zadanie 3.2 {$APPTYPE CONSOLE}
962a78eb15d2230b22be7b0aa45 Rozdział 3. Iteraje 33 uses SysUtils; x, y : Integer; Writeln('Program obliza wartos funkji y = 3x dla x zmieniajaego sie od 0 do 10.'); x := 0; repeat y := 3*x; Writeln('x = ', x, #9, 'y = ', y); x := x+1; until x > 10; Readln; // zeka na naisnieie klawisza Enter Pętla repeat... until nie posiada wbudowanego mehanizmu zmiany zmiennej sterująej nią, dlatego musimy do niej ten mehanizm dobudować. Rolę zmiennej sterująej pełni tutaj zmienna x. repeat y := 3*x; Writeln('x = ', x, ' x := x+1; until x > 10; y = ', y); 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 przypadku 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 od 10. Zwróćmy uwagę, że warunek sprawdzająy zakońzenie działania pętli, tzn. until x > 10, znajduje się na jej końu. Z A D A N I E 3.3 Napisz program, który za pomoą instrukji while... do dla danyh wartośi x zmieniająyh się od 0 do 10 obliza wartość funkji y = 3x.
962a78eb15d2230b22be7b0aa45 34 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Przykładowe rozwiązanie listing 3.3 program Projet1; // Zadanie 3.3 {$APPTYPE CONSOLE} uses SysUtils; x, y : Integer; Writeln('Program obliza wartos funkji y = 3x dla x zmieniajaego sie od 0 do 10.'); x := 0; while x <= 10 do y := 3*x; Writeln('x = ', x, #9, 'y = ', y); x := x+1; Readln; // zeka na naisnieie klawisza Enter Pętla while... do, podobnie jak repeat... until, nie posiada wbudowanego mehanizmu modyfikaji sterująej nią zmiennej, musimy wię go w nią wbudować. Rolę zmiennej sterująej pełni tutaj x. while x <= 10 do y := 3*x; Writeln('x = ', x, ' x := x+1; y = ', y); 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 przypadku 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 mniejsza bądź równa 10. Zwróćmy uwagę, że warunek sprawdzająy zakońzenie działania pętli, tzn. while x <= 10 do, znajduje się na jej pozątku.
962a78eb15d2230b22be7b0aa45 Rozdział 3. Iteraje 35 Z A D A N I E 3.4 Napisz program, który za pomoą instrukji for wyświetla lizby ałkowite od 1 do 20. Przykładowe rozwiązanie listing 3.4 program Projet1; // Zadanie 3.4 {$APPTYPE CONSOLE} uses SysUtils; i : Integer; Writeln('Program wyswietla lizby alkowite od 1 do 20.'); for i := 1 to 20 do if i < 20 then Write(i, ', ') else Write(i, '.'); Readln; // zeka na naisnieie klawisza Enter Rezultat działania programu można zobazyć na rysunku 3.2. Program wyswietla lizby alkowite 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 pomoą instrukji repeat... until wyświetla lizby ałkowite od 1 do 20. Przykładowe rozwiązanie listing 3.5 program Projet1; // Zadanie 3.5 {$APPTYPE CONSOLE}
962a78eb15d2230b22be7b0aa45 36 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami uses SysUtils; i : Integer; Writeln('Program wyswietla lizby alkowite od 1 do 20.'); i := 0; repeat i := i+1; if i < 20 then Write(i, ', ') else Write(i, '.'); until i >= 20; Readln; // zeka na naisnieie klawisza Enter Z A D A N I E 3.6 Napisz program, który za pomoą instrukji while... do wyświetla lizby ałkowite od 1 do 20. Przykładowe rozwiązanie listing 3.6 program Projet1; // Zadanie 3.6 {$APPTYPE CONSOLE} uses SysUtils; i : Integer; Writeln('Program wyswietla lizby alkowite od 1 do 20.'); i := 0; while i < 20 do i := i+1; if i < 20 then Write(i, ', ') else
962a78eb15d2230b22be7b0aa45 Rozdział 3. Iteraje 37 Write(i, '.'); Readln; // zeka na naisnieie klawisza Enter Z A D A N I E 3.7 Napisz program, który za pomoą instrukji for sumuje lizby ałkowite w przedziale od 1 do 100. Przykładowe rozwiązanie listing 3.7 program Projet1; // Zadanie 3.7 {$APPTYPE CONSOLE} uses SysUtils; i, suma : Integer; Writeln('Program sumuje lizby alkowite w przedziale od 1 do 100.'); suma := 0; for i := 1 to 100 do suma := suma+i; Writeln('Suma lizb alkowityh w przedziale od 1 do 100 wynosi ', suma, '.'); Readln; // zeka na naisnieie klawisza Enter Za sumowanie lizb ałkowityh w przedziale od 1 do 100 odpowiedzialne są następująe linijki kodu: for i := 1 to 100 do suma := suma+i; Ozywiśie przed pętlą zmienna suma musi zostać wyzerowana. suma := 0; Rezultat działania programu można zobazyć na rysunku 3.3.
962a78eb15d2230b22be7b0aa45 38 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Program sumuje lizby alkowite w przedziale od 1 do 100. Suma lizb alkowityh 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 pomoą instrukji repeat... until sumuje lizby ałkowite w przedziale od 1 do 100. Przykładowe rozwiązanie listing 3.8 program Projet1; // Zadanie 3.8 {$APPTYPE CONSOLE} uses SysUtils; i, suma : Integer; Writeln('Program sumuje lizby alkowite w przedziale od 1 do 100.'); suma := 0; i := 0; repeat suma := suma+i; i := i+1; until i > 100; Writeln('Suma lizb alkowityh w przedziale od 1 do 100 wynosi ', suma, '.'); Readln; // zeka na naisnieie klawisza Enter Z A D A N I E 3.9 Napisz program, który za pomoą instrukji while... do sumuje lizby ałkowite w przedziale od 1 do 100. Przykładowe rozwiązanie listing 3.9 program Projet1; // Zadanie 3.9 {$APPTYPE CONSOLE}
962a78eb15d2230b22be7b0aa45 Rozdział 3. Iteraje 39 uses SysUtils; i, suma : Integer; Writeln('Program sumuje lizby alkowite w przedziale od 1 do 100.'); suma := 0; i := 0; while i <= 100 do suma := suma+i; i := i+1; Writeln('Suma lizb alkowityh w przedziale od 1 do 100 wynosi ', suma, '.'); Readln; // zeka na naisnieie klawisza Enter Z A D A N I E 3.10 Napisz program, który za pomoą instrukji for sumuje lizby parzyste w przedziale od 1 do 100. Wskazówka Należy skorzystać z właśiwośi operatora modulo mod. Przykładowe rozwiązanie listing 3.10 program Projet1; // Zadanie 3.10 {$APPTYPE CONSOLE} uses SysUtils; i, suma : Integer; Writeln('Program sumuje lizby parzyste w przedziale od 1 do 100.'); suma := 0;
962a78eb15d2230b22be7b0aa45 40 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami for i := 1 to 100 do if (i mod 2) = 0 then suma := suma+i; Writeln('Suma lizb parzystyh w przedziale od 1 do 100 wynosi ', suma, '.'); Readln; // zeka na naisnieie klawisza Enter Za sumowanie lizb parzystyh z przedziału od 1 do 100 odpowiedzialne są następująe linijki kodu: for i := 1 to 100 do if (i mod 2) = 0 then suma := suma+i; Do tego elu wykorzystaliśmy właśiwośi operatora modulo oznazonego jako mod. Zapis (i mod 2) = 0 oznaza, że w wyniku dzielenia ałkowitego i mod 2 reszta wynosi zero, a wię mamy do zynienia z lizbą parzystą, którą następnie dodajemy do zmiennej suma. Rezultat działania programu można zobazyć na rysunku 3.4. Program sumuje lizby parzyste w przedziale od 1 do 100. Suma lizb parzystyh 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 pomoą instrukji repeat... until sumuje lizby parzyste w przedziale od 1 do 100. Wskazówka Należy skorzystać z właśiwośi operatora modulo mod. Przykładowe rozwiązanie listing 3.11 program Projet1; // Zadanie 3.11 {$APPTYPE CONSOLE} uses SysUtils;
962a78eb15d2230b22be7b0aa45 Rozdział 3. Iteraje 41 i, suma : Integer; Writeln('Program sumuje lizby 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 lizb parzystyh w przedziale od 1 do 100 wynosi ', suma, '.'); Readln; // zeka na naisnieie klawisza Enter Z A D A N I E 3.12 Napisz program, który za pomoą instrukji while... do sumuje lizby parzyste w przedziale od 1 do 100. Wskazówka Należy skorzystać z właśiwośi operatora modulo mod. Przykładowe rozwiązanie listing 3.12 program Projet1; // Zadanie 3.12 {$APPTYPE CONSOLE} uses SysUtils; i, suma : Integer; Writeln('Program sumuje lizby parzyste w przedziale od 1 do 100.'); suma := 0; i := 0; while i <= 100 do
962a78eb15d2230b22be7b0aa45 42 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami if (i mod 2 = 0) then suma := suma+i; i := i+1; Writeln('Suma lizb parzystyh w przedziale od 1 do 100 wynosi ', suma, '.'); Readln; // zeka na naisnieie klawisza Enter Z A D A N I E 3.13 Napisz program, który za pomoą instrukji for sumuje lizby nieparzyste z przedziału od 1 do 100. Wskazówka Należy skorzystać z właśiwośi operatora modulo mod i operatora negaji not. Przykładowe rozwiązanie listing 3.13 program Projet1; // Zadanie 3.13 {$APPTYPE CONSOLE} uses SysUtils; i, suma : Integer; Writeln('Program sumuje lizby 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 lizb nieparzystyh w przedziale od 1 do 100 wynosi ', suma, '.'); Readln; // zeka na naisnieie klawisza Enter
962a78eb15d2230b22be7b0aa45 Rozdział 3. Iteraje 43 Za sumowanie lizb nieparzystyh z przedziału od 1 do 100 odpowiedzialne są następująe linijki kodu: for i := 1 to 100 do if not (i mod 2 = 0) then suma := suma+i; Do tego elu wykorzystaliśmy właśiwośi operatora modulo oznazonego jako mod oraz operatora negaji oznazonego jako not. Operator not przekształa warunek prawdziwy w fałszywy, a fałszywy w prawdziwy. Zapis not (i mod 2) = 0 oznaza, że w wyniku dzielenia ałkowitego zmiennej i mod 2 reszta jest różna od zera, a wię mamy do zynienia z lizbą nieparzystą, którą następnie dodajemy do zmiennej suma. Rezultat działania programu można zobazyć na rysunku 3.5. Program sumuje lizby nieparzyste w przedziale od 1 do 100. Suma lizb nieparzystyh 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 pomoą instrukji repeat... until sumuje lizby nieparzyste z przedziału od 1 do 100. Wskazówka Należy skorzystać z właśiwośi operatora modulo mod i operatora negaji not. Przykładowe rozwiązanie listing 3.14 program Projet1; // Zadanie 3.14 {$APPTYPE CONSOLE} uses SysUtils; i, suma : Integer; Writeln('Program sumuje lizby nieparzyste w przedziale od 1 do 100.'); suma := 0; i := 0;
962a78eb15d2230b22be7b0aa45 44 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami repeat if not (i mod 2 = 0) then suma := suma+i; i := i+1; until i > 100; Writeln('Suma lizb nieparzystyh w przedziale od 1 do 100 wynosi ', suma, '.'); Readln; // zeka na naisnieie klawisza Enter Z A D A N I E 3.15 Napisz program, który za pomoą instrukji while... do sumuje lizby nieparzyste z przedziału od 1 do 100. Wskazówka Należy skorzystać z właśiwośi operatora modulo mod i operatora negaji not. Przykładowe rozwiązanie listing 3.15 program Projet1; // Zadanie 3.15 {$APPTYPE CONSOLE} uses SysUtils; i, suma : Integer; Writeln('Program sumuje lizby nieparzyste w przedziale od 1 do 100.'); suma := 0; i := 0; while i <= 100 do if not (i mod 2 = 0) then suma := suma+i; i := i+1;
962a78eb15d2230b22be7b0aa45 Rozdział 3. Iteraje 45 Writeln('Suma lizb nieparzystyh w przedziale od 1 do 100 wynosi ', suma, '.'); Readln; // zeka na naisnieie klawisza Enter Z A D A N I E 3.16 Napisz program, który za pomoą instrukji for znajduje największą i najmniejszą lizbę ze zbioru n ałkowityh lizb losowyh (w programie ilos_lizb = 5) z przedziału od 0 do 99 oraz obliza średnią ze zbioru wszystkih wylosowanyh lizb. Przykładowe rozwiązanie listing 3.16 program Projet1; // Zadanie 3.16 {$APPTYPE CONSOLE} uses SysUtils; onst ilos_lizb = 5; i, lizba, suma, min, max : Integer; Writeln('Program losuje ', ilos_lizb, ' lizb alkowityh z przedzialu od 0 do 99,'); Writeln('a nastepnie znajduje najmniejsza i najwieksza'); Writeln('oraz obliza srednia ze wszystkih wylosowanyh lizb.'); suma := 0; Randomize(); min := Random(100); Writeln; Write('Wylosowano lizby: '); Write(min, ', '); max := min; suma := suma+max; for i := 1 to ilos_lizb-1 do lizba := Random(100); if i < ilos_lizb-1 then Write(lizba, ', ')
962a78eb15d2230b22be7b0aa45 46 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami else Write(lizba, '.'); if max < lizba then max := lizba; if lizba < min then min := lizba; suma := suma+lizba; Writeln; Writeln('Najwieksza lizba to ', max, '.'); Writeln('Najmniejsza lizba to ', min, '.'); Writeln('Srednia wynosi ', suma/ilos_lizb:4:2, '.'); Readln; // zeka na naisnieie klawisza Enter Najpierw losujemy w programie pierwszą lizbę i przypisujemy jej wartość min. min := Random(100); W kolejnym kroku wartośi max nadajemy wartość min. max := min; Następnie w pętli pomniejszonej o 1 (pierwsza lizba została już wylosowana): for i := 1 to ilos_lizb-1 do lizba := Random(100); if i < ilos_lizb-1 then Write(lizba, ', ') else Write(lizba, '.'); if max < lizba then max := lizba; if lizba < min then min := lizba; suma := suma+lizba; sprawdzamy, zy kolejna wylosowana lizba jest większa od poprzedniej. Jeśli tak, to staje się ona największą lizbą (max); w przeiwnym wypadku przypisujemy jej wartość min. Ilustrują to następująe linijki kodu:
962a78eb15d2230b22be7b0aa45 Rozdział 3. Iteraje 47 if max < lizba then max := lizba; if lizba < min then min := lizba; Sumę wszystkih lizb wylizają następująe linijki kodu: suma := suma+max (przed pętlą) i suma := suma+lizba (w pętli). Średnia ze wszystkih wylosowanyh lizb jest natomiast oblizana i wyświetlana na ekranie przez następująa linijkę: Writeln('Srednia wynosi ', suma/ilos_lizb:4:2, '.'); Rezultat działania programu dla przykładowyh wylosowanyh lizb można zobazyć na rysunku 3.6. Program losuje 5 lizb alkowityh z przedzialu od 0 do 99, a nastepnie znajduje najmniejsza i najwieksza oraz obliza srednia ze wszystkih wylosowanyh lizb. Wylosowano lizby: 22, 57, 77, 29, 16. Najwieksza lizba to 77. Najmniejsza lizba 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 pomoą instrukji repeat... until znajduje największą i najmniejszą lizbę ze zbioru n ałkowityh lizb losowyh (w programie ilos_lizb = 5) z przedziału od 0 do 99 oraz obliza średnią ze zbioru wszystkih wylosowanyh lizb. Przykładowe rozwiązanie listing 3.17 program Projet1; // Zadanie 3.17 {$APPTYPE CONSOLE} uses SysUtils; onst ilos_lizb = 5;
962a78eb15d2230b22be7b0aa45 48 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami i, lizba, suma, min, max : Integer; Writeln('Program losuje ', ilos_lizb, ' lizb alkowityh z przedzialu od 0 do 99,'); Writeln('a nastepnie znajduje najmniejsza i najwieksza'); Writeln('oraz obliza srednia ze wszystkih wylosowanyh lizb.'); suma := 0; i := 0; Randomize(); min := Random(100); Writeln; Write('Wylosowano lizby: '); Write(min,', '); max := min; suma := suma+max; repeat lizba := Random(100); if i < ilos_lizb-2 then Write(lizba, ', ') else Write(lizba, '.'); if max < lizba then max:= lizba; if lizba < min then min := lizba; suma := suma+lizba; i := i+1; until (i = ilos_lizb-1); Writeln; Writeln('Najwieksza lizba to ', max, '.'); Writeln('Najmniejsza lizba to ', min, '.'); Writeln('Srednia wynosi ', suma/ilos_lizb:4:2, '.'); Readln; // zeka na naisnieie klawisza Enter
962a78eb15d2230b22be7b0aa45 Rozdział 3. Iteraje 49 Z A D A N I E 3.18 Napisz program, który za pomoą instrukji while... do znajduje największą i najmniejszą lizbę ze zbioru n ałkowityh lizb losowyh (w programie ilos_lizb = 5) z przedziału od 0 do 99 oraz obliza średnią ze zbioru wszystkih wylosowanyh lizb. Przykładowe rozwiązanie listing 3.18 program Projet1; // Zadanie 3.18 {$APPTYPE CONSOLE} uses SysUtils; onst ilos_lizb = 5; i, lizba, suma, min, max : Integer; Writeln('Program losuje ', ilos_lizb, ' lizb alkowityh z przedzialu od 0 do 99,'); Writeln('a nastepnie znajduje najmniejsza i najwieksza'); Writeln('oraz obliza srednia ze wszystkih wylosowanyh lizb.'); suma := 0; i := 1; Randomize(); min := Random(100); Writeln; Write('Wylosowano lizby: '); Write(min, ', '); max := min; suma := suma+max; while (i <= ilos_lizb-1) do lizba:= Random(100); if i < ilos_lizb-1 then Write(lizba, ', ') else Write(lizba, '.'); if max < lizba then max := lizba; if lizba < min then
962a78eb15d2230b22be7b0aa45 50 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami min := lizba; suma := suma+lizba; i := i+1; Writeln; Writeln('Najwieksza lizba to ', max, '.'); Writeln('Najmniejsza lizba to ', min, '.'); Writeln('Srednia wynosi ', suma/ilos_lizb:4:2, '.'); Readln; // zeka na naisnieie klawisza Enter Z A D A N I E 3.19 Napisz program wyświetlająy tablizkę mnożenia dla lizb od 1 do 100 z wykorzystaniem podwójnej pętli for. Przykładowe rozwiązanie listing 3.19 program Projet1; // Zadanie 3.19 {$APPTYPE CONSOLE} uses SysUtils; onst n = 10; wiersze, kolumny : Integer; Writeln('Program wyswietla tablizke mnozenia dla lizb od 1 do 100.'); Writeln; for wiersze := 1 to n do for kolumny := 1 to n do Write(wiersze*kolumny, #9); Writeln; Readln; // zeka na naisnieie klawisza Enter
962a78eb15d2230b22be7b0aa45 Rozdział 3. Iteraje 51 Rezultat działania programu można zobazyć na rysunku 3.7. Program wyswietla tablizke mnozenia dla lizb 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ąy tablizkę mnożenia dla lizb od 1 do 100 z wykorzystaniem podwójnej pętli repeat... until. Przykładowe rozwiązanie listing 3.20 program Projet1; // Zadanie 3.20 {$APPTYPE CONSOLE} uses SysUtils; onst n = 10;
962a78eb15d2230b22be7b0aa45 52 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami wiersze, kolumny : Integer; Writeln('Program wyswietla tablizke mnozenia dla lizb 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; // zeka na naisnieie klawisza Enter Z A D A N I E 3.21 Napisz program wyświetlająy tablizkę mnożenia dla lizb od 1 do 100 z wykorzystaniem podwójnej pętli while... do. Przykładowe rozwiązanie listing 3.21 program Projet1; // Zadanie 3.21 {$APPTYPE CONSOLE} uses SysUtils; onst n = 10; wiersze, kolumny : Integer; Writeln('Program wyswietla tablizke mnozenia dla lizb od 1 do 100.'); Writeln; wiersze := 1; while (wiersze <= n) do kolumny := 1;
962a78eb15d2230b22be7b0aa45 Rozdział 3. Iteraje 53 while (kolumny <= n) do Write(wiersze*kolumny, #9); kolumny := kolumny+1; Writeln; wiersze := wiersze+1; Readln; // zeka na naisnieie klawisza Enter Z A D A N I E 3.22 Napisz program, który wyświetla duże litery alfabetu od A do Z i od Z do A z wykorzystaniem pętli for. Przykładowe rozwiązanie listing 3.22 program Projet1; // Zadanie 3.22 {$APPTYPE CONSOLE} uses SysUtils; znak : har; 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; // zeka na naisnieie klawisza Enter
962a78eb15d2230b22be7b0aa45 54 Turbo Pasal. Zadania z programowania z przykł adowymi rozwiązaniami Rezultat działania programu można zobazyć 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 do Z i od Z do A z wykorzystaniem pętli repeat... until. Przykładowe rozwiązanie listing 3.23 program Projet1; // Zadanie 3.23 {$APPTYPE CONSOLE} uses SysUtils; znak : har; Writeln('Program wyswietla duze litery alfabetu od A do Z i od Z do A.'); Writeln; znak := 'A'; Write(znak, ', '); repeat znak := su(znak); if znak < 'Z' then Write(znak, ', ') else Write(znak, '.'); until znak = 'Z'; Writeln; znak := 'Z'; Write(znak, ', ');