2 strony - Stefan Brock
Transkrypt
2 strony - Stefan Brock
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 1 x 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 214 213 212 0 0 0 0 0 24 23 1 1 1 22 21 20 Znak: 0 to +, 1 to 1 X= +(0*214+0*213+......+0*24 +0*23 +1*22 +1*21 +1*20)= =+(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 0 0 0 0 0 1 1 1 2-1 2-2 2-3 wykładnik 0 0 0 0 0 0 0 0 2-23 Znak liczby: 0 to +, 1 to 1 0 0 0 0 26 25 24 1 1 1 23 22 21 20 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 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. START 1 Wczytaj(n) 2 J:=1 NIE J<=n 3 TAK 4 Wczytaj(tab[J]) 5 J:=J+1 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 STOP J:=1 NIE J<=n 4 TAK 5 Wczytaj(tab[J]) 6 J:=J+1 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. STOP Czytanie i pisanie tablicy zmiennych START 1 Wczytaj(n) 2 J:=1 NIE J<=n 3 TAK Wczytaj(tab[J]) 7 J:=J+1 4 5 6 NIE J<=n 8 TAK 9 Wypisz(tab[J]) 10 J:=J+1 program czytpisz ; uses Crt; Const maksTab=10; var n,j:integer; tab:array [1..maksTab] of real; begin Wypisz(‘UWAG read(n); A: piszę’) for J:=1 to n do J:=1 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 Wczytaj(tab[J]) 6 J:=J+1 7 4 5 J:=1 Suma:=0 NIE J<=n 8 11 TAK 9 Suma:=Suma+tab[J] 10 J:=J+1 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 maksymum tym elementem ■ ■ 35 30 25 20 15 10 5 0 Sty Lut Mar Kw i Maj Cze START Maksimum 1 Wczytaj(n) 2 J:=1 NIE J<=n 3 TAK Wczytaj(tab[J]) 6 J:=J+1 7 4 5 8 TAK 0 J<=n NIE TAK MX<tab[J] NIE 9 MX:=tab[J] 11 J:=2 MX:=tab[1] J:=J+1 12 Wypisz(MX) 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 11 121 1331 14641 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 ■ x2 + y2 + z 2 Obliczanie długości wektora ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ program Dlug3w; 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) ■ Sortowanie godzin cd. ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ else begin 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 ■