Wykład 5 – typy – stałe – tablice – elementy grafiki
2 Definicje typów i stałych, wartości początkowe Definicja typów definicja: typy standardowe miały swoje nazwy: integer realcharboolean string można wprowadzać nazwy (unikalne) dla swoich typów pojęcie abstrakcyjne (dla kompilatora) - nie ma reprezentacji fizycznej - brak operacji !! - użycie tylko w części opisowej - definicja poprzedza użycie type
3 np.: type dni_tyg = ( pn, wt, sr, czw, pt, sob, ndz); napis = string[ 20 ]; calkowite = integer; zakres= ; var dzien, dn: dni_tyg; nazwisko, imie: napis; i, j, k: calkowite; n: zakres; St. Wołek - Podst. Progr. Komput.
4 Definicja stałych constN = W; lub constN :typ = W; stała element posiadający: nazwę wartość określonego typu nie ulega zmianie używana w wyrażeniach N - nazwa stałej W - proste wyrażenie: stałe numeryczne stałe znakowe stałe tekstowe stałe wyliczeniowe operacje + - * / div mod bez funkcji stand. (zewnętrznych) prócz chr, ord, pred, succ definiowana w części opisowej programu (przed begin bloku wykonawczego) Postać definicji: gdy nie podamy typu, typ wynika domyślnie z wartości wyrażenia
5 np.: const N = 10; N1:integer=10; max_Liczba = 1024*N-16; lba_znakow = ord( 'z' ) - ord( 'a' ) + 1; nazwisko = 'Kowalski'; tak = true; nie = false; są predefiniowane stałe, np.: false = 0 true = 1 maxInt = pi =
6 Typ tablicowy (array) Pojęcie i opis array [ lista typów indeksów ] of typ bazowy (składowych) Pojęcie: - skończony zbiór elementów tego samego typu składowego - o położeniu (selekcji) określanym przez indeks (numer) składowej np.: wektor, macierz o składowych tego samego typu typ porządkowy (o ograniczonym zakresie): okrojony integer okrojony char wyliczeniowy boolean dowolny: prosty strukturalny (bez plików) tablica tablic,napisów, rekordów Opis:
7 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-wektor 2-prostokątna 3- przestrzenna 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;
8 przykłady: array[ ] of integer; fizycznie: w pamięci operacyjnej kolejne wartości typu bazowego ułożone regularnie wierszami array[ 1..20, 1..30] of real; array[ 1..20] of array[ 1..30] of real; może być też 30 wierszy i 20 kolumn, zależy od wizualizacji
9 type dni_tyg = ( pn, wt, sr, cw, pt, sb, nd ); zakres = ; dane = array[ boolean, zakres, dni_tyg] of char; Indeksami mogą być także wartości typu wyliczeniowego bądź znakowego
10 uwagi: wymiar, rozmiar tablica 1, 2, 3 - wymiarowa rozmiar 20 wierszy na 30 kolumn ( 20 x 30) rozmiar statyczny - wyrażony typem indeksów nie mogą być wyrażenia np.: var n: integer; tab: array[ 1..10, 1.. n] of...; mogą być indeksy ujemne array [ ] of real
11 Zmienne tablicowe indeksowane (składowe)całościowe
12 zmienne indeksowane (składowe) - dostęp do składowych Z [ W 1,..., W n ] Przykłady:var x: array[ ] of real; Użycie 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 ] ) ) ); 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
13 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 y do x edit1.text:= IntToStr(x[1]); end
14 type dni_tyg = ( pn, wt, sr, cw, pt, sb, nd ); var dane: array[ dni_tyg, boolean ] of real; begin dane[ pn, true ] := 10.2; k:=5; memo1.lines.add( 'Wynik = ' + floatToStr( dane[ wt, k < 2 ]/1000 ) ); if dane[ sr, k =5 ] > 3E2 then...; typeopis = ( nazw, imie ); var grupa: array[ , 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...; Przykłady:
15 const osoby: array[ 1..3] of string[20] = ( 'Nowak', 'Kowalski', 'Nycz' ); wartości początkowe zmiennych tablicowych dla tablic konstrukcja typu ( (st 11, st 21,..., st n1 ), (st 12, st 22,..., st n2 ),... (st 1m, st 2m,..., st nm ) ) const 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) )
16 type dni_tyg = ( pn, wt, sr, cz, pt, sb); dane= array[ 1..10, dni_tyg ] of string[20]; var rozklad: array[ 1..10] of dane; grupa,x3: dane; x1:string; x2:char; begin rozklad[ 1 ][ 1, pn ] := 'matematyka'; //grupa1 termin 1 poniedziałek rozklad[ 2, 3, pt ] := 'fizyka'; //...można też tak rozklad[ 3] [4][ sb ]:= 'informatyka'; //... lub tak grupa[ 3, pt ] := 'fizyka'; x1 := grupa [ 2,sb]; //x1 to element typu string x2 := grupa [ 2,sb][ 8 ]; //x2 to 8–my znak elementu 2 x3 := rozklad [ 2 ]; // tablica dla 2 grupy end; Tablice hierarchiczne: Zagnieżdżanie tablic – rozkład zajęć
17 Wczytać N liczb do wektora i zsumować co drugie (nieparzyste indeksy) const N=100; type zakres = 1..N; var k, k_max: zakres; dana: string; suma: real; x: array [ 1.. N ] of real; begin k_max := Memo1.Lines.Count; //przepisanie z Memo do tablicy for k := 1 to k_max do x [ k ] := StrToFloat(Memo1.Lines [ k -1]); suma := 0; for k := 1 to ( k_max+1 ) div 2 do suma := suma + x [ 2*k - 1 ]; Memo1.Lines.add( 'Suma w nieparzystych wynosi: ' + FloatToStr( suma ) ); end;
18 Edycja wielowierszowa TStringGrid właściwości: informacja tekstowa zorganizowana w tabelę (wiersze, kolumny) ColCount, RowCount:integer- liczba kolumn i wierszy FixedCols, FixedRows:integer- liczba stałych (szarych) kolumn i wierszy Cells[nr_k, nr_w: integer]: string- zawartość komórki Rows, Cols[nr].ComaText:string- cały wiersz, kolumna (ciąg wartości) służy do programowego wpisywania tekstu ColWidths[nr]- szerokość w pikselach RowHeights[nr]- wysokość w pikselach Options- opcje (np. goEditing)
19 Przykłady: StringGrid1.Cols[0].CommaText := ', 1, 2, 3, 4'; StringGrid1.Rows[0].CommaText := ', Nazwisko, Imię, kwota'; StringGrid1.Rows[0].CommaText := ', " Nazwisko", " Imię", " kwota"'; StringGrid1.Cells[1, 2]:= 'Kowalski'; StringGrid1.Cells[2, 2]:= 'Jan'; StringGrid1.Cells[3, 2]:= '123,00 zł'; StringGrid1.Options := StringGrid1.Options + [goEditing]; StringGrid1.Options := StringGrid1.Options + [goColSizing, goRowSizing]; Options jest tzw. typu zbiorowego (nie znamy jeszcze) – jeśli zbiór zawiera goEditing (true w ObjectInspektorze) to można edytować komórkę w czasie biegu programu
20 Wykorzystanie tablic w grafice bitmapowej Niektóre komponenty (wizualne) posiadają właściwość obiektową Canvas (tło, płótno) Form1.Canvas.Pixels[ 100, 100] :=clRed; Canvas posiada właściwość: Pixels [ N, M] która umożliwia dostęp do pikseli i modyfikację ich koloru. Możemy ją traktować jak dwuwymiarową tablicę o wymiarach współrzędnych komponentu, wypełnioną danymi typu TColor Przykład – przypisanie koloru N pixel komponent M
21 Przykład - linia prosta var i:integer; begin for i:=1 to 85 do Form1.Canvas.Pixels[ 400+i, 400+2*i] :=clRed; end;
22 var w,k,w1,k1:integer; begin for w:=1 to 5 do for k:=1 to 5 do for w1:=1 to 25 do for k1:=1 to 25 do if ((w+k) mod 2 = 0) then Form1.Canvas.Pixels[ 100+(w-1)*25+w1, 100+(k-1)*25+k1] :=clRed; end; Przykład zagnieżdżania pętli - szachownica Form1.Canvas.Pixels[ 100+(w-1)*50+w1, 100+(k-1)*50+k1] :=rgb(120*w,20*(w+k),200*k); Można użyć standardowej funkcji rgb do modyfikacji koloru z argumentami zależnymi od liczników "pętli":