APR, ćwiczenia 2

Struktura programu

Każdy program w Pascalu wygląda mniej więcej tak:

program Nazwa;
uses {lista używanych bibliotek oddzielonych przecinkami
-- może być pusta, wtedy pomijamy sekcję uses}
const {lista używanych stałych -- może być pusta,
wtedy pomijamy sekcję const}
var {lista zmiennych globalnych -- może być pusta,
wtedy pomijamy sekcję var}
{lista definiowanych podprogramów (funkcji i procedur)}
begin
{kod programu}
end.

Uwagi:

PI = 3.1415927;
x, y: Integer;

Typy wbudowane

Typy całkowitoliczbowe

Nazwa typu Zakres
Byte 0 .. 255
ShortInt -128 .. 127
SmallInt -32768 .. 32767
Word 0 .. 65536
Integer SmallInt lub LongInt
LongInt -2147483648 .. 214748364
LongWord 0 .. 4294967295

Typ logiczny

Typ Boolean pozwala przechowywać wartości logiczne True (prawda) i False (fałsz). Pod zmienne typu Boolean można też przypisywać wyniki porównań. Zmienne te mogą występować jako warunki w instrukcjach pętli i instrukcjach warunkowych, np.:

var
equal: Boolean;
begin
equal := 1 = 2;
if equal then
Write('1 = 2');
else
Write('1 <> 2');
end.

Typy zmiennoprzecinkowe

Poniższe typy pozwalają na operacje na liczbach zmiennoprzecinkowych („rzeczywistych“):

Nazwa typu Zakres
Real Single lub Double
Single 1.5E-45 .. 3.4E38
Double 5.0E-324 .. 1.7E308
Extended 1.9E-4932 .. 1.1E4932

Typ znakowy

W zmiennych typu Char można przechowywać pojedyncze znaki, np.:

var
c: Char;
begin
c := 'A';
Write(c);
end.

Typ łańcuchowy

W zmiennych typu String można przechowywać łańcuchy znaków, np.:

var
s: String;
begin
s := 'Hello';
Write(s);
end.

Sterowanie przebiegiem programu

Instrukcje w tej sekcji stanowią podstawę programowania strukturalnego. Ich znajomość i rozumienie są absolutnie konieczne.

Instrukcja warunkowa

Instrukcja warunkowa pozwala wybrać jedną z dróg wykonywania programu w zależności od tego czy spełniony jest zadany warunek. Składnia jest następująca:

if warunek then
instrukcja_do_wykonania_jesli_warunek_zachodzi
else
instrukcja_do_wykonania_jesli_warunek_nie_zachodzi;

Należy zwrócić uwagę na brak średnika przed else i fakt, że instrukcje te wykonują tylko jedną instrukcję. Jeżeli chcemy wykonać w wypadku spełnienia bądź nie warunku kilka instrukcji, należy użyć bloku instrukcji i otoczyć zadane instrukcje słowami kluczowymi begin i end.

Przykład

if x < 5 then
WriteLn('Zmienna x jest mniejsza niż 5.')
else
WriteLn('Zmienna x nie jest mniejsza niż 5.')

Pętla while

Pętla while pozwala na wykonywanie kodu dopóki spełniony jest warunek. Powtarzanie jest przerywane, kiedy warunek przestaje być prawdziwy. Żadna operacja nie jest wykonywana, jeśli od samego początku warunek nie jest spełniony.

Składnia wygląda następująco:

while warunek do
instrukcja_do_powtarzania;

Podobnie jak przy instrukcji if, jeżeli chcemy by powtarzana była więcej niż jedna instrukcja należy użyć bloku otoczonego słowami kluczowymi begin i end.

Przykład

x := 0
while x < 5 do
begin
WriteLn('x = ', x);
x := x + 1;
end;

Pętla for

Pętla for pozwala na wykonywanie kodu znaną z góry liczbę razy. Służy do tego celu jedna zmienna typu całkowitoliczbowego, tzw. licznik pętli, przyjmująca kolejno zadane wartości będące kolejnymi liczbami całkowitymi. Pętla for ma dwie odmiany, jedną w której wartość licznika rośnie:

for i := wartosc_poczatkowa to wartosc_koncowa do
instrukcja_do_powtarzania;

i drugą, w której wartość licznika maleje:

for licznik_petli := wartosc_poczatkowa downto wartosc_koncowa do
instrukcja_do_powtarzania;

Podobnie jak w dwóch poprzednich instrukcjach, jeżeli powtarzana ma być więcej niż jedna instrukcja, należy użyć begin i end.

Przykład

for i := 0 to 4 do
WriteLn('i = ', i);

Wewnątrz pętli nie można zmieniać wartości licznika pętli.

Pętla repeat

Pętla repeat pozwala na wykonywanie kodu dopóki zadanym warunek nie jest spełniony. Różni się od pętli while także tym, że warunek sprawdzany jest dopiero po wykonaniu pętli, więc instrukcje zawsze wykonają się przynajmniej jeden raz.

Składnia wygląda następująco:

repeat
instrukcja_do_powtarzania_1;
instrukcja_do_powtarzania_2;
...
instrukcja_do_powtarzania_N
until warunek;

W przeciwieństwie do poprzednich instrukcji, w przypadku powtarzania w pętli więcej niż jednej instrukcji, nie trzeba używać begin i end.

Przykład

x := 0
repeat
WriteLn('x = ', x);
x := x + 1;
until x = 5;

Instrukcje break i continue

Instrukcje break i continue pozwalają wpływać na wykonanie pętli.

break

Instrukcja break powoduje natychmiastowe przerwanie wykonywania pętli (for, while lub repeat), bez względu na prawdziwość warunku czy wartość licznika. Sterowanie przechodzi do następnej linijki znajdującej się pod pętlą.

continue

Instrukcja continue przerywa wykonanie tylko obecnego przebiegu pętli. W przypadku pętli while i repeat oznacza to ponowne sprawdzenie warunku i ewentualnie rozpoczęcie wykonywania pętli od pierwszej instrukcji. W pętli for oznacza rozpoczęcie pętli z następną wartością licznika pętli.

Błędem jest użycie break lub continue poza pętlą. W razie zagnieżdżania pętli, instrukcje te dotyczą tylko najbardziej wewnętrznej pętli w której są umieszczone.

Zadanie 3. (domowe) Przeanalizować poniższy program. Dla niektórych danych program nie działa poprawnie. Dla jakich? Przemyśleć działanie programu dobrze radzącego sobie z wszystkimi możliwymi danymi.

program pierwiastki;
{$APPTYPE CONSOLE}
function Delta(a, b, c: Real): Real;
begin
Delta := b*b - 4*a*c;
end;
function x1(a, b, c: Real): Real;
begin
x1 := (-b + sqrt(Delta(a, b, c))) / (2*a);
end;
function x2(a, b, c: Real): Real;
begin
x2 := (-b - sqrt(Delta(a, b, c))) / (2*a);
end;
var
a, b, c: Real;
begin
WriteLn('Podaj współczynniki trójmianu:');
Write('a = ');
ReadLn(a);
Write('b = ');
ReadLn(b);
Write('c = ');
ReadLn(c);
WriteLn('Pierwiastkami równania ',
a, '*x^2 + ', b, '*x + ', c, ' = 0 są:');
WriteLn('x1 = ', x1(a, b, c), ', x2 = ', x2(a,b,c));
end.

Zadanie 3. (domowe) Przeanalizować poniższy program. Dla niektórych danych program nie działa poprawnie. Dla jakich? Przemyśleć działanie programu dobrze radzącego sobie z wszystkimi możliwymi danymi.

program pierwiastki;
{$APPTYPE CONSOLE}
function Delta(a, b, c: Real): Real;
begin
Delta := b*b - 4*a*c;
end;
function x1(a, b, c: Real): Real;
begin
x1 := (-b + sqrt(Delta(a, b, c))) / (2*a);
end;
function x2(a, b, c: Real): Real;
begin
x2 := (-b - sqrt(Delta(a, b, c))) / (2*a);
end;
var
a, b, c: Real;
begin
WriteLn('Podaj współczynniki trójmianu:');
Write('a = ');
ReadLn(a);
Write('b = ');
ReadLn(b);
Write('c = ');
ReadLn(c);
WriteLn('Pierwiastkami równania ',
a, '*x^2 + ', b, '*x + ', c, ' = 0 są:');
WriteLn('x1 = ', x1(a, b, c), ', x2 = ', x2(a,b,c));
end.