Temat 7 program Zapisywanie algorytmów w języku programowania wysokiego poziomu 1. Język programowania 1.1. Klasyfikacja języków programowania 2. Struktura programu w języku Pascal 3. Etapy programowania 3.1. 3.2. 3.3. 3.4. Implementacja algorytmu Kompilacja programu Uruchomienie i wykonanie programu Testowanie programu 4. Problemy z błędami kompilacji i wykonania 5. Zapis algorytmu z warunkami w języku Pascal 5.1. Warunek prosty 5.2. Warunek zagnieżdżony 6. Realizacja algorytmów iteracyjnych w Pascalu 6.1. Pętle proste 6.2. Pętle zagnieżdżone Warto powtórzyć 1. Wyjaśnij pojęcia: język programowania, program komputerowy, instrukcja, słowo kluczowe. 2. Omów ogólne zasady tworzenia programu w pseudojęzyku. 3. Przedstaw na konkretnym przykładzie postać i działanie instrukcji warunkowej i iteracyjnej w pseudojęzyku. 58 Temat 7 1. Język programowania Do przedstawiania algorytmów w postaci programów służą języki programowania. Tylko algorytm zapisany w postaci programu komputerowego w konkretnym języku programowania może być zrealizowany przez komputer. Każdy język programowania posiada swój zbiór instrukcji, w tym słowa kluczowe. Podobnie jak języki naturalne, którymi posługują się ludzie na całym świecie, języki programowania posiadają odpowiednie zasady składni oraz właściwe słownictwo. Każdy język naturalny dysponuje własnymi słowami, służącymi określaniu czynności i nazywaniu rzeczy. Podobnie jest też z językami programowania. W każdym działają na podobnych zasadach instrukcje, które określają takie czynności, jak: wprowadzanie danych, wyprowadzanie wyników, wykonywanie obliczeń, określanie warunków czy realizacja powtórzeń. Ich postać jest zazwyczaj inna dla różnych języków. Inne są też konkretne zasady składni, ale ogólne zasady działania tych instrukcji są podobne. Język programowania = zasady składni + instrukcje Niezależnie od stosowanego języka programowania należy pamiętać, że: • Język programowania jest językiem formalnym, co oznacza, że podlega jednoznacznym regułom. Cechy takiej nie mają języki naturalne, gdzie czasem sens zdania zależy od kontekstu, w którym zostało ono użyte, lub od naszej interpretacji. • Postać instrukcji, w tym słów kluczowych, musi być bardzo precyzyjna – zgodna z zasadami składni. W programie nie może zabraknąć ani jednego koniecznego znaku. Tłumaczenie programu na kod maszynowy połączone jest ze sprawdzaniem poprawności składniowej zapisanych instrukcji. Instrukcje błędnie zapisane nie będą mogły zostać przetłumaczone, a tym samym program nie zostanie wykonany. • Kolejność zapisywania instrukcji powinna odpowiadać kolejności operacji realizujących dany algorytm (podobnie jak umieszczanie bloków w schemacie blokowym). Program jest bowiem wykonywany zgodnie z zapisem. 1.1. Klasyfikacja języków programowania Czy wiesz, że… opublikowano już ponad 2000 języków programowania! Obecnie wciąż powstają na świecie nowe języki programowania oraz zmodyfikowane wersje już istniejących. Mogą one być przeznaczone do realizowania określonego typu zadań bądź też niektóre z zadań lepiej realizować w danym, konkretnym języku. Na przykład w ostatnim czasie pojawiło się wiele nowych języków programowania przeznaczonych do tworzenia stron internetowych. Niektóre języki można sklasyfikować na kilka sposobów. Język Pascal np. należy do języków wysokiego poziomu, jest także językiem strukturalnym (chociaż funkcjonuje również jego wersja obiektowa), kompilowanym oraz uniwersalnym (szerokie spektrum zastosowania). Na przykładzie tego języka omówimy metody programowania i związane z nimi pojęcia. Rodzaj podziału poziom wykonywania programu sposób wykonania Opis Przykład wysokiego poziomu Pascal, C i inne wymienione w tej tabeli poza assemblerami niskiego poziomu (poziom maszynowy) assemblery interpretowane Basic, JavaScript, PHP, LOGO kompilowane Pascal, C, C++, Java Temat 7 zastosowanie model programowania tworzenie aplikacji internetowych Java, JavaScript, PHP dostęp do baz danych SQL obliczenia matematyczne Fortran dydaktyczne LOGO inne (uniwersalne) Pascal, C, C++ programowanie wizualne Visual C, Visual Basic, Delphi, Kylix opis danych PostScript, HTML, XML tworzenie aplikacji współbieżnych Ada, Occam przetwarzanie tekstu PERL, REXX, Python programowanie sztucznej inteligencji LISP, Prolog programowanie grafiki OpenGL liniowe BASIC, Fortran strukturalne Pascal, C zdarzeniowe Visual Basic obiektowe C++, Object Pascal, Java Można by wskazać znacznie więcej klasyfikacji języków programowania. Stopniowo będziemy wyjaśniać znaczenie klasyfikacji wymienionych w tabeli. 2. Struktura programu w języku Pascal Konstrukcja prostego programu w języku Pascal jest podobna do struktury programu w pseudojęzyku (temat 4) i obejmuje: I. nagłówek programu, II. blok główny, a w nim część deklaracyjną i część wykonawczą. W części deklaracyjnej deklarujemy m.in. stosowane w programie zmienne (podajemy ich nazwy i typy). Część wykonawcza programu (inaczej program główny) to zapisany w postaci instrukcji (procedur) algorytm. Rozpoczyna się słowem begin, a kończy – end (koniecznie z kropką!). Przykład 1 Program źródłowy w języku Pascal, realizujący algorytm obliczania średniej arytmetycznej z trzech liczb, ma postać podobną do programu w pseudojęzyku (patrz przykład 1 w temacie 4): program Srednia; var a, b, c, S, Sr: real; begin Readln(a, b, c); S := a + b + c; Sr := S/3; Writeln(’Średnia wynosi:’, Sr); end. {nagłówek programu} {część deklaracyjna} {zmienne zadeklarowane jako liczby rzeczywiste (real)} {część wykonawcza} {rozpoczęcie programu} {wprowadzanie danych} {obliczenie sumy} {obliczenie średniej} {wyprowadzanie komunikatów i wyników} {zakończenie programu} 59 Rys. 1. Przykłady klasyfikacji języków programowania 60 Temat 7 Słowa kluczowe/ instrukcje/procedury Opis słowo kluczowe program, rozpoczynające nagłówek programu Po słowie program występuje nazwa programu. instrukcja złożona Może wystąpić w programie wiele razy. Grupuje ciąg instrukcji, tworząc zamiast nich jedną. Stosuje się ją wówczas, gdy składnia języka wymaga użycia jednej instrukcji, np. w instrukcji pętli. Rozpoczyna i kończy blok główny programu. Za słowem kluczowym begin nie stawia się średnika; natomiast kropką kończy się tylko jedno (ostatnie) end, pozostałe zaś średnikiem. słowo kluczowe var rozpoczynające deklarację zmiennych Może wystąpić kilka nazw zmiennych oddzielonych przecinkiem. Opis typu określa zbiór wartości przyjmowanych przez zmienne, np. liczby rzeczywiste, całkowite, naturalne, znaki. Write(lista argumentów); lub Writeln(lista argumentów); procedura wyprowadzania wyników na standardowe wyjście, np. na ekran monitora Argumentem może być tekst, wyrażenie arytmetyczne lub zmienna – oddzielone przecinkami. Wyrażenie najpierw zostanie obliczone, a następnie zostanie wyprowadzona jego wartość. Wpisujemy je w nawiasach. Procedura writeln różni się tym od write, że po wykonaniu procedury writeln następuje przejście do nowego wiersza. Read(lista zmiennych); lub Readln(lista zmiennych); procedura wprowadzania (czytania) danych ze standardowego wejścia, np. z klawiatury Może wystąpić kilka nazw zmiennych oddzielonych przecinkami. Wpisujemy je w nawiasach. program nazwa_programu; begin ciąg instrukcji; end; lub begin ciąg instrukcji; end. var lista zmiennych: opis typu; Nazwa_zmiennej := wyrażenie; instrukcja przypisania If wyrażenie then instrukcja1 else instrukcja2; lub for zmienna := w1 to w2 do instrukcja; lub for zmienna := w1 downto w2 do instrukcja; Zmiennej po stronie lewej zostanie przypisana wartość wyrażenia obliczona po stronie prawej. Wartość wyrażenia musi być zgodna z typem zmiennej, np. do zmiennej typu całkowitego nie można przypisać wartości rzeczywistej. instrukcja warunkowa Wyrażenie powinno przyjmować wartości logiczne True (prawda) lub False (fałsz). Jako instrukcja1 i instrukcja2 mogą wystąpić również instrukcje warunkowe lub instrukcja złożona begin...end. instrukcja iteracyjna (pętli) „dla” Zmienna jest tzw. zmienną sterującą w pętli. Jako instrukcja może wystąpić również instrukcja pętli lub instrukcja złożona begin...end (przykład 6). If wyrażenie then instrukcja1; Rys. 2. Przykłady podstawowych poleceń w języku Pascal Uwagi Temat 7 61 3. Etapy programowania Programowanie można podzielić na cztery etapy: I. implementację algorytmu, II. kompilację programu, III. uruchomienie i wykonanie programu, IV. testowanie programu. Narzędziami pomocnymi w ich realizacji mogą być: edytory narzędziowe (do implementacji), kompilatory (do kompilacji) lub interpretery (do interpretacji), debuggery (do śledzenia i testowania). Większość rozbudowanych środowisk programistycznych posiada wszystkie te narzędzia. Przebieg etapów programowania pokażemy na przykładzie kompilatora języka Turbo Pascal. 3.1. Implementacja algorytmu Zapisanie algorytmu w postaci ciągu instrukcji języka programowania wysokiego poziomu nazywamy implementacją. Powstaje wówczas tzw. program (kod) źródłowy. Algorytm można zaimplementować w dowolnym edytorze tekstu, ale najwygodniej jest skorzystać z edytora wbudowanego do programu kompilatora danego języka. Program (kod) źródłowy – algorytm zapisany za pomocą instrukcji programowania. Przykład 2 Napisz program, który umożliwi zapisanie na ekranie monitora tekstu: „pierwszy program”. Program w języku Pascal: program Napis; begin Writeln(’pierwszy program’); end. Uwaga: Po każdej instrukcji powinien być umieszczony średnik. Pominąć można jedynie średnik za instrukcją zapisaną bezpośrednio przed słowem end kończącym program. Ćwiczenie 1 Wpisz powyższy tekst programu w oknie edytora Turbo Pascala. Zapisz program w pliku o nazwie Pierwszy we własnym folderze. W trakcie pisania programu należy pamiętać o jego nazwaniu i zapisaniu w pliku. Implementacja – zapisanie algorytmu w postaci kodu źródłowego. Pakiet Turbo Pascala to zintegrowany system oprogramowania, w skład którego wchodzą m.in. kompilator, edytor tekstu, narzędzie do śledzenia wykonywania programu (debugger). Rys. 3. Okno edytora w języku Turbo Pascal wraz z wpisanym programem przykładowym Wskazówki: Po uruchomieniu pakietu Turbo Pascala otwiera się zazwyczaj nowe okno edytora Pascala, w którym wpisuje się tekst programu. Posługiwanie się tym edytorem jest bardzo łatwe, mimo że jest to program w wersji angielskiej, działający w środowisku MS DOS. Wybór opcji menu jest podobny do menu w programach działających w środowisku Windows, np. zapisywanie pliku – File (odpowiednik opcji Plik). W jednym oknie należy wpisać tekst tylko jednego programu. 62 Temat 7 3.2. Kompilacja programu Program źródłowy, który utworzyliśmy i zapisaliśmy w pliku (ćwiczenie 1), nie może być wykonywany przez komputer (procesor). Procesor bowiem nie może wykonać dokumentu tekstowego (w takim właśnie formacie zapisany jest program źródłowy). Pisząc program w języku programowania, przygotowujemy jedynie źródło do utworzenia kodu maszynowego, czyli programu rozumianego przez komputer. Komputer, a dokładniej procesor, wykonuje program w kodzie maszynowym (w języku wewnętrznym procesora). Tworzenie programów w takim języku jest bardzo trudne (patrz przykład na rys. 4), czasem wręcz niemożliwe. Dlatego programiści używają języków zrozumiałych dla człowieka. Język wysokiego poziomu charakteryzuje się przejrzystą strukturą; nie zależy od architektury komputera. Język niskiego poziomu posługuje się instrukcjami, które odpowiadają danym instrukcjom konkretnego procesora. Kod maszynowy – program napisany w języku wewnętrznym (maszynowym), rozumianym przez procesor. Interpretacja – tłumaczenie programu źródłowego na kod maszynowy instrukcja po instrukcji. Tłumaczenie następuje przy każdorazowym uruchomieniu programu. Program może występować w dwóch postaciach: · jako program źródłowy – postać zrozumiała dla programisty, · jako kod maszynowy (program wykonywalny) – zapisany w języku maszynowym, zrozumiałym dla komputera. Program napisany w języku wysokiego poziomu (w naszym przypadku w Pascalu) musi zostać przetłumaczony na język niskiego poziomu (język wewnętrzny komputera). Proces ten nazywamy translacją (z ang. translate – tłumaczyć). Może ona przebiegać w formie kompilacji lub interpretacji, a używa się do tego celu specjalnego programu do tłumaczenia programu na kod maszynowy – translatora. Programy tłumaczące, czyli translatory, dzielą się na: · interpretery – każde polecenie programu jest po jego uruchomieniu na bieżąco zamieniane na kod maszynowy, · kompilatory – cały program jest przekładany na kod maszynowy. Przykładem języka interpretowanego (interpretera) jest język LOGO (patrz tabela – rys. 1), który często omawialiśmy na lekcjach informatyki w gimnazjum. W zadaniach rozwiązywanych w tym podręczniku będziemy używać m.in. kompilatora języka Turbo Pascal. Program w kodzie maszynowym (rys. 4) składa się z ciągu wartości binarnych, które oznaczają zarówno instrukcje, jak i dane. Postać kodu maszynowego zależy od procesora, na który dany Kompilacja – tłumaczenie programu źródłowego na kod maszynowy. Raz skompilowany program nie wymaga już powtórnego tłumaczenia. Program źrółówy Aktualnie wykonywana instrukcja Rys. 4. Program w języku wysokiego poziomu (Pascal) oraz ten sam fragment programu w kodzie maszynowym i w assemblerze Program wynikowy w assemblerze Temat 7 63 program jest przeznaczony. Język maszynowy jest językiem niskiego poziomu. Elementy tego języka odwzorowują architekturę komputera – instrukcje zależą od tego, jaki mamy komputer – program nie będzie działał na innym sprzęcie. Natomiast język Pascal należy do języków wysokiego poziomu – na każdym komputerze działa tak samo; im bardziej zbliżony jest do języka naturalnego, tym jego poziom jest wyższy. Ćwiczenie 2 Skompiluj program utworzony w ćwiczeniu 1. Wskazówki: Aby skompilować program, wybieramy opcję Compile. Rys. 5. Po udanym zakończeniu kompilacji pojawi się informacja w takim oknie 3.3. Uruchomienie i wykonanie programu Uruchomiony i wykonywany może być program, który jest skompilowany poprawnie. W trakcie wykonywania programu procesor rozpoznaje i wykonuje instrukcje swojego wewnętrznego języka. W jednej z części procesora – arytmometrze – są wykonywane operacje arytmetyczne (patrz więcej – temat 16). Po wykonaniu programu wyniki pojawią się na wybranym urządzeniu zewnętrznym. W naszym przypadku – na ekranie monitora, ale mogą być również wyprowadzone do pliku (czyli w nim zapisane) lub wydrukowane. Rys. 6. Na ekranie monitora widoczny jest efekt wykonania programu w postaci zapisu „Pierwszy program” Ćwiczenie 3 Uruchom swój pierwszy program. Wskazówki: Należy wybrać opcję Run – program zostanie uruchomiony i wykonany. Jeśli wcześniej nie wykonasz kompilacji, to wybranie opcji Run spowoduje, że i tak zostanie ona przeprowadzona. 3.4. Testowanie programu Prosty program, który tworzyliśmy w pierwszych ćwiczeniach, nie wymaga praktycznie testowania. Efektem działania tego programu było wyprowadzenie tekstu na ekran monitora. Program trudniejszy, w którym występuje wiele zmiennych i różne na nich działania, należy przetestować – prześledzić jego działanie dla kilku różnych wartości zmiennych. Podobnie postępowaliśmy w przypadku prezentacji algorytmu w postaci listy kroków czy schematu blokowego. Uwaga: Aby zobaczyć efekt wykonania programu, trzeba nacisnąć Alt + F5, bo po wykonaniu programu bardzo szybko następuje powrót do edytora i na ekranie nie widać wyprowadzonych wyników. Ćwiczenie 4 Wpisz w oknie edytora Pascala tekst programu z przykładu 1. Skompiluj i uruchom ten program. Sprawdź jego działanie dla różnych wartości zmiennych. Wskazówki: 1. Możesz skorzystać z pliku tego programu zapisanego na CD. 2. Pamiętaj, że procedura Readln czyta dane z klawiatury, więc w momencie jej realizacji następuje zatrzymanie wykonywania programu i oczekiwanie na wprowadzenie danych z klawiatury. Aby prześledzić wykonywanie programu, można skorzystać z gotowego narzędzia – tzw. debuggera – często wbudowywanego do programu kompilatora. Nazywa się go też „odpluskwiaczem” (z ang. bug – pluskwa). Nazwa debugger powstała w 1945 roku. Wyniknęła z faktu, że w przekaźnikach używanego wówczas elektromechanicznego komputera Mark II zagnieździły się... karaluchy. 64 Temat 7 4. Problemy z błędami kompilacji i wykonania Ćwiczenie 5 1. Przepisz dokładnie program w podanej postaci i wykonaj jego kompilację. program Test begin Writeln(’drugi program’) end 2. W oknie edytora pojawi się opis błędu (”;” expected – oznacza, że brakuje średnika po nazwie programu). Popraw program, wstawiając ten średnik. Skompiluj ponownie. 3. Program jest sprawdzany od początku, ale kompilator wykrył kolejny błąd – Unexpected end of file. Jak sądzisz, jaki to błąd? Można spotkać się z następującymi rodzajami błędów: Błędy kompilacji – wykrywane w czasie kompilacji, np. błędnie zapisane słowo kluczowe, zła postać instrukcji, źle wstawiony znak interpunkcyjny lub jego brak. Wśród błędów wykrywanych podczas kompilacji są też błędy syntaktyczne – np. zastosowanie zbyt wielu wyjść z instrukcji (warunkowej). Błędy wykonania – np. dzielenie przez zero, brak wolnej pamięci, brak dostępu do pliku. Błędy te nie są wykrywane podczas kompilacji, a dopiero w trakcie wykonywania programu (są to sytuacje, w których kontynuacja wykonania programu nie jest możliwa). Błędy logiczne (specyfikacji) – np. zapętlenie programu, nieokreślone wartości zmiennych; przy wprowadzaniu pewnych wartości zmiennych program działa dobrze, przy wprowadzaniu innych – źle. Ogólnie program nie robi tego, czego się od niego oczekuje. Błędy te nie są wykrywane podczas kompilacji. Niemożliwe jest automatyczne wykrycie takiego błędu, ponieważ komputer nie wie, co tak naprawdę chcemy osiągnąć. 5. Zapis algorytmu z warunkami w języku Pascal 5.1. Warunek prosty Postać instrukcji warunkowej w języku Pascal jest podana w tabeli na rys. 2. Wyrażenie, które występuje po słowie kluczowym if, może być warunkiem logicznym prostym, np. x > 0, a <> 9, liczba <= -5, lub złożonym, np. (x > -5) and (y >= 0). W przypadku warunku złożonego potrzebne są nawiasy. Stosujemy następujące operatory logiczne: = (równy), > (większy) < (mniejszy), >= (większy lub równy), <= (mniejszy lub równy), <> różny, or (alternatywa), and (koniunkcja), not (negacja). Podajemy dwie formy instrukcji warunkowej (patrz tabela na rys. 2). W tej, w której brak części zaczynającej się od słowa else, w przypadku niespełnienia warunku jest wykonywana od razu kolejna instrukcja zapisana po instrukcji warunkowej. Przykład 3 Algorytm znajdowania wartości bezwzględnej liczby rzeczywistej. Uwagi: 1. Aby ekran monitora był wyczyszczony przed każdorazowym uruchomieniem programu, można skorzystać ze standardowej procedury bez parametrów ClrScr, którą należy zapisać na początku programu. Procedura ta zdefiniowana jest w standardowym module Crt, dlatego w części deklaracyjnej dodajemy: uses Crt. Temat 7 2. W nazwie programu i nazwach zmiennych należy stosować tylko litery i cyfry, gdyż nie mogą występować w nich tzw. znaki specjalne, takie jak spacja, „:”, „%”, „*” ). Spację zastępuje się znakiem podkreślenia. W nazwach nie stosujemy polskich znaków diakrytycznych; wielkie i małe litery są nierozróżnialne, np. nazwa suma oznacza to samo, co Suma. Polskie litery można stosować tylko w napisach, np. w procedurze Writeln. program Liczba_bezwgledna; uses Crt; var x,w: real; begin ClrScr; readln(x); if x >= 0 then w := x else w := -x; Writeln(’wartość bezwzględna liczby x =’, w); end. Ćwiczenie 6 Przepisz program podany w przykładzie 3, korzystając z kompilatora Pascala. Zapisz program w pliku, a następnie porównaj go z zapisem tego samego algorytmu w postaci listy kroków (patrz przykład 5 w temacie 1), zwracając uwagę na zapis instrukcji warunkowej. Skompiluj i wykonaj program dla kilku różnych wartości zmiennych. 5.2. Warunek zagnieżdżony Realizację algorytmów zawierających warunki zagnieżdżone prezentowaliśmy w postaci listy kroków i schematów blokowych (temat 3) oraz w pseudojęzyku (temat 4). Instrukcje warunkowe „if” również mogą się zagnieżdżać. Należy przestrzegać zasady, że każda część else przyporządkowana jest najbliższej, poprzedzającej ją części then. Przykład 4 Algorytm wyboru najmniejszej z trzech liczb całkowitych. Uwagi: 1. Zmienne zostały zadeklarowane jako liczby typu całkowitego – integer; do typu integer należą liczby z zakresu od -32768 do 32767. 2. W przypadku instrukcji zagnieżdżonych zaleca się pisać słowo kluczowe else bezpośrednio pod odpowiadającym mu słowem then (dla zachowania czytelności). 3. Tylko „zewnętrzna” instrukcja warunkowa powinna kończyć się średnikiem. 4. Umieszczenie pod koniec programu procedury Readln bez parametrów spowoduje, że powrót do okna edytora nastąpi dopiero po naciśnięciu klawisza Enter. program Minimum; uses Crt; var a, b, c, min: integer; begin ClrScr; Writeln(’podaj trzy liczby’); Readln(a, b, c); if a < b then if a < c then min := a else min := c else if b < c then min := b else min := c; Writeln(’minimum wynosi =’, min); Readln; end. Ćwiczenie 7 Przepisz program podany w przykładzie 4, korzystając z kompilatora Pascala. Zapisz program w pliku. Zwróć uwagę na zapis zagnieżdżonych instrukcji warunkowych. Skompiluj i uruchom program. Przetestuj go dla następujących wartości zmiennych: (3; -56; 0), (76; 123; -2), (44; 44; 44); (-70; -40; -40), (56; 68; 88), (100; 0; 2). 65 66 Temat 7 6. Realizacja algorytmów iteracyjnych w Pascalu 6.1. Pętle proste Programy komputerowe tworzy się dla czynności wielokrotnie powtarzanych, stąd znaczenie instrukcji pętli w programowaniu jest bardzo duże. Postać instrukcji iteracyjnej for w języku Pascal została podana w tabeli na rys. 2. Instrukcję tę stosujemy, gdy liczba kroków iteracji jest znana. Dokładne jej działanie zostało omówione w temacie 4 na przykładzie odpowiadającej jej instrukcji DLA w pseudojęzyku. Pozostałe dwie instrukcje iteracyjne Pascala, w których nie trzeba z góry określać liczby powtórzeń, zostaną omówione w temacie 10. Wartość w1 i w2 musi być zgodna w sensie przypisania z typem zmiennej sterującej. Ponadto w postaci ze słowem kluczowym do powinien być spełniony warunek: w1 <= w2, a w postaci ze słowem kluczowym downto – odwrotnie. Instrukcja pętli może mieć postać: for i := 1 to k do Writeln(’x’) lub for i := 1 to n + 1 do Writeln(’x’) lub for i := 20 downto 1 do Writeln(’x’). program Obliczanie_iloczynu; uses Crt; var i, n, iloczyn: word; begin ClrScr; iloczyn := 1; Writeln(’podaj liczbę danych’); Readln(n); for i := 1 to n do iloczyn := iloczyn*i; Writeln(’iloczyn = ’, iloczyn); Readln; end. Przykład 5 Algorytm obliczania iloczynu n kolejnych liczb naturalnych (począwszy od 1). Uwagi: 1. Zmienne zostały zadeklarowane jako liczby typu całkowitego nieujemnego – word; do typu word należą liczby z zakresu od 0 do 65535. 2. Zmiennej iloczyn na początku programu przypisujemy wartość 1, aby była poprawnie określona w wykonywanej po raz pierwszy instrukcji przypisania iloczyn := iloczyn•i. Gdybyśmy tego nie zrobili, może zostać jej przypisana przypadkowa wartość, np. zero. Ćwiczenie 8 Na CD w pliku T7-przykład5 zapisany jest program z przykładu 5: 1. Uruchom i przetestuj program dla kilku różnych wartości zmiennych. 2. Zmień typ wszystkich zmiennych na typ całkowity byte (są to liczby z zakresu od 0 do 255). Omów skutki tej zmiany, testując program kolejno dla wartości n: 3, 5, 7, 10. Ćwiczenie 9 Napisz program realizujący algorytm sumowania n dowolnych liczb rzeczywistych. Odwołaj się do schematu blokowego tego algorytmu i programu zapisanego w pseudojęzyku (przykład 3 i 4 w temacie 5) – porównaj wszystkie sposoby przedstawienia iteracji. 6.2. Pętle zagnieżdżone Instrukcje iteracyjne for mogą się zagnieżdżać, czyli po słowie do może wystąpić kolejna instrukcja iteracyjna, np. for i := 1 to n do for j := 1 to m do instrukcja. Liczba kroków tej iteracji określona jest przez iloczyn: n·m. Przykład 6 Algorytm, który umożliwi wyprowadzenie na ekran monitora „prostokąta” narysowanego za pomocą znaków „x” o bokach n, m (m – liczba znaków „x” w poziomie, n – liczba znaków „x” w pionie). Wnętrze prostokąta ma być również wypełnione znakami „x”. Program w języku Pascal i schemat blokowy (patrz ramka i rys. 7 na drugiej stronie). Temat 7 program Prostokat; uses Crt; var i, j, n, m : integer; begin ClrScr; Writeln(’podaj wymiary prostokąta’); Readln(n, m); for i := 1 to n do begin for j := 1 to m do Write(’x’); Writeln; end; Readln; end. Uwaga: Procedura Writeln bez parametrów oznacza przejście kursora do nowego wiersza. 67 START Wprowadź(n, m) i := 1 TAK Czy i > n? Ćwiczenie 10 NIE Na CD w pliku T7-przykład6 zapisany jest program z przykładu 6. 1. Uruchom i przetestuj program dla kilku różnych wartości zmiennych. 2. Dlaczego zapis Write(’x’) jest bez końcówki „ln”? Dodaj tę końcówkę i sprawdź działanie programu. j := 1 TAK Warto zapamiętać · · Aby algorytm był zrozumiały dla komputera, trzeba go zapisać w postaci programu w konkretnym języku programowania. Języki te klasyfikujemy według różnych kryteriów. Wyróżniliśmy cztery etapy programowania: – implementację, – kompilację (interpretację), – uruchomienie i wykonanie, – testowanie. Pytania, problemy 1. Wymień te cechy języka programowania, które odróżniają go od języka naturalnego. 2. Omów cechy charakteryzujące języki wysokiego i niskiego poziomu. Podaj przykłady takich języków. 3. Na czym polega kompilacja programu? 4. Przedstaw i omów na konkretnym przykładzie etapy programowania. 5. Omów rodzaje błędów, które występują podczas programowania. Z jakimi błędami najczęściej spotyka się niedoświadczony programista? Zadania 1. Napisz program realizujący algorytm znajdowania większej z dwóch liczb rzeczywistych (bez sprawdzania warunku, czy liczby są równe). 2. Tak zmodyfikuj program z zadania 1, aby w przypadku liczb równych wyprowadzał napis: „liczby są równe”. 3. Sprawdź następujący fragment programu (powinien realizować algorytm wyboru najmniejszej z trzech liczb). Program w całości zapisany jest na CD w pliku T7-zadanie3. Skompiluj i uruchom go, a następnie przetestuj dla różnych wartości. Z jakim rodzajem błędu się tu spotkałeś? if a < b then if a < c then min := a else if b < c then min := b else min := c; Czy j > m? NIE Wyprowadź(’x’) j := j + 1 Przejdź do nowego wiersza i := i + 1 KONIEC Rys. 7. Schemat blokowy algorytmu z pętlami zagnieżdżonymi 68 Temat 7 4. Napisz program sprawdzający, czy z odcinków o długościach wprowadzonych przez użytkownika z klawiatury można zbudować trójkąt (warunek istnienia trójkąta). Liczby zadeklaruj jako byte. Program ma sprawdzać dziesięć takich trójek liczb i zależnie od rezultatu wyprowadzać komunikaty: „można zbudować trójkąt” lub „nie można zbudować trójkąta”. 5. Napisz program sprawdzający, czy wprowadzone trzy liczby naturalne są bokami trójkąta prostokątnego. Liczby zadeklaruj jako byte. Program ma sprawdzać dziesięć takich trójek liczb i zależnie od rezultatu wyprowadzać komunikaty „tak” lub „nie”. 6. Na podstawie następujących fragmentów programów napisz, jakie są wyniki ich działania: a. for i := 1 to 20 do Write(’$’); writeln; b. for i := 1 to 20 do Writeln(’$’); 7. Uzupełnij program z przykładu 3 o możliwość wykonywania go dla n danych (n wprowadzane z klawiatury). 8. Zapisz następujące zadania w postaci programów, na podstawie gotowych schematów blokowych: a. zadanie 2 w temacie 3, b. zadanie 5 w temacie 3; dodatkowo program ma działać dla n dowolnych liczb rzeczywistych (n wprowadzane z klawiatury). 9. Zapisz zadanie 2 (temat 4) w postaci programu w języku Pascal na podstawie jego zapisu w pseudojęzyku. 10. Napisz w języku Pascal program rozwiązywania równania liniowego na podstawie listy kroków (przykład 8 w temacie 3). Dodatkowo program ma działać dla n par współczynników (skorzystaj też z zadania 5 w temacie 4 – jeśli je rozwiązałeś). 11. Napisz program realizujący algorytm sumowania n dowolnych liczb rzeczywistych (patrz przykład 4 w temacie 5 – gdzie ten sam algorytm został zrealizowany w pseudojęzyku). Dla zainteresowanych 12. Napisz program realizujący algorytm, który umożliwi wyprowadzenie na ekran monitora prostokąta o bokach n x m, składającego się z liter „A” i „B”, występujących co drugi wiersz (m – liczba znaków „A” lub „ B” w poziomie, n – liczba znaków „A” lub „B” w pionie). 13. Napisz program realizujący algorytm, który umożliwi wyprowadzenie na ekran monitora „szachownicy” składającej się z zer i jedynek. 14. Napisz program realizujący algorytm rozwiązywania równania kwadratowego (patrz schemat blokowy w ELI – ćwiczenie 8 w temacie 3). 15. Omów szczegółowo klasyfikacje języków programowania według kryteriów podanych w tabeli na rys. 1. 16. Zapoznaj się z debuggerem wbudowanym do kompilatora języka Pascal. 17. Wyjaśnij, na czym polega konsolidacja (linkowanie). Poszukaj informacji w dodatkowych źródłach. Warto jeszcze wiedzieć Język Pascal powstał w 1971 roku. Zaprojektował go Niklaus Wirth z politechniki w Zurychu. Później zaczęły powstawać liczne wersje tego języka przeznaczone dla mikrokomputerów, takich jak ZX Spectrum, Commodore, Atari. Wielką popularność zdobyła w 1983 roku jego odmiana Turbo Pascal, zaprojektowana przez firmę Borland i przeznaczona dla mikrokomputerów klasy IBM. Turbo Pascal ma dobrze zintegrowane środowisko: edytor, debugger i projekty, doskonałą pomoc, jak również możliwość programowania obiektowego.