CZĘŚĆ A: Etykiety, instrukcja skoku (zawsze do zastapienia

Transkrypt

CZĘŚĆ A: Etykiety, instrukcja skoku (zawsze do zastapienia
CZĘŚĆ A: Etykiety, instrukcja skoku (zawsze do zastapienia intrukcjami
warunkowymi lub petlami repeat/while, ale czasami wygodna). Opis:
deklaracja etykiety, w części z deklaracjami:
label nazwa_etykiety;
instrukcja skoku: goto nazwa_etykiety;
umieszczenie etykiety w programie:
nazwa_etykiety: intrukcja;
Przykład: wybieramy funkcje do tablicowania z funkcji sin(x), cos(x), exp(x), gdy niepoprawny
wybór program pyta raz jeszcze; wybieramy przedział tablicowania, gdy niepoprawnie podany –
raz jeszcze. Zapis funkcji do pliku oraz na ekran.
program tablicuje;
uses crt;
var x,dol,gor,krok:real;
c:char;
plik:text;
nazwa:string;
label zpowrotem,zpowrotem1;
function f(xx:real;cc:char):real;
var
y:real;
begin
case cc of
's' : y:=sin(x);
'c' : y:=cos(x);
'e' : y:=exp(x);
end;
f:=y;
end;
begin
zpowrotem: writeln(' jaka funkcje chcesz liczyc? ');
writeln(' s -sinus, c-cosinus, e-exp');
readln(c);
if ((c<>'s') and (c<>'c') and (c<>'e')) then begin
writeln(' zly wybor');
goto zpowrotem;
end;
zpowrotem1: writeln(' w jakim przedziale: dol,gor,krok');
readln(dol,gor,krok);
if(dol>gor) then begin
writeln(' gor < dol , podaj poprawnie');
goto zpowrotem1;
end;
writeln('podaj nazwe pliku');
readln(nazwa);
clrscr;
assign(plik,nazwa);
rewrite(plik);
x:=dol;
while(x<=gor) do begin
writeln(x,' ',f(x,c));
writeln(plik,x,' ',f(x,c));
x:=x+krok;
end;
close(plik);
end.
CZĘŚĆ B. Przykłady programów z procedurami i funkcjami
P1) Mnożenie 2 macierzy, elementy macierzy są liczbami całkowitymi. Teoria jest tu:
http://pl.wikipedia.org/wiki/Mno%C5%BCenie_macierzy
Program:
program monzenie_macierzy;
uses crt;
{ macierz A ma wymiar M na P, macierz B - P na N,
sprawdz kiedy mnozenie macierzy jest mozliwe na podanych wyzej
stronach wiki}
{stale sa zmiennymi globalnymi}
const
N=2;
M=3;
P=2;
{zauwaz, ze mozna zadeklarowac wymiary podajac stale}
type TA=array[1..M,1..P] of integer;
TB=array[1..P,1..N] of integer;
TC=array[1..M,1..N] of integer;
var i,j,k:integer;
A:TA;
B:TB;
C:TC;
procedure iloczyn(AA: TA; BB:TB; var CC:TC);
var
s,i,k: integer;
begin
for i:=1 to M do
begin
for k:=1 to N do
begin
s:=0;
for j:=1 to P do
s:=s+AA[i,j] * BB[j,k];
CC[i,k]:=s;
end;
end;
end;
{program glowny}
begin
writeln(' wczytuje macierz A, o wymiarach ',M,' x ',P);
writeln('Podaj elementy macierzy A : ' );
for i:=1 to M do
for j:=1 to P do
begin
write('Element [',i,' , ',j,' ] = ');
readln(A[i,j]);
end;
writeln(' wczytuje macierz B, o wymiarach ',P,' x ',N);
writeln('Podaj elementy macierz B : ');
for j:=1 to P do
for k:=1 to N do
begin
write('Element [',j,' , ',k,' ] = ');
readln(B[j,k]);
end;
iloczyn(A,B,C);
writeln('Macierz wynikowa C=A*B o wymiarach ', M,' x ',N);
writeln(' po kazdym elemencie wcisnij ENTER');
for i:=1 to M do
begin
for k:=1 to N do
begin
writeln('Element [',i,' , ',k,' ] = ' ,C[i,k]);
readln;
end;
end;
end.
P2. Rozwiązywanie układu równań liniowych metodą eliminacji Gaussa
http://pl.wikipedia.org/wiki/Metoda_eliminacji_Gaussa
program ze strony:
http://edu.i-lo.tarnow.pl/inf/alg/001_search/0076.php
jest tam teoria.
Program jest dobrze napisany. Zawiera dynamiczną deklarację rozmiarów
tablic. Dołaczyłem komentarze w programie
// Eliminacja Gaussa
// Data: 15.02.2010
// (C)2012 mgr Jerzy Wałaszek
//----------------------------program gauss;
type
NReal = array of extended; // typ tablic wierszy
{zauwaz, nie ma rozmiarow, to deklaracja dynamiczna,
uzyjemy takich rozmiarow, jakie beda potrzebne
deklaracja typu Mreal to „tablica tablic”, jeśli dalej będzie
var AB:Mreal; to elementy są AB[i][j], A NIE A[i,j]!!}
MReal = array of NReal;
const
eps = 1e-12;
// stała przybliżenia zera, wszystko < eps, to zero
// Funkcja realizuje algorytm eliminacji Gaussa
//--------------------------------------------function gauss(n : integer; var AB : MReal; var X : NReal) : boolean;
var
i,j,k : integer;
m,s : double;
begin
// eliminacja współczynników
for i := 0 to n - 2 do
begin
for j := i + 1 to n - 1 do
begin
if abs(AB[i][i]) < eps then exit(false);
{exit – procedura standardowa, wyjscie z funkcji, funkcja ma wartosc FALSE
metoda eliminacji gaussa nie może być stosowana}
m := -AB[j][i] / AB[i][i];
for k := i + 1 to n do
AB[j][k] := AB[j][k] + m * AB[i][k];
end;
end;
// wyliczanie niewiadomych
for i := n - 1 downto 0 do
begin
s := AB[i][n];
for j := n - 1 downto i + 1 do
s := s - AB[i][j] * X[j];
if abs(AB[i][i]) < eps then exit(false);
X[i] := s / AB[i][i];
end;
gauss := true;
{wszystkie obliczenia są prawidlowe, funkcja ma wartosc TRUE}
end;
// Program główny
//--------------var
AB : MReal;
X : NReal;
n,i,j : integer;
begin
// odczytujemy liczbę niewiadomych
read(n);
// tworzymy macierze AB i X
{TUTAJ USTALAMY POTRZEBNY ROZMIAR TABLIC,
procedura SetLength (tablica, rozmiar) to procedura standardowa}
SetLength(AB,n);
SetLength(X,n);
for i := 0 to n - 1 do SetLength(AB[i],n + 1);
// odczytujemy dane dla macierzy AB
for i := 0 to n - 1 do
for j := 0 to n do read(AB[i][j]);
{instrukcja if dziala, jeśli wartosc gauss=prawda (TRUE),
czyli jeśli metoda daje rozwiazanie}
if gauss(n,AB,X) then
begin
for i := 0 to n - 1 do
writeln('x',i + 1,' = ',X[i]:9:4);
end
else
writeln('DZIELNIK ZERO');
// usuwamy macierze z pamięci
{a to już ozdobnik, uwalnianie pamieci, można pominac}
for i := 0 to n - 1 do SetLength(AB[i],0);
SetLength(AB,0);
SetLength(X,0);
end.
P3 Metoda Newtona (zwana również metodą Newtona-Raphsona lub metodą stycznych) –
iteracyjny algorytm wyznaczania przybliżonej wartości pierwiastka funkcji.
http://pl.wikipedia.org/wiki/Metoda_Newtona
Program ze strony:
http://edu.i-lo.tarnow.pl/inf/alg/005_root/0013.php
UWAGA: zmien funkcje f oraz jej pochodną
DLA funkcji podanej w przykładzie punkt startowy to 1
Typu double to extended!
// Program znajduje miejsce zerowe funkcji f(x)
// za pomocą algorytmu Newtona
//--------------------------------------------// (C)2006 mgr J.Wałaszek
I LO w Tarnowie
program mzf1;
//uses crt,math;
uses crt;
const
EPS0 = 0.0000000001; // dokładność porównania z zerem
EPSX = 0.0000000001; // dokładność wyznaczenia pierwiastka
// Funkcja, której miejsce zerowe obliczamy
// f(x) = x^3*(x+sin(x^2-1)-1)-1
// <-1,0> i <1,2>
//----------------------------------------function f(x : real) : double;
begin
f := x * x * x * (x + sin(x * x - 1) - 1) - 1;
end;
// Oblicza pochodną funkcji f(x)
// f'(x) =2x^4*COS(x^2 - 1) + 3x^2*SIN(x^2 - 1) + 4x^3 - 3x^2
//----------------------------------------------------------function fp(x : real) : double;
begin
fp := x * x * (2 * x * x * cos(x * x - 1) + 3 * sin(x * x - 1) + 4 * x - 3)
end;
//----------------------------------------------------// Program główny
//----------------------------------------------------var
x0,x1,f0,f1 : double;
i
: integer;
begin
writeln('Obliczanie pierwiastka funkcji - metoda Newtona');
writeln('f(x) = x^3*(x+sin(x^2-1)-1)-1');
writeln('-----------------------------------------------');
writeln('(C)2006 mgr Jerzy Walaszek
I LO w Tarnowie');
writeln;
write('Podaj punkt startowy x0 = '); readln(x0);
writeln;
writeln('-----------------------------------------------');
writeln('WYNIK:');
writeln;
x1 := x0 - 1; f0 := f(x0); i := 64;
while (i > 0) and (abs(x1 - x0) > EPSX) and (abs(f0) > EPS0) do
begin
f1 := fp(x0);
if abs(f1) < EPS0 then
begin
writeln('Zly punkt startowy');
i := 0;
break;
end;
x1 := x0;
x0 := x0 - f0 / f1;
f0 := f(x0);
dec(i);
if i = 0 then writeln('Przekroczony limit obiegow');
end;
if i > 0 then writeln('x0 = ',x0:15:8);
writeln;
writeln('-----------------------------------------------');
writeln('Koniec. Nacisnij klawisz Enter...');
readln;
end.
P4. Metoda trapezów wyznaczania całki pojedynczej
http://pl.wikipedia.org/wiki/Metoda_trapez%C3%B3w
Program wzięty ze strony:
http://edu.i-lo.tarnow.pl/inf/alg/004_int/0003.php
//*************************************************
//** Obliczanie całki oznaczonej metodą trapezów **
//** ------------------------------------------- **
//** (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie **
//*************************************************
program int_trapez;
uses crt;
//*******************************
//** Tutaj definiujemy funkcję **
// JAK INNA FUNKCJA - TO TO TRZEBA ZMIENIC
//*******************************
function f(x : double) : double;
begin
f := x * x + 2 * x;
end;
//********************
//** Program główny **
//********************
const N = 1000; //liczba punktów/trapezów podziałowych
var
xp,xk,s,dx : double;
i : integer;
begin
writeln('Obliczanie calki oznaczonej');
writeln(' za pomoca metody trapezow');
writeln('----------------------------');
writeln('(C)2004 mgr J.Walaszek I LO');
writeln;
writeln('f(x) = x * x + 2 * x');
writeln;
writeln('Podaj poczatek przedzialu calkowania');
writeln;
write('xp = '); readln(xp);
writeln;
writeln('Podaj koniec przedzialu calkowania');
writeln;
write('xk = '); readln(xk);
writeln;
s := 0;
dx := (xk - xp) / N;
for i := 1 to N - 1 do s := s + f(xp + i * dx);
s := (s + (f(xp) + f(xk)) / 2)* dx;
writeln('Wartosc calki wynosi : ',s:8:3);
writeln;
writeln('Nacisnij klawisz Enter...');
readln;
end.
ZMIEŃ PROGRAM, ABY WYZNACZAŁ CAŁKE Z DANĄ DOKŁADNOŚCIĄ
P5. Metoda Monte Carlo wyznaczania całek
http://pl.wikipedia.org/wiki/Metoda_Monte_Carlo
Program wzięty ze strony
http://edu.i-lo.tarnow.pl/inf/alg/004_int/0005.php
//****************************************************
//** Obliczanie całki oznaczonej metodą Monte Carlo **
//** ---------------------------------------------- **
//** (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie **
//****************************************************
program int_montecarlo;
uses crt;
//*******************************
//** Tutaj definiujemy funkcję **
//*******************************
function f(x : double) : double;
begin
f := x * x + 2 * x;
end;
//********************
//** Program główny **
//********************
const N = 10000; //liczba punktów losowych
var
xp,xk,s,dx : double;
i : integer;
begin
writeln('Obliczanie calki oznaczonej');
writeln(' Metoda Monte Carlo');
writeln('---------------------------');
writeln('(C)2004 mgr J.Walaszek I LO');
writeln;
writeln('f(x) = x * x + 2 * x');
writeln;
writeln('Podaj poczatek przedzialu calkowania');
writeln;
write('xp = '); readln(xp);
writeln;
writeln('Podaj koniec przedzialu calkowania');
writeln;
write('xk = '); readln(xk);
writeln;
randomize; //inicjujemy generator liczb pseudolosowych
s := 0;
dx := xk - xp;
for i := 1 to N do s := s + f(xp + random * dx);
s := dx * s / N;
writeln('Wartosc calki wynosi : ',s:8:3);
writeln;
writeln('Nacisnij klawisz Enter...');
readln;
end.
POLECAM STRONY I LO W TARNOWIE!!!!!!
http://edu.i-lo.tarnow.pl/index.php