Algorytmy + Struktury danych = Programy

Transkrypt

Algorytmy + Struktury danych = Programy
prof dr hab. inz Witold Dzwinel
Instytut Informatyki AGH, KRAKÓW
Algorytmy + Struktury danych = Programy
DELPHI 4.0 – TURBO PASCAL 5.5
Metoda TOP - DOWN
1. Wstep: Zlozonosc obliczeniowa: przyklad: znajdowanie liczb pierwszych
rozwiazywanie ukladu równan liniowych
2. Struktury danych
a. stale, zmienne , typy, tablice,
b. stringi, rekordy
c. wskazniki
d. pliki
e. obiekty
3. Instrukcje
a. Instrukcje podstawienia i podstawowe instrukcje sterujace (if, for, goto)
b. Dodatkowe instrukcje sterujace (if,then,else; while, repeat, case, continue,
break, with)
c. Funkcje, procedury i metody
d. Programy, kompilatory, dyrektywy
4. Algorytmy
a. Podstawy algorytmiki: sumowanie szeregu, silnia, operacje na stringach,
generator liczb losowych, metody Monte-Carlo
b. Podstawowe algorytmy numeryczne: interpolacja, aproksymacja,
calkowanie, równania róznicowe, miejsca zerowe, znajdowanie
maksimum (minimum funkcji), uklady równan.
c. Operacje na tablicach. Wymiana, element maksymalny i minimalny
transpozycja, porzadkowanie, mnozenie macierzy, sortowanie, quick-sort,
kolejkowanie .
d. Operacje na rekordach, tworzenie list, listy polaczone, operacje na
strukturach drzewiastych, stosie , i inne struktury dynamiczne.
e. Algorytmy rekurencyjne i operacje na obiektach
Cwiczenia No.1
1. Stale i zmienne, typy, if, for, goto - powtórzenie
2. Przyklady:
a. Znajdowanie zer równania kwadratowego,
b. Znajdowanie liczb pierwszych,
c. Silnia, kombinacje k elementowe zbioru N elementowego, ciagi
arytmetyczny i geometryczny
d. Dodawanie elementów szeregu Taylora z zadana dokladnoscia
e. Iteracyjne znajdowanie zer funkcji
=================================================================
Komentarze // { } (* *)
unit Nazwa;
interface
implementation
end.
Stale:
const
Pi = 3.14159;
AlaX = ‘Moja kolezanka’;
Ilosc = 35;
Limit = 25.5;
Boltzm = 1.36E-26;
Zmienne
var
Kat: Real;
i: Integer;
Volume: Real;
Radius: Double;
NumberX: integer;
Nazwisko: char;
TablicaA = array [1 .. Ilosc] of char;
Typy zmiennych:
Integer (-2 147 483 648 ... 2 147 483 647)
Real (8 bajtów)
Double (8 bajtów)
char (1 bajt)
Wyraze nia
begin
Volume := 4.0/3.0 * Pi * Radius*Radius*Radius;
TablicaA := ‘Obliczono objetosc”;
end
Operatory
Arytmetyczne *, /, div,+, -,
Przypisania :=
Logiczne: and, or
Relacyjne: = <> < > <= >=
Instrukcja sterujaca
if then
if Radius > Limit then
begin
Volume := 4.0/3.0* PI * Radius * Radius * Radius;
Wynik := Volume/2;
end
Instrukcja
while ..... do begin .... end
const
con1 = 10;
var
suma: Real;
suma := 0.0;
while suma < MAX do
suma := suma + con1;
CWICZENIA
Napisac algorytm znajdowania wartosci N po K.
function Silnia (N:integer):integer;
var
N,ST, Ind : integer;
begin
if (N <> 0) then
begin
ST := 1;
Ind :=1;
while Ind <= Silnia do begin
ST := ST * nd;
Ind := Ind + 1;
end
end
else
ST := 1;
Silnia := ST;
end
======================= Rekurencja ==============================
function Silnia (N:integer):integer;
var
N: integer;
begin
if (N = 0) then
Silnia := 1;
else
Silnia := N* Silnia (N-1);
end
===============================================
var
N,K, Kombin: Integer;
Kombin := Silnia(N)/(Silnia(N -K) * Silnia (K));
================Funkcja znajdujaca liczby pierwsze =============
function prime (N:integer): string;
const
NotPrime = ‘not a prime number’;
YesPrime = ‘this is a prime number’;
var
N, Ns: integer;
comm: string;
begin
if (N = 1) or (N div 2) = 0 the n
comm := NotPrime;
else
begin
Ns := sqrt (N)+1;
Ind := 3;
while (N div Ind) <> 0 and Ind <= Ns do
Ind := Ind + 2;
if (Ind >= Ns) then
comm := NotPrime;
else
comm := YesPrime;
end
prime := comm;
end
======================Rozwiazywanie rownania kwadratowego =============
function sqrEqs (a,b,c:real, var x: array [1..2] of real): integer;
begin
delta := sqr (b) – 4* a*c;
if delta < 0 then
sqrEqs := 0;
else
if delta = 0 then
begin
x[1] := -b/(2*a);
x[2] := x[1];
sqrEqs := 1;
end
else
begin
x[1] := (-b+sqrt(delta))/(2*a);
x[2] := (-b- sqrt(delta))/(2*a);
sqrEqs := 2;
end
end
=================Funkcja znajdujaca wartosc e**x ==============
function exponent (x, Err:real): real;
const
Huge = 3.5E24;
var
error: real;
begin
if (x<1.0) then
begin
exponent := 1+x;
error := Huge;
id
:= 2;
while error > Err do begin
exponent := exponent + Power (x,id)/Silnia(id);
id := id + 1;
error := 1.0/Silnia(id);
end
end
else
exponent = -1.0;
end
ZADANIE:
1. Napisz program znajdujacy wartosc funkcji sinus z zadana
dokladnoscia (z szeregu Taylora)
2. Napisz program sumujacy nastepujacy ciag
A0=Q0, A1=Q1, An = q*An-1 + q*An-2
3. Napisz program sumujacy odwrotnosci kwadratów elementów tablicy
dwuwymiarowej
4. Napisz program znajdujacy macierz transponowana do danej
macierzy dwuwymiarowej a[n,n]
5. Napisz program znajdujacy najwieksza wartosc w tablicy
jednowymiarowej
6. Napisz kod w Pascalu sortujacy tablice dwuwymiarowa.
Cwiczenia No.2
1. Instrukcja case
case PrzekroczenieP redkosci of
0 : Mandat := 0;
5: Mandat := 50;
10: Mandat := 75;
15: Mandat := 100;
20,
25,
30: Mandat := Przekroczenie Predkosci * 20;
else begin
Mandat := MaksymalnyMandat;
end;
end;
2. Rekordy
Rekord jest to zbiór powiazanych danych zgrupowanych w jednej strukturze.
Po zadeklarowaniu typu rekordowego, trzeba za deklarowac zmienna tego typu,
aby umieszczac w niej dane. Skladniki rekordu nosza nazwe pól.
type
TKartaAdresowA = record
imie:
string;
nazwisko: string;
ulica:
string;
miasto: string;
kodpocztowy: integer;
end;
const MAX = 10000;
var
Karta001= array [1..MAX] of TKartaAdresowa;
// Wielkosc tego rekordu moze byc rózna ze wzgledu na string (nie jest to dobre
// w zapisie na plik
begin
Karta001[1].imie := ‘waldus’;
Karta001[1].nazwisko := ‘kiepski’;
Karta001[1].ulica := ‘Polna’;
Karta001[1].kodpocztowy := 320675;
end
with Karta001[1] do begin
imie := ‘waldus’;
nazwisko := ‘kiepski’;
ulica := ‘Polna’;
kodpocztowy := 320675;
end
Zadania na cwiczenia
Skonstruuj typ rekordowy kartoteka, posortuj babelkowo ludzi wzgledem wieku. Dla
osob mlodszych niz 65 lat wpisz w polu rekordu StosunekDoSluzby „zmobilizowany”.
Dla osób mlodszych niz 40 lat „drugalinia”
Dla osob mlodszych niz 25 lat „pierwsza linia”
Posortowana tablice rekordów KARTOTEKA uzupelnij rekordami z tablicy wejsciowej
INSERT
function insert (n:integer, x:array [1..n] of real, var a:real, var k:integer):integer;
var i: integer;
begin
if k<=0 then
begin
insert := 1;
for i:=n downto k+1 do begin
x[i] := x[i-1];
end;
x[k] := a;
end;
else
insert := 0;
end;
function MatrixMult (k,m,n:integer, a:array [1..N, 1..M] of real, b:array [1..M, 1..K] of
real, var c:array [1..N,1..K] of real)
var n,m,k:integer;
begin
if N>=0 and K>=0 or M>=0 then
begin
MatrixMult := 1;
for n :=1 to N do begin
for k := 1 to K do begin
c[n,k]:= 0;
for m := 1 to M do begin
c[n,k] := c[n,k] + a[n, m]*b[m,k]
end;
end;
end;
end;
e lse MatrixMult := 0;
end;
function BubbleSort (M: integer, var a: array[1..M] of real): integer;
var s: real;
i,k ,m: integer;
begin
m := 0;
BubbleSort := 1;
while k > 0 do begin
k := 0;
for i :=1 to M -1 do begin
if a[i] > a[i+1] then
begin
k:=k+1;
s := a[i];
a[i] := a[i+1];
a[i+1] := s;
end;
end;
if k=0 and m =0 then
BubbleSort := 0;
m := m+1;
end;
end;
procedure NormalSort (M: integer, var a: array[1..M] of real);
var s: real;
i,k ,l: integer;
begin
for k := 1 to M-1 do begin
s := a[k ]; l := k;
for i :=k+1 to M do begin
if s < a[i] then
begin
s := a[i];
l := i;
end;
end;
a[l] := a[k];
a[k] := s;
end;
end;
PROJEKTY
Na najblizsze cwiczenia:
1. Skonstruuj dowolny typ rekordowy
2. Zdefiniuj tablice rekordow w ktorej dokonywac bedziesz poszukiwania jej
elementow zgodnie z zadanymi regulami dla pól.
1.
2.
3.
4.
Sortowanie babelkowe rekordow ksiazka cena
Sortowanie przez wstawianie, rekordow imie, nazwisko wzrost
Znajdowanie liczby pierwszej w zadanej tablicy liczb
Sumowanie procentow (suma wplacona, stale odsetki, coroczny
podatek Belki, ile bede mial pieniedzy w zadanym miesiacu i roku)
5. Liczenie calki z zadanych funkcji metoda trapezow i Simpsona
6. Program na znajdowanie sumy elementów ciagu Fibonacciego
7. Program na liczenie wartosci funkcji sin(x) z rozwiniecia funkcji w
szereg Tylora z zadana dokladnoscia
8. Program do znadowania prostej regresji
9. Metoda regula falsi w znajdowaniu zer zadanej funkcji
10. Program znajdujacy dokladne pierwiastki rownania 3ego stopnia
11. Napisz program ukladajacy rekordy (np. typu kartoteka) na stos (o
ograniczonym rozmiarze), wyszukujacy na stosie zadane elementy
sortujacy stos w zadanym porzadku .
12. Napisz program wstawiajacy napisany kawalek tekstu w zadane
miejsce drugiego tekstu.
13. Napisz program kodujacy tekst w ktorym kluczem kodowym jest
odleglosc znaku kodujacego w tablicy ASCII.
14. Napisz program wylawiajacy z tekstu zadany kawalek tekstu
15. Napisz program zamieniajacy w tekscie zadane znaki innymi
zadanymi znakami.
Cwiczenia No.3
Kartkówka:
1. Mamy tablice A[100,100] wypelniona rekordami o dwóch polach jedno typu char a
drugie typu real.
a. zadeklaruj tablice rekordów
b. napisz funkcje zwracajaca tablice transponowana do A
c. oraz zwracajaca ilosc elementów tablicy dla których pole rzeczywiste posiada
wartosc mniejsza od x i wiekszych od y
2. Mamy tablice B[100,10] wypelniona rekordami o dwóch polach jedno typu char a
drugie typu integer.
a. zadeklaruj tablice rekordów
b. napisz funkcje zwracajaca tablice C[10,100] w której wiersze to odpowiednie
kolumny macierzy B.
c. funkcja zwraca liczbe elementów tablicy w których pole integer jest wieksze od 0.
type rec record
a1: char;
a2: real;
end;
var A: array [1,100, 1..100] of rec;
b:rec;
x,y:real;
i,j,l, ilosc: integer;
const M = 100;
begin
l := 0;
for i := 1 to M do begin
for j:= i+1 to M do begin
begin
b := A[i,j];
if b.a2 <y and b.a2>x then
l:=l+1;
A[i,j] := A[j,i];
if A[j,i].a2 <y and A[j,i].a2>x then
l:=l+1;
A[j,i] := b;
end;
end;
ilosc := l;
end;
Mamy dwa zbiory A i B. Znalezc C sume róznice i iloczyn zbiorów.
SUMA ZBIORÓW (N>=M):
for i := 1 to N do begin
C[i] := A[i];
end;
k := 0;
for i:= 1 to M do begin
b := B[i];
j := 1;
while j < N - k do
begin
if b = C[j] then
begin
C[j] := C[N-k];
k := k +1;
j : = j – 1;
Il[k] : = b;
end;
j := j + 1;
end;
end;
// ILOCZYN
for n := 1 to M do begin
// SUMA
C[j+ n-1] := B [n ];
end;
for n := 1 to j-1 do begin // if j=1 RÓZNICA = zbiór pusty
R [n] := C[n];
end;
W DOMU
Znajdz: liczbe elementów, ilosc powtórzen, iloczyn, sume i róznice stogów
Cwiczenia No.4
Masz N wygenerowanych losowo punktów w kwadracie a na b. Znajdz najblizszych
sasiadów znajdujacych sie nie dalej niz Rcut. Zrób to za pomoca listy polaczone j.
2
algorytm N
var X,Y: array [1..N] of real;
Lmindis: array [1..N] of real;
L:array[1..N] of integer;
x, a, b, distx, disty, dist, Rcut, disi, disj: real;
i,j:integer;
x := iles;
for i:=1 to N do begin
X[i] := a*rand(x);
Y[i] := b*rand(x);
L[i] := 0;
Lmindis[i] := Rcut;
end;
for i:=1 to N do begin
for j:=i+1 to N do begin
distx := X[i]-X[j];
disty := Y[i]-Y[j];
dist := distx*distx + disty*disty;
if dist < Rcut then
begin
disi := Lmindis[i]; disj:= L mindis [j];
if dist < disi then begin Lmindis[i]:=dist; L[i] := j; end;
if dist < disj then begin Lmindis[j]:=dist; L[j] := i; end;
end;
end;
end;
algorytm N
var LL: array [1..N] of integer;
LH: array [1..Nc] of integer;
ncx, ncy, icell, ix, iy: integer;
ncx := a/Rcut; ncy := b/Rcut;
for i:=1 to N do begin
LL[i] := 0;
end;
for i:=1 to Nc do begin
LH[i] := 0;
end;
for i:=1 to N do begin
iy := (Y[i]/b)*ncy;
ix := (X[i]/a)*ncx
icell := ix + iy*ncx + 1 ;
LL[i] := LH[icell];
LH[ice ll] := i;
end;
for icell:=1 to Nc do begin
icellx := (icell-1) div ncx; //reszta z dzielenia
icelly := (icell-1) / ncx;
i := LH[icell];
while i <> 0 do begin
j := LL[i];
// dla innych komorek j:=k:=LH[icell1]
while j <> 0 do begin
distx := X[i]-X[j];
disty := Y[i]-Y[j];
dist := distx*distx + disty* disty;
if dist < Rcut then
begin
disi := Lmindis[i]; disj:= Lmindis[j];
if dist < disi then begin Lmindis[i]:=dist; L[i] := j; end;
if dist < disj then begin Lmindis[j]:=dist; L[j] := i; end;
end;
j := LL[j];
end;
i := LL[i];
end;
icellx1 := icellx – 1; //sprawdzic war brzegowe
icelly1 := icelly;
icell 1:= icellx+icelly*ncx;
i := LH[icell1];
while i <> 0 do begin
j := LH[icell];
while j <> 0 do begin
distx := X[i]-X[j];
disty := Y[i]-Y[j];
dist := distx*distx + disty*disty;
if dist < Rcut then
begin
disi := Lmindis[i]; disj:= Lmindis[j];
if dist < disi then begin Lmindis[i]:=dist; L[i] := j; end;
if dist < disj then begin Lmindis[j]:=dist; L[j] := i; end;
end;
j := LL[j];
end;
i := LL[i];
end;

Podobne dokumenty