KURS PASCAL

Transkrypt

KURS PASCAL
KURS PASCAL’A
1.Wprowadzenie
Pascal jest językiem wyŜszego poziomu, posiada gotowe biblioteki i moduły, co ułatwia
programowanie. Z drugiej strony jest on bardziej wymagający pod względem estetyki
programowania np. kaŜda linia musi być zakończona średnikiem ( ; ).
2.Podstawy i składnia
Ogólny szkic programu wygląda następująco: deklaracja program nazwa; potem ewentualne
dołączanie bibliotek uses nazwa; następnie deklaracje zmiennych var i pod spodem np.
a:integer; ustalenie zmiennej a jaku typu dziesiętnego, dalej piszesz program i kończysz end.
program nazwa; (deklaracja nazwy programu i jego początku)
uses nazwa, nazwa2; (dołączanie modułów)
const (deklaracje stałych)
...
var (deklaracje zmiennych)
...
begin (początek programu, procedury lub funkcji)
...
end. (koniec programu)
3. Instrukcja warunkowa
Do tej pory pisaliśmy jedynie programy wykonujące wszystkie instrukcje kolejno jedna po
drugiej. Taka liniowa konstrukcja programu zdarza się dosc rzadko — w większości
przypadków działanie programu rozgałęzia się w zaleŜności od konkretnych warunków.
jeŜeli warunek jest spełniony, to wykonaj jakąś operację
w przeciwnym razie wykonaj inną operację
Przekładając to na angielski, uzyskujemy dosłowny zapis instrukcji warunkowej w Pascalu:
1
if warunek then
{ blok instrukcji 1 } else
{ blok instrukcji 2 }
W skróconej wersji moŜna pominąc alternatywną galąź ,,w przeciwnym razie", uzyskując cos
takiego:
if warunek then { blok instrukcji 1 }
If... then — jezeli... to. Else—w przeciwnym razie.
PowyŜsza konstrukcja rozpoczyna działanie od sprawdzenia wartości warunku, który musi
byc wyraŜeniem logicznym (tj. dawac w efekcie wartosc True lub false). Jeśli warunek jest
prawdziwy, wykonywany jest blok instrukcji 1, a jeŜeli nie — blok instrukcji 2 (w przypadku
formy uproszczonej, jeŜeli warunek jest spełniony, wykonywany jest blok instrukcji 1, a jeŜeli
nie, program przechodzi do kolejnych instrukcji programu).
Przed słowem else nie moŜe byc średnika!
Zwrocmy uwagę na pojęcie blok instrukcji. W programach czesto zdarza się, Ŝe określoną
grupę instrukcji trzeba wykonac jako całośc. Do zaznaczenia ich odrębnosci słuŜą znane nam
juŜ słowa kluczowe begin i end, oznaczające oczywiście początek i koniec bloku:
begin
instrukcja1;
instrukcja2;
…
instrukcjaN:
end;
ZauwaŜmy, Ŝe po słowie end na końcu bloku znajduje się średnik, a nie kropka, jak ma to
miejsce na końcu programu.
Przykład
ZałóŜmy, ze chcemy sprawdzic, czy wartośc zmiennej X jest dodatnia i wypisac odpowiedni
komunikat.
if X > 0 then { jezeli X jest większe od zera. to... }
2
writeln(‘X jest dodatnie’);
else
{ w przeciwnym razie ... }
writeln(‘X jest ujemne lub równe 0');
PowyŜsza konstrukcja pozwala nam jedynie rozróŜniac pomiędzy liczbami dodatnimi a
niedodatnimi. Gdybyśmy chcieli obsłuŜyc trzy przypadki — liczby dodatnie, ujemne i zero —
naleŜałoby uŜyc ,,piętrowej" konstrukcji pokazanej poniŜej:
if X > 0 then { jezeli X jest wieksze od zera, to... }
writeln(‘X jest wieksze od 0')
else
{ jezeli zaś nie jest. to... }
if X < 0 then { jezeli jest mniejsze od zera. . . }
writeln(X jest mniejsze od 0')
else
{ w przeciwnym razie musi bye zerem }
writeln( 'X jest rowne 0');
4. Pętla for
for zmienna := początek to koniec do { blok instrukcji }
for zmienna := początek downto koniec do { blok instrukcji }
PowyŜszy zapis oznacza, Ŝe blok instrukcji będzie wykonywany wielokrotnie, dla zmiennej
przyjmującej kolejno kaŜdą wartość z zakresu od początek do koniec. Pierwsza instrukcja jest
stosowana dla zliczania „w górę" (początek jest nie mniejszy niŜ koniec). JeŜeli koniec jest nie
mniejszy niŜ początek, tj. chcemy zliczać „w dół", powinniśmy uŜyć zapisu drugiego.
Przykład
program petla_for;
{ Program wpisuje liczby od 1 do 10, a następnie w dół - od 10 do 1. }
var
i : Byte;
begin
for i := 1 to 10 do
{ zliczamy w gore od 1 do 10 }
3
write(i, ' ');
writeln;
for i := 10 downto 1 do
{a następnie w dół od 10 do 1 }
write(i, ' ');
writeln;
readln;
end.
Aby oddzielić ciąg rosnący od malejącego, posłuŜyliśmy się instrukcją writeln bez
parametrów. Powoduje ona po prostu przejście do nowego wiersza.
Przykład
Pogram cw;
{Program wypisuje liczby naturalne mniejsze od 100 }
{i podzielne przez 11, wyznaczając je metodą "siłową". }
i : Byte;
begin:
for i := 1 to 100 do
if (i mod 11 = 0) then
{ liczba podziel na przez 11 }
writeln(i);
readln;
Przykład
Przypomnijmy wzór na N-ty wyraz ciągu fibonacciego:
F(N) =
0
dla N = 0
1
dla N= 1
F(N-2) + F(N-1) dla N >1
{ Program oblicza N-ty wyraz ciągu Fibonacciego. }
var
N, i : Byte:
Poprzedni, Przedpoprzedni, Pomoc : Longint;
begin
write(‘Podaj numer wyrazu ciągu do wyliczenia: '): readln(N);
if (N < 0) then { nie ma wyrazów o numerze ujemnym}
writeln(‘Nie moŜna policzyć ', N, ' wyrazu ciągu Fibonacciego.' )
4
else if (N = 0) then
{ wyraz zerowy jest równy zero }
writeln(‘F(‘ , N, ')=0')
else if (N = 1) then
{ wyraz pierwszy jest równy jeden }
writeln(‘F(, N,')=1')
else
begin
Przedpoprzedni := 0;
Poprzedni := 1:
for i := 2 to N do { liczymy iteracyjnie dla N-tego wyrazu}
begin
Pomoc := Przedpoprzedni;
Przedpoprzedni := Poprzedni;
Poprzedni := Poprzedni + Pomoc;
End;
Writeln(‘F(‘, N, ')=', Poprzedni)
end;
readln;
end.
5. Pętle repeat i while
Pętla while ma postać:
while warunek do { blok instrukcji }
zaś, jej istotę najlepiej oddaje przetłumaczenie na język polski:
Dopóki jest spełniony warunek, wykonuj blok instrukcji.
Pętla repeat ma postać:
repeat
{ blok instrukcji }
until warunek
Ponownie tłumacząc to na polski, otrzymujemy:
Powtarzaj blok instrukcji, aŜ zostanie spełniony warunek.
Jak widać, obie pętle robią to samo i moŜna by zapytać, jaka jest właściwie między nimi
5
róŜnica. Tkwi ona w miejscu sprawdzania warunku. W pętli while sprawdzany jest on na
początku, czyli przed pierwszym wykonaniem instrukcji, zaś w pętli repeat — na końcu
przebiegu, czyli po pierwszym —wykonaniu. Wynika stąd, Ŝe w pętli repeat instrukcje muszą
wykonać się najmniej raz, natomiast w pętli while mogą nie wykonać się ani razu.
Przykład
program cw;
{Program czyta kolejne liczby i liczy ich sumę aŜ do napotkania liczby 0. }
Const
Suma : Real = 0;
var
Liczba : Real;
Begin
repeat
writet(‘Dotychczasowa suma: ', Suma:10:2, '. Podaj liczbę: ');
readln(‘Liczba);
Suma := Suma + Liczba;
until (Liczba = 0);
writeln;
writeln('Całkowita suma: ', Suma:10:2);
readln;
end.
Analizując strukturę programu, moŜna zauwaŜyć, Ŝe liczba oznaczająca koniec danych jest
równieŜ dodawana do sumy. W naszym przypadku jest to na szczęście zero, jednak gdybyśmy
chcieli przyjąć jako znacznik końca inną wartość, naleŜałoby zapobiec uwzględnieniu go w
sumie. MoŜna to zrobić albo poprzez instrukcję warunkową (która przed sumowaniem
sprawdzałaby, czy liczba nie jest znacznikiem końca), albo poprzez odjęcie liczby po wyjściu
z pętli.
Przykład
Napisz program, który znajdzie największy wspólny podzielnik liczb A i B.
program cw;
{ Program znajduje największy wspólny podzielnik liczb A i B. }
var
A, B, Pom : Integer;
6
begin
write('Podaj A: '); readln(A);
write('Podaj B: '); readln(B);
write(‘NWD(‘, A. '. '. B, ') = '): while (A <> B) do
begin
if (A < B) then
{ jeśli A jest mniejsze od B, zamień je miejsca—
begin
Pom := A; A :- B; B := Pom;
end:
A := A - B; end:
writeln(A); readln; end.
Znowu podpieramy się zmienną Pom, która słuŜy do zamiany wartość: A i B w przypadku,
gdy A jest mniejsze. Wątpliwości moŜe budzić równieŜ sposób wypisania wyniku — część na
początku, przed obliczeniami, a część po nich. PoniewaŜ chcemy, by przy wypisywaniu
wyniku pojawiły się teŜ dane wejściowe, a program operuje na wprowadzonych liczbach i
zmienia wartość, wyprowadzenie ich juŜ po zakończeniu obliczeń spowodowałoby problem.
W takiej sytuacji naleŜałoby zapamiętać wpisane dane w dodatkowych dwóch zmiennych
pomocniczych, aby potem móc je wypisać. A po co, skoro moŜna wypisać je od razu i nie
pamiętać?
Przykład
program cw;
{ Program oblicza pierwiastki równań kwadratowych aŜ do podania A = |
var
A. B. C
: Real;
Delta, Xl, X2 : Real;
begin
repeat
writeln('Podaj współczynniki równania kwadratowego.');
write('Podaj A: '); readln(A);
if (A <> 0) then
begin
write(‘Podaj B: '); readln(B);
write(‘Podaj C: '); readln(C);
Delta : = Sqr(B) - 4*A*C;
7
if (Delta < 0) then
writeln('Równanie nie ma pierwiastków rzeczywistych')
else if (Delta = 0) then
begin
Xl : = -B/(2*A);
writeln('Równanie ma jeden pierwiastek rzeczywisty; ', Xl;10;5
end
else
begin
Xl := (-B - Sqrt(Delta))/(2*A);
X2 := (-B + Sqrt(Delta))/(2*A);
writeln('Równanie ma dwa pierwiastki rzeczywiste: ', Xl:10:5, ','. X2;10:5);
end;
writeln;
end;
until (A = 0);
end.
ZauwaŜmy, Ŝe program sprawdza, czy współczynniki jest zerowy, a jeśli tak, zwalnia
uŜytkownika z konieczności wpisywania pozostałych współczynników.
Przykład
Program cw;
{Program znajduje największe wspólne podzielniki podawanych
{Liczb tak długo, jak uŜytkownik będzie chciał. }
var
A. B, Pom : Integer; Znak
: Char;
Begin
repeat
writeln;
write('Podaj A: '); readln(A);
write('Podaj B: '); readln(B);
write(‘NWD(‘, A, ', '. B, ') = ');
while (A <> B) do
begin
if A < B then
8
begin
Pom := A; A := B: B := Pom;
end;
A ;= A - B; end;
writeln(A):
write('Czy chcesz liczyć dalej (T/N) ');
readln(Znak);
until (Upcase(Znak) = 'N');
end.
6. Instrukcja wyboru (Case ..of)
Instrukcja ta posiada następującą składnię:
CASE wyraŜenie OF
wartość1 : Instrukcja1;
wartość2 : Instrukcja2;
...
END;
lub
CASE wyraŜenie OF
wartość1 : Intrsukcja1;
wartość2 : Instrukcja2;
...
ELSE Instrukcja3
End;
Przykład
Zbadać, czy wczytany znak jest samogłoską, spółgłoską polską lub jedną z liter obcych: q, x,
v.
Algorytm: Do badania znaku przy tylu moŜliwościach wyboru doskonale nadaje się
mechanizm oferowany przez instrukcję wyboru. Aby zabezpieczyć się przed nieokreślonym
działaniem tej instrukcji, naleŜy wcześniej zbadać, czy czytany znak jest w ogóle literą.
Program: W programie dodatkowo drukujemy dla kontroli wczytaną daną.
9
PROGRAM litery;
VAR
Znak: char;
BEGIN
writeln(’Program do rozpoznawania liter’);
writeln(’Podaj znak’);
read(znak);
writeln(znak);
IF (’a’ <=znak) AND (znak <=’z’) THEN {litera}
CASE znak OF
’a’, ’e’, ’i’, ’o’,’u’, ’y’ : writeln(’samogłoska’);
’q’, ’v’, ’x’ : writeln(’spółgłoska obca’);
’b’, ’c’, ’d’, ’f’,’g’, ’h’, ’j’, ’k’,’l’, ’m’, ’n’, ’p’,’r’, ’s’, ’t’, ’w’,’z’ : writeln(’spółgłoska
polska’);
END
ELSE writeln(‘to nie była litera’)
END.
Przykład
Program sprawdza czy podany przez uŜytkownika znak to mała lub duŜa litera, bądź cyfra.
USES CRT;
VAR
znak:char;
BEGIN
clrscr;
readln(znak);
case ORD(znak) of
97..122: writeln('podales mala litere ',ORD(znak));
65..90: writeln('podales duza litere ',ORD(znak));
48..57: writeln('podales cyfre ',ORD(znak));
end;
readln;
END.
10