Wykład 1
description
Transcript of Wykład 1
Wykład 1
Informatyka II
MPZI2 sem.letni
Tablice
Tablice deklarujemy
array [ lista typów indeksów ] of typ bazowy (składowych)
np.
var t1,t2:array [1..5, 1..6] of real;
const osoby: array[ 1..3] of string[20] = ( 'Nowak', 'Kowalski', 'Nycz' );
Nadanie wartości początkowych zmiennym tablicowym- dla tablic konstrukcja typu:
( (st11, st21,..., stn1 ), (st12, st22,..., stn2 ), . . . (st1m, st2m,..., stnm) )
var wyniki: array[ 1..3, 1..4] of real = ( ( 3, 4, 4.5, 5),
( 2, 3.5, 5.0, 4.5), (5.0, 4, 3.5, 2) );
albo zmienna (zmiennym można w programie zmienić wartości a stałym NIE):
program p2;uses SysUtils; var wyniki: array[ 1..3, 1..4] of real
= (( 3, 4, 4.5, 5), ( 2, 3.5, 5.0, 4.5), (5.0, 4, 3.5, 2));
begin writeln (wyniki[1,1]:10:2); //wypisze wartość 3.00 readln;end.
Przykład:
typetab = array [1..2, 1..5] of real;
vart1, t2 : tab;wie,kol: integer;
beginwrite ('Podaj element 1,1:'); readln(t1[1,1]); //itp.
// najczęściej operacje w pętli zagnieżdżanej jeśli tablica 2-wymiarowa for wie:=1 to 2 do
for kol:= 1 to 5 dot1[wie, kol] :=1;
//wyświetlenie na ekranie też w pętli zagnieżdżanej for wie:=1 to 2 do begin
for kol:= 1 to 5 dowrite(t1[wie, kol]);
writeln; end;readln;end.
Przykłady operacji tablicowych
Zadanie: w wektorze zsumować co drugi element (nieparzyste indeksy)
const N=12;type zakres = 1..N;var k: zakres;suma: real; x: array [ 1 .. N ] of real= ( 3, 4, 4.5, 5, 2, 3.5, 5.0, 4.5, 5.0, 4, 3.5, 2);begin suma := 0; for k := 1 to N do if (k mod 2) = 1 then suma := suma + x [k]; writeln ( suma :10:3) ; readlnend.
for k := 1 to ( N+1 ) div 2 do suma := suma + x [ 2*k - 1 ];
albo można tak:
zastanowić się!
Pamiętajmy: Nie ma gotowych operacji macierzowych (mnożenie, obliczanie wyznacznika, znajdowanie macierzy odwrotnej itp.), trzeba samemu stworzyć algorytm lub posiadać odpowiednie biblioteki z gotowymi podprogramamiPrzykładowo mnożenie tablic:program mn24;var t1:array[1..2, 1..4] of real =
((1,2,4,-1),(0, -1, 8, 1)); t2 :array[1..4,1..2] of real =
((1,1.1),(4,-2.0),(0, -1),(-3,-2.5)); wyn: array[1..2,1..2] of real; i:1..4;begin// obliczanie elementu 1,1 wyn[1,1]:=0; for i:=1 to 4 do
wyn[1,1]:= wyn[1,1]+ t1[1,i]*t2[i,1]; writeln(wyn[1, 1]:10:2); readln;end.
1 1.1
4 -2
0 -1
-3 -2.5
1 2 4 -1
0 -1 8 1
program mn24;const N=2; M=4;var t1:array[1..N, 1..M] of real = ((1,2,4,-1),(0, -1, 8, 1)); t2 :array[1..M,1..N] of real= ((1,1.1),(4,-2.0),(0, -1),(-3,-2.5)); wyn: array[1..N,1..N] of real; wie,kol, i:1..4;begin //potrójna pętla! for wie:=1 to N do for kol:=1 to N do for i:=1 to M do
wyn[wie,kol]:= wyn[wie,kol]+ t1[wie,i]*t2[i,kol];//wyswietlenie wynikufor wie:=1 to N do begin
for kol:= 1 to N dowrite(wyn[wie, kol]:10:2); //wypisanie wiersza
writeln; //zmiana wiersza end;readln;end.
Całość:
...begin //potrójna pętla! for wie:=1 to N do begin for kol:=1 to N do begin //utworzenie elementu for i:=1 to M do
wyn[wie,kol]:= wyn[wie,kol]+ t1[wie,i]*t2[i,kol]; // i od razu wyświetlenie write(wyn[wie, kol]:10:2); end; writeln; end;readln;end.
Można wyświetlać wyniki od razu po utworzeniu elementu
Algorytm polega porównywaniu kolejnych par elementów sąsiadujących i zamianie miejscami w przypadku niewłaściwej kolejności
Sortowanie bąbelkowe
Sortowanie
1 2 3 4 ..... N
N-1 porównań
Wykonujemy N przebiegów
1 przebieg12 5 11 4 7 2 zamiana 1 5 12 11 4 7 2 zamiana 2 5 11 12 4 7 2 zamiana 3 5 11 4 12 7 2 zamiana 4 5 11 4 7 12 2 zamiana 5 5 11 4 7 2 12 efekt ostatniej zamiany
– największy na końcu2 przebieg
5 11 4 7 2 12 5 11 4 7 2 12 zmiana 6 5 4 11 7 2 12 zmiana 7 5 4 7 11 2 12 zmiana 8 5 4 7 2 11 12 5 4 7 2 11 12
3 przebieg 5 4 7 2 11 12 zamiana 9 4 5 7 2 11 12 4 5 7 2 11 12 zamiana 10 4 5 2 7 11 12 4 5 2 7 11 12 4 5 2 7 11 12
4 przebieg 4 5 2 7 11 12 4 5 2 7 11 12 zamiana 11 4 2 5 7 11 12 4 2 5 7 11 12 4 2 5 7 11 12 4 2 5 7 11 12
N=6
zauważamy nadmiarowe porównania
5 przebieg 4 2 5 7 11 12 zmiana 12 2 4 5 7 11 12 2 4 5 7 11 12 2 4 5 7 11 12 2 4 5 7 11 12 2 4 5 7 11 12
6 przebieg 2 4 5 7 11 12 2 4 5 7 11 12 2 4 5 7 11 12 2 4 5 7 11 12 2 4 5 7 11 12
30 operacji= (N-1)*N=6*5
Algorytm polega na porównywaniu kolejnych par elementów sąsiadujących, z tym, że w każdym kolejnym przebiegu liczba analizowanych par jest zmniejszana o 1
Przebiegów wykonujemy N-1
Sortowanie bąbelkowe skrócone
1 przebieg12 5 11 4 7 2 zamiana 1 5 12 11 4 7 2 zamiana 2 5 11 12 4 7 2 zamiana 3 5 11 4 12 7 2 zamiana 4 5 11 4 7 12 2 zamiana 5 5 11 4 7 2 12 efekt
2 przebieg 5 11 4 7 2 12 5 11 4 7 2 12 zamiana 6 5 4 11 7 2 12 zamiana 7 5 4 7 11 2 12 zamiana 8 5 4 7 2 11 12 efekt
3 przebieg 5 4 7 2 11 12 zamiana 9 4 5 7 2 11 12 4 5 7 2 11 12zamiana 10 4 5 2 7 11 12 efekt
4 przebieg 4 5 2 7 11 12 4 5 2 7 11 12zamiana 11 4 2 5 7 11 12 efekt
5 przebieg 4 2 5 7 11 12zamiana 12 2 4 5 7 11 12 efekt
15 operacji
5
4
3
2
1
Algorytm polega na porównywaniu:• pierwszego elementu z kolejnymi i dokonanie
zamiany jeśli trzeba, • drugiego elementu z kolejnymi itd.,• aż do porównania dwóch ostatnich elementów.
N2 (N-1) operacji
Można też tak (rodzaj sortowania bąbelkowego):
1 przebieg12 5 11 4 7 2 zamiana 1 5 12 11 4 7 2 5 12 11 4 7 2 zamiana 2 4 12 11 5 7 2 4 12 11 5 7 2 zamiana 3 2 12 11 5 7 4 najmniejszy na początku
2 przebieg 2 12 11 5 7 4 zamiana 4 .. więc zaczynamy od 2-go 2 11 12 5 7 4 zamiana 5 2 5 12 11 7 4 2 5 12 11 7 4 zamiana 6 2 4 12 11 7 5
3 przebieg 2 4 12 11 7 5 zamiana 7 2 4 11 12 7 5 zamiana 8 2 4 7 12 11 5 zamiana 9 2 4 5 12 11 7
4 przebieg 2 4 5 12 11 7 zamiana 10 2 4 5 11 12 7 zamiana 11 2 4 5 7 12 11
5 przebieg 2 4 5 7 12 11 zamiana 12 2 4 5 7 11 12
15 operacji
const N=10; var tab:array [1..N] of integer; var k,m:1..N; pom,lop:integer;begin//wypełnienie losowe tablicy 1-wymiarowej Randomize; for k:=1 to N do tab[k]:=random(100);//sortowanie for k:=1 to N do for m:=1 to N-1 do begin lop:=lop+1;
if tab[m]>tab[m+1] then begin
pom:=tab[m];tab[m]:=tab[m+1];tab[m+1]:=pom;
end; end;//wypisanie wynikufor k:= 1 to N do write(tab[k]:6);writeln;writeln(lop);readln;end.
Bąbelkowe
lop=90
const N=10; var tab:array [1..N] of integer; var k,m:1..N; pom,lop:integer;begin//wypełnienie losowe tablicy 1-wymiarowej Randomize; for k:=1 to N do tab[k]:=random(100);//sortowanie for k:=1 to N-1 do for m:=1 to N-k do begin lop:=lop+1;
if tab[m]>tab[m+1] then begin
pom:=tab[m];tab[m]:=tab[m+1];tab[m+1]:=pom;
end; end;//wypisanie wynikufor k:= 1 to N do write(tab[k]:6);writeln;writeln(lop);readln;end.
Bąbelkowe skrócone
różnice!
lop=45
szybsze
Typ rekordowy (record)Pojęcie i opis
· opis:record lista_nazw_pól: typ; . . .
end
· pojęcie:- skończony zbiór elementów dowolnego typu składowego
tak zwane pola- ułożone jednowymiarowo- o położeniu (selekcji) określanym przez nazwę składowej (pola) - tzw. dostęp kwalifikowany
wektor nazwanych pól dowolnego typu (różnego rozmiaru)
typ dowolny: prosty lubstrukturalny (bez plików)
pole może być tablicą,napisem, innymrekordem
deklaracja_pól_tego_samego_typu;
· przykłady:type data = record
rok: 1900 .. 2100;mies: 1..12;dzien: 1..31
end;
· fizycznie:w PaO kolejne wartości pól określonego typu
311
121
21001900
..
..
..
-
-
-
dzien
mies
rok
var student: record
nazw: string[ 20 ]; imie: array[1..2] of
string[ 15 ]; data_ur: data; stypend: real
end;
| | | | | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
nazw
data_ur
imie
stypend
[1][2]
rokmies
dzien
· jednakowe składowe· selektor typu indeks· dostęp bezpośredni· statyczny rozmiar
· różne składowe· selektorem jest nazwa pola· dostęp bezpośredni· statyczny rozmiar
12...
wektor
N
dł pole 1
rekord
pole 2
. . .
pole N
Porównanie:
Uwaga:Rekord to jeden zestaw danych (np. dane jednego studenta), jeśli potrzebujemy analizy większej liczby to tworzymy tablicę rekordów
Zmienne rekordowe
· zmienne całościowe - tylko przypisanie - typów tożsamych!
całościowe desygnator pola (składowa)
brak: + - * /porównaniawejścia/wyjścia – można tylko składową (pole)
np:var r1, r2: record ..definicja... end ; begin
r1 := r2;
21 rekrek ZZ :
· desygnator pola (składowa) - dostęp do pola
Z . p
Przykład:
nazwa pola
Ztypu składowego
· użycie - w wyrażeniach lub instrukcjach, jak zmienne typu składowego
type data= record dzien, miesiac, rok:integer;
var student: record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data;//zdef. typ rekordowy
stypend: real end;
student.nazw (nazwisko)student.stypendstudent.imie (tablica)student.data_ur.dzienstudent.data_ur.rokstudent.imie[1] (1-sze imię)
student.imie[2][1] (1-sza litera 2-go imienia)
nazwa zmiennej rekordowej
type osoba = record
nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data;
end;var grupa: array[1..100] of osoba; //tablica rekordów !!!! os1:osoba; // zmienna rekordowa pomocnicza
grupa – zmienna typu tablicowegogrupa[k] – typu rekordowegogrupa[1].nazw - typu stringgrupa[2].imie – typu tablicowegogrupa[k].imie[1] - typu stringgrupa[k].data_ur - typu rekordowegogrupa[k].data_ur.rok – typu integergrupa[2].imie[2][5] – typu char
Użycie zależne od typu:writeln( grupa[3].nazw);os1.nazw := 'Nowak';grupa[50]:=os1;os1:= grupa[51];writeln (grupa[k]. imie[1]);writeln(length(grupa[30].nazw))if grupa[k].data_ur.rok>1970 then…
type data = record rok: 1900 .. 2100; mies: 1..12; dzien: 1..31
end;
TABLICE REKORDÓW
· jednakowe składowe· selektor typu indeks
· różne składowe· selektorem jest nazwa
pola
12...
wektor
N
dł pole 1
rekord
pole 2
. . .
pole N
var student: record
nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; stypend: real
end;
var t1:array [1..5, 1..6] of real;Zmienna tablicowa
Zmienna rekordowa
Deklaracje (opis) zmiennych
Użycie w części wykonawczej programu
tablica t1[5, 6]
rekord student.nazwisko
student.imie[1]
student.data_ur.rok
w zależności od typu
indeks (-y)
nazwa pola
var grupa: array[1..100] of osoba; //tablica rekordów !!!!
type data = record rok: 1900 .. 2100; mies: 1..12; dzien: 1..31
end;osoba = record
nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data;
end;
TABLICE REKORDÓW
Instrukcja wiążąca - with· dotyczy tylko zmiennych rekordowych (obiektowych)· upraszcza zapis !!
with lista_zmiennych_rekordowych do instrukcja;
najczęściej begin. . .
endmożna tu używać nazw pólbez specyfikowania zmiennej rekordowej
przykład:
student.nazw :=’Kowalski’;student.imie[1] := ’Jan’;student.data_ur.rok := 1988;student.stypendium := 420.00;
with student do begin nazw :=’Kowalski’; imie[1] := ’Jan’; data_ur.rok := 1988; stypendium := 420,00;end;
Opis:
Podprogramy
· dzielenie programu na części (logicznie spójne)· nazwane· niezależne od pozostałych części· z określonym sposobem wymiany informacji z innymi częściami
(przekazywanie danych)
· korzyści:· krótszy zapis źródłowy· efektywniejsze wykorzystanie PaO (mniej)· czytelność· łatwiejsze uruchamianie i testowanie· tworzenie bibliotek i korzystanie z nich
Pojęcie i istota stosowania
Definiowanie
· różnice - sposób definiowania - funkcja przyjmuje wartość a procedura nie- sposób wywołania
procedury
nagłówek: procedure nazwa_proc (deklaracje_parametrów_formalnych ); function nazwa_fun ( deklaracje_param._formal. ): typ_wartości;
lista_nazw_parametrów_formalnych: nazwa_typu var lista_nazw_parametrów_ formalnych : nazwa_typu
elementy listy oddzielane ; mechanizm przekazywania danych
funkcje
Czyli...
- musimy zdefiniować sposób otrzymywania przez podprogram danych i ewentualny zwrot wyników oraz operacje wykonawcze podprogramu
podprogram
dane
wyniki
function nazwa (parametry formalne): typ funkcji ;definicje, deklaracje lokalnebegin ....
nazwa := wyrażenie ; //albo result:=wyrażenieend ;
procedure nazwa (parametry formalne) ;definicje, deklaracjebegin....
instrukcje....end ;
Definicje funkcji i procedury dane wynik
dane i ewentualne wyniki
Wywołanie (wykonanie)procedura – osobna instrukcja wykonania:
nazwa_procedury( lista_parametrów_aktualnych );
Uwagi:parametry aktualne zgodne z parametrami formalnymi:
- co do liczby- co do typu- co do kolejności
funkcja – najczęściej w wyrażeniu (jako składniku instrukcji): nazwa_funkcji( lista_parametrów_aktualnych );
ale może być też osobną instrukcją, gdy nie zależy nam na zwracanej wartości
parametry oddzielane przecinkami ,
var a, b, c:real;begin
a:=2; writeln(srednia (6.7, 2*a)) ; readln;
end.
function srednia (x1, x2 : real): real ; begin
result := (x1 + x2)/2 ;//albosrednia:= (x1 + x2)/2 ;
end ; {koniec definicji funkcji}
parametry formalne typ wyniku
program p1;
Przykład funkcji obliczającej średnią arytmetyczną Definicja lokalna funkcji
parametry aktualne
Przekazywanie danych z/do podprogramu
- parametr formalny bez var - jest zmienną lokalną - wartość początkowa w momencie wywołania- argument aktualny - wyrażenie typu zgodnego- przekazywanie danych tylko na wejściu do podprogramu
· przez zmienną (adres) - określonego typu (referencyjnie)
- parametr formalny z var - faktycznie nie dane lecz adres argumentu aktualnego- argument aktualny - zmienna tego samego typu- przekazywanie danych na wyjściu (czyli w większości
przypadków zwrot wyniku lub wyników) - ale może być także na wejściu
· przez wartość
program x; procedure alfa(x1,x2:real; var wynik:real); begin
wynik:=x1-x2; end;
var w:real; //dodatkowa zmienna begin
alfa(5,2,w);writeln(w) ;alfa(4,2,w);writeln(w) ;readln;
end;
definicja procedury
Przykład
procedure srednia (liczba1, liczba2 : real ; var wynik : real) ; begin
wynik := (liczba1 + liczba2)/2 ;end ; {koniec definicji procedury}
var a, b, c:real;begin
a:=2; b:=3;srednia (6.7, 2*a, c) ; {trzeci parametr aktualny musi być zmienną}writeln(c)) ; {c jest równe (6.7+2*2)/2=5.35}
srednia (a, b, c) ;writeln(c) ; {c jest równe (2+3)/2=2.5}
srednia (a, c, c) ;writeln(c) ; {c jest równe (2+2.5)/2=2.25}
srednia (c, b, a) ; writeln(a) ; {a jest równe (2.25+3)/2=2.67..
end.
Przykład procedury obliczającej średnią arytmetycznąparametry formalne
parametry aktualne
var !!Program proc;