Pierwsze programy w Turbo Pascal'u
Jak "myśli" komputer
Komputer wykonuje zawsze dokładnie to co mu każesz. Nie myli się. Zaczyna w określonej
kolejności -od linijki kodu, która jest u góry bloku programu, do następnej linii i następnej...
Jeśli go nie zaprogramujesz inaczej, sam nie zmieni tej kolejności. Świadomość ta ułatwia
wykrywanie błędów i analizowanie programów. Gdy coś programujesz, masz pewność, że
wszystko będzie się działo w sposób uporządkowany. W tym samym czasie w Pascalu
wykonuje się tylko jedno polecenie.
Estetyka
Zanim zaczniesz programować postanów sobie zachowywać pewne normy estetyczne. Nie są
one wymagane aby program działał poprawnie, ale naprawdę ułatwiają życie. Ułatwią pracę
nie tylko nauczycielowi, czy innym osobom, które będą oglądały Twoją pracę, ale i Tobie.
Pokażę Tobie przykład estetyki kodów z historii uczącego się programisty.
Początki:
procedure plot;
begin
tlo(nx,ny);
if GetPixel(nx,ny)<>k then
begin
if sp=0 then begin
punkt(nx,ny,k);
Writeln(F,'punkt');
r:=r+15;
Str(nx,t);
Writeln(F,t);
r:=r+Length(t);
Str(ny,t);
Writeln(F,t);
r:=r+Length(t);
Str(k,t);
Writeln(F,t);
r:=r+Length(t);
end;
end;
if ((sp=1) and (roznice)) then
begin
linia(sx,sy,ex,ey,k);
Writeln(F,'linia');
Str(sx,t);
r:=r+17;
Writeln(F,t);
r:=r+Length(t);
Str(sy,t);
Writeln(F,t);
r:=r+Length(t);
Str(ex,t);
Writeln(F,t);
r:=r+Length(t);
Str(ey,t);
Writeln(F,t);
r:=r+Length(t);
Str(k,t);
Writeln(F,t);
r:=r+Length(t);
end;
status3;
kursor(nx,ny);
end;
Kilka lat później:
unit Doors;
{**********************************************************}
interface
uses Errors, {OBSLUGA I KODY BLEDOW}
Graph10E, {GRAFIKA W VESA, TRYB 10Eh}
Standard, {STANDARDOWE POLECENIA}
Fonts; {OBSLUGA CZCIONEK}
{**********************************************************}
const
MaxEvents=15; {WSZYSTKICH ROZNYCH ZDARZEN}
MINI_BUTTON_SIZE =10; {ROZMIAR PRZYCISKU NA OKNIE}
MAX_OBJECTS =10;
{**********************************************************}
{NAZWY OBIEKTOW SYSTEMU SKKS DOORS}
DOORS_FORM = 1; {OKNO, NA KTORYM USTAWIA SIE OBIEKTY}
DOORS_BUTTON = 2; {PRZYCISK}
DOORS_EDIT = 3; {POLE TEKSTOWE}
DOORS_PANEL = 4; {PANEL NA KTORYM BEDA INNE OBIEKTY}
DOORS_ICON = 5;
DOORS_LABEL = 6; {NAPIS OBIEKTOWY}
Ty nie musisz tracić kilku lat na wypracowanie u siebie własnego stylu programowania.
Wystarczy, że od początku będziesz zachowywał estetyczny kod. Proponuję wcinać go po
każdym rozpoczęciu bloku instrukcji i powracać w lewo po jego zakończeniu. Jeśli masz
bałagan w kodzie zajrzyj do skrótów klawiszowych opisanych we wstępie i uporządkuj swoje
źródła.
Dobrze jest pisać słowa kluczowe, takie jak: unit, begin, end, const małymi literami.
Dlaczego? Prawdopodobnie zetkniesz się w przyszłości z Delphi. Delphi sam dopisuje
znaczną część kodu. Gdy tworzysz w Delphi blok instrukcji, on tworzy kod, gdzie słowa
kluczowe są napisane małymi literami. Żeby nie bałaganić w jego kodzie pisanego małymi
literami swoim -dużymi, do którego się przyzwyczaisz -pisz słowa kluczowe małymi literami.
Warto czasem stosować komentarze, czyli swoje opisy, co robi dany kod. W praktyce nie ma
czasu na pisanie komentarzy przy każdej instrukcji dlatego nie wpadaj w skrajności. Opisuj to
co naprawdę potrzebne i ułatwi Tobie pracę, a nie zbierze dużo czasu.
Napisy na ekranie, WriteLn
Żeby napisać prosty program trzeba wiedzieć jak wygląda jego ogólna budowa w Pascalu.
Pisanie kodu zaczynamy od słowa begin, a kończymy słowem end z kropką.
program nazwa; {nagłówek programu – nie jest konieczny}
begin
{cały kod źródłowy kończymy słowem }
end.
Jeśli chcesz nazwać swój program warto napisać słowo program a za nim jakąś nazwę.
Niestety nazwa nie może zawierać polskich znaków. Słowo program nie jest konieczne.
Niektórzy nauczyciele mogą wymagać wpisywania słowa program dla odróżnienia od innej
wersji kodu źródłowego -modułu: unit.
Przypuśćmy, że chcesz napisać coś na ekranie, wystarczy wpisać:
begin
WriteLn(‘napis na ekranie’);
end.
Aby uruchomić program wciśnij CTRL+F9 lub wybierz z menu górnego polecenia Run-
>Run. Prawdopodobnie obraz tylko raz mignie, bo program się zakończył. Aby zrobić
podgląd tego co było na ekranie wciśnij ALT+F5. Teraz zobaczysz:
napis na ekranie
Do programu została użyta instrukcja WriteLn, która wypisuje tekst. Tekst musi się znaleźć
między apostrofami. WriteLn jest odpowiedzialne za przesłanie danych na tzw. Standardowe
wyjście. Standardowo wyjściem tym jest ekran. Użytkownik w dosie może przy uruchamianiu
przekierować standardowe wyjście np. na jakiś plik lub na drukarkę, a wtedy dane z programu
trafiają do odpowiedniego miejsca -mogą zostać zapisane do pliku, być wczytane przez inny
program lub zostać wydrukowane.
Można też bardziej urozmaicić program, napisać kilka linii kodu
begin
WriteLn(‘WITAMY W PIERWSZYM PROGRAMIE’);
WriteLn(‘NAPISANYM W PASCALU 7.0’);
WriteLn(‘------------’);
WriteLn;
WriteLn('koniec.’);
end.
Uruchomienie CTRL+F9
Podgląd (Alt+F5)
WITAMY W PIERWSZYM PROGRAMIE
NAPISANYM W PASCALU 7.0
------------
koniec.
Można też użyć Write bez Ln. Ln oznacza, że po napisaniu tekstu komputer przejdzie do
kolejnej linii, więc
begin
Write(‘Ten napis będzie ’);
WriteLn(‘w pierwszej linii’);
WriteLn(‘a ten w następnej’);
end.
Podgląd (Alt+F5)
Ten napis będzie w pierwszej linii
a ten w następnej
Operacje matematyczne
Za pomocą WriteLn można wyświetlać rozwiązania operacji matematycznych, nawet tych
skomplikowanych. Przykład:
Proste dodawanie
begin
WriteLn(‘2 + 2 = ’, 2 + 2);
end.
Podgląd (Alt+F5)
2 + 2 = 4
Proste mnożenie
begin
WriteLn(‘2 * 2 = ’, 2 * 2);
end.
Podgląd (Alt+F5)
2 * 2 = 4
Z nawiasami
begin
WriteLn(‘2 * (2 – 3) = ’, 2 * (2 – 3));
end.
Podgląd (Alt+F5)
2 * (2 – 3) = -2
Dzielić można na dwa sposoby. Dzielenie całkowite „DIV” z resztą „MOD” oraz zwykłe
dzielenie znakiem „/”
begin
WriteLn(‘25 div 4 = ’, 25 div 4);
end.
Podgląd (Alt+F5)
25 div 4 = 6
A zwykłe, ułamkowe
begin
WriteLn(‘25 / 4 = ’, 25 / 4);
end.
Da wynik:
25 / 4 = 6.2500000000E+00
Inne podstawowe operacje matematyczne:
Sqrt(x) – Pierwiastek kwadratowy
Sqr(x) – Potęga kwadratowa
x div y – dzielenie x / y bez reszty
x mod y – reszta z dzielenia x / y
Sin(x) – funkcja Sinus -gdzie x to kąt podany w radianach (180° = π [rad])
Cos(x) – funkcja Cosinus -gdzie x to kąt podany w radianach (180° = π [rad])
Formatowanie liczb
Mało kto chciałby otrzymywać wyniki z dzielenia z wieloma miejscami po przecinku. Do
formatowania liczb służą pewne operatory. Przykład:
begin
WriteLn(‘25 / 4 = ’, 25 / 4 : 4 : 3);
end.
Da wynik:
25 / 4 = 6.250
Dlaczego? „: 4” oznacza, że poświęcamy miejsce na 4 znaki cyfr, „: 3” oznacza, że 3 z nich
będą miejscami po przecinku. Gdy damy :10 : 3, znaczy to, że aż 10 znaków będzie
poświęconych na wyświetlenie tej liczby. Jeśli liczba cyfr jest krótsza liczba zostanie
wyrównana do prawej.
Kompilacja, tworzenie exe
Żeby użytkownicy komputera mogli bez edytora Pascala używać Twojego programu musisz
go skompilować, czyli zamienić kod źródłowy na program wykonywalny. Trzeba zbudować
plik .exe. Do budowy exe służy część menu Compile. Znajduje się tu ważny parametr
Destination. Oznacza on miejsce docelowe kompilacji. Inaczej mówiąc gdy testujesz
program, pascal nie musi za każdym razem tworzyć na dysku pliku exe. Standardowo
Destination jest ustawione na memory. Twój program jest więc kompilowany i uruchamiany z
pamięci RAM.
Jeśli chcesz zbudować plik .exe na dysku twardym zmień Destination na Disk. Teraz, gdy
potrzebujesz, skompiluj wszystkie moduły (Build), potem uruchom program. Wystarczy.
Program zostanie utworzony w lokalizacji podanej w 'Options->Directories->EXE & TPU'.
Jeśli nie ustawiłeś tych ścieżek, polecam zajrzeć do pierwszego rozdziału tego kursu.
Zmienne, ReadLn
Zmienne są pewnym obszarem pamięci do którego możemy wstawiać różne dane. W
zmiennej możemy przechowywać imię lub nazwisko jakiejś osoby, która aktualnie obsługuje
nasz program, jej wiek, adres zamieszkania -cokolwiek wymyślimy. Dzięki temu możemy się
do użytkownika zwracać po imieniu kiedy tylko nam się podoba.
Zawartość zmiennej można wyświetlać metodą WriteLn. Niestety żebyśmy mieli dostęp do
jakiejś zmiennej musimy poinformować o tym komputer. Służy do tego instrukcja (słowo
kluczowe) VAR (Variables). Zmienne można deklarować tylko przed częścią wykonywalną
programu.
Każda zmienna musi mieć swoją nazwę. Możesz wymyślić co Ci się tylko podoba,
najważniejsze żeby nie zawierała w sobie spacji ani polskich znaków, itp. Zmienna powinna
się także kojarzyć z wartością, którą zawiera. Np. jeśli przechowuje imię dobrze jest ją
nazwać Imie, jeśli nazwisko -Nazwisko, itp… Programiści dość często przed nazwą zmiennej
dodają małą literkę, która oznacza jej typ. Jeśli byłaby to zmienna tekstowa nazwisko (typ:
string) -nazwaliby ją sNazwisko lub s_nazwisko.
Zmiennymi mogą być liczby, napisy, nawet miejsce w pamięci gdzie są rysunki, dźwięki itp.
My zajmiemy się napisami i liczbami. Każda zmienna ma swoje przeznaczenie. W zależności
od przeznaczenia komputer wie, ile pamięci jej przydzielić i co z nią można zrobić. Musimy
więc podczas deklaracji zmiennej podać jej typ (np. czy liczba czy napis).
Żeby zdać jakikolwiek egzamin, napisać program bezbłędnie, musisz zapamiętać podstawowe
typy zmiennych. Najczęściej stosowane to INTEGER (liczba) oraz STRING (łańcuch znaków
–inaczej napis). Każdy typ zmiennej ma swoje właściwości, np. zakres jaki obejmuje liczba
lub ilość znaków w napisie. Tabelka będzie przedstawiała czym dokładnie się różnią.
Typ
Zajmowana
pamięć w
bajtach
Zakres
Opis
Byte
1
0..255
Liczba o małym zakresie wykorzystywana
np. do wczytywania wieku
ShortInt
1
-128..127
Liczba o małym zakresie z możliwością
wpisywania liczb ujemnych, np. do
szybkości przesuwania piłki w grze
Word
2
0..65535
Liczba o średnim zakresie stosowana np.
do obliczania liczby punktów, prostych
działań na liczbach dodatnich
Integer
2
-32768..32767
Liczba o średnim zakresie, bardzo często
stosowana do operacji matematycznych
LongInt
4
-2^31..2^31-1
Liczba o dużym zakresie, wiele
zastosowań, np. przechowująca rozmiar
pliku
Char
1
Wszystkie znaki
Pojedynczy znak np. litera „a”; może
przechowywać informacje o płci
użytkownika (m lub k)
String
256
Wszystkie znaki
Napis, przechowuje np. Imię, nazwisko,
tekst, który ma wyświetlić na ekranie
Real
6
Liczby rzeczywiste
Przechowuje liczby z możliwością operacji
na częściach dziesiętnych, można stosować
w miejscach gdzie duża prędkość
programu nie jest wymagana (wolniejsze
od single). Stosowane do obliczeń
matematycznych, np. Obliczanie pola koła
Single
4
Liczba
zmiennoprzecinkowa
Możliwa ilość miejsc po przecinku zależy
od jej wielkości (dla małych liczb więcej
miejsc, dla dużych w ogóle)
Stosowana przy operacjach na grafice
trójwymiarowej, dużo szybsza od Real
Double
8
Liczba
zmiennoprzecinkowa
Podobne do Single, jednak większa
dokładność
Pascal ma pewne ograniczenia. Gdy mamy zmienną typu string, która przechowuje jakąś
liczbę np. wpisaną przez użytkownika, nie możemy do niej dodawać innej liczby. Komputer
nie będzie wiedział o co chodzi. Tylko do zmiennej typu integer, można dodać inny integer,
do zmiennej typu string nie da się dodać zmiennej typu integer (można natomiast
przekonwertować string na integer i odwrotnie -służą do tego polecenia val i str).
Dla Pascala próba dodania zmiennej Integer do string to tak jakbyś w matematyce na
sprawdzianie pisał: "dwa razy dwa równa się cztery". Nawet gdyby wynik był dobry,
nauczycielka zwróciła by Ci uwagę, że nie stosujesz matematycznych opisów. Pascal
wyświetli błąd: "Error 26: Type mismatch".
Przykład będzie demonstrował w jaki sposób zadeklarować zmienną typu tekstowego,
wczytać imię do zmiennej a następnie ją wyświetlić.
var imie: string;
begin
WriteLn(‘Podaj swoje imie: ’);
ReadLn(imie);
WriteLn(‘Nazywasz sie ’,imie);
end.
Łatwo zauważyć, że do wczytywania danych sluży polecenie ReadLn. Aby wypisać jakiś
napis, a po nim zmienną można zamknąć apostrof i po przecinku wpisać nazwę zmiennej.
Warto przypomnieć, że istnieją podobne instrukcje do WriteLn i ReadLn. Są nimi Write i
Read, które również wypisują coś na ekranie, różnica polega na tym że WriteLn i ReadLn
przenosi kursor piszący do następnej lini, a bez Ln nie.
Przypuśmy, że chcesz podstawić do zmiennej konkretną liczbę, lub wartość innej zmiennej,
możesz to zrobić tak:
var a, b: integer;
begin
a:= 10;
b:= 5; {Podstawienie liczby 5 do zmiennej b}
a:= b; {Podstawienie wartości b do zmiennej a}
end. {Wyniki: a=5, b=5}
Poeksperymentuj trochę, spróbuj wczytać imię i nazwisko, może wiek i wyświetlić wszystko.
Nie zapomnij o ALT+F5 aby zobaczyć wynik. Sposobem na uniknięcie wciskania Alt+F5 jest
np. wpisanie na końcu ReadLn; Teraz program będzie czekał na wciśnięcie klawisza ENTER.
Co można zrobić ze zmiennymi?
var a, b: integer;
s : string;
begin
a := 1; b := a; s := 'Ala '; {wolno podstawiać}
a : = a + 1; {wolno dodawać do samej siebie}
s := s + 'ma kota'; {napisy można łączyć}
{NIE WOLNO s := s + a;}
{NIE WOLNO TEŻ s:='1'; s := s + 2;}
{wolno eksperymentować :) }
end.
Przykłady eksperymentów:
Prosty kalkulator mnożący
var a, b: integer;
begin
WriteLn(‘Program mnożący a*b’);
Write(‘Podaj liczbę a: ’);
ReadLn(a);
Write(‘Podaj liczbę b: ’);
ReadLn(b);
WriteLn(a, ‘ * ’, b, ' = ', a * b);
ReadLn;
end.
Wynik działania:
Program mnożący a*b
Podaj liczbę a: 3
Podaj liczbę b: 5
3 * 5 = 15
Stałe (const)
Stałe to komórki pamięci, które mają takie same wartości przez cały czas działania programu.
Najczęściej programiści nadają im nazwy dużymi literami -w odróżnieniu od zmiennych.
Stałe są wygodne przy podstawianiu pewnych wartości, któe będą miały wpływ na działanie
całego programu.
Definiuje się je na początku kodu programu. Stalą jest np. liczba π – stała nazywa się PI, stałe
możesz tworzyć samemu, może to być prędkość światła c, stała grawitacji g, itd.
const
STALA_G = 9.81;
var t, s : Real;
begin
WriteLn(‘Ile czasu spadało na ziemię ciało?’);
ReadLn(t);
s := STALA_G * sqr(t) / 2;
WriteLn('Ciało pokonało drogę ',s : 10 : 3, 'm');
ReadLn;
end.
Program oblicza drogę spadania dowolnego ciała w podanym przez użytkownika czasie.
Gdyby programista zmienił stałą, może np. obliczać drogę spadania ciała na Księżycu.
Zmiana stałej w nagłówku kodu źródłowego jest znacznie łatwiejsza niż poszukiwanie i wiele
zmian konkretnych liczb wewnątrz kodu.