Programowanie - pojęcia podstawowe
Program jest to uporządkowany zbiór instrukcji zrozumiałych dla komputera. Proces tworzenia programu nazywamy programowaniem, ale w praktyce programowania nie da się oddzielić od innych czynności, prowadzących do rozwiązania problemu.
Proces rozwiązywania problemu przebiega w kilku etapach:
definiowanie problemu,
opis rozwiązania problemu,
opracowanie algorytmu,
przekształcenie algorytmu w program,
testowanie programu,
dokumentowanie rozwiązania,
konserwacja.
|
---|
|
Program
Dane | Wykonanie programu przez procesor |
|
---|---|---|
Programowanie polega na zapisywaniu algorytmów w formie programów zrozumiałych dla komputera. Program opisuje proces przekształcania danych wejściowych w dane wyjściowe według pewnego algorytmu.
Algorytmem nazywamy metodę rozwiązania danego problemu w skończonej liczbie kroków (operacji elementarnych).
Dane wejściowe musza być dostarczone do programu przez użytkownika, w celu umożliwienia wykonania algorytmu.
Dane wyjściowe są generowane przez program i stanowią wyniki działania programu.
Program musi być zapisany w języku programowania w postaci ciągu instrukcji, ściśle według reguł języka.
Algorytm jest pojęciem ogólnym, związanym nie tylko z programem i programowaniem, stosowanym także w innych dziedzinach wiedzy, np. ekonomii oraz w życiu codziennym. Określa on sposób (przepis) wykonania pewnego zadania, rozwiązania określonego problemu czy osiągnięcia zamierzonego celu.
Przykład opracowania algorytmu:
Należy określić sumę liczb dodatnich spośród 20 dowolnych liczb, podanych przez użytkownika.
Wyzeruj sumę
Powtarzaj 20 razy
Wczytaj liczbę
Jeżeli jest dodatnia, to dodaj ją do sumy
3) Wydrukuj sumę
Algorytm w postaci pseudokodu
( START )
iWyzeruj sumę
Wyzeruj licznik
Wczytaj liczbę
T
Dodaj liczbę do sumy
Zwiększ licznik o jeden
Wydrukuj sumę
( STOP )
Algorytm w postaci sieci działań
Algorytm składa się z opisu:
obiektów, na których wykonywane są działania,
działań realizujących cel algorytmu,
kolejności działań.
Wśród atrybutów obiektów można wyróżnić:
atrybuty jawne,
atrybuty niejawne.
Jawnymi atrybutami obiektu, tzn. takimi, które występują w treści programu są:
nazwa - identyfikator, za pomocą którego obiekty są rozróżniane w programie,
typ - określający zbiór wartości obiektu, format zapisu danych w pamięci oraz zbiór operacji na obiektach,
• wartość - aktualna wartość obiektu. Niejawnymi atrybutami są:
alokacja - miejsce w pamięci, o rozmiarze odpowiednim do typu obiektu, w którym jest przechowywana wartość,
zakres - obszar działania identyfikatora, w którym można go wykorzystywać w programie,
czas życia - czas ważności identyfikatora podczas działania programu.
Rozróżnia się dwa rodzaje obiektów występujących w programach:
obiekty, których wartość pozostaje nie zmieniona, bez względu na rodzaj działań wykonywanych w programie, reprezentowane przez stałe,
obiekty, których wartość zmienia się w wyniku wykonywania działań, reprezentowane przez zmienne.
Działania są zapisywane za pomocą sekwencji instrukcji należących do zbioru dopuszczalnych instrukcji języka programowania. Instrukcje języka programowania wykorzystują do zdefiniowania swoich działań tzw. słowa kluczowe, które mają w danym języku programowania zdefiniowane znaczenie, określające rodzaj działania realizowanego przez instrukcję. Dodatkowo instrukcje mogą posiadać argumenty, którymi są stałe i zmienne programu. W instrukcjach języka mogą też być wykorzystywane tzw. słowa zastrzeżone języka, reprezentujące standardowe typy, stałe i procedury. Słowa kluczowe, słowa zastrzeżone i argumenty są oddzielone w instrukcjach ogranicznikami (separatorami). Zbiór ograniczników jest także zdefiniowany dla danego języka programowania.
Każda instrukcja języka programowania ma zdefiniowaną składnię i semantykę. Składnia określa rodzaj używanych w niej słów kluczowych, argumentów i ograniczników oraz ich kolejność. Semantyka określa znaczenie instrukcji.
Język Pascal
•
Język Pascal - język algorytmiczny wysokiego poziomu i ogólnego przeznaczenia.
•
Zdefiniował go i opisał formalnie Nicolas Wirth na uniwersytecie w Zurichu w roku 1968.
W roku 1992 powstała ostatnia wersja Pascala dla środowiska tekstowego - Pascal 7.0.
W roku 1995 powstał pakiet Delphi (firmy Borland), który umożliwia projektowanie i programowanie złożonych systemów programowych, pracujących pod systemem Windows, oparte na Pascalu i programowaniu obiektowym. Program napisany w języku takim jak Pascal jest nazywany programem źródłowym. Przed wykonaniem program źródłowy musi zostać przetłumaczony na postać zrozumiałą dla komputera, czyli na program wynikowy. Program wynikowy, zapisany w pamięci komputera, stanowi ciąg rozkazów i danych, zapisany w kodzie zeroje-dynkowym (binarnym). Translacji programu z postaci źródłowej do wynikowej dokonuje program translatora.
Dane
Program źródłowy |
---|
Translacja |
Program wynikowy |
Wykonanie programu wynikowego przez komputer |
Wyniki
Elementy języka Pascal
Instrukcje języka są budowane z elementów, tj. symboli leksykalnych takich jak słowa kluczowe, słowa zastrzeżone, identyfikatory, liczby, napisy i separatory. W tekście programu można też umieszczać komentarze.
Zbiór słów kluczowych języka wzorcowego, wykorzystywanych w języku Turbo Pascal zawiera:
AND, ARRAY, BEGIN, CASE, CONST, DIV, DO, DOW-NTO, ELSE, END, FILE, FOR, FUNCTION, GOTO, IF,
IN, LABEL, MOD, NIL, NOT, OF, OR, PROCEDURE, PROGRAM, RECORD, REPEAT, SET, THEN, TO, TY-PE, UNTIL, VAR, WHILE, WITH.
Dla Turbo Pascala zbiór ten został rozszerzony o następujące słowa dodatkowe:
ABSOLUTE, CONSTRUCTOR, DESTRUCTOR, EXTERNAL, FORWARD, IMPLEMENTATION, INLINE, INTERFACE, INTERRUPT, OBJECT, SHL, SHR, STRING, UNIT, USES, VIRTUAL, XOR.
Identyfikatorem w języku Pascal jest dowolny ciąg liter lub cyfr zaczynający się od litery. Znak spacji jest separatorem i nie może być używany w identyfikatorach. Długość identyfikatora w Turbo Pascalu 7.0 wynosi 63 znaki. Identyfikatory reprezentują nazwy elementów programu takich jak np. stałe i zmienne.
Niektóre identyfikatory stanowiące wyróżnione słowa języka angielskiego mają w języku określone znaczenie. Słowa te stanowią zbiór słów zastrzeżonych. Należą do nich:
ABS, ARCTAN, BOOLEAN, CHAR, CHR, COS, DEC, DISPOSE, EOF, EOLN, EXP, FALSE, INC, LN, MAXINT, NEW, ODD, ORD, PRED, READ, READLN, REAL, RE-SET, REWRITE, ROUND, SIN, SQR, SQRT, SUCC, TEXT, TRUE, TRUNC, WRITE, WRITELN.
Słowa zastrzeżone mogą być przedefiniowywane przez programistę, ale wtedy tracą swoje standardowe znaczenie.
Struktura programu.
Program
Nagłówek programu
Blok
PROGRAM
Nazwa programu
Deklaracja modułów
H USES —z—► Nazwa modułu
Blok
Część deklaracyjna
Część wykonawcza
|
|
i |
( label )
a "etykieta
stała
const )—t—► identyfikator
typ
■C
► var
►[ type J—j—► identyfikator K=)—* —K "
identyfikator
-H
deklaracja procedury lub funkcji
( begin ) x-»| instrukcja |—r-»{ end )
|
---|
(:=) |
BEGIN..END |
CASE..OF..ELSE..END |
FOR..TO/DOWNTO..DO |
GOTO |
IF..THEN..ELSE |
INLINE(...) |
REPEAT..UNTIL |
WHILE..DO |
WITH..DO |
Wywołanie funkcji |
Wywołanie procedury |
Struktura programu:
Program nazwa;
(część deklaracyjna) begin
(część wykonawcza) end.
Przykład programu, zbudowanego w oparciu o algorytm przedstawiony wcześniej, a dotyczący sumowania liczb dodatnich spośród dwudziestu dowolnych liczb.
Program Suma_liczb; uses
Crt; const
granica=20;
var
suma :real;
liczba :real;
licznik :integer;
begin
ClrScr; suma:=0;
writeln('Podaj kolejno 20 dowolnych liczb1); for licznik:=1 to granica do begin
read(liczba); if liczba>0 then suma:=suma+liczba; end;
write('Suma liczb dodatnich wynosi: ',suma); readln;
end.
Typy danych w Pascalu.
Centralnym pojęciem języka Pascal są zmienne i związane z nimi zbiory danych definiujące dokładnie nie tylko charakter dozwolonych operacji na tych zmiennych (np. dodawanie lub odejmowanie), ale także zasięg działania tych operacji, tzn. zbiór wartości, na których te operacje można wykonać. Każdy typ danych definiuje dokładnie zbiór elementów, które mogą być wartościami zmiennych tego typu.
Najogólniejszym podziałem będzie podział na dwa rodzaje. Pierwszy z nich to typy danych tzw. standardowe, z góry już w języku Turbo Pascal zdefiniowane i noszące określone nazwy (np. integer, real). Drugi z nich to typy danych dowolnie definiowane przez programistę i noszące dowolnie nadawane im nazwy.
<Typ Prosty>
<Typ String>
<Typ strukturalny>
<Typ wskaźnikowy>
<Typ proceduralny>
<Nazwa typu>Typ prosty
z.
<Typ porządkowy> <Typ rzeczywisty>
Typ porządkowy
<Typ całkowity <Typ wyliczeniowy> <Typ okrojony> <Typ logiczny> <Typ znakowy>
Typy całkowite
Typ danych |
|
Miejsce w pamięci |
---|---|---|
Byte ShortInt Word Integer LongInt |
|
|
Standardowymi działaniami typów całkowitych są:
+ dodawanie,
- odejmowanie,
* mnożenie,
/ dzielenie,
DIV dzielenie całkowite bez reszty,
MOD reszta z całkowitego dzielenia.
Np. 20 DIV 9=2, 9 MOD 5=4.
Funkcje standardowe dostępne dla typu całkowitego: abs(i) - wartość bezwzględna, sqr(i) - kwadrat,
sqrt(i) - pierwiastek, wynik typu rzeczywistego, odd(i) - bada, czy i jest nieparzyste, wynik typu Boolean, succ(i) - następny po i, pred(i) - poprzedni przed i. Przykłady:
abs(-7)=7,
sqr(4)=16,
sqrt(3)=1,732050...
odd(78)=false,
succ(7)=8, pred(8)=7,
Typy logiczne.
Typ ten służy do reprezentowania danych dwustanowych. Zbiór jego wartości zawiera dwie predefiniowane stałe TRUE i FALSE.
Typ logiczny
<Typ Boolean>
<Typ ByteBool>
<Typ WordBool>
<Typ LongBool>
Operatory dla zmiennych typu logicznego to NOT negacja, AND -koniunkcja, OR - alternatywa, XOR - różnica symetryczna.
Zmiennej logicznej można w instrukcji przypisania nadać wartość wyrażenia. Na przykład zmienne zadeklarowane jako:
var
b,c :boolean;
i,j,m,n :integer;
można wykorzystać w instrukcjach przypisania:
b:=i<=n; c:=j<=m;
Typ znakowy CHAR
Zmienne typu CHAR są wykorzystywane do przechowywania jednego znaku kodu ASCII. Wartości kodu ASCII są liczbami z zakresu od 0 do 255. Wartości znaków z tego zakresu określa się za pomocą numeru poprzedzonego znakiem #. Zmienne znakowe mogą przyjmować wartości od #0 do #255. Jeżeli zmienna ma przyjąć wartość znaku widocznego np. na ekranie, to można jej przypisać wartość tego znaku umieszczona w apostrofach, np.:
z:='A';
Funkcje konwersji dostępne dla typu znakowego omówione poniżej wykorzystują deklaracje: var
z:Char; i:Integer;
i zwracają:
ORD(z) - numer znaku z w zbiorze znaków, CHR(i) - znak o numerze i.
Np. znak '0' ma numer 48, tj.
ORD('0')=48 CHR(48)='0'
Dla typu CHAR, tak jak dla innych typów porządkowych, są dostępne funkcje:
SUCC(z) - zwracająca znak kodu ASCII, następny po z, PRED(z) - znak kodu ASCII, poprzedni przed znakiem z.
Typy rzeczywiste.
Typy rzeczywiste są wykorzystywane do deklarowania zmiennych, które podczas obliczeń będą wykorzystywane do przechowywania wartości rzeczywistych. Liczby rzeczywiste występują w programach w postaci:
•
•
Liczba bajtów
Dokładność
stałopozycyjnej, np. 5.6, zmiennopozycyjnej, np. 0,8765E4.
Typ danych Zakres wartości
Real |
|
|
|
---|---|---|---|
Single |
|
|
|
Double |
|
|
|
Extended |
|
|
|
Comp |
|
|
Dla
typu REAL są dostępne funkcje standardowe, tj.: abs(x) - wartość bezwzględna, sin(x), cos(x), arctan(x) - funkcje trygonometryczne, sqr(x) - kwadrat, sqrt(x) - pierwiastek kwadratowy, exp(x) - e do potęgi x, frac(x) - część ułamkowa argumentu x, int(x) - część całkowita argumentu x, ln(x) - logarytm naturalny argumentu x, trunc(x) - konwersja liczby rzeczywistej do całkowitej przez obcięcie części ułamkowej,
round(x) - zaokrąglenie do najbliższej liczby całkowitej, random - liczba losowa z przedziału od 0 do 0.99999999999,
random(x) - liczba losowa z przedziału 0 do x-1. Argument x i wynik są typu całkowitego.
Typ napisowy STRING
Typ napisowy (łańcuchowy) służy do przechowywania nazw własnych obiektów oraz wyprowadzanych do użytkownika danych tekstowych, objaśniających dane numeryczne. Struktura danych typu STRING zajmuje 256 bajtów pamięci, ponumerowanych od 0 do 255. Zmienne tego typu przechowują napisy (łańcuchy znaków) o aktualnej długości nie większej niż 255 znaków. Napis może mieć określony mniejszy rozmiar, np. 15 znaków, co podaje się w deklaracji zmiennej:
var s:STRING[15];
12 Okna i drzwi
0 1 23456789 10 11 12
Bajt zerowy (długość napisu) można odczytać funkcją:
lenght(s);
Dla typu napisowego są dostępne funkcje konwersji:
VAL(napis,liczba,kod) - zamienia napis na liczbę, przekazując parametr kontrolny kod. Parametr kod ma wartość 0, jeżeli napis reprezentuje poprawna liczbę i konwersja została przeprowadzona, lub kod zawiera numer pierwszego błędnego znaku w napisie reprezentującym liczbę.
STR(liczba,napis) - zmienia liczbę na napis.
Pozostałe funkcje służące do obsługi typu napisowego to:
COPY(s,indeks,licznik) - z łańcucha znaków s zostanie od miejsca oznaczonego numerem indeks wycięta liczba znaków określona przez licznik,
CONCAT(s1,s2,...,sn) - operacja konkatenacji, łańcuchy znaków s7, s2, sn są łączone ze sobą w jeden wspólny łańcuch,
POS(s1,s) - w łańcuchu s poszukuje się łańcucha s7. Wynikiem jest numer miejsca, w którym łańcuch s1 po raz pierwszy zostanie znaleziony w łańcuchu s,
DELETE(s,indeks,licznik) - z łańcucha znaków s zostanie od miejsca oznaczonego numerem indeks usunięta liczba znaków określona przez zmienną licznik,
INSERT(s1,s,indeks) - do zmiennej typu STRING s zostanie wpisany od pozycji indeks łańcuch s1.
Przykłady:
VAL('2',x,kod) - x=2, kod=0, VAL('1232g5',x,kod) - x=0, kod=5, STR(240,s) - s=240, COPY('Programista,4,3) - 'gra', CONCAT('Turbo',' ','Pascal') - 'Turbo Pascal', LENGHT('Programista') - 11,
POS('Pascal','Turbo Pascal') - 7,
DELETE - parametrem musi być zmienna, a nie dowolne wyrażenie, np.: var s:string[10]
begin s:='Stagnacja'; delete (s,4,3); end. W wyniku otrzymujemy napis 'Stacja'.
Instrukcja przypisania.
Do nadawania wartości zmiennym przez program służy instrukcja przypisania. Ma ona postać:
Nazwa_zmiennej:=wyrażenie;
Przykłady instrukcji przypisania:
Instrukcja przypisania Rodzaj przypisania
cena := 345; (* Stała numeryczna *)
iloczyn := a*b; (* Wynik rachunku *)
nazwisko := 'Kowalski'; (* Stała łańcuchowa *)
litera := 'w'; (* Stała znakowa *)
prawda := true; (* Stała logiczna *)
wynik := sin(c+d); (* Wynik funkcji *)
Nadawanie wartości zmiennym przez użytkownika
Jeżeli wartość zmiennej będzie znana dopiero w czasie wykonywania programu, to wartość taka musi być czytana przez program za pomocą procedur READ i READLN, nazywanych instrukcjami wprowadzania danych lub instrukcjami wejścia.
Użycie:
read(x); readln(nazwa);
Instrukcje READ i READLN mogą być wieloargumentowe. Instrukcja:
read(x,y,z);
nadaje zmiennym, wprowadzanym z klawiatury wartości w kolejności wymienienia zmiennych w liście argumentów.
Wyprowadzanie informacji i danych z programu do użytkownika.
Do wyprowadzania informacji i danych na standardowe urządzenie wyjścia, jakim jest ekran komputera, służą instrukcje WRITE i WRITELN. Obie te instrukcje mogą być wieloargumentowe. Instrukcja WRITE wyprowadza wszystkie argumenty instrukcji w tym samym wierszu, nie powodując zmiany wiersza. Instrukcja WRITELN wyprowadza wszystkie argumenty w tym samym wierszu, po czym przenosi kursor do następnego wiersza.
Przykłady użycia:
writepPodaj haslo: Podaj haslo: _
writelnpKomunikat'); Komunikat
writelnpLiczba osob: *,n); Liczba osob:20
Sekwencja instrukcji:
writelnpPodaj liczbe osob: M; read(n);
da wynik:
Podaj liczbe osob:
20
Zaś sekwencja instrukcji:
writepPodaj liczbe osob: M; readln(n);
da wynik:
Podaj liczbe osob: 20