Ogólna struktura programu w języku Pascal
program nazwa_programu; {Nagłówek programu - opcjonalny}
{ SEKCJA DEKLARACJI }
uses lista_nazw_modułów ;
const sekwencja_definicji_stałych ; {Definicje stałych}
type sekwencja_definicji_typów ; {Definicje typów}
label lista_etykiet ; {Deklaracja etykiet}
var sekwencja_deklaracji_zmiennych ; {Deklaracje zmiennych}
procedure nazwa_procedury_1 ; {Definicje procedur}
begin { Definicje składowych procedury_1 - kod procedury } end;
procedure nazwa_procedury_2 ( lista_parametrów ) ;
begin { Definicje składowych procedury_2 - kod procedury } end;
. . .
function nazwa_funkcji_1 : typ_wartosci ; {Definicje funkcji}
begin
{ Definicje składowych funkcji_1 - kod funkcji }
nazwa_funkcji_1:= wynik; { przekazanie wyniku funkcji na zewnątrz }
end;
function nazwa_funkcji_2( lista_parametrów ) : typ_wartości ;
begin
{ Definicje składowych funkcji_2 - kod funkcji }
nazwa_funkcji_2:= wynik; { przekazanie wyniku funkcji na zewnątrz }
end;
. . .
{ SEKCJA INSTRUKCJI }
begin
instrukcja_1 ;
instrukcja_2 ;
. . .
instrukcja_N ;
end .
Funkcje
Cel ćwiczenia:
Poznanie zastosowań funkcji. Struktura funkcji. Przekazywanie parametrów do funkcji i zwracanie wyników. Funkcje rekurencyjne. Obliczenia iteracyjne i rekurencyjne.
Zad 1. Opracować funkcję, która oblicza sumę dwóch liczb rzeczywistych przekazywanych przez wartości, za pomocą argumentów x i y, oraz zwraca wynik dodawania argumentów przez wartość funkcji. W programie głównym wywołać funkcję dla danych wejściowych wczytywanych z klawiatury. Przyjąć, że nagłówek funkcji ma następującą postać: function Suma(x, y: real): real.
program suma1;
var
x,y: real;
function Suma(x,y:real): real;
begin
Suma:=x + y;
end;
begin
write('Podaj x ='); readln(x);
write('Podaj y ='); readln(y);
writeln(Suma(x,y):0:2));
readln;
end.
Zad 2. Opracować funkcję, która zwraca przez wartość średnią arytmetyczną z dwóch liczb rzeczywistych, przekazywanych do funkcji przez wartości, oraz zwraca minimum i maksimum z tych liczb przez zmienne. Przyjąć, że nagłówek funkcji ma następującą postać: function SMM(x,y: real; Var min,max: real): real.
program minmax;
var
x,y,min,max: real;
function SMM(x,y: real; var min,max: real): real;
begin
SMM:=(x + y)/2;
{wyznaczenie min}
min:=x;
if y<=min then min:=y;
{wyznaczenie max}
max:=x;
if y>=max then max:=y;
end;
begin
write('Podaj x ='); readln(x);
write('Podaj y ='); readln(y);
writeln('Funkcja oblicza srednia z liczb x,y');
writeln('SMM = ',SMM(x,y,min,max):0:2);
writeln('Max = ',max:0:2);
writeln('Min = ',min:0:2);
readln;
end.
Procedury
Zad 1. Opracować program, który umożliwia przesuwanie po ekranie w trybie znakowym kursora reprezentowanego za pomocą dowolnego znaku, np. x. Przesuwanie zrealizować za pomocą klawiszy strzałek (wykorzystać funkcję ReadKey). W prawym górnym rogu ekranu wyświetlać aktualne współrzędne kursora.
program przesuwanie;
uses crt;
procedure PodajXY(s:string; px,py: integer);
begin
cursoroff;
gotoXY(1,1);
write(s, ' ','[',px,',',py, ']');clreol;
end;
var
i,j: integer;
x,x_ext: char; {x- znak normalny x_ext - znak rozszerzony}
Koniec: boolean;
px,py: integer;
s: string;
begin
cursoroff;
clrscr;
s:='Pozycja kursora: ';
px:=1; py:=1;
i:= 1;
j:=2;
Koniec := false;
repeat
PodajXY(s,px,py);
x_ext := char(0);
x:=readKey;
if x = char(27) then Koniec:=true; {kod ASCII Esc - 27}
if x = char(0) then x_ext := readkey;
if(x_ext = 'M') then
begin
gotoXY(i, j);
if keypressed=false then begin delline;clreol;end;
write('X');
inc(i);
end;
if(x_ext = 'K') then
begin
gotoXY(i, j);
if keypressed=false then delline;
Write('X');
dec(i);
end;
if(x_ext = 'H') then {gora}
begin
gotoXY(i, j);
if keypressed=false then delline;
Write('X');
dec(j);
end;
if(x_ext = 'P') then {dol}
begin
gotoXY(i, j);
if keypressed=false then delline;
Write('X');
if keypressed=false then insline;
inc(j);
end;
px:=whereX;
py:=whereY;
until Koniec;
clrscr;
end.
wróć
Cel ćwiczenia:
Poznanie zastosowań procedur. Struktura procedury. Przekazywanie parametrów do procedur. Obliczanie sum szeregów z wykorzystaniem procedur.
Zad 2. Opracować procedurę, która oblicza sumę dwóch liczb rzeczywistych przekazywanych przez wartości za pomocą argumentów x i y oraz zwraca wynik dodawania argumentów za pośrednictwem zmiennej wyn, będącej argumentem procedury. W programie głównym wywołać funkcję dla danych wejściowych wczytywanych z klawiatury. Przyjąć następujący nagłówek procedury: procedure Suma1(x, y: real; Var wyn: real).
program suma;
var
x,y,wyn: real;
procedure Suma1(x,y: real; var wyn: real);
begin
wyn:=x+y;
end;
begin
write('Podaj x: '); readln(x);
write('Podaj y: '); readln(y);
Suma1(x,y,wyn);
write(wyn:0:2);
readln;
end.
Zad 3. Opracować procedurę, która zwraca przez zmienne minimum, maksimum oraz średnią arytmetyczną z dwóch liczb rzeczywistych przekazywanych do procedury przez wartości. Nagłówek procedury: procedure MS(x, y: real; Var min, max, sr: real).
program minimum;
var
x,y,min,max,sr: real;
procedure MS(x,y: real; var min,max,sr:real);
begin
{ wyznaczenie min }
min:=x;
if y<=min then min:=y;
{ wyznaczenie max }
max:=x;
if y>=max then max:=y;
{ wyznaczenie sredniej arytmetycznej }
sr:=(x+y)/2;
end;
begin
write('Podaj x: '); readln(x);
write('Podaj y: '); readln(y);
MS(x,y,min,max,sr);
writeln('min = ', min:0:2);
writeln('max = ', max:0:2);
writeln('sr = ', sr:0:2);
readln;
end.
Zad 4. Opracować procedurę, która dla n będącego jej parametrem oblicza sumę:
S(n) = 1 - 1/2 + 1/4 - 1/6 + ... +1/k ,
gdzie k <=n tj. obliczenia należy zakończyć, gdy pojawi się k > n. Na przykład, n = 1; S(1) = 1;
n = 2; S(2) = 1 - 1/2;
n = 3; S(3) = 1 - 1/2;
n = 4; S(4) = 1 - 1/2 + 1/4;
n = 5; S(5) = 1 - 1/2 + 1/4.
Nagłówek procedury: procedure S1(n: integer; Var wyn: real).
program suma2;
var
n: integer;
wyn: real;
procedure S1(n: integer; var wyn: real);
var
k,i: integer;
begin
i:=1;
k:=2;
wyn:=1;
while (k<=n) do
begin
if i mod 2 = 0 then wyn:=wyn+1/real(k) else wyn:=wyn-1/real(k);
k:=k+2;
inc(i);
end;
end;
{Program glowny}
begin
write('Podaj n: '); readln(n);
S1(n,wyn);
writeln('Suma S1=',wyn:0:2);
readln;
end.
Zad 4. Niech x będzie liczbą rzeczywistą wczytywaną z klawiatury. Opracować procedurę, która dodaje kolejne wyrazy szeregu
S(x, k) = 1 + x1 / 1! + x2 / 2! + ... + xk / k! ...
tak długo, aż pojawi się wyraz o numerze k taki, że moduł | xk / k! | < eps, gdzie eps=1E-7 jest stałą w programie (obliczanie ex z dokładnością eps=10-7). Przyjąć, że x oraz eps są argumentami procedury. Zastosować następujący nagłówek procedury: procedure S2(x, eps: real; Var wyn: real);
Zad 5.Opracować procedurę, która wyznacza sumę cyfr liczby naturalnej x. W programie głównym wywołać procedurę dla x wczytywanego z klawiatury. Nagłówek procedury: procedure SumC(x: word; Var suma: word).
program suma3;
var
x, suma: word;
procedure SumC(x: word; var suma: word);
var
l: string;
c,i: integer;
begin
str(x,l); {kowersja do typu napisowego}
for i:=length(l) downto 1 do
begin
c:=ord(l[i]) - ord('0'); {kody ASCII}
suma:=suma+c;
end;
end;
{Program glowny}
begin
write('Podaj liczbe (0..65535) x='); readln(x);
SumC(x,suma);
writeln('suma cyfr liczby ',x,' wynosi ',suma);
readln;
end.
3