Temat 7 Zapisywanie algorytmów w języku programowania

advertisement
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.
Download