{ Program ilustruje strukture programu Pascalowego, niektore definicje, deklaracje i instrukcje (C) J.Kobus Instytut Fizyki UMK 2002) } (* W Pascalu dostępne są następujące znaki i symbole: - litery alfabetu łacińskiego: a-z, A-Z, - cyfry dziesiętne: 0-9, - odstęp (spacja), - symbole specjalne: + - * / = < > [ ] . , : ; ( ) <> <= >= := .. ^ słowa kluczowe Mamy następujące słowa kluczowe: and array begin case const div do downto else end file for function goto if in label mod nil not of or packed procedure program record repeat set then to type until var while with Symbol pascalowy: symbol specjalny, liczba bez znaku, identyfikator, napis, instrukcja, etykieta. Liczba: liczba całkowita albo rzeczywista. Identyfikator: nazwa alfanumeryczna, ciąg znaków, z których pierwszy jest literą, a następne (o ile występują) są literami albo cyframi. Napis: ciag znaków ujętych w apostrofy. Etykieta: liczby typu 0..9999 oraz dowolne nazwy. Kolejne symbole mogą (czasami muszą) być oddzielone od siebie separatorami. Separatorami są: odstęp, zmiana wiersza i komentarz. Komentarz stanowi dowolny ciąg znaków ujęty w nawiasy klamrowe { ... } lub nawiasy złożone z '(' i '*' oraz '*' i ')' (por. komentarz tego programu). *) program Pascal_to_jest_to (Input, Output); { naglowek programu } { Nagłowek programu składa się ze słowa kluczowego PROGRAM oraz identyfikatora (nazwy programu). W nawiasach okrągłych mogą, ale nie muszą wystąpić zmienne INPUT i OUTPUT, które są identyfikatorami standardowych plików wejściowych (do wczytywania danych) i wyjściowych (do wyprowadzania wyników). } { część bierna programu: deklaracje i definicje } uses Crt; (* biblioteka Crt jest dostępna w niektórych (rozszerzonych) implementacjach pascala uses Crt; {Dołączenie pakietu procedur Crt, które pozwalają na wybór jednego z trybów znakowych, wybór koloru tekstu i jego tla, definiowanie okien, sprawdzanie stanu klawiatury i sterowanie głośnikiem. W szczególności pakiet ten zawiera następujące procedury: Sound, NoSound, Delay, ReadKey } *) {określanie typów; typ = zbiór możliwych wartości wraz z identyfikatorem; z typem jest także związany zestaw operacji, które można wykonywać na obiektach danego typu} type rzeczywisty_4 = single; rzeczywisty_6 = real; rzeczywisty_8 = double; student = record { imie : array[1..20] of char;} { nazwisko : array[1..40] of char;} imie : string[20]; nazwisko : string[40]; nralbumu : integer; rokurodz : integer; end; data = record dzien : 1..31; miesiac : 1..12; rok : 1900..2050; end; const { deklaracje używanych stałych} g = 9.81; c = 3.0e+8; Nmax = 100; inicjaly = 'aa'; kropka = '.'; var { deklaracje } bool : boolean; {zmiennej boolowskiej, logicznej} ch : char; {zmiennej znakowej} i,j,k,n,reszta : integer; {zmiennych całkowitych} nrstud : integer; {zmiennych całkowitych} h,r,x,y,z : rzeczywisty_4; {zmiennych rzeczywistych} A,B : array[1..Nmax] of real; {tablicy jednowymiarowej o elementach typu rzeczywistego} tytul : string[30]; {zmiennej łańcuchowej} studWFAIIS : array[1..100] of student; {tablicy o elementach typu rekordowego} data_1,data_2 : data; {zmiennych rekordowych} ffun : text; {zmiennej plikowej} label { deklaracje etykiet } 1234,5555; { część aktywna programu zawiera instrukcję złożoną begin ... end } begin { Wywołanie procedury z pakietu Crt do czyszczenia ekranu (dzialanie tej procedury jest równoważne działaniu polecenia dosowskiego cls) ClrScr; } { Możliwe operacje na wartościach całkowitych: + - dodawanie, - - odejmowanie, * - mnożenie, div - dzielenie całkowite, mod - branie reszty z dzielenia całkowitego. Funkcje standardowe o wartościach całkowitych: abs(i) - |x|, wartość bezwzględna, sqr(i) - kwadrat wartości i, succ(i) - następnik, tj. i+1, pred(i) - poprzednik, tj. i-1. round(x) - zaokrąglenie wartości rzeczywistej x do najbliższej liczby całkowitej, trunc(x) - obcięcie wartości rzeczywistej x do najbliższej liczby całkowitej bliższej zeru random(i) - liczba przypadkowa (pseudolosowa) z przedziału [0..i-1] (przed jej użyciem musi być wołana procedura randomize) Możliwe operacje na wartościach rzeczywistych: + - dodawanie, - - odejmowanie, * - mnożenie, / - dzielenie, Funkcje standardowe o wartościach rzeczywistych: abs(x) - |x|, wartość bezwzględna, sqr(x) - kwadrat wartości x, sqrt(x) - pierwiastek kwadratowy, ln(x) - logarytm naturalny, exp(x) - funkcja wykładnicza, sin(x) - funkcja sinus, cos(x) - funkcja cosinus, arctan(x) - funkcja arcus tangens. Argumenty powyższych funkcji mogą być typu rzeczywistego lub całkowitego. Liczby całkowite i rzeczywiste mogą być porównywane przy pomocy operatorów relacji, tj. operatorów <,>,<=,>=,<>,=. INSTRUKCJE PRZYPISANIA (PODSTAWIANIA): } ch:='!'; i:=10; j:=2; i:=i*j+i; k:=i div j; reszta:= k mod 5; r:=1.3; x:=2.0*pi*r; y:=(-x+sqrt(x))/(x+r); z:=x+y; data_1.dzien:=5; nrstud:=5; studWFAIIS[nrstud].imie:='Adam'; studWFAIIS[nrstud].nazwisko:='Adamowski'; studWFAIIS[nrstud].nralbumu:=12345; studWFAIIS[nrstud].rokurodz:=1981; { INSTRUKCJE WEJŚCIA I WYJŚCIA } Writeln; {utworzenie pustej linii} Writeln ('To może być dowolny ciąg znaków ... '); {wyprowadzenie napisu '...'} Writeln; Write('i,j,k? '); Read(i,j,k); {wczytanie z klawiatury trzech liczb całkowitych} Writeln(i:10,j:10,k:10); {wypisanie na ekranie monitora wartosci trzech liczb całkowitych na polach o szerokośc 10 znaków} assign (ffun,'funkcja_sin.txt'); {związanie zmiennej plikowej z określonym plikiem} rewrite(ffun); {otwarcie pliku do zapisu}; {reset(ffun);} {otwarcie pliku do odczytu}; n:=10; h:=pi/n; x:=-h; for k:=0 to n do begin x:=x+h; writeln(ffun,x:10:4,sin(x):10:4); end; close(ffun); {zamknięcie pliku} { INSTRUKCJA ITERACYJNA 1 for var:=pierwszy to ostatni do instrukcja; for var:=pierwszy downto ostatni do instrukcja; } for k:=-5 to 5 do Write(k:5); Writeln; Writeln; for k:=5 downto 0 do begin Write(k:5); Writeln(' Turbo Pascal to jest to!'); end; Writeln; Writeln; { INSTRUKCJA ITERACYJNA 2 repeat instrukcja; instrukcja; ... until wyrażenie boolowskie } k:=-1; repeat { początek instrukcji iteracyjnej 'repeat' } Inc(k); Writeln (k:5,' Turbo Pascal to jest to!'); until k=5; { koniec instrukcji iteracyjnej 'repeat' } {Pętla 'nieskonczona': przerwanie petli przez nacisniecie Esc} Writeln; Writeln; Writeln ('Przerwij pętlę naciskając Esc'); Writeln; k:=0; repeat Inc(k); Writeln; Writeln (k:5,' Pascal to jest to!'); Writeln; Writeln ('Nacisnac dowolny klawisz.'); until ReadKey=#27; { koniec instrukcji iteracyjnej 'repeat'} { pętlę 'repeat ... until' można przerwać naciskając klawisz Esc, który w kodzie ASCII ma numer 27 } { INSTRUKCJA ITERACYJNA 3 while wyrazenie boolowskie do instrukcja; } Writeln; Writeln; n:=0; while n<10 do begin Inc(n); Write(n:5); end; Writeln; { INSTRUKCJA WYBORU case ... of } Writeln; Writeln('Rozpoznawanie nacisniętego klawisza klawiatury: klawisz+Enter'); Writeln('Nacisnięcie = przerywa pętlę'); repeat readln(ch); case ch of 'a'..'z': Writeln('mala litera ',ch:2); 'A'..'Z': Writeln('duza litera ',ch:2); '0'..'9': Writeln('cyfra ',ch:2); else Writeln('znak specjalny'); end until (ch='='); { INSTRUKCJE WARUNKOWE if wyrazenie_boolowskie then instrukcja; if wyrazenie_boolowskie then instrukcja else instrukcja; } Writeln; Writeln; if i=1 then goto 5555; if j=1 then Writeln ('j=1') else Writeln ('j<>1'); Halt; 5555: Writeln ('zmienna boolowska bool ma wartosc true'); Writeln; bool:=true; if bool then Writeln ('prawda: bool=true') else Writeln ('falsz: bool=false'); end. {kropka oznacza koniec programu}