Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wykład 10 Informatyka MPDI2 DELPHI cd. - zmienne tablicowe, - zmienne rekordowe - zmienne plikowe.

Podobne prezentacje


Prezentacja na temat: "Wykład 10 Informatyka MPDI2 DELPHI cd. - zmienne tablicowe, - zmienne rekordowe - zmienne plikowe."— Zapis prezentacji:

1 Wykład 10 Informatyka MPDI2 DELPHI cd. - zmienne tablicowe, - zmienne rekordowe - zmienne plikowe

2 Typ tablicowy (array) array [ lista typów indeksów ] of typ bazowy (składowych) Pojęcie: - skończony zbiór elementów tego samego typu składowego (tablice są homogeniczne) - o położeniu (selekcji) określanym przez indeks(-y) (numery) składowej typ porządkowy (o ograniczonym zakresie):  okrojony integer (najczęściej)  okrojony char  wyliczeniowy  boolean dowolny:  prosty  strukturalny (bez plików) tablica tablic,napisów, rekordów Opis:

3 Uwagi tablice służą do gromadzenia wielu wartości tego samego typu (nietrwałe – tylko w pamięci operacyjnej – później poznamy jak zapisywać do plików) wymiar tablicy 1-wymiarowa -wektor 2-wymiarowa (prostokątna) 3-wymiarowa (przestrzenna) itd.. rozmiar – w każdym wymiarze! zawartość – dowolna – także inna tablica! np. array [1..5,1..5] of array [1..2,1..2] of integer;

4  przykłady: var tab1: array[ ] of integer; var tab2: array[ 1..20, 1..30] of real;

5 Tablica ma:  wymiar  rozmiar w każdym wymiarze  mogą być indeksy ujemne var tab: array [ ] of real;

6 Zmienne tablicowe całościoweindeksowane (składowe) xx[k]

7  zmienne indeksowane (składowe) - dostęp do składowych Z [ W 1,..., W n ] Przykłady: var x: array[ ] of real ; begin x[ 2 ] := 10.5; //nadanie wartości y := 10*x[ k ] - 5.2; //użycie w wyrażeniu z:=sin( sqrt( x[ 5 ] ) ) //użycie w wyrażeniu if x[5] >0 then.... //sprawdzenie indeksy  wyrażenia typu zgodnego z typem indeksów zgodne co do liczby, typu i kolejności z deklaracją nazwa tablicy  W typu składowego  użycie - w wyrażeniach lub instrukcjach, jak zmienne typu składowego

8  zmienne całościowe - tylko przypisanie - dla typów tożsamych! brak:+ - * / porównania np: var x, y: array[ 1..5] of integer ; begin y[1] := 35 ; x := y; //przepisz całą zawartość tablicy y do tablicy x..... end

9 type tab = array [1..2, 1..5] of real; var t1, t2 : tab; wie,kol: integer; begin write ('Podaj element 1,1:'); readln(t1[1,1]); //itd. // 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 do t1[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 do write(t1[wie, kol]); writeln; end; readln; end. Przykłady operacji tablicowych cała tablica wypełniona jedynkami pętla wewnętrzna po kolumnach każdego wiersza pętla zewnętrzna po wierszach po wypisaniu wiersza tabeli przejdź do nowego wiersza

10 Zadanie: w wektorze zsumować co drugi element (nieparzyste indeksy) program test; 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) ; //tak też można wstępnie zdefiniować zawartość tablicy begin suma := 0; for k := 1 to N do if (k mod 2) = 1 then suma := suma + x [k]; writeln ( suma :10:3) ; readln end. for k := 1 to ( N+1 ) div 2 do suma := suma + x [ 2*k - 1 ]; albo można tak: zastanowić się!

11 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 podprogramami Przykł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

12 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 wyniku for wie:=1 to N do begin for kol:= 1 to N do write(wyn[wie, kol]:10:2); //wypisanie wiersza writeln; //zmiana wiersza end; readln; end. Całość:

13 Pamiętamy typ string – typ łańcuchowy – zmienna zawiera ciąg znaków var zmienna:string[20]; begin zmienna:= 'lokomotywa'; writeln (zmienna[3]); { wyświetli literę k } {…..} end. Można typ string traktować jako wektor znaków string[20] tożsame z array[0..20] of char;

14 Algorytm przeszukiwania tablic polega na porównywaniu podanego wzorca z kolejnymi elementami tablicy. Pseudokod algorytmu wygląda następująco. 1. Start. 2. Wczytaj tablicę i wzorzec przeszukiwań (czyli czego szukamy). 3. Ustaw zmienną licznika na wartość Sprawdź czy wzorzec jest równy elementowi tablicy o indeksie równym licznikowi. Jeżeli tak to przejdź do punktu 7, jeśli nie to kontynuuj. 5. Zwiększ licznik o Sprawdź czy licznik nie jest większy od rozmiaru tablicy. Jeśli tak, to napisz, że nie znaleziono wzorca i przejdź do punktu 8, jeśli nie to przejdź do punktu Wypisz licznik i element o indeksie równym aktualnemu licznikowi. 8. Stop. Przeszukiwanie tablic jednowymiarowych Oczywiście algorytm znajdzie tylko pierwsze wystąpienie – co zrobić gdy w tablicy elementy się powtarzają?

15 1. Start. 2. Wczytaj tablicę. 3. Przypisz pierwszy element tablicy do E min. 4. Zwiększ licznik o 1. 6.Sprawdź czy licznik nie jest większy od rozmiaru tablicy. Jeśli tak, przejdź do punktu 9. 7.Sprawdź czy aktualny element jest mniejszy od E min.Jeśli tak wstaw go do E min. 8.Przejdź do punktu Wypisz E min. 10. Stop. Wyznaczanie minimum (maksimum) Algorytm przeszukiwania tablic polega na początkowym założeniu, że minimum (maksimum) X jest pierwszym elementem tablicy. Następnie kolejno sprawdzamy elementy od 2 do N - jeśli analizowany element jest mniejszy (większy) od aktualnego X ustawiane jest nowe X. Pseudokod algorytmu wygląda następująco.

16 program maximum; {$APPTYPE CONSOLE} uses SysUtils; var x:array[1..20] of integer; k,max:1..20; begin randomize; for k:=1 to 20 do // losowe wypełnienie tablicy begin x[k]:= random(100); write(x[k]:5); end; max:= x[1]; for k:=2 to 20 do if x[k]>max then max:=x[k]; writeln; writeln(max:10); readln; end.

17 Algorytm polega porównywaniu kolejnych par elementów sąsiadujących i zamianie miejscami w przypadku niewłaściwej kolejności. Po wykonaniu pierwszego przebiegu porównań i ewentualnych zamian miejscami, element największy znajdzie się na końcu (w przypadku porządku sortowania według kolejności rosnącej). Następnie wykonujemy kolejny przebieg porównań par i tak dalej… Sortowanie bąbelkowe

18 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 N N-1 porównań w każdym przebiegu Wykonujemy N przebiegów

19 1 przebieg zamiana zamiana zamiana zamiana zamiana efekt ostatniej zamiany – największy na końcu 2 przebieg zmiana zmiana zmiana przebieg zamiana zamiana przebieg zamiana N=6 zauważamy nadmiarowe porównania

20 5 przebieg zmiana przebieg operacji= (N-1)*N=6*5

21 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

22 1 przebieg zamiana zamiana zamiana zamiana zamiana efekt 2 przebieg zamiana zamiana zamiana efekt 3 przebieg zamiana zamiana efekt 4 przebieg zamiana efekt 5 przebieg zamiana efekt 15 operacji

23 const N=10; var tab:array [1..N] of integer ; k, m:1..N; pom, lop:integer; begin randomize; //wypełnienie losowe tablicy 1-wymiarowej 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; //wypisanie wyniku for k:= 1 to N do write(tab[k]:6); writeln;writeln(lop); readln; end. Sortowanie bąbelkowe lop=90 zamiana wartości tab[m] i tab[m+1]

24 const N=10; var tab:array [1..N] of integer ; k,m:1..N; pom,lop:integer; begin randomize; //wypełnienie losowe tablicy 1-wymiarowej 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; //wypisanie wyniku for k:= 1 to N do write(tab[k]:6); writeln;writeln(lop); readln; end. Sortowanie bąbelkowe skrócone różnice! lop=45 szybsze

25 Typ rekordowy (record)  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 Czyli zestaw nazwanych pól dowolnego typu (i różnego rozmiaru)

26  opis: record lista_nazw_pól: typ1; lista_nazw_pól: typ2;... end typ dowolny:prosty lub strukturalny (bez plików) pole rekordu może być: liczbą, tekstem, tablicą, napisem, innym rekordem

27 type data = record rok: ; mies: 1..12; dzien: end; var student : record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; stypend: real end; Przykłady:

28  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 Porównanie: Uwaga: Rekord to jeden zestaw danych (np. dane jednego studenta), jeśli potrzebujemy analizy większej liczby to tworzymy tablicę rekordów

29 var student : record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; stypend: real end; var t1:array [1..5, 1..6] of real; Zmienna tablicowa Zmienna rekordowa Deklaracje (opis) zmiennych type dane = record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; stypend: real end; var student: dane; lub

30 Wykorzystanie zmiennych rekordowych w programie  zmienne całościowe - tylko przypisanie – możliwe jedynie dla typów tożsamych czyli dokładnie takie same składowe! brak:+ - * /porównania wejścia/wyjścia – wczytać lub wypisać można tylko składową (pole) var r1, r2: record.. definicja... end ; begin //… ustalenie zawartości zmiennej r1 r2 := r1; //przepisz zawartość r1 do r2 np:

31  desygnator pola (składowa) - dostęp do pola Z. p nazwa pola  Z typu składowego nazwa zmiennej rekordowej UWAGA: kropka oddzielająca!

32 użycie: w wyrażeniach lub instrukcjach, w zależności od typu składowej Przykład1 type data= record dzien, miesiac, rok:integer end; var student: record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data ; //zdefiniowany typ rekordowy stypend: real end; begin student.nazw:= 'Kowalski'; student.stypend:= 300; student.data_ur.dzien:= 3; student.data_ur.rok := 1993; student.imie[1]:= 'Jan'; writeln(student.imie[1][2] ) ; //to 2-ga litera 1-go imienia //itd. definicje program

33 program test; type data= record dzien, miesiac, rok:integer; end; var student: record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; stypend: real end; begin write('Podaj imię1:'); readln(student.imie[1]); write('Podaj drugie imię:'); readln(student.imie[2]); write('Podaj dzien urodzenia:'); readln(student.data_ur.dzien); //itd. writeln(student.imie[1]); //wypisz na ekranie //itd. end. Przykład2:

34 Użycie elementów tablicy i rekordu w części wykonawczej programu: tablicat1[5, 6] rekord student.nazwisko student.imie[1] student.data_ur.rok w zależności od typu indeks (-y) nazwy pól zmienna

35 type data = record rok: ; mies: 1..12; dzien: end; osoba = record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; end; var os1: osoba ; // zmienna rekordowa pomocnicza grupa: array[1..100] of osoba ; //tablica rekordów !!!! TABLICE REKORDÓW Tablice rekordów służą do gromadzenia wielu danych typu rekordowego (zwykle 1-wymiarowe)

36 grupa – zmienna typu tablicowego grupa[k] – zmienna typu rekordowego grupa[1].nazw- zmienna typu string grupa[2].imie – zmienna typu tablicowego grupa[k].imie[1] - zmienna typu string grupa[k].data_ur - zmienna typu rekordowego grupa[k].data_ur.rok – zmienna typu integer grupa[2].imie[2][5] – zmienna 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…

37 Instrukcja wiążąca - with  dotyczy tylko zmiennych rekordowych (obiektowych)  upraszcza zapis !! with lista_zmiennych_rekordowych do instrukcja; najczęściej begin... end można tu używać nazw pól bez specyfikowania zmiennej rekordowej przykład: student.nazw :='Kowalski'; student.imie[1] := 'Jan'; student.data_ur.rok := 1988; student.stypendium := 420.0; with student do begin nazw :='Kowalski'; imie[1] := 'Jan'; data_ur.rok := 1988; stypendium := 420.0; end; Opis:

38 Obsługa plików  składowe takiego samego dowolnego typu - prostego, strukturalnego - nie pliki  dostęp sekwencyjny - operacje np.:  czytaj pierwszy | czytaj następny  zapisz na początku | zapisz na końcu  brak selektora (adresacji)  rozmiar dynamiczny  istnieje wewnętrzny wskaźnik elementu bieżącego, automatycznie modyfikowany po każdej operacji odczyt | zapis  fizycznie - w pamięci zewnętrznej: dysk, dyskietka, CD-ROM, - znakowe urządzenia wej/wyj: (monitor), drukarka Pojęcie i istota stosowania elementy

39 Po otwarciu do odczytu wskaźnik ustawia się na początku pliku, każdy odczyt lub zapis przesuwa wskaźnik o jedną pozycję. Otwarcie nowego (nieistniejącego) pliku powoduje utworzenie pustego pliku, jeśli plik istniał jego zawartość zostaje usunięta, Można sprawdzić czy wskaźnik jest na końcu pliku Można przewinąć wskaźnik na początek – jeśli wtedy stwierdzimy, że jesteśmy na końcu pliku to plik jest pusty, Zapis nowego elementu zalecany tylko na końcu pliku (w środku można, ale wtedy zmienimy (nadpiszemy) wartość elementu). Dopisanie „w środku” pliku wykonuje się przez etapowe przepisywanie do innego pliku. Uwagi:

40  istotne cele file of T b - plik elementowy ( binarny, zdefiniowany ) o składowych typu T b textFile - plik tekstowy czyli file of string Opis typu plikowego deklaracja: var lista_nazw_zmiennych: T p ; - T p jest opisem typu plikowego lub nazwą typu są zmienne całościowe - reprezentują cały plik nie ma zmiennych składowych - brak selektora są operacje dotyczące składowych pliku (procedury, funkcje), korzystamy ze zmiennych odpowiadających składowym plików Wprowadza się tzw. zmienne plikowe służące do komunikowania programu z plikami fizycznymi - gromadzenie dużej ilości informacji w sposób trwały - przenoszenie danych między programami | komputerami

41 Przykłady deklaracji zmiennych plikowych: type osoba = record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; pensja: real end; dwa_napisy = array[1..2] of string[15]; //definiujemy zmienne typu plikowego varoceny: file of real; nazwiska: file of string[20]; zaloga: file of osoba; adresy: file of dwa_napisy; wyniki: textFile;

42 Kolejność operacji plikowych: 1.skojarzenie zmiennej plikowej z plikiem fizycznym 2.otwarcie pliku (do zapisu lub odczytu) 3.operacje (czytanie, zapis) 4.zamknięcie !!!

43 W bloku wykonawczym skojarzenie- f  ’d:\ścieżka\plik’ otwarcie pliku f do- zapisu - odczytu - dodawania (tylko tekstowe) operacje- zapis | odczyt zamknięcie pliku f usunięcie pliku f | zmiana położenia (nazwy) Reguły obsługi plików W części deklaracyjnej opis zmiennych plikowych type osoba =.....; var grupa: file of osoba;

44 procedura : reset ( f ) - otwarcie do odczytu /zapisu (zastępowanie) - jeśli plik istnieje!!! - plik staje się aktywny - wskaźnik na początku pliku - gdy plik nie istnieje  błąd wykonania procedura : rewrite ( f ) - otwarcie do zapisu - gdy plik nie istniał  jest tworzony - gdy plik istniał  jest zerowany - wskaźnik na początku-końcu pliku pustego procedura: assignFile ( f, W t ) - skojarzenie f zmienna plikowa np.: assignFile ( grupa, ' C:\ROK_II\grupa_1.bin ' ); stała tekstowa – ścieżka i nazwa pliku na dysku..istnieje grupa standardowych procedur i funkcji, m.in. procedura: append ( f ) - otwarcie do zapisu na końcu pliku (tylko dla pliku typu texfile)

45 procedura : read( f, zmienna) procedura : write( f, zmienna ) zapis do pliku Odczyt z pliku Można korzystać z readln i writeln, ale tylko dla zmiennych plikowych typu Textfile f zmienna plikowa zmienna takiego samego typu jak element pliku

46 Także operacje systemu plików – np. procedura erase(plik) – usunięcie pliku procedura : closeFile ( f ) - zamknięcie pliku - dopisuje zawartość bufora do pliku, zwalnia go - powinno się odbyć przed zakończeniem programu funkcja: eof ( f ) - badanie końca pliku (end of file) - wartość logiczna: true - wskaźnik po ostatniej wartości (na końcu) false - wskaźnik w środku

47 program test; var p1:TextFile; z:real; begin z:=7.5; assignfile(p1,'d:\dane\a.txt'); rewrite(p1); //otwarcie do zapisu writeln(p1,z:2:0); //wpisze do pliku 8 closeFile(p1); end. Przykład: Zapis liczby do pliku tekstowego nazwa fizycznego pliku (wraz z ewentualną ścieżką dostępu)

48 program test; var p1:TextFile; z:real; begin assignFile(p1,'a.txt'); //plik w tym samym folderze co program reset(p1); readln(p1,z); //czytanie z pliku do zmiennej CloseFile(p1); writeln(z:10:3); //wypisanie na konsoli readln end. Przykład: odczyt jednej liczby z pliku tekstowego

49 program test; var p1:TextFile; z:real; begin assignFile(p1,'a.txt'); reset(p1); while not eof(p1) do begin readln(p1,z); //czytanie z pliku do zmiennej writeln(z:10:3); //wypisanie na konsoli end; CloseFile(p1); readln end. Jeśli więcej liczb w wierszach w pliku i nie wiemy ile, zwykle stosuje się konstrukcję while..do pętla - dopóki nie ma końca pliku wykonuj...

50 program pliki; type osoba = record nazw, imie: string[ 20 ]; stypendium: real end; var student:osoba; plik:file of osoba; begin assignfile(plik,'spis.bin');//skojarzenie rewrite(plik);//utworzenie pliku readln(student.nazw); //użytkownik podaje elementy readln(student.imie); readln(student.stypendium); write(plik,student);//zapis do pliku całego rekordu!!!! closeFile(plik); readln end. Prosty zapis do pliku elementowego

51 program pliki2; type osoba = record nazw, imie: string[ 20 ]; stypendium: real; end; var student:osoba; plik:file of osoba; begin assignfile(plik,'spis.bin');//skojarzenie reset(plik);//otwarcie pliku read(plik,student);//odczyt z pliku całego rekordu!!!! writeln(student.nazw); //wypisujemy na ekranie writeln(student.imie); writeln(student.stypendium); closeFile(plik); readln; end. Prosty odczyt z pliku elementowego


Pobierz ppt "Wykład 10 Informatyka MPDI2 DELPHI cd. - zmienne tablicowe, - zmienne rekordowe - zmienne plikowe."

Podobne prezentacje


Reklamy Google