Zmienne i ich typy Zmienne to komórki pamięci przeznaczone na przechowywanie przedmiotów. Komórka (zmienna) może być albo pusta albo zawierać jeden przedmiot. Nie każdy przedmiot pasuje do każdej komórki (dla samolotu potrzebny jest hangar, na samochód wystarczy garaż, oddzielną komórkę mamy na węgiel, oddzielną na drewno, oddzielną na motor). Zbiór przedmiotów pasujących do komórki określa typ tej komórki. Typ zmiennej Typ zmiennej określa, co może zawierać określona zmienna Poznaliśmy niektóre typy: integer, real
Typy zmiennych - Typ logiczny boolean logiczny Operacje: var x, y, z:boolean; begin x:=true; y:=false; z := not x; z:= x and y; z:= x or y; Z:=not y write(x); read(x); Typ logiczny mają wyniki wszelkich porównań x x 1 0 Typy zmiennych - Typ znakowy char znak Operacje: var x, y, z:char; begin x:= p ; y:=chr(ord(x)-1); czyli o z:=chr(ord( A )+3); czyli D ((z> c ) and (z= H )) or (y<= Z ) write(x); read(x); Typ znakowy pozwala na przechowywanie pojedynczych znaków kodu ASCII Jeżeli x jest typu znakowego, to Ord(x) podaje numer kodu ASCII Jeżeli y jest typu całkowitoliczbowego, to Chr(y) podaje znak odpowiadający kodowi y. X - zawiera znak spacji 0 0 1 0 0 0 0 0
Typy zmiennych Typ całkowitoliczbowy Integer mała liczba całk. Operacje: var x,y,z:integer; begin x:= 7; y:=$13 {hexa} y:=x-1; z:=x+y; z:=x*y;z=:x div y; z:=x mod y; ((z>7) and (z==5)) or (y<=z) write(x); read(x); Uwaga:23 div 7 ->3 23 mod 7 ->2 Typ całkowitoliczbowy imituje liczby całkowite w określonym zakresie X zawiera liczbę 7 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 14 2 13 2 12 2 4 2 3 2 2 2 1 2 0 Znak: 0 to +, 1 to 1 X= +(0*2 14 +0*2 13 +...+0*2 4 +0*2 3 +1*2 2 +1*2 1 +1*2 0 )= =+(1*4+1`*2+1*1)=+(4+2+1)=+7 Zakres wartości : -32767 - +32767 Typy zmiennych - Typ zmiennoprzecinkowy Real Operacje: var x, y, z:real; begin x=7.56; y=x-1.;z=x+y; z=x*y;z=x/y; ((z>7.)and(z==.5))or(y<=z ) write(x); read(x); Typ zmiennoprzecinkowy imituje liczby rzeczywiste. Reprezentuje je tylko z określoną dokładnością i w określonym zakresie Podczas operacji następuje zaokrąglanie wyniku (przez to stale rośnie błąd)
Typ zmiennoprzecinkowy liczba rzeczywista X zawiera liczbę typu real mantysa 1 1 0 0 0 0 0 0 2-1 2-2 2-3 0 0 0 0 0 1 1 1 wykładnik 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 Znak liczby: 0 to +, 1 to 1 2-23 2 6 2 5 2 4 2 3 2 2 2 1 2 0 Znak wykładnika: 0 to +, 1 to 1 X= -(1*2-1 +0*2-2 +...+0*2-23 )*2 +7 =-(1*0.5)*127=+-64 Inne proste typy Kompilatory PASCALa zwykle wprowadzają inne jeszcze proste typy zmiennych o poszerzonych lub zawężonych zakresach wartości W Turbo Pascalu mamy np.. szortint liczba całkowita 127 - +127 Byte - liczba całkowita 0 255 Longint długa liczba całkowita (32 bity ze znakiem) Word całkowita 16 bitów bez znaku Single, double, extended, comp liczby zmiennoprzecinkowe
Typy zmiennych użytkownika Użytkownik może w Pascalu wprowadzić swoje własne typy Używa do tego deklaracji type przed zmiennymi var Typy zmiennych użytkownika: wyliczany Typy wyliczane deklaruje się jako: Type wyksztalcenie=(podstawowe,srednie,wyzsze ); Symbole podstawowe, srednie, wyzsze stają się stałymi typu wyksztalcenie Zmiennne tego typu deklarujemy jako Var wyk1 : wyksztalcenie;
Typy zmiennych użytkownika: wyliczany Przykłady: Ord(podstawowe) = 0 Ord(srednie) = 1 Pred(srednie)=podstawowe Succ(srednie)=wyzsze Uwaga: funkcje Ord, Pred i Succ są zdefiniowane także dla typów całkowitoliczbowych oraz char i boolean. Typy zmiennych użytkownika: zakresowy Użytkownik dla typów porządkowych (tych, dla których zdefiniowane jest Ord, Succ i Pred) może wprowadzić nowe typy będące ich pozakresami np.. Type XXwiek = 1901..2000; Type wyknizsze = podstawowe..srednie;
Kontrola typów Poszczególne operacje dopuszczają jedynie pewne typy argumentów. Np.. Operator mod czy div stosuje się wyłącznie dla liczb całkowitych, and or i not tylko dla logicznych itd.. Niektóre operatory zachowyją się inaczej dla różnych typów, np.. Operator + inaczej dodaje liczby, a inaczej znaki. Użycie operatorów dla niewłaściwych typów danych spowoduje błąd kompilacji Konwersja typów Niektóre typy zmiennych ulegają automatycznej zamianie. Np.. Integer na real. Dlatego np.. Można dodać liczbę real i integer, w wyniku czego otrzymamy liczbę real. W innych trzeba wymuszać konwersję Np.. Trunc(lrzeczyw) oraz Round(lrzecz) zamienia liczbę rzeczywistą na całkowitą
Tablica Tablice używa się do reprezentacji mnogości komórek pamięci tego samego typu ( gdy zabraknie nam imion ) X Var x:garaz; Var y: array[1..4] of garaz; Y[1] Y[2] Y[3] Y[4] Deklaracja tablicy Deklaracja zmiennej będącej tablicą składa się z elementów: VAR nazwa_zmiennej : ARRAY [zakres] OF typ_podstawowy; Np.: Var z : array[1..200] of real; to tablica 200 liczb rzeczywistych o nazwach z[1], z[2],...,z[200] Wyrażenie [3] nazywamy INDEKSEM.
Deklaracja tablicy UWAGA: zwykle wielkość tablicy jest rzeczą umowną i przy kolejnym użyciu programu może być potrzebna tablica większa lub mniejsza. Dlatego zwykle w deklaracji nie stosuje się się liczby (np.. 200) lecz wprowadza się stałą pomocniczą Const maks_z=200; Var z : array[1..maks_z] of real; Deklaracja tablicy Czasami jest uzasadnione używanie tablic o zakresie indeksów zaczynającym się nie od 1. Var podatek:array[1992..2005] of real; To tablica elementów o nazwach podatek[1992], podatek[1993],..., podatek[2005]
Typy tablicowe użytkownika Czasem kilka tablic powinno mieć identyczną strukturę Najlepiej jest wtedy zadeklarować typ tablicowy Type DaneZLat=array[1992..2005] of real; Potem deklarujemy zmienne: Var podatek: DaneZLat; przychody:danezlat; kosztyuzyskania: DaneZLat; Programowanie z użyciem tablic Programowanie z użyciem tablic wymaga stosowania pętli. ZADANIE Wczytaj z klawiatury n liczb rzeczywitych, przy czym od użytkownika należy pobrać liczbę n.
Czytanie tablicy zmiennych START 1 Wczytaj(n) 2 J:=1 NIE J<=n 3 TAK 4 Wczytaj(tab[J]) 5 J:=J+1 program czyttab; uses Crt; Const makstab=10; var n,j:integer; tab:array[1..maxtab] of real; begin read(n); {1} for J:=1 to n do {2,3,4} begin read(tab[j]); {5} end; End. STOP UWAGI UWAGA: Pracując z tablicami musimy strzec się używania indeksów spoza zakresu W powyższym programie, jeśli użytkownik poda n większe od 10, wystąpi błąd podczas wykonania programu. Aby temu zapobiec należy: Ostrzegać użytkownika, z jakiego zakresu ma podać wartości Stosować nadzwyczajne zakończenie programu, jeśli użytkownik naruszy dopuszczalny zakres
Czytanie tablicy zmiennych START 1 Wczytaj(n) TAK n>makstab 2 NIE 3 J:=1 NIE J<=n 4 TAK 5 Wczytaj(tab[J]) 6 J:=J+1 STOP STOP program czyttab2; uses Crt; Const makstab=10; var n,j:integer; tab:array[1..maxtab] of real; begin read(n); {1} if n > makstab then Halt; for J:=1 to n do begin read(tab[j]); end; End. Czytanie i pisanie tablicy zmiennych START 1 Wczytaj(n) 2 J:=1 NIE J<=n 3 TAK 4 Wczytaj(tab[J]) 7 5 J:=J+1 NIE J<=n 8 TAK 9 10 J:=J+1 Wypisz(tab[J]) 6 program czytpisz ; uses Crt; Const makstab=10; var n,j:integer; tab:array [1..maksTab] of real; begin Wypisz( UWAG A: piszę ) read(n); J:=1 for J:=1 to n do read(tab[j]); writeln( UWAGA: piszę ); for J:=1 to n do writeln(tab[j]); STOP End.
Zadanie Obliczyć średnia z wczytanych liczb ANALIZA Średnia to suma wartości podzielona przez liczbę wartości Średnia tablicy zmiennych START 1 Wczytaj(n) 2 J:=1 NIE J<=n 3 TAK 4 Wczytaj(tab[J]) 5 J:=J+1 6 7 J:=1 Suma:=0 NIE J<=n 8 TAK 9 10 J:=J+1 Suma:=Suma+tab[J] 11 12 STOP Sred:=Suma/n Wypisz(Sred)
Średnia tablicy zmiennych - PROGRAM program srednia ; uses Crt; Const makstab=10; var n,j:integer; tab:array[1..maxtab] of real; suma, sred : real; begin read(n); for J:=1 to n do read(tab[j]); suma:=0; for J:=1 to n do Suma:=Suma+tab[J]; Sred := Suma / n; writeln(sred); End. Zadanie Znajdź maksymalny element wczytanej tablicy ANALIZA W pierwszym przybliżeniu za maksymum przyjmiemy pierwszy element tablicy. Jeśli którykolwiek z kolejnych elementów jest większy od zakładanego maksymy, podstawiamy 35 maksymum tym elementem 30 25 20 15 10 5 0 Sty Lut Mar Kw i Maj Cze
START 1 Wczytaj(n) 2 J:=1 Maksimum NIE J<=n 3 TAK 4 Wczytaj(tab[J]) 5 J:=J+1 6 7 J:=2 MX:=tab[1] TAK 0 J<=n 8 TAK MX<tab[J] 9 MX:=tab[J] NIE NIE 12 Wypisz(MX) 11 J:=J+1 STOP Maksymum - Program program maksymym ; uses Crt; Const makstab=10; var n,j:integer; tab:array[1..makstab] of real; MX : real; begin read(n); for J:=1 to n do read(tab[j]); MX:-tab[1]; for J:=2 to n do if MX < tab[j] then MX:=tab[J]; writeln( Maksymum wynosi ); writeln(mx); End.
Zadanie Znajdź wszystkie liczby pierwsze w zakresie 2 5000 Analiza Można wypisać wszystkie liczby od 2 do 5000, a następnie wykreślić wielokrotności liczb pierwszych Sito liczb pierwszych program sito; uses Crt; const {Deklaracje stal`ych } MAX_N=5000; var {Deklaracje zmiennych} n,j,k: Integer; liczby: array [2..MAX_N] of Integer;{ tablica na liczby} Ch : Char; { zmienna pomocnicza } begin { Wlasciwy program} Writeln('Liczby pierwsze do? >>> '); Readln(n); if (n>max_n) then Writeln('Za duza liczba ',n) else begin {od else } for j:=2 to n do liczby[j]:=j; { wstaw liczby 2-n do tablicy } k:=2; while k*k<=n do begin {cyklu} j:=2*k; { usun` nadkrotnos`ci k } while j<=n do begin liczby[j]:=0; j:=j+k end; k:=k+1; { naste`pne k z liczby[k]!=0 } while (liczby[k]=0) and (k<=n) do k:=k+1; end; {cyklu} for j:=2 to n do {druk liczb p.}if liczby[j]>0 then Write(' ',j); end; {od else } Writeln; Writeln(' KONIEC '); Ch:=ReadKey; end.
Tablice mogą być wielowymiarowe Var y: array[1..2,1..4] of garaz; Y[1,1] Y[1, 2] Y[1, 3] Y[1, 4] Y[2,1] Y[2, 2] Y[2, 3] Y[2, 4] Zadanie na laboratorium Znaleźć sumę elementów wczytanej tablicy Znaleźć maksymalny (minimalny) element wczytanej tablicy Powyższe najpierw dla tablic jednowymiarowych, potem dla dwuwymiarowych Utworzyć tablicę zawierającą trójkąt Pascal i wypisać trójkąt
Trójkąt Pascala: W pierwszej kolumnie i na przekątnej ma jedynki Elementy poniżej przekątnej są sumą elementu wyżej i wyżej na lewo 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1...1 Struktura Strukturalny typ danych stosujemy wtedy, gdy chcemy opisać obiekt, którego kompletu cech nie można wyrazić za pomocą pojedynczej liczby Np..: pisząc godzinę 12.30 mamy na myśli dwa składniki liczbowe: godzina i minuty Pisząc datę 23.11.2001 mamy na myśli trzy składniki liczbowe: dzień, miesiąc, rok. Pisząc ułamek trzy czwarte mamy na myśli dwa składniki liczbowe: licznik i mianownik
Deklaracja typu struktury: Type data = Record dzien, miesiac,rok:integer; end; Type godzina= Record godz, min:integer; end; Type ulamek= Record licznik,mianownik:integer; end; Deklaracja zmiennej Var dzis : data; Var teraz : godzina; Var wym : ulamek;
Dostęp do wartości Read(teraz.godz); read(teraz.min); Teraz.godz:=2; teraz.min:=43; Writeln(teraz.godz); Writeln(teraz.min); zadanie Dodać dwa wektory trójwymiarowe Analiza Wektor trójwymiarowy można przedstawić jako strukturę (rekord) o trzech składowych: x,y,z Suma wektorów jest wektorem Dodawanie dwóch wektorów oznacza dodanianie do siebie odpowiednich składowych
Dodawanie wektorów program Wektor3w; type wek3w = record x,y,z:real; end; var w1, w2, w3:wek3w; begin {Czytanie wektorów } Writeln('Podaj 3 współrzędne pierwszego wektora:'); readln(w1.x, w1.y,w1.z); Writeln('Podaj 3 współrzędne drugiego wektora:'); readln(w2.x, w2.y,w2.z); {Dodawanie wektorów} w3.x:=w1.x+w2.x; w3.y:=w1.y+w2.y; w3.z:=w1.z+w2.z; {Prezentacja wyniku} Writeln('Wektor sumy ma współrzędne'); Writeln('[',w3.x, ',', w3.y, ',',w3.z, ']' ); end. zadanie Obliczyć długość wektora trójwymiarowego Analiza Długość wektora jest liczbą Jest po pierwiastek z sumy kwadratów składowych 2 2 x + y + z 2
program Dlug3w; Obliczanie długości wektora type wek3w = record x,y,z:real; end; var :wek3w; dlug:real; begin {Czytanie wektora } Writeln('Podaj 3 współrzędne pierwszego wektora:'); readln(w1.x, w1.y,w1.z); {Obliczanie długości} dlug:=sqrt(w1.x(w1.x+w1.y*w1.y+w1.z*w1.z); {Prezentacja wyniku} Writeln( Długość wektora wynosi, dlug); end. zadanie Wczytaj i posortuj godziny Analiza Zadanie sortowania godzin niczym nie różni się od sortowania liczb. Jedyne, co trzeba uwzględnić to inny sposób porównywania godzin, ich czytania i wypisywania Można zastosować metodę EXCHANGE SORT
Sortowanie godzin program sortowgodz; {nazwa programu} { Program w je`zyku Pascal: sortowanie exchange sort liczb } uses Crt; {uz yte biblioteki} const {Deklaracje stal`ych } MAX_N=5000; type godzina= Record godz, min:integer; end; Tablica = array [1..MAX_N] of godzina; var {Deklaracje zmiennych} n,j,k: Integer; { deklaracja zmiennej n oraz pomocniczej j i k} liczby: Tablica; { tablica na liczby} pomoc : godzina; Ch : Char; { zmienna pomocnicza } begin { Wlasciwy program} {czytanie} Writeln('ile godzin? >>> '); Readln(n); { czeka na Twe dane } if (n>max_n) then Writeln('Za duza liczba ',n) else begin Sortowanie godzin cd. for j:=1 to n do {czytaj godziny } begin Write('godzina[',j,']='); Readln(liczby[j].godz,liczby[j].min); end; {Sortowanie} for j:=1 to n-1 do for k:=j+1 to n do if (liczby[j].godz> liczby[k].godz) or (( liczby[j].godz= liczby[k].godz) and (liczby[j].min> liczby[k].min)) then begin pomoc:=liczby[k]; liczby[k]:=liczby[j]; liczby[j]:=pomoc; end;
Sortowanie godzin cd. {Prezentacja wyników} Writeln(' Liczby w kolejności rosnącej'); for j:=1 to n do Write(' ', liczby[j].godz:2,':',liczby[j].min:2); end {do robienia czegikolwiek} end. Zadania na laboratorium Wczytać i pomnożyć dwa ułamki Obliczyć różnicę w minutach między dwoma godzinami Wczytać dwa wektory dwuwymiarowe (składowe X,Y) i dodać je. Wczytać serię dat i posortować je