Zajęcia 3 1. Instrukcja iteracyjna „while” while WARUNEK do Instrukcja; 2. Deklaracja funkcji function nazwa(x:real;i:integer;.....): typ_funkcji; deklaracje zmiennych lokalnych; begin instrukcje (w tym podstawienie pod nazwe funkcji wartości); end; 3. Podstawowe funkcje mamematyczne. http://www.freepascal.org/docs-html/rtl/system/mathematicalfunctions.html ZAPOZNAĆ SIĘ!!! 4. Pewne procedury konwersji http://www.freepascal.org/docs-html/rtl/sysutils/conversionroutines.html wiedzieć, że takie coś jest, przeczytać Przykład 1. Program wyznaczający liczbe maksymalną ze wszystkich wczytanych liczb całkowitych; zapamiętuje wczytane liczby i ew. je drukuje. Podaje też ilość wczytanych liczb program maksimum; {wyznacza maksymalna liczbe integer, wczytane liczby pamieta w tablicy tab do ew. dalszego wykorzystania liczy tez ilosc wczytanych liczb} uses crt; var max,a,i,ile_liczb:integer; odp:char; tab: array[1..1111] of integer; begin max:=0; {i to numer kolejnej liczby, ile_liczb -ich ilosc} i:=0; ile_liczb:=0; writeln(' jesli zakonczyć wcisnij n, kontynuowac - t '); readln(odp); while (odp<>'n') do begin write('Podaj wartosc liczby :'); readln(a); i:=i+1; tab[i]:=a; ile_liczb:=i; if max<a then max:=a; writeln(' jesli zakonczyć wcisnij n, kontynuowac - t '); readln(odp); end; clrscr; if(ile_liczb<>0) then begin Writeln('wczytales ',ile_liczb,' liczb, maxymalna liczba to ',max); {teraz ewentyalnie wydrukuje wczytane liczby} writeln(' nacisnij ENTER'); readln; writeln(' czy wypisac wczytane liczby t/n'); readln(odp); if odp='t' then begin for i:=1 to ile_liczb do writeln(' liczba ',i, ' jest rowna = ',tab[i]); end; end else writeln(' nie wczytales zadnej liczby'); end. Przykład 2. Program wyznacza resztę z dzielenie dwu liczb rzeczywistych. Resztę z dzielenia dwu liczb całkowitych oblicza się stosując operator mod: i mod j Program reszta; uses crt; var a,b:real; function modd(x,y:real):real; var il:real; begin il:=int(x/y); modd:=x-(il*y); end; begin clrscr; write('Podaj wartosc licznika a :');readln(a); write('Podaj wartosc mianownika b :');readln(b); if(b<>0) then writeln('czesc calkowita to ',int(a/b):0:0, ' reszta z dzielenia a/b wynosi : ',modd(a,b):0:5) else writeln(' nie dziel przez 0 '); end. Przykład 3. Program „rysuje” trójkąt prostokątny o danej podstawie (jednostka: znak < 80) program trojkacik; uses crt; var a,b,i:byte; begin write('Podaj Podstawe trojkata (< od „dlugosci” wiersza :');readln(a); clrscr; b:=0; writeln('*'); repeat b:=b+1; if a>2 then begin write('*'); for i:=2 to b do write(' '); writeln('*'); end; until (a=b+2)or(a=2); for i:=1 to a do write('*'); readln; end. Przykład 3. Obliczanie silni. Wersja bez (silnia1) oraz z (silnia2) rekurencją program silnia1; uses crt; var i,x: Integer; w : extended; begin Writeln('Program oblicza silnie podanej liczby'); Write('Podaj liczbe x: ');Read(x); if (x < 0 ) then begin if (x=0) then Writeln('Silnia liczby ',x, ' wynosi 1') else writeln(' liczba ujemna, nie ma '); end else begin W:=1; for i:=1 to x do W:=W*i; Writeln('Silnia liczby ',x, ' wynosi ', W); end; end. Program silnia2; uses Crt; var M : integer; Function Silnia(N : integer):extended; Var I : integer; wartosc : extended; Begin Wartosc:=1; For I:=1 to N do Begin Wartosc:=Wartosc*I; End; Silnia:=Wartosc; end; Begin {blok instrukcji} Write('Podaj liczbe: ');readln(M); clrscr; if (M < 0 ) then begin if (M=0) then Writeln('Silnia liczby ',M, ' wynosi 1') else writeln(' liczba ujemna, nie ma '); end else begin Writeln('Silnia liczby ',M,' = ',Silnia(M)); end; End. Przykład 4. Obliczenie iloczynu 2 macierzy 2x2. Wyrazy macierzy przypadkowe liczby <=100. program iloczyn_macierzy; uses crt; var i,ii:longint; macierz1:array[1..2,1..2]of longint; macierz2:array[1..2,1..2]of longint; begin randomize; for i:=1 to 2 do for ii:=1 to 2 do Begin macierz1[i,ii]:=random(100); macierz2[i,ii]:=random(100); end; writeln('Macierz 1'); writeln; for i:=1 to 2 do begin for ii:=1 to 2 do Begin writeln(' ',macierz1[i,ii]); end; writeln; end; writeln('Macierz 2'); writeln; for i:=1 to 2 do begin for ii:=1 to 2 do Begin writeln(' ',macierz2[i,ii]); end; writeln; end; writeln('Iloczyn Macierzy 1 i Macierzy 2'); writeln((macierz1[1,1]*macierz2[1,1])+(macierz1[2,1]*macierz2[1,2])); writeln((macierz1[1,1]*macierz2[2,1])+(macierz1[2,1]*macierz2[2,2])); writeln((macierz1[1,2]*macierz2[1,1])+(macierz1[2,2]*macierz2[1,2])); writeln((macierz1[1,2]*macierz2[2,1])+(macierz1[2,2]*macierz2[2,2])); end. Przykład 5. Program zgaduje ile masz lat z odpowiedzi T/N program ile_lat; uses crt; var a1,a2,pyt:byte; ch:char; begin Writeln('PROGRAM ODGADNIE ILE MASZ LAT, mniej niz 100'); a1:=1; a2:=100; { maximum} repeat pyt:=round(int((a1+a2)/2)); repeat Writeln('Masz mniej niz ',pyt,' lat ? [T/N]'); ch:=upcase(readkey); until (ch='N')or(ch='T'); if ch='N' then a1:=pyt; if ch='T' then a2:=pyt; if(a1-a2=1)or(a2-a1=1)then a2:=a1; until a1=a2; Writeln; Writeln('Masz ',a1,' lat'); readln; end. Przykład 6. Program rysuje na ekranie prymitywną szachownicę. uses crt; {lub uses wincrt;} var i,j:byte; procedure b; begin for j:=1 to 4 do write(#987+#987+#987+' '); end; procedure c; begin for j:=1 to 4 do write(' '+#987+#987+#987); end; begin clrscr; Writeln('Szachownica !'); writeln;writeln; writeln(' A B C D E F G H'); writeln; for i:=8 downto 1 do begin if i mod 2 = 0 then begin write(' ',i,' ');b;end else begin write(' ',i,' ');c;end; writeln; end; Przykład 7. Odpytywanie z tabliczki mnożenia. program tabliczka_mnozenia; uses crt; var odp,l1,l2,pytan,bledow,zasieg:integer; ch:char; begin clrscr; Writeln(' Program Mnozenie'); writeln; writeln; repeat write('Podaj zasieg z jakiego losowac liczby [1..100] : ');readln(zasieg); until (1<zasieg)and(zasieg<101); pytan:=0; bledow:=0; randomize; repeat clrscr; pytan:=pytan+1; l1:=random(zasieg)+1; l2:=random(zasieg)+1; Writeln('Pytanie Numer : ',pytan); Writeln; Write('Ile Jest ',l1,' x ',l2,' = ');readln(odp); if odp<>l1*l2 then begin Writeln('Zle !');bledow:=bledow+1;end else writeln('Dobrze'); writeln; Writeln('------------ STATYSTYKA -------------'); Writeln(' Pytan - ',pytan); Writeln(' Dobrych - ',pytan-bledow); Writeln(' Blednch - ',bledow); Writeln(' Procent Dobrych : ',100*(pytan-bledow)/pytan:0:1,' %'); Writeln; Writeln('Kontynuowac ? : [T/N]'); ch:=readkey; {funkcja upcase zamienia duze na małe litery} until upcase(ch)='N'; writeln('KONIEC'); end. UWAGA. Użyto funkcji upcase(ch). Inne funkcje operacji na łascuchach/znakach: http://www.freepascal.org/docs-html/rtl/system/stringfunctions.html ZAPOZNAĆ SIĘ Z NIMI!! Przykład 8. Podajemy współczynniki funkcji liniowej. Obliczamy przecięcia z osiami X i Y oraz pisze, czy jest rosnąca, czy malejąca. program funkcja_liniowa; uses crt; var a,b:integer; ch:char; begin repeat clrscr; Writeln('Program Oblicza Stan Funkcji Liniowej y = ax + b'); Writeln('Sprawdza czy jest rosnaca, malejaca czy stala.'); Writeln; Write ('Podaj wartosc wpolczynnika a :');readln(a); Write ('Podaj wartosc wpolczynnika b :');readln(b); writeln; if a=0 then Writeln('Funkcja jest Stala'); if a<0 then Writeln('Funkcja jest Malejaca'); if a>0 then Writeln('Funkcja jest Rosnaca'); Writeln('Punkt przeciecia z osia y = x = 0 y = ',b); if a<>0 then Writeln('Punkt przeciecia z osia x = x = ',((0-b)/a):0:1,' Writeln('Punkt przeciecia z osia x = BRAK'); y = 0') else writeln; if a>0 then begin Writeln('Wartosci przyjmuje wartosc ujenma dla przedzialu (-nieskoncz , ',((0-b)/a):0:1,' )'); Writeln('Wartosci przyjmuje wartosc dodatmia dla przedzialu ( ',((0-b)/a):0:1,' ,nieskoncz )'); end; if a<0 then begin Writeln('Funkcja przyjmuje wartosc dodatnia dla przedzialu (-nieskoncz , ',((0-b)/a):0:1,' )'); Writeln('Funkcja przyjmuje wartosc ujemna dla przedzialu ( ',((0-b)/a):0:1,' ,nieskoncz )'); end; if a=0 then begin if b>0 then writeln('Wartosc funkcji jest dodatnia dla ( -nieskoncz, nieskoncz )'); if b=0 then writeln('Wartosc funkcji jest rowna zero'); if b<0 then writeln('Wartosc funkcji jest ujemna dla ( -nieskoncz, nieskoncz )'); end; {} writeln; write('Jeszcze Raz ? [T/N] :'); ch:=readkey; {upcase zamienia mala na duza literę} until upcase(ch)='N'; writeln('Koniec'); end.