1. Język ObjectPascal - typ tablicowy (array)

Slides:



Advertisements
Podobne prezentacje
Katarzyna Szafrańska kl. II ti
Advertisements

Wprowadzenie do informatyki Wykład 6
Programowanie w języku Visual Basic
PASCAL (3) dr Anna Kwiatkowska.
typy całkowite (całkowitoliczbowe)
PROGRAMOWANIE STRUKTURALNE
PROGRAMOWANIE STRUKTURALNE
Obiekty i zdarzenia w środowisku Delphi
OBJECT PASCAL Marzena Szałas.
ZŁOŻONOŚĆ OBLICZENIOWA
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 6: Tablice, rekordy, zbiory.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 5: Typy porządkowe, wyliczeniowe i okrojone. Definiowanie.
Zakres i zasięg deklaracji Zakres : obszar programu, w którym identyfikator może być użyty zakres globalny : cały program zakres lokalny : definicja pojedynczej.
Przetwarzanie tekstów i AWK Copyright, 2000 © Jerzy R. Nawrocki Wprowadzenie do.
Podstawy informatyki Wirtotechnologia – Wskaźniki i referencje
Podstawy informatyki Rekurencja i rekurencja Grupa: 1A
Kurs Pascala – spis treści
Ogólne jednostki programowe 1
Tablice jednowymiarowe 1
Wykład 2 struktura programu elementy języka typy zmienne
1 Języki i techniki programowania prowadzący dr Grzegorz Filipczyk.
Wprowadzenie do programowania w języku Turbo Pascal
Pliki. Pliki Pliki jako pamięć nieulotna Pliki jako pamięć nieulotna Nazwy, atrybuty i prawa dostępu Nazwy, atrybuty i prawa dostępu atrybuty atrybuty.
Typy wyrażenia, schematy blokowe, writeln, readln, if, pętle
Podprogramy.
Typy złożone, case, stałe. Typ zbiorowy type typ_zb = set of typ_podstawowy; Typem podstawowym może być tylko typ porządkowy. Typem podstawowym może być
Programowanie w języku Fortran 95
Podstawy programowania
AWK Zastosowania Informatyki Wykład 1 Copyright, 2003 © Adam Czajka.
Obiekty dynamiczne Tworzenie klas 3 MPDI Programowanie obiektowe W4.
Programowanie strukturalne i obiektowe
Pliki tekstowe. Operacje na plikach. mgr inż. Agata Pacek.
Andrzej Jędryczkowski Nie da się napisać większego programu bez podziału go na części zwane podprogramami. Podprogram to wyróżniona część programu.
Funkcje w Pascalu Przypomnienie wiadomości o procedurach Prowadzący: Anna Kaleta Piotr Chojnacki.
© A. Jędryczkowski – 2006 r. © A. Jędryczkowski – 2006 r.
TABLICE C++.
Wyrażenia w Turbo Pascalu.
Procedury i funkcje.
Definicja pliku tekstowego Operacje wykonywane na plikach tekstowych
Wykład 5 – typy – stałe – tablice – elementy grafiki.
Programowanie w środowisku DELPHI
Podstawy programowania
Pliki Pojęcie i rodzaje plików Definicja typu plikowego Operacje wykonywane na plikach elementowych.
Pliki tekstowe – A. Jędryczkowski © 2007 Turbo Pascal umożliwia wykorzystanie w programach plików tekstowych. Pliki takie zawierają informację niezakodowaną
1 Wykład 8 Podprogramy. 2 Pojęcie i istota stosowania dzielenie programu na części (logicznie spójne) - nazwane - niezależne od pozostałych części - z.
KOLEKTOR ZASOBNIK 2 ZASOBNIK 1 POMPA P2 POMPA P1 30°C Zasada działanie instalacji solarnej.
Podstawy programowania w języku C i C++
Zbiory i rekordy mgr inż. Agata Pacek. Deklaracja typu zbiorowego (określa ilość elementów w zbiorze) type biegi=set of 0..6; Definiowanie zmiennej typu.
Podstawy informatyki 2013/2014
PROGRAMOWANIE KOMPUTERÓW
Informatyka MPZI Wykład 4 Podprogramy Pliki Typ zbiorowy Rekurencja.
Informatyka MZT1 Wykład 6 Iteracje while i repeat Tablice Rekordy
Wykład 10 typ zbiorowy rekurencja.
Wykład 3 przykłady operacje na tekstach wyrażenia logiczne
1 Wykład 7 sortowanie BitButton format tekstu rysunki typ rekordowy.
Ogólna struktura programu w TP
Programowanie w języku C++
Informatyka 2 MPDI Wykład 9 Delphi tablice, rekordy.
User experience studio Użyteczna biblioteka Teraźniejszość i przyszłość informacji naukowej.
Informatyka MPDI2 Wykład 10 DELPHI cd. - zmienne tablicowe,
Podstawy programowania (4)
Podsumowanie wiedzy MPDI2 sem.3 INFORMATYKA. tworzenie nowego pliku i katalogu, nawigacja po katalogach, listowanie zawartości katalogu, zmiana nazw,
Dominik Benduski Michał Mandecki Podstawy Visual Basic w Excelu.
P ASCAL Definicje, deklaracje, podstawowe instrukcje 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,
Strumienie, Wczytywanie, Zapisywanie, Operacje na plikach
Dane, zmienne, instrukcje
Zapis prezentacji:

1. Język ObjectPascal - typ tablicowy (array) Pojęcie i opis pojęcie: - skończony zbiór elementów tego samego typu składowego - ułożonych regularnie - o położeniu (selekcji) określanym przez indeks (numer) składowej np.: wektor, macierz o składowych tego samego typu opis: array [ lista typów indeksów ] of typ bazowy (składowych) typ porządkowy (o ograniczonym zakresie): okrojony integer okrojony char wyliczeniowy boolean dowolny: prosty strukturalny (bez plików) tablica tablic, napisów, rekordów

fizycznie: w PaO kolejne wartości typu bazowego ułożone regularnie wierszami przykłady: array[ 1..50 ] of integer; a1 a2 ... a50 array[ 1..20, 1..30] of real; array[ 1..20] of array[ 1..30] of real; a1,1 ... a20, 30

type dni_tyg = ( pn, wt, sr, cw, pt, sb, nd ); zakres = 1 .. 20; dane = array[ boolean, zakres, dni_tyg] of char;

uwagi: rozmiar, wymiar tablica 1, 2, 3 - wymiarowa rozmiar 20 wierszy na 30 kolumn ( 20 x 30) - dwuwymiarowa rozmiar statyczny - wyrażony typem indeksów nie mogą być wyrażenia np.: var n: integer; tab: array[ 1..10, 1.. n] of ...; dostęp bezpośredni - taki sam czas - dowolny element, określony indeksem mogą być indeksy ujemne array [ -10 .. 0 ] of real a-10 ... a-1 a0

Zmienne tablicowe całościowe indeksowane (składowe) zmienne całościwe - tylko przypisanie - dla typów tożsamych brak: + - * / porównania wej/wyj np: var x, y: array[ ...... ; begin x := y;

zmienne indeksowane (składowe) - dostęp do składowych Z [ W1, ..., Wn ]  Ztypu składowego nazwa tablicy indeksy  wyrażenia typu zgodnego z typem indeksów zgodne co do liczby, typu i kolejności z deklaracją użycie - w wyrażeniach lub instrukcjach, jak zmienne typu składowego Przykłady: var x: array[ 1..100 ] of real; x[ 1 ] - 1-szy element wektora, typu real x[ k ] - k-ty element x[ 2*k - 1 ] - element nr 2k-1 x[ 2 ] := 10.5; y := 10*x[ k ] - 5.2; floatToStr( x[ k ] ); floatToStr( sin( sqrt( x[ abs( 2*k ) + 10 ] - 5.2 ) ) );

Przykłady: type dni_tyg = ( pn, wt, sr, cw, pt, sb, nd ); var dane: array[ dni_tyg, boolean ] of real; begin dane[ pn, true ] := 10.2; memo1.lines.add( 'Wynik = ' + floatToStr( dane[ wt, k < 2 ]/1000 ) ); if dane[ sr, k =5 ] > 3E2 then ...; type opis = ( nazw, imie ); var grupa: array[ 1..100, opis ] of string[20]; begin grupa[ 1, nazw ] := 'Kowalski'; if grupa [ k, imie ] = 'Jan' then ...; for k:= 1 to 10 do memo1.lines.add( grupa[ k, nazw ] + ‘ ‘ + grupa[ k, imie ] ); if grupa [ k, nazw ][1] = 'S' then ...;

tablice hierarchiczne: type dni_tyg = ( pn, wt, sr, cw, pt, sb, nd ); var x, y , z : string[10]; dane: array[ 1..10, dni_tyg ] of string[10]; grupa: array[ 1..10] of array[ dni_tyg ] of string[ 10 ]; begin dane[ k, nd ] := 'kotlety'; grupa[ k ] [ nd ] := 'pierogi'; grupa[ k, nd ] := 'pieczeń'; x := dane [ 2 ]; x := dane [ 2, 8 ]; x := grupa [ 3 ]; y := grupa [ sb ]; z := grupa [ 2 ] [ cw ] [ k ];

przykład 1 - wczytać nazwę miasta i wyprowadzić do memo po dwa znaki w wierszu var miasto: string[20]; dwie_lit: string[2]; dlugosc, i: integer; begin memo1.clear; miasto := Edit1.Text ; memo1.Lines.add( miasto ); dlugosc := length( miasto ); i := 1; // początek głównej iteracji while i <= N do begin dwie_lit := miasto[i]; i := i + 1; if i <= dlugosc then dwie_lit := dwie_lit + miasto[i] else begin memo1.Lines.add( dwie_lit); // zakończenie, gdy N nieparzyste break; end; memo1.Lines.add( dwie_lit);

wczytać N liczb i posumować co drugą (nieparzyste indeksy) const N = 10; var k, k_max: 1 .. N; dana: string; suma: real; x: array [ 1 .. N ] of real; begin suma := 0; memo1.clear; dana := inputbox( 'Liczby do sumowania', 'Podaj rozmiar danych (<= 10)', '10' ); k_max := strToInt( dana ); memo1.Lines.add( 'Podane ' + dana + ' liczb:' ); for k := 1 to k_max do begin dana := inputbox( 'Podawanie liczb', 'Podaj liczbę nr ' + IntToStr(k), '0,0' ); x[ k ] := StrToFloat( dana ); memo1.Lines.add( dana ); end; for k := 1 to ( k_max+1 ) div 2 do suma := suma + x[ 2*k - 1 ]; memo1.Lines.add( 'Suma nieparzystych wynosi: ' + FloatToStr( suma ) );

Edycja wielowierszowa TStringGrid informacja tekstowa zorganizowana w tabelę (wiersze, kolumny) właściwości: ColCount, RowCount - liczba kolumn i wieszy FixedCols, FixedRows - liczba stałych (szarych) kolumn i wieszy Cells[nr_k, nr_w: integer]: string - zawartość komórki Rows, Cols[nr].Text - cały wiersz, kolumna (zwykły tekst) Rows, Cols[nr].ComaText - cały wiersz, kolumna (ciąg wartości) Options - opcje (np. goEditing) EditorMode: boolean - dopuszczenie edycji

Przykłady: StringGrid1.Cols[0].CommaText := ', 1, 2, 3, 4'; StringGrid1.Rows[0].CommaText := ', Nazwisko, Imię, kwota'; StringGrid1.Cells[1, 2]:= 'Kowalski'; StringGrid1.Cells[2, 2]:= 'Jan'; StringGrid1.Cells[3, 2]:= '123,00 zł';

Zadanie: liczby w wierszach wyznaczanie sumy, średniej, liczby większych od średniej, średniej ogólnej

procedure TForm1.FormCreate(Sender: TObject); const lba_kol = 8; var k: integer; begin with StringGrid1 do begin Rows[1].CommaText := ' , "12,5", -8, "100,25", +4'; Rows[2].CommaText := ' , "21,21", -10, 321, 4, "2,5", "‑56,99" '; Rows[3].CommaText := ' , 89, 140, 72, 20, -2, 55, -100'; Cols[0].CommaText := ', suma, średnia, większe'; Options := Options + [goEditing]; for k := 1 to lba_kol do Cells[k, 0] := IntToStr(k); Cells[ lba_kol+1, 0] := 'Statystyka'; end;

procedure TForm1.sumaClick(Sender: TObject); const kol_wyn = 9; // numer kolumny wyników wiersz = 1; var k: integer; suma: real; dana: string; begin k := 1; suma := 0; for k := 1 to maxInt do begin // pętla nieograniczona dana := StringGrid1.Cells[k, wiersz]; if length(dana) = 0 then break; // przerwanie pętli suma := suma + StrToFloat(dana); end; // for k StringGrid1.Cells[kol_wyn, wiersz] := FloatToStr(suma); end;

procedure TForm1.maxClick( Sender:TObject ); const kol_wyn = 9; // numer kolumny wyników wiersz = 2; var k: integer; wart_b, max: real; begin max := StrToFloat( StringGrid1.Cells[1, wiersz] ); k := 2; repeat wart_b := StrToFloat(StringGrid1.Cells[k, wiersz]); if wart_b > max then max := wart_b; k := k+1; until length(StringGrid1.Cells[k, wiersz]) = 0; StringGrid1.Cells[kol_wyn, wiersz] := FloatToStr(max); end;

// liczba danych trzeciego wiersza, większych od ich średniej procedure TForm1.wiekszeClick(Sender: TObject); const kol_wyn = 9; // numer kolumny wyników wiersz = 3; var k, lba_danych, lba_wiekszych: integer; suma, srednia: real; begin suma := 0; lba_danych := 1; with StringGrid1 do begin while length( Cells[lba_danych, wiersz] ) > 0 do begin suma := suma + StrToFloat( Cells[lba_danych, wiersz] ); inc(lba_danych); end; // while dec( lba_danych ); //pomniejszanie o 1 srednia := suma / lba_danych; lba_wiekszych := 0; for k := 1 to lba_danych do if StrToFloat( Cells[k, wiersz] ) > srednia then inc(lba_wiekszych); Cells[kol_wyn,wiersz] := IntToStr(lba_wiekszych); end; // with StringGrid1 end;

// średnia wszystkich danych procedure TForm1.sredniaClick(Sender: TObject); var wrsz, kol, lba_danych: integer; suma: real; begin suma := 0; lba_danych := 0; for wrsz := 1 to 3 do begin // iteracja po wierszach kol := 1; repeat // iteracja po komórkach wierszy suma := suma + StrToFloat(StringGrid1.Cells[kol, wrsz]); inc(kol);// albo kol:= kol+1; inc(lba_danych) until length( StringGrid1.Cells[kol, wrsz] ) = 0; end; // for wrsz Edit1.Text := 'Średnia = ' + FloatToStr (suma/lba_danych); end;

2. Język ObjectPascal - typ rekordowy (record) Pojęcie i opis pojęcie: - skończony zbiór elementów dowolnego typu składowego - pola - ułożonych jednowymiarowo, niejednorodnie - 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) opis: record deklaracja_jednakowych_pól; . . . end dowolny: prosty strukturalny (bez plików) pole  tablica, napis, rekord lista_nazw_pól: typ;

w PaO kolejne wartości pól określonego typu xxx fizycznie: w PaO kolejne wartości pól określonego typu przykłady: type data = record rok: 1900 .. 2100; mies: 1..12; dzien: 1..31 end; var student: record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; stypend: real end; St. Wołek - Podst. Progr. Komput. St. Wołek - Podst. Progr. Komput. St. Wołek - Podst. Progr. Komput.

selektor typu nazwa pola dostęp bezpośredni statyczny rozmiar Porównanie: jednakowe składowe selektor typu indeks dostęp bezpośredni statyczny rozmiar różne składowe selektor typu nazwa pola dostęp bezpośredni statyczny rozmiar St. Wołek - Podst. Progr. Komput.

Zmienne rekordowe całościowe desygnator pola (składowa) zmienne całościowe - tylko przypisanie - typów tożsamych brak: + - * / porównania wej/wyj np: var r1, r2: record ... end ; begin r1 := r2;

Z . pole  Ztypu składowego desygnator pola (składowa) - dostęp do pola Z . pole  Ztypu składowego nazwa rekordu użycie - w wyrażeniach lub instrukcjach, jak zmienne typu składowego Przykłady: student.nazw student.imie student.imie[1] student.data_ur.rok student.nazw[1] student.imie[2][1] student.stypend student[1].imie student.rok var student: record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; stypend: real end;

type osoba = record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; end; var grupa: array[1..100] of osoba; grupa[1].nazw grupa[k].imie[1] grupa[k].data_ur.rok grupa.imie[2] grupa[k].data grupa[2].rok memo1.lines.add( grupa[3].nazw) grupa grupa[k] grupa[k].data_ur grupa.osoba grupa.data_ur[k] osoba.nazw := 'Nowak' edit1.text := grupa[k]. imie;

Instrukcja wiążąca - with dotyczy tylko zmiennych rekordowych, obiektowych upraszcza zapis opis: with lista_zmiennych_rekordowych do J najczęściej begin . . . end można używać nazw pól bez określenia rekordu 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;

przykład: To samo dotyczy składowych (właściwości , metody) obiektów StringGrid1.Rows[1].CommaText := ' , "12,5", -8, "100,25", +4'; StringGrid1.Rows[2].CommaText := ' , "21,21", -10, 321, 4, "2,5", "‑56,99" '; StringGrid1.Cols[0].CommaText := ', suma, średnia, większe'; for k := 1 to 10 do StringGrid1.Cells[k, 0] := IntToStr(k); with StringGrid1 do begin Rows[1].CommaText := ' , "12,5", -8, "100,25", +4'; Rows[2].CommaText := ' , "21,21", -10, 321, 4, "2,5", "‑56,99" '; Cols[0].CommaText := ', suma, średnia, większe'; for k := 1 to 10 do Cells[k, 0] := IntToStr(k); end;

Przykład – sortowanie - w polu StringGrid dane o osobach - wprowadzamy do wektora rekordów - porządkujemy - wynik w drugim StringGrid

Elementy globalne: const max = 10; // ograniczenie liczności danych type stud = record nazw,imie: string[10]; styp: real; end; var lba_danych: 1..max; x: array[1..max] of stud;

Operacje początkowe: procedure TForm1.FormCreate(Sender: TObject); var k: integer; begin with StringGrid1 do begin Options := Options + [goEditing]; ColCount := 4; RowCount := max; Rows[0].CommaText := 'L.p.," nazwisko"," imię",stypendium'; Rows[1].CommaText := '1,Nowak,Jan,132,00'; Rows[2].CommaText := '2,Bęben,Teresa,399,50'; Rows[3].CommaText := '3,Zając,Mateusz,212,00'; Rows[4].CommaText := '4,Kowalski,Adam,502,10'; end; with StringGrid2 do begin for k := 1 to max - 1 do Cells[0, k] := IntToStr(k);

Kopiowanie do wektora rekordów: procedure TForm1.zapamietajClick(Sender: TObject); var k, m: 1.. max; begin for k := 1 to max - 1 do with x[k],StringGrid1 do begin nazw := Cells[1, k]; if nazw = '' then break; imie := Cells[2, k]; styp := strtofloat(Cells[3, k]); lba_danych := k; end;

Porządkowanie wg stypendium: procedure TForm1.wg_stypClick(Sender: TObject); var k, m: 1.. max; pom: stud; begin for k := 1 to lba_danych - 1 do // porządkowanie for m := k to lba_danych do if x[m].styp > x[k].styp then pom := x[m]; x[m] := x[k]; x[k] := pom end; for k := 1 to lba_danych do // pokazanie wyniku with StringGrid2 do begin Cells[1, k] := x[k].nazw; Cells[2, k] := x[k].imie; Cells[3, k] := FloatToStr(x[k].styp);

Porządkowanie wg nazwisk: procedure TForm1.wg_nazwiskClick(Sender: TObject); var k, m: 1.. max; pom: stud; begin for k := 1 to lba_danych - 1 do for m := k to lba_danych do if x[m].nazw < x[k].nazw then pom := x[m]; x[m] := x[k]; x[k] := pom end; for k := 1 to lba_danych do with StringGrid2 do begin Cells[1, k] := x[k].nazw; Cells[2, k] := x[k].imie; Cells[3, k] := FloatToStr(x[k].styp);

3. Język ObjectPascal - pliki Pojęcie i istota stosowania 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 rozmiar dynamiczny wewnętrzny wskaźnik elementu bieżącego fizycznie - PaZ: dysk, dyskietka, CD-ROM, taśma (streamer)

istotne cechy Opis typu plikowego Zmienne plikowe - gromadzenie dużej ilości informacji - w sposób trwały - przenoszenie danych między programami | komputerami Opis typu plikowego textFile (text) - plik tekstowy file of Tb - plik elementowy ( binarny, zdefiniowany ) o składowych typu Tb Zmienne plikowe deklaracja: var lista_nazw_zmiennych: Tp; Tp - jest nazwą lub opisem typu plikowego są zmienne całościowe - reprezentują cały plik są operacje (procedury, funkcje) dotyczące: - całych plików - składowych pliku - korzystają ze zmiennych odpowiadających składowym plików

Przykład: type osoba = record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; pensja: real end; dwa_napisy = arrray[1..2] of string[15]; var oceny: file of real; nazwiska: file of string[20]; zaloga: file of osoba; adresy: file of dwa_napisy; wyniki: textFile;

Reguły obsługi plików operacje na treści pliku (składowe): opis zmiennych plikowych type osoba = .....; var f: file of osoba; skojarzenie - f  ’d:\ścieżka\plik’ otwarcie pliku f do - zapisu - odczytu operacje - zapis | odczyt zamknięcie pliku f operacje dla całych plików (jak operacje DOS-u) usunięcie pliku f zmiana położenia (nazwy) kopiowanie zmiana atrybutu

p: assignFile( f, Wt ) - skojarzenie zmienna plikowa tekstowy opis położenia na dysku np.: assignFile( grupa, 'C:\ROK_II\grupa_1.pdf ' ); p: reset( f ) - otwarcie do odczytu - plik staje się aktywny - wskaźnik na początku pliku - gdy plik nie istnieje  błąd wykonania p: rewrite( f ) - otwarcie do zapisu - gdy plik nie istniał  jest tworzony - gdy plik istniał  jest zerowany - wskaźnik na początku pliku (końcu pustego) p: closeFile( f ) - zamknięcie pliku f: eof( f ) - badanie końca pliku (end of file) true - wskaźnik po ostatniej wartości (na końcu) false - wskaźnik w środku

Okienka wyboru pliku do otwarcia lub zapisu openDialog, saveDialog karta Dialogs biblioteki komponentów VCL standardowe okna dialogu - wybór pliku do otwarcia lub zapisu komponenty niewidzialne, - funkcja execute, - wynik typu logicznego: - true, gdy użytkownik kliknął na zakończenie przycisk Otwórz lub Zapisz - false, gdy użyto przycisku Anuluj. właściwości title: string - treść tytułu w pasku tytułowym okna filter: string - wzorzec przeglądanych plików, np. ’*.txt’ fileName: string - dysk + ścieżka + nazwa wybranego pliku działa na wej. oraz po wyj.

Przykład 1 - operacji wybrania pliku i usunięcia : procedure TForm1.Button1Click(Sender: TObject); var plik: textFile; begin openDialog1.title := 'Usuwanie pliku'; openDialog1.filter := 'Delphi(*.pas, *.dpr)|*.pas;*.dpr'; if openDialog1.execute then assignFile( plik, openDialog1.fileName ); try reset( plik ); if messageDlg( 'Usunąć ' + openDialog1.fileName + '?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then closeFile( plik ); erase( plik); end; except on eInOutError do messageDlg( 'Błąd operacji wej/wyj pliku.', mtError, [mbOk], 0 );

Obsługa plików tekstowych opis typu plikowego textFile assignFile, reset, rewrite, closeFile czytanie z pliku - read( zmienna_plikowa, Z1, Z2,... Zn) - readln( zmienna_plikowa, Z1, Z2,... Zn) gdzie - zmienne typu składowego: integer, real, char, string skąd - czytane z pliku do zmiennych w PaO - dla integer, real, string - konwersja - gdy eof = true  błąd odczytu - każdy odczyt  przesunięcie wskaźnika

Przykład 2 – Plik tekstowy – czytanie procedure TForm1.Otw_plikClick(Sender: TObject); var pl_wej: TextFile; nazwa_pl, wiersz: String; begin openDialog1.title := 'Plik do edycji'; openDialog1.filter := 'Delhi(*.pas, *.dpr)|*.pas;*.dpr'; if OpenDialog1.Execute then begin nazwa_pl := OpenDialog1.FileName; AssignFile( pl_wej, nazwa_pl ); Reset( pl_wej ); while not Eof( pl_wej ) do begin Readln( pl_wej, wiersz ); Richedit1.Lines.Add( wiersz ); end; CloseFile( pl_wej ); Form1.Caption := 'Edycja pliku [ ' + nazwa_pl + ' ]';

zapis do pliku - write( zmienna_plikowa, W1, W2,... Wn) - writeln( zmienna_plikowa, W1, W2,... Wn) co - wyrażenia typu składowego gdzie Wi - wyrażenia typu: integer, real, char, string, array of char, TStrings + format wyniku :m :m:n dopisywać można tylko na końcu pliku - jest tak po rewrite - gdy po reset  trzeba przewinąć na koniec zapis ustawia wskaźnik na końcu

Przykład 3A – Plik tekstowy – zapis jako procedure TForm1.Zap_jakoClick(Sender: TObject); var pl_wyj: TextFile; nazwa_pl: String; begin SaveDialog1.title := 'Plik do zapisu'; SaveDialog1.filter := 'tekst ASCII|*.txt'; if SaveDialog1.Execute then begin nazwa_pl := SaveDialog1.FileName; AssignFile( pl_wyj, nazwa_pl ); // nowy Rewrite( pl_wyj ); Writeln( pl_wyj , Memo1.Text ); // przepisywanie CloseFile( pl_wyj ); Form1.Caption := 'Edycja pliku [ ' + nazwa_pl + ' ]'; end;

Obsługa plików binarnych opis typu plikowego file of Tb - Tb jest typem bazowym deklaracja, skojarzenie, otwarcie i zamknięcie - jak dla plików tekstowych operacje edycyjne: czytanie z pliku - read( zmienna_plikowa, Z1, Z2,... Zn ) Zi - nazwy zmiennych typu bazowego zapis do pliku - write( zmienna_plikowa, W1, W2,... Wn ) Wi - wyrażenia typu bazowego Przykład: var student: osoba; f: file of osoba; begin assign( f, '....' ); reset( f ); read( f, student )

Przykład 4: var student, rob: osoba; f1, f2: file of osoba; begin assignFile( f1, '....' ); with student do begin nazw := 'Kowalski'; imie := 'Jan'; end; // with rewrite( f1 ); write ( f1, student ); // zapis do nowego reset( f2 ); while not eof( f2) do read( f2, rob ); // przewijanie write ( f2, student ); // zapis na koniec

3. Język ObjectPascal - podprogramy Pojęcie i istota stosowania 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) Podprogram begin end przekazanie danych korzyści: - krótszy zapis źródłowy - efektywniejsze wykorzystanie PaO (mniej) - czytelność - łatwiejsze uruchamianie i testowanie - tworzenie bibliotek i korzystanie Program wywołanie podprogramu zwrot wyników

definiowanie procedury funkcje xxx procedury funkcje różnice - sposób definiowania - funkcja przyjmuje wartość - procedura nie - sposób wywołania nagłówek:    procedure nazwa_proc ( sekw._deklaracji_parametrów_formalnych );    function nazwa_fun ( sekw._dekl._param._formal. ): nazwa_typu_wartości;  lista_nazw_parametrów_formalnych: nazwa_typu  var lista_nazw_parametrów_ formalnych : nazwa_typu  var lista_nazw_parametrów_ formalnych mechanizm przekazywania danych

wywołanie procedura - instrukcja wywołania: xxx wywołanie procedura - instrukcja wywołania: nazwa_procedury( lista_argumentów_aktualnych ); funkcja - w wyrażeniu (jako składniku instrukcji):    nazwa_funkcji( lista_argumentów_aktualnych ); Uwagi: argumenty aktualne zgodne z parametrami formalnymi: - co do liczby - co do typu - co do kolejności - względem mechanizmu zakres widoczności zmiennych

Przekazywanie danych z/do podprogramu przez wartość - 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 wejściu i na wyjściu

Uwagi: parametry formalne opcjonalne - pomijamy "( )" xxx parametry formalne opcjonalne - pomijamy "( )" obiekty lokalne opcjonalne typ parametru formalnego - dowolny (plik tylko przez zmienną) - nazwa typu (nie opis) - także tylko string (bez rozmiaru) typ wartości funkcji - tylko prosty lub string (bez rozmiaru) - nazwa typu (nie opis) dla definicji funkcji musi być w części akcyjnej nadanie wartości funkcji nazwa_funkcji := Wtypu_zgodnego ze środka podprogramu (procedury|funkcji) można "wychodzić" instrukcją exit

Przykład A procedure TForm1.Button1Click(Sender: TObject); begin xxx Przykład A procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Font.Name := 'New Courier'; Memo1.Lines.Append( '-----------------------' ); Memo1.Lines.Append( '| |' ); Memo1.Lines.Append( '| DELPHI |' ); Memo1.Lines.Append( '----------------------' ); end;

Przykład B: procedure TForm1.Button2Click(Sender: TObject); xxx Przykład B: procedure TForm1.Button2Click(Sender: TObject); procedure linia_poz; begin Memo1.Lines.Append( '--------------------' ); end; procedure linia_pion; Memo1.Lines.Append( '| |' ); linia_poz; linia_pion; Memo1.Lines.Append( '| DELPHI |' );

Przykład C: procedure TForm1.Button3Click(Sender: TObject); xxx Przykład C: procedure TForm1.Button3Click(Sender: TObject); procedure linia_poz; begin Memo1.Lines.Append( '--------------------' ); end; procedure linia_pion ( N: integer ); var k: integer; for k := 1 to N do Memo1.Lines.Append( '| |' ); begin linia_poz; linia_pion ( 2 ); Memo1.Lines.Append( '| DELPHI |' ); end;

Przykład_D - wykres funkcji xxx Przykład_D - wykres funkcji var i: integer; function fun( k: integer): real; begin if k <= 10 then fun := 2*k else fun := 40 - 2*(k-1) end; Memo1.Font.Name := 'Courier'; for i:= 1 to 20 do Memo1.Lines.Append( format('%3d %10.1f',[i, fun(i)] )); Przykłady - wykr_fun.pas

Przykład_E – funkcja średnia harmoniczna: Program do wyznaczenia średnich harmonicznych ciągu 3 różnych N liczb,\ wczytywanych z klawiatury: zdefiniować 3- elementowy wektor rekordów o dwóch polach: wartość N – typu integer, wartość średniej harmonicznej N – typu real, zdefiniować funkcję wyznaczania średniej : parametrem ma być N, wartością – średnia harmoniczna N, wypełnić i wyświetlić wartości wektora rekordów.

Przykład_F – fun wekt: Program wyznaczenia średniej arytmetycznej dla 3 ciągów 4 liczb całkowitych, wczytywanych z klawiatury: zdefiniować 3- elementowy wektor rekordów o dwóch polach: - wektor 4-elementowego ciągu wejściowego – o składowych typu integer, - wartość średnia w ciągu – typu real, zdefiniować funkcję do wyznaczania średniej: - parametr 4-elementowy wektor wejściowy, - wartość – średnia arytmetyczna danych wejściowych – typu real, wypełnić i wyświetlić wartości wektora rekordów.