Pascal

 

W tym dziale zajmiemy się programowaniem w Pascal`u, poznamy jego składnię i napiszemy przykładowy program. Inne przykłady i kurs znajdują się w dziale programy.

1.Wprowadzenie

2.Podstawy i składnia

3.Przykłady

4.Tryb tekstowy

5.Tryb graficzny

6.Operacje na plikach

7.Moje kombinacje

 

1.Wprowadzenie

Pacal jest językiem wyższego poziomu, posiada gotowe biblioteki i moduły, co ułatwia programowanie. Z drugiej strony jest on bardziej wymagający pod względem estetyki programowania np. każda linia musi być zakończona średnikiem ( ; ). Edytor powinien zawierać kompilator i linker, co pozwoli tworzyć nam pliki wykonywalne exe.

2.Podstawy i składnia

Ogólny szkic programu wygląda następująco: deklaracja program nazwa; potem ewentualne dołączanie bibliotek uses nazwa; następnie deklaracje zmiennych var i pod spodem np. a:integer; ustalenie zmiennej a jaku typu dziesiętnego, dalej piszesz program i kończysz end.

 

program nazwa; (deklaracja nazwy programu i jego początku)
uses nazwa, nazwa2;
(dołączanie modułów)
const
(deklaracje stałych)
...
var
(deklaracje zmiennych)
...
begin
(początek programu, procedury lub funkcji)
...
end.
(koniec programu)

 

A teraz trochę inaczej robimy procedurę:
 

-Szkielet procedury

procedure nazwa(...);
(deklaracja początku procedury)
const
...
var
...
begin
...
end;
(koniec procedury)

Teraz poznamy podstawowe polecenia Pascal`a i ich znaczenie:

Komenda i ewentualne parametry

Znaczenie (opis działania)

Program nazwa

Deklaracja początku programu

Unit nazwa

Deklaracja jednego modułu

Const

Deklaracja stałych

Uses nazwa

Deklaracja użycia bazy modułów

Var

Deklaracja zmiennych

Begin

Początek programu, procedury, funkcji, pętli

End (End.)

Koniec pętli (koniec programu)

Procedure nazwa (zmienne)

Deklaracja początku procedury

Function nazwa (zmienne)

Deklaracja początku funkcji

Array [zbior] of [typ]

Deklaracja tablicy

If [warunek] then [program]

Jeżeli warunek jest spełniony to zrób...

Else

Operacja ewentualnie (inaczej) np. gdy war. nie spełniony

Or (And)

Lub (oraz)

Repeat [program] until [warunek]

Powtarzaj aż zostanie spełniony warunek

While [warunek] do [program]

Powtarzaj dopóki jest spełniony warunek

For [zmienna] to [zmienna] do

Pętla: od danej1 do danej2 zrób to...

Case [zmienna] of [wybor]

Instrukcja wyboru np. zamiast wielu warunków (if)

Writeln(' tekst ') writeln(a)

Wyświetl tekst, wyświetl zmienną a

Readln(a)

Czeka na wprowadzenie zmiennej a

TextBackground(n)

Ustawia kolor tła na (n - numery 0-7)

TextColor(n)

Ustawia kolor tekstu na (n - numery 0-15)

ClrScr

Czyści ekran

Halt

Zamyka bezwarunkowo program

Exit

Zamyka program

Label n,n2

Definicja etykiet

Goto n

Skacz do n - etykiety

Sound(n)

Wydaje dźwięk o częstotliwości n

NoSound

Powoduje zaprzestanie wydawania dźwięku

Delay(n)

Wstrzymuje wykonywanie programu na czas n (ms)

Randomize

Pozwala na używanie zmiennych generowanych losowo

3.Przykłady

Przedstawię tutaj dwa programy przykładowe oraz kilka innych dotyczących konkretnych zagadnień: jeden jako rozbudowany szkic, a drugi konkretny przykład.

Program nazwa_programu;
Uses moduł1,moduł2,moduł3; {akurat w tym przypadku dos,crt}
Var Zmienna1 : String; {String jest przykładowy ale może być inny}
Zmienna2 : Boolean;
Begin
readln(zmienna1);
If Zmienna1='napis' then Zmienna2:=true;
case Zmienna2 of
'true': writeln('zmienna to napis');
'false': writeln('zmienna to nie napis');
end;
redaln;
end.

Drugi:

program suma;
uses Crt;
var
a,b: integer;
begin
ClrScr;
writeln('Podaj zmiennĄ a');
read(a);
writeln('Podaj zmiennĄ b');
read(b);
writeln('Suma zmiennych=',a+b);
end.

TRYB TEKSTOWY - PRZYKŁADY

-Program wykorzystujący funkcje dźwiękowe oraz używanie warunków:

program dk;
uses Crt;
var
tura,x,odp,ton,czas:integer;
begin
{na początek zagramy melodię wstępną}
x:=50;
repeat
x:=x+5;
Sound(x);
Delay(75);
tura:=tura+1;
until tura=10;
NoSound;
writeln('Witaj w programie muzycznym!!!');
writeln;
writeln('Wybierz rodzaj melodii: ');
writeln;
writeln(' 1.Szalona 2.Spokojna');
readln(odp);
if odp = 1 then
begin
Randomize;
{ta funkcja pozwala na używanie liczb losowych}
repeat
ton:=Random(750);
czas:=Random(250);
Sound(ton);
Delay(czas);
tura:=tura+1;
until tura=25;
NoSound;
end
else
if odp = 2 then
begin
repeat
x:=x+1;
ton:=Random(50+x);
czas:=Random(50);
Sound(ton);
Delay(czas);
tura:=tura+1;
until tura=100;
NoSound;
end
else
end.

-Program wykorzystujący funkcje graficzne – trybu tekstowego:

program graf;
uses Crt;
var
kolor,tlo,x:integer;
begin
Randomize;
{migawka wstępna-kolorowe tła}
repeat
tlo:=Random(6);
textbackground(tlo);
ClrScr;
Delay(50);
x:=x+1;
until x=25;
x:=0;
{kolorow ciągi znaków}
repeat
tlo:=Random(6);
textbackground(tlo);
kolor:=Random(20);
textcolor(kolor);
write(' ',x);
Delay(50); x:=x+1; until x=200; end.

TRYB GRAFICZNY - PRZYKŁADY

-Teraz zajmiemy się trybem graficznym - 13h (VGA 320*200 - 256 kolorów):

Aby umożliwić nam pracę w takim trybie najpierw musimy go załadować. Ja wykorzystuję do tego asemblera.Aby zrozumieć wstawki asemblera musisz znać mnemoniki i ogólne zasady programowania w tym języku. Zajżyj więc do działu asembler - krótko. Piszę taką wstawkę:

asm
mov ah, 00h
mov al, 13h
int 10h
end;

I już mamy tryb 13h załadowany, jak sam zauważyłeś w rejestr al wpisujemy numer trybu. Teraz pokażę wam kilka funkcji, które trzeba napisać dla potrzeb tego trybu graficznego. Pierwsza z nich wyświetla pixel o określonym kolorze:

asm
mov ax, 0A000h
mov es, ax
mov al, kolor
mov di, pixel
mov es:[di], al
end;

Ta wstawka powoduje wyświetlenie pixela o kolorze z rejestru al w miejscu odległym o liczbę pixeli podanych w rejestrze di od początku ekranu. Jest to dość niewygodne więc napiszemy funkcję, która wyświetla pixel w miejscu wskazanym przez współrzędne x i y oraz kolor w zmiennej kolor:

procedure pixel(x,y:word; kolor:byte);
begin
asm
mov ax, 0A000h
mov es, ax
mov ax, 320
mul y
add ax, x
mov di, ax
mov ax, 0h
mov al, kolor
mov es:[di], al
end;
end;

I mamy gotową procedurę, ta jest jedną z moich procedur wchodzących w skład mojego modułu GRAF_OC. Np. pixel(160,100,1); - wyświetli niebieski pixel na środku ekranu.

Teraz zamalowywanie ekranu na jeden kolor, funkcja taka jak ClrScr w trybie tekstowym:

procedure ekran(kolor:byte);
begin
asm
mov ax, 0A000h
mov es, ax
mov di, 0h
mov al, kolor
mov cx, 64000
@ekran:
mov es:[di],al
add di, 1
loop @ekran
end;
end;

Proszę oto gotowa funkcja - zapełnia ekran wybranym kolorem podanym w parametrze np. ekran(1); - wypełnia ekran na niebiesko

Teraz funkcje lini pionowych i poziomych, oto one:

procedure linia_pozioma(x,y,x1: word; kolor:byte);
var
dlugosc,tmp:word;
begin
if x > x1 then
begin
tmp:=x1;
x1:=x;
x:=tmp;
end;
dlugosc:=x1-x;
asm
mov ax, 0A000h
mov es, ax
mov ax, 320
mul y
add ax, x
mov di, ax
mov al, kolor
mov cx, dlugosc
@linia:
mov es:[di], al
add di, 1
loop @linia
end;
end;

A teraz pionowa:

procedure linia_pionowa(x,y,y1: word; kolor:byte);
var
dlugosc,tmp:word;
begin
if y > y1 then
begin
tmp:=y1;
y1:=y;
y:=tmp;
end;
dlugosc:=y1-y;
asm
mov ax, 0A000h
mov es, ax
mov ax, 320
mul y
add ax, x
mov di, ax
mov al, kolor
mov cx, dlugosc
@linia:
mov es:[di], al
add di, 320
loop @linia
end;
end;

Narazie to wszystko, inne funkcje znajdują się w moim module, ale narazie ich nie udostępniam, moduł z ograniczoną liczbą funkcji jest dostępny w dziale donload.

OPERACJE NA PLIKACH

W tym miejscu chciałbym przedstawić operacje zapisu i odczytu z plików (głównie tekstowych). Przedstawię dwa sposoby, jeden posiadający mniejsze możliwości manewru, ale prostrzy i drugi trudniejszy.

Pierwszy sposób zaprezentuję na przykładnie prostego programu, który będzie przechowywał w pliku wynik ostatniej operacji dodawania, oto on:

program pliksuma;
uses crt;
var
plik:text;
a,b,c:integer;
begin
ClrScr;
assign(plik,'g.dat');
reset(plik);
read(plik,c);
close(plik);
writeln('Ostatnia suma = ',c);
writeln('Podaj liczbę a: ');
readln(a);
writeln;
writeln('Podaj liczbę b: ');
readln(b);
writeln;
writeln('Suma= ',a+b);
readln;
assign(plik,'g.dat');
rewrite(plik);
write(plik,a+b);
close(plik);
end.

Ten sposób nadaje się do zarządzania tylko plikami tekstowymi, w tym przykładnie odczytywałem z pliku i nadpisywałem plik. Polecenie assign(plik,'g.dat') służy do skojażenia nazwy pliku g.dat ze zmienną plik, reset(plik) - otwiera plik do odczytu, read(plik,c) - odczytuje z pliku do zmiennej c close(plik) - zamyka plik, rewrite(plik) - tworzy nowy plik/nadpisuje stary do zapisu.

Teraz przedstawię drugi sposób, przykładem będzie zapisanie do pliku napisu, następnie odczytuje napis, należy zwrócić uwagę na to, że dane są zapisywane w formacie LATIN 2, do dzieła:

program pliknapis;
uses crt;
var
plik:file;
napis,napis2:string;
licznik,wynik:word;
begin
ClrScr;
writeln('Podaj napis: ');
readln(napis);
licznik:=255;
wynik:=0;
assign(plik,'g.dat');
rewrite(plik,1);
blockwrite(plik,napis,licznik,wynik);
close(plik);
assign(plik,'g.dat');
reset(plik,1);
wynik:=0;
blockread(plik,napis2,licznik,wynik);
close(plik);
writeln(napis2);
readln;
end.

Instrukcja blockwrite/blockread posiada następujące parametry: nazwa pliku, dane, ilość cykli zapisu/odczytu, ilość naprawdę wykonanych cykli zapisu/odczytu. Zmienna licznik przechowuje właśnie ilość cykli, natomiast wynik liczbę przeprowadzonych cykli. W tym przykładzie nazwa pliku została zadeklarowana jako file, natomiast przy otwieraniu pliku po przecinku została podana liczba bajtów , które zostaną odczytane/zapisane w jednym cyklu. Wiem, że może wydać się to nieco skomplikowane, ale wkrótce wszystko zrobi się jasne - jak śnieg ;-). Reszty chyba nie muszę tłumaczyć?!

Inne przykłady można ściągnąć tu (796 B), bądź w dziale programy!


MOJE KOMBINACJE


Jest to taki dział, który stworzyłem na próbę i jeżeli się spodoba to dodam go do każdego języka opisanego w moim serwisie. Otóż zamieszczam w nim moje pomysły, algorytmy, opracowane progsy lub ich części i taki inne rzeczy, które mogę się komuś przydać lub poddać myśl. Są to głownie kody źródłowe, na zasadzie "open_source", mam nadzieję że ciekawe, dodatkowo załączam zrzuty ekranowe z tych programów.

OC-ASCII - program drukuje tablicę znaków ASCII na ekranie, przydatna rzecz gdy potrzebny jest któryś z nich SCREEN
LICZBA - prosta gra/program losujący liczbę z zakresu 0-100 i wymagający jej odgadnięcia SCREEN
SNOW - prosty efekt śniegu(białe i jasnobiałe płatki) w trybie textowym 80*25 SCREEN
SREDNIA - program oblicza średnią arytmetyczną z liczb, max ze stu SCREEN
MIN&MAX - program wyszukuje w ciągach liczb liczbę najmniejszą i najwiekszą SCREEN
OIX - prosta gra logiczna, popularne kółko i krzyżyk w trybie textowym SCREEN
MATRIX - efekt matrix`a w trybie tekstowym 80*25 SCREEN