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. 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) Wyrazenia Volume := 4.0/3.0 * Pi * Radius*Radius*Radius; TablicaA := Obliczono objetosc ; Operatory Arytmetyczne *, /, div,+, -, Przypisania := Logiczne: and, or Relacyjne: = <> < > <= >= Instrukcja sterujaca if then if Radius > Limit then Volume := 4.0/3.0* PI * Radius * Radius * Radius; Wynik := Volume/2; Instrukcja while... do... 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; if (N <> 0) then ST := 1; Ind :=1; while Ind <= Silnia do ST := ST * nd; Ind := Ind + 1; else ST := 1; Silnia := ST; ======================= Rekurencja ============================== function Silnia (N:integer):integer; var N: integer; if (N = 0) then Silnia := 1; else Silnia := N* Silnia (N-1); =============================================== 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; if (N = 1) or (N div 2) = 0 then comm := NotPrime; else 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; prime := comm;
======================Rozwiazywanie rownania kwadratowego ============= function sqreqs (a,b,c:real, var x: array [1..2] of real): integer; delta := sqr (b) 4* a*c; if delta < 0 then sqreqs := 0; else if delta = 0 then x[1] := -b/(2*a); x[2] := x[1]; sqreqs := 1; else x[1] := (-b+sqrt(delta))/(2*a); x[2] := (-b- sqrt(delta))/(2*a); sqreqs := 2;
=================Funkcja znajdujaca wartosc e**x ============== function exponent (x, Err:real): real; const Huge = 3.5E24; var error: real; if (x<1.0) then exponent := 1+x; error := Huge; id := 2; while error > Err do exponent := exponent + Power (x,id)/silnia(id); id := id + 1; error := 1.0/Silnia(id); else exponent = -1.0;
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.
1. Instrukcja case Cwiczenia No.2 case PrzekroczeniePredkosci of 0 : Mandat := 0; 5: Mandat := 50; 10: Mandat := 75; 15: Mandat := 100; 20, 25, 30: Mandat := Przekroczenie Predkosci * 20; else Mandat := MaksymalnyMandat; 2. Rekordy Rekord jest to zbiór powiazanych danych zgrupowanych w jednej strukturze. Po zadeklarowaniu typu rekordowego, trzeba zadeklarowac 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; 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 Karta001[1].imie := waldus ; Karta001[1].nazwisko := kiepski ; Karta001[1].ulica := Polna ; Karta001[1].kodpocztowy := 320675;
with Karta001[1] do imie := waldus ; nazwisko := kiepski ; ulica := Polna ; kodpocztowy := 320675; 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; if k<=0 then insert := 1; for i:=n downto k+1 do x[i] := x[i-1]; x[k] := a; else insert := 0;
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; if N>=0 and K>=0 or M>=0 then MatrixMult := 1; for n :=1 to N do for k := 1 to K do c[n,k]:= 0; for m := 1 to M do c[n,k] := c[n,k] + a[n, m]*b[m,k] else MatrixMult := 0; function BubbleSort (M: integer, var a: array[1..m] of real): integer; var s: real; i,k,m: integer; m := 0; BubbleSort := 1; while k > 0 do k := 0; for i :=1 to M -1 do if a[i] > a[i+1] then k:=k+1; s := a[i]; a[i] := a[i+1]; a[i+1] := s; if k=0 and m =0 then BubbleSort := 0; m := m+1;
procedure NormalSort (M: integer, var a: array[1..m] of real); var s: real; i,k,l: integer; for k := 1 to M-1 do s := a[k ]; l := k; for i :=k+1 to M do if s < a[i] then s := a[i]; l := i; a[l] := a[k]; a[k] := s; 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. Sortowanie babelkowe rekordow ksiazka cena 2. Sortowanie przez wstawianie, rekordow imie, nazwisko wzrost 3. Znajdowanie liczby pierwszej w zadanej tablicy liczb 4. 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; var A: array [1,100, 1..100] of rec; b:rec; x,y:real; i,j,l, ilosc: integer; const M = 100; l := 0; for i := 1 to M do for j:= i+1 to M do 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; ilosc := l;
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 C[i] := A[i]; k := 0; for i:= 1 to M do b := B[i]; j := 1; while j < N - k do if b = C[j] then C[j] := C[N-k]; k := k +1; j : = j 1; Il[k] : = b; j := j + 1; // ILOCZYN for n := 1 to M do // SUMA C[j+ n-1] := B [n ]; for n := 1 to j-1 do // if j=1 RÓZNICA = zbiór pusty R [n] := C[n]; 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 polaczonej. algorytm N 2 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 X[i] := a*rand(x); Y[i] := b*rand(x); L[i] := 0; Lmindis[i] := Rcut; for i:=1 to N do for j:=i+1 to N do distx := X[i]-X[j]; disty := Y[i]-Y[j]; dist := distx*distx + disty*disty; if dist < Rcut then disi := Lmindis[i]; disj:= Lmindis[j]; if dist < disi then Lmindis[i]:=dist; L[i] := j; if dist < disj then Lmindis[j]:=dist; L[j] := i;
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 LL[i] := 0; for i:=1 to Nc do LH[i] := 0; for i:=1 to N do iy := (Y[i]/b)*ncy; ix := (X[i]/a)*ncx icell := ix + iy*ncx + 1 ; LL[i] := LH[icell]; LH[ice ll] := i; for icell:=1 to Nc do icellx := (icell-1) div ncx; //reszta z dzielenia icelly := (icell-1) / ncx; i := LH[icell]; while i <> 0 do j := LL[i]; // dla innych komorek j:=k:=lh[icell1] while j <> 0 do distx := X[i]-X[j]; disty := Y[i]-Y[j]; dist := distx*distx + disty* disty; if dist < Rcut then disi := Lmindis[i]; disj:= Lmindis[j]; if dist < disi then Lmindis[i]:=dist; L[i] := j; if dist < disj then Lmindis[j]:=dist; L[j] := i; j := LL[j]; i := LL[i]; icellx1 := icellx 1; //sprawdzic war brzegowe icelly1 := icelly; icell 1:= icellx+icelly*ncx;
i := LH[icell1]; while i <> 0 do j := LH[icell]; while j <> 0 do distx := X[i]-X[j]; disty := Y[i]-Y[j]; dist := distx*distx + disty*disty; if dist < Rcut then disi := Lmindis[i]; disj:= Lmindis[j]; if dist < disi then Lmindis[i]:=dist; L[i] := j; if dist < disj then Lmindis[j]:=dist; L[j] := i; j := LL[j]; i := LL[i];