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;