Turbo Pascal: Tablice, procedury, funkcje

advertisement
Język PASCAL – podstawy
Turbo Pascal:
Tablice, procedury, funkcje
Cele nauczania: Podstawowe zasady
programowania.
Osiągnięcia: Praktyczna znajomość
elementów programowania w języku Pascal
TABLICE
• Tablica jest strukturą danych zawierającą uporządkowany
zbiór obiektów tego samego typu.
Odpowiada pojęciu wektora czy macierzy.
• Tablice jednowymiarowe odpowiadają wektorom
a tablice 2-wymiarowe macierzom.
Elementy tablicy wskazuje się za pomocą indeksów.
• Dostęp do elementów uzyskuje się przez podanie nazwy
tablicy oraz w nawiasach [] wyrażenia określającego wartość
indeksu, np. t[5].
• Dla tablic 2-wymiarowych (zawierających wiersze i kolumny)
1-szy indeks odpowiada numerowi wiersza,
a 2-gi numerowi kolumny, np. a[4,5].
• Tablicę tworzymy przy pomocy słowa kluczowego array.
Definicja typu tablicowego
Definicja typu tablicowego ma postać:
type identtabl = array [zakresy_indeks] of typ_elementu;
• Dany identyfikator można następnie wykorzystać
w deklaracji var w sposób następujący:
var zmienna_tablicowa : identtabl;
Przykład:
type wector = array[1..30] of integer; {typ tablicowy}
var t1, t2: wektor; {tablice t1 i t2 typu wektor}
var t1, t2: array[1..30] of integer; {bezpośrednia deklaracja}
Bezpośrednia deklaracja tablicy
• Tablicę można też zdefiniować bezpośrednio
w deklaracji var
var zmienna = array[zakresy_indeksów] of typ_elem;
Przykłady:
var
test: arary[1..20, 1..10] of integer;
Wymiary: array[1..100] of real;
Liczlit: array[‘A’..’Z’] of integer;
Symbole: array[1..4] of char;
Przykłady programów z tablicami
Przykład 1
program Tabl1; {nadanie wartości elementom tablicy i wydruk}
var {deklaracja zmiennych}
i: integer;
tab: array[1..5] of integer; {definicja tablicy 1-wymiar}
Begin
for i:=1 to 5 do tab[i]:=10*i; {nadanie wartości
elementom tablicy}
for i:=1 to 5 do writeln(i,' ',test[i]); {wydruk wartości}
End.
Przykład 2 - tablica
program tabl_liczb_calk; {Program wczytuje do tablicy 5 liczb
całkowitych a następnie wyświetla}
var
Tab: array[1..5] of integer;
i: integer;
Begin
for i:=1 to 5 do
begin {początek for}
write('Podaj ', i, ' liczbę całkowita: '); readln(Tab[i])
end; {koniec for}
write('Podales nastepujace liczby: ');
for i:=1 to 5 do write(Tab[i], ', ');
Readln {czekanie na naciśniecie Enter}
End.
Znajdowanie elementu największego
• Dane: Zbiór n liczb.
• Wynik: Największy element w zbiorze.
• Kroki:
1. Przyjmij, że max to pierwszy element zbioru
2. Dla każdego kolejnego elementu x zbioru
wykonuj:
jeśli x>max, to za max przyjmij x
• Uwaga. Algorytm jest optymalny obliczeniowo
- złożoność n-1 (bo tyle mamy porównań)
Znajdowanie elementu największego - program
program Maksimum;
var
x: array[1..5] of real; max: real; i: integer;
begin
x[1]:=2.1; x[2]:=-4.15; x[3]:=3.25; x[4]:=2.1; x[5]:=0.1;
max:=x[1];
for i:=2 to 5 do if x[i]>max then max:=x[i];
writeln('Liczba największa to: ', max:0:2);
readln
end.
Program maksimum minimum
program Maks_min; {znajdowanie wartości maks. i minimalnej w tablicy}
var
x: array[1..5] of real; max, min: real; i: integer;
Begin
x[1]:=2.1; x[2]:=-4.15; x[3]:=3.25; x[4]:=2.1; x[5]:=0.1;
max:=x[1]; min:=x[1];
for i:=2 to 5 do
begin
if x[i]>max then max:=x[i];
if x[i]<min then min:=x[i];
end;
writeln('Liczba największa to: ', max:0:2);
writeln('Liczba najmniejsza to: ', min:0:2);
readln
End.
Procedury i funkcje
• Wiele problemów algorytmicznych (programistycznych)
łatwiej się rozwiązuje po podzieleniu ich
na podproblemy (podprogramy).
• Takimi podprogramami w języku Pascal są
procedury i funkcje.
• Dzięki procedurom i funkcjom program staje się
czytelniejszy i krótszy - często występujące czynności są
opatrzone nazwą i wywoływane w zależności
od potrzeb.
• Języki programowania umożliwiające tworzenie
programów z podprogramów, noszą nazwę języków
strukturalnych.
Procedury
• Składnia definicji procedury:
procedure nazwa (parametry);
deklaracje;
begin
{treść procedury}
end;
• Procedurę wywołujemy podając jej nazwę
i ewentualnie parametry wywołania
(w przypadku procedur z parametrami).
Przykłady – program bez procedury i z procedurą
program procedury1;
program bezprocedury;
var x,y,z : integer;
Begin
writeln ('Podaj trzy liczby całkowite');
read (x); read (y); read (z);
writeln ('Suma liczb: ',x+y+z);
writeln ('Podaj trzy liczby');
read (x); read (y); read (z);
writeln ('Roznica liczb: ', z-y-x);
End.
Powtarzanie tego samego schematu nie
jest właściwym wyborem.
Można temu zaradzić pisząc własną
procedurę, która nie tylko ułatwi nam
pracę, ale też skróci cały zapis.
Procedurę umieszczamy ją przed
programem głównym (przed Begin).
uses crt;
var x,y,z : integer;
{Procedura – bez parametrów}
procedure podaj_dane; {Nagłówek procedury}
begin
writeln ('Podaj trzy liczby');
read (x); {treść procedury}
read (y);
read (z)
end; {end ze średnikiem!!!}
{Program główny}
Begin
clrscr;
podaj_dane; {Procedura bez parametrów}
writeln ('x=',x,' y=',y, ' z=',z);
writeln ('Suma liczb ',x+y+z);
podaj_dane;
writeln ('x=',x,' y=',y, ' z=',z);
writeln ('Roznica liczb z-y-x=: ', z-y-x);
readln;
End.
Przykład. Program z procedurą
program Szlaczki;
var i : integer;
{ licznik wierszy }
procedure Szlaczek(Znak : char; Ile : integer);
begin
for i := 1 to Ile do { wypisz szlaczek }
write(Znak);
{ złożony z iluś znaków }
writeln
end;
begin
for i := 1 to 20 do { wypisz 20 szlaczków }
Szlaczek('*', i);
end.
program Rown_kwadratowe; {program rozwiazuje rownanie kwadratowe}
uses Crt; var a,b,c: real;
procedure start(tytul:string);
begin
ClrScr; Writeln('Autor: Jan Anonim'); Writeln(tytul); Writeln
end;
procedure liczPierwiastki(a,b,c: real);
var delta: real;
begin
Write('Rownanie '); delta:=b*b-4*a*c;
if delta<0 then Writeln('nie ma pierwiastkow.')
else if delta=0 then Writeln('ma jeden pierwiastek x1=',-b/(2*a):8:2)
else {if delta >0}
begin
Writeln('ma dwa pierwiastki:');
Writeln('x1=',(-b-Sqrt(delta))/(2*a):8:2);
Writeln('x2=',(-b+Sqrt(delta))/(2*a):8:2)
end {delta>0}
end;
procedure czytajDane(var a,b,c: real);
begin
Write('Podaj wspolczynnik a: '); Readln(a); Write('Podaj wspolczynnik b: '); Readln(b); Write('Podaj wspolczynnik c: '); Readln(c)
end;
procedure czekaj;
begin
Writeln; Write('Nacisnij klawisz Enter.'); Readln
end;
procedure blad(komunikat: string);
begin
Writeln; Write(komunikat); czekaj; Halt
end;
Begin {Wlasciwy program}
start('Pierwiastki rownania kwadratowego');
czytajDane(a,b,c);
if a=0 then blad('Zle dane.');
liczPierwiastki(a,b,c);
czekaj
End.
Korzystanie z procedur
• Przy dużych programach korzystanie z
procedur jest nieuniknione.
• Procedura, wygląda bardzo podobnie do
programu.
• Procedura rozpoczyna się słowem procedure
i kończy słowem end; (ze średnikiem).
• End. (z kropką) występuje tylko raz - na samym
końcu programu głównego.
Funkcja
• Funkcja to procedura, która może zwracać
jakąś wartość.
Przy wywołaniu funkcji należy użyć specjalnej
instrukcji przypisania:
Zmienna:=nazwa_funkcji(parametry_aktualne);
np. zmienna:=Moja_funkcja;
lub np. wypisać na ekranie wartość jaką zwraca
funkcja (czyli jaką oblicza):
write (Moja_funkcja);
Ogólna postać funkcji w jezyku Pascal, wywołanie funkcji
Ogólna postać funkcji:
function nazwa (lista parametrów formalnych): typ_wyniku;
{deklaracje-i-definicje-obiektów lokalnych: stałych,
zmiennych i typów}
begin
{instrukcje-realizujące-treść funkcji}
nazwa:=wynik
end;
Wywołanie funkcji:
zmienna:=nazwa(lista parametrów aktualnych);
Przykład programu z funkcją – Wartosc_bezwzgl
program Wartosc_Bezwzgl;
var x: real;
function bezw(a: real): real;
begin
if a>=0 then
bezw:=a
else
bezw:=-a
end;
Begin
write('Podaj liczbe: '); readln(x);
writeln('Wartosc bezwgledna liczby ', x:0:2, ' wynosi: ', bezw(x):0:2);
readln
End.
program Bisekcja;
{ Program rozwiązuje równania nieliniowe metodą bisekcji }
var
a, b, c : real;
{ granice przedziału i punkt podziału
eps : real; { dokładność }
function f(x:real):real;
begin
f := 1 - exp(sin(x)*cos(x));
end;
{ badana funkcja }
{ treść funkcji }
Begin
writeln('Program znajduje miejsce zerowe funkcji'); writeln('w przedziale [a; b]');
write('Podaj wartosc a: ');
{ wprowadź granice przedzialu } readln(a);
write('Podaj wartosc b: '); readln(b); write('Podaj dokladnosc: '); readln(eps);
repeat
c := (a + b)/2;
{ podziel przedział na pół }
if (f(a)*f(c)) < 0 then
b := c
{ funkcja ma przeciwne znaki w a i c }
else
a := c;
{ funkcja ma przeciwne znaki w b i c }
writeln(c);
until abs(f(c)) < eps;
{ badamy wartość bezwzględną! }
writeln('Miejsce zerowe: c = ',c:12:8);
readln;
End.
Download