Powiedzmy że w wielu miejscach programu potrzebujemy wyczyścić ekran i narysować identyczną ramkę:
Uses CRT; Var Numer:byte; Begin Write('1 - Ramka pierwsza 2 - Ramka druga :'); Read(numer); If numer=1 Then Begin ClrScr; Writeln('I-------------------------------------------I'); Writeln('I I'); Writeln('I I'); Writeln('I I'); Writeln('I-------------------------------------------I'); GotoXY(8,3); Write('Oto Ramka 1'); End; If numer=2 Then Begin ClrScr; Writeln('I-------------------------------------------I'); Writeln('I I'); Writeln('I I'); Writeln('I I'); Writeln('I-------------------------------------------I'); GotoXY(8,3); Write('Oto Ramka 2'); End; End.Jak widzisz część programu zawiera identyczne polecenia czy jest więc sens pisać kilka razy to samo ? Właśnie wtedy z pomocą przychodzą nam WŁASNE procedury. Procedury tworzy się jeszcze tuż przed naszym głównym programem podobnie jak zmienne i stałe. Deklaruje się ją tak:
PROCEDURE JakasTam; Begin { Treść procedury } End;I od tego momentu nasz program posiada dodatkową procedurę o nazwie "JakasTam" i jeżeli użyjemy jej nazwy gdzieś w programie to zostanie wykonane to co jest jej treścią. Aby to pokazać jaśniej wstawię do poprzedniego programu procedurę o nazwie "Ramka" i sam będziesz mógł się przekonać co to zmieniło.
Uses CRT; Var Numer:byte; PROCEDURE Ramka; Begin ClrScr; Writeln('I-------------------------------------------I'); Writeln('I I'); Writeln('I I'); Writeln('I I'); Writeln('I-------------------------------------------I'); GotoXY(8,3); End; Begin Write('1 - Ramka pierwsza 2 - Ramka druga :'); Read(numer); If numer=1 Then Begin Ramka; Write('Oto Ramka 1'); End; If numer=2 Then Begin Ramka; Write('Oto Ramka 2'); End; End.Widzisz teraz różnicę ? 7 linijek zostało zastąpionych jedną: "Ramka" !! Program jest teraz po pierwsze: bardziej przejrzysty, po drugie: jest krótszy ( może przy wykorzystaniu procedury 2 razy tego nie widać, ale jeżeli wykonamy ją więcej powiedzmy 5..10...100... to jest to bardzo zauważalne ), i po trzecie chyba najważniejsze: Jeżeli chcemy zmienić tą ramkę w programie bez procedury musielibyśmy zmieniać ją wiele razy w każdym miejscu gdzie by się znajdowała, a tutaj wystarczy w jednym miejscu i już gotowe :)
Wyobraź sobie teraz, że masz taki program, który będzie wypisywał kilka linijek tekstu zaczynających się w różnych miejscach ekranu:
Uses CRT; Begin GotoXY(10,8); Write('Linijka 1'); GotoXY(42,2); Write('Linijka 2'); GotoXY(30,6); Write('Linijka 3'); GotoXY(13,14); Write('Linijka 4'); GotoXY(63,19); Write('Linijka 5'); End.Pokażę Ci teraz jak zrobić procedurę która będzie przyjmować 3 zmienne, 2 będą typu BYTE i 1 typu STRING. Nazywać się będzie WriteXY i będzie miała za zadanie wyświetlenie tekstu bezpośrednio w wybranym miejscu ekranu ( połączenie GotoXY i Write )
Uses CRT; PROCEDURE WriteXY(x,y:byte; s:string); Begin GotoXY(x,y); Write(s); End; Begin WriteXY(10,8,'Linijka 1'); WriteXY(42,2,'Linijka 2'); WriteXY(30,6,'Linijka 3'); WriteXY(13,14,'Linijka 4'); WriteXY(63,19,'Linijka 5'); End.Może zwróciłeś uwagę na to, że nie ma tutaj definicji poprzez "Var" zmiennych X,Y i S. Zostały one natomiast podane w nawiasie po procedurze i zadeklarowane automatycznie przy jej tworzeniu, ważną rzeczą jest to że będą one dostępne TYLKO w jej obrębie ! Od tego momentu procedura ta BĘDZIE WYMAGAĆ tych parametrów ( dwóch typu Byte i jednego String oddzielonych przecinkami )
Teraz będzie coś co jak wiem z doświadczenia jest dla początkujących bardzo trudne do zrozumienia i może doprowadzić do załamania nerwowego ;) więc
poświęcę temu trochę miejsca i opiszę chociaż same podstawy krok po kroku.
Zacznę od najprostszego przykładu. Program wczytuje 5 zmiennych i wyświetla je w odwrotnej kolejności:
Var a1,a2,a3,a4,a5:string; Begin ReadLn(a1); ReadLn(a2); ReadLn(a3); ReadLn(a4); ReadLn(a5); WriteLn(a5); WriteLn(a4); WriteLn(a3); WriteLn(a2); WriteLn(a1); End.Jak widzisz to bardzo prosty prymitywny program, teraz spróbuję wyjaśnić jak używać tablic, a coś mi się zdaje że będzie ciężko :(
Var a[1],a[2],a[3],a[4],a[5]:string;A tak naprawdę to jest JEDNA zmienna tablicowa nazywająca się "a" poprawna deklaracja takiej zmiennej to:
Var a:array[1..5]of string;i oznacza to: zadeklaruj zmienną "a" która będzie posiadać elementy ponumerowane od 1 do 5 i będą one typu String, będą więc to kolejno: a[1], a[2], a[3], a[4], a[5] tak więc program teraz będzie wyglądał tak:
Var a:array[1..5] of string; Begin ReadLn(a[1]); ReadLn(a[2]); ReadLn(a[3]); ReadLn(a[4]); ReadLn(a[5]); WriteLn(a[5]); WriteLn(a[4]); WriteLn(a[3]); WriteLn(a[2]); WriteLn(a[1]); End.Do tej pory niewiele się więc zmieniło, zmienne zostały po prostu zastąpione na takie co się tylko inaczej zapisuje. Na razie powinno być wszystko jasne. Teraz trochę zagmatwam ( nadal rozpatrujemy ten sam program )
Var a:array[1..5] of string; kolejna:byte; Begin kolejna:=1; ReadLn(a[kolejna]); kolejna:=2; ReadLn(a[kolejna]); kolejna:=3; ReadLn(a[kolejna]); kolejna:=4; ReadLn(a[kolejna]); kolejna:=5; ReadLn(a[kolejna]); kolejna:=5; WriteLn(a[kolejna]); kolejna:=4; WriteLn(a[kolejna]); kolejna:=3; WriteLn(a[kolejna]); kolejna:=2; WriteLn(a[kolejna]); kolejna:=1; WriteLn(a[kolejna]); End.W tym momencie już pewnie jesteś zakręcony :) ale zobacz do czego doszliśmy ( ten program wykonuje dokładnie to samo co ten na początku ), dokonaliśmy takiego czegoś że mimo że występują te same linijki przy wpisywaniu i wyświetlaniu zmiennych to jednak zawartość tych zmiennych zmienia się tak samo jak w poprzednich programach !! Dokonaliśmy tego używając zmiennej tablicowej, to właśnie przez zmieniającą się zmienną "kolejna" zmienia się "a" ! Zobacz teraz jak wygląda końcowa wersja tego programu ( przepisz go sobie na kartkę albo wydrukuj bo zaraz będziemy go analizować) :
Var a:array[1..5] of string; kolejna:byte; Begin kolejna:=0; {1} Repeat {2} kolejna:=kolejna+1; {3} ReadLn(a[kolejna]); {4} Until kolejna=5; {5} Repeat {6} WriteLn(a[kolejna]); {7} kolejna:=kolejna-1; {8} Until kolejna=0; {9} End.Zobacz jak nam się drastycznie skrócił program ! ( jak poznasz później jeszcze parę poleceń to program ten będziesz mógł zmieścić w 2 ( dosłownie dwóch ) linijkach ! Ale to tak na marginesie :) Przeanalizujmy go teraz krok po kroku ( jeżeli jeszcze nie rozumiesz i teraz nie zaskoczysz to klops, bo nie wiem czy da się to jeszcze prościej wytłumaczyć tak więc skup się :)
Uff myślę że starczy :) wystarczająco dużo było na tej lekcji. Odpocznij teraz trochę i zabierz się za naukę dopiero jak będziesz gotowy do kolejnego wyzwania. Na następnej lekcji poznasz jak zbudować prostą bazę danych ( jeżeli jednak
nadal nie rozumiesz tablic to radzę wrócić i jeszcze raz powoli przestudiować tą lekcję. Bez ich zrozumienia nie ma sensu iść dalej gdyż właściwie w każdym programie będziemy je teraz stosować )