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.