Na tej lekcji poznasz kilka procedur, instrukcję warunkową i jedną pętlę, a pod jej koniec będziesz już potrafił napisać np. prosty program zabezpieczający dalszy dostęp poprzez hasło.
Const
jakas_stala=999;
Var
jakas_zmienna:Word;
Begin
jakas_zmienna:=448;
Write(123); {1}
Write('bzdura'); {2}
Write(4*8); {3}
Write('4*8'); {4}
Write(jakas_stala); {5}
Write(jakas_zmienna); {6}
Write(jakas_zmienna+12); {7}
Write(3/4); {8}
End.
Program wypisze na ekranie liczbę 123 {1}, tekst 'bzdura' {2}, wynik działania matematycznego 32 {3}, tekst '4*8' {4}, stałą o wartości 999 {5}, zmienną
do której została wprowadzona liczba 448 {6}, oraz tą samą zmienną powiększoną o 12 czyli 460 {7}.Write(3/4:8:4);Znaczy to: wyświetl liczbę ograniczając wyświetlanie do 8 znaków przed kropką i 4 po kropce, dzięki temu otrzymamy łatwo czytelny wynik 0.7500
Const jakas_stala=999; Var jakas_zmienna:Word; Begin jakas_zmienna:=448; Write(123,'bzdura',4*8,'4*8',jakas_stala,jakas_zmienna,jakas_zmienna+12,3/4:8:2); End.
Begin
WriteLn(123); {1}
WriteLn('bzdura'); {2}
WriteLn(''); {3}
WriteLn; {4}
WriteLn(4*8); {5}
End.
W tym przypadku w KOLEJNYCH LINIACH zostaną wyświetlone wartości: liczba 123 {1} , tekst 'bzdura' {2}, pusty ciąg znaków '' {3} ( czyli niczego nie wyświetli i przejdzie do następnej linii ), kolejną pustą linię {4} ( po prostu
procedura jest wykonywana podobnie jak w {3} z pustym łańcuchem znaków )
i wynik działania 32 {5}. Podobnie jak w procedurze Write parametry można podawać oddzielone przecinkami:
Begin WriteLn(123,'bzdura','',,4*8); End.Zwróć uwagę, że w tym przypadku jak pomineliśmy pusty ciąg znaków i po poprostu wpisaliśmy kolejny przecinek ( podobnie jak w {4} ) kompilator wyrzuci nam błąd. Prawidłowym zapisem natomiast jest:
Begin WriteLn(123,'bzdura','','',4*8); End.
Pozwala na wprowadzenie do zmiennej wartość podawaną z klawiatury w czasie działania programu:
Var
zm1:String;
zm2:Word;
Begin
Read(zm1); {1}
Read(zm2); {2}
Read; {3}
End.
Program czeka na wprowadzenie dwóch
zmiennych, ZM1
typu STRING {1} oraz ZM2
typu WORD {2}, jeżeli natomiast wywołamy tą procedurę bez żadnych parametrów {3} to program czeka w tym momencie na wciśniecie klawisza Enter.
W przypadku wprowadzania zmiennych trzeba uważać na kilka rzeczy:
Podobnie jak READ procedura ta pozwala na wprowadzenie do zmiennej wartość podawaną z klawiatury w czasie działania programu, z tym, że po przyjęciu wartości program przechodzi do następnej linii:
Var
imie:String;
Begin
Write( 'Jak masz na imie ? : ' ); {1}
ReadLn( imie ); {2}
WriteLn; {3}
WriteLn( 'Witaj ' , imie , '!' ); {4}
Write( 'Wcisnij Enter...' );
ReadLn; {5}
End.
Programik ten wypisuje tekst {1} i czeka na wprowadzenie zmiennej IMIE {2}, następnie robi linijkę odstępu {3} i wypisuje tekst, zmienną i znowu tekst {4}. Na sam koniec czeka dodatkowo na wciśniecie klawisza
Enter {5}.
Składnia: GotoXY(x,y:byte); [CRT]
Procedura ta pozwala na umieszczenie kursora (miejsca, od którego np. będą wyświetlane wartości przez Write), w dowolnym miejscu ekranu, procedura ta znajduje się w bibliotece CRT:
Uses CRT;
Begin
GotoXY(20,10);
Write('Ten tekst rozpoczyna się w 20 kolumnie i 10 wersie');
End.
W tym programie procedura GotoXY nakazuje przenieść kursor do 20 wiersza i 10 kolumny i wyświetlić tekst.
Przerywa ona natychmiast wykonywanie programu i powraca do DOS-a
Składnia: ClrScr; [CRT]
Usuwa wszystkie znaki z ekranu tekstowego (czyści go) i ustawia kursor w pozycji 0,0 (lewy górny róg ekranu)
Składnia: Sound(CZE:word); [CRT]
Włącza dźwięk o częstotliwości CZE ( liczba typu word ) emitowany przez głośnik komputera. Z własnych praktyk zauważyłem że dźwięk o częstotliwości 3160 jest "trochę" denerwujący :)
Składnia: NoSound; [CRT]
Wyłącza dźwięk emitowany przez głośnik komputera, włączony uprzednio przez SOUND.
Składnia: Delay(CZAS:word); [CRT]
Wstrzymuje program na określoną (zmienna CZAS) ilość milisekund (1000 milisekund=sekunda), przydatne np. przy procedurze Sound
Uses CRT; Begin Sound(2000); Delay(1000); NoSound; End.
Instrukcja ta sprawdza czy jest spełniony warunek postawiony po "IF", jeżeli tak to wykonywana jest instrukcja po słowie "THEN". Można jeszcze po THEN "coś tam", użyć słowa ELSE oznaczającego "w przeciwnym wypadku", umieszczona po ELSE instrukcja zostanie wykonana dopiero wtedy, gry warunek postawiony po "IF" NIE ZOSTAŁ SPEŁNIONY np:
Var
ttt:Byte;
Begin
Write('Podaj liczbę z zakresu 0..255 : ');
ReadLn(ttt);
IF ttt=40 THEN WriteLn('Podałeś liczbę 40'); {1}
IF ttt>100 THEN WriteLn('Podałeś liczbę większą niż 100') ELSE WriteLn('Podałeś liczbę równą lub mniejszą od 100'); {2}
End.
Ograniczę się w opisie programu tylko do rzeczy nowych, a więc:
Var
ttt:Byte;
Begin
Write('Podaj liczbę z zakresu 0..255 : ');
ReadLn(ttt);
IF ttt=40 THEN {1}
WriteLn('Podałeś liczbę 40'); {1}
IF ttt>100 THEN {2}
WriteLn('Podałeś liczbę większą niż 100') ELSE {2}
WriteLn('Podałeś liczbę równą lub mniejszą od 100'); {2}
End.
Instrukcję grupującą rozpoczyna słowo kluczowe BEGIN, a kończy ją END. Wszystkie instrukcje umieszczone pomiędzy tymi słowami będą traktowane jako jedna. Jest to przydatne np. przy poznanej przez chwilą instrukcji warunkowej IF THEN ELSE np.
Uses CRT;
Var
strona:byte;
Begin
Write('1-strona tytulowa 0-koniec : ');
ReadLn(strona);
IF strona=1 THEN
Begin
ClrScr;
WriteLn('Program przykładowy w języku Turbo Pascal');
WriteLn('Autor: Robert Wróbel (GiGi)');
WriteLn('Napisany Dnia 20.09.97')
End;
End.
Jak widzisz po wpisaniu cyfry "1" zostanie wyczyszczony ekran i pojawią się trzy linijki tekstu więc wykona cztery instrukcje zamiast jednej, gdyby nie było BEGIN END to program by wyglądał tak:
Uses CRT;
Var
strona:byte;
Begin
Write('1-strona tytulowa 0-koniec : ');
ReadLn(strona);
IF strona=1 THEN ClrScr;
IF strona=1 THEN WriteLn('Program przykładowy w języku Turbo Pascal');
IF strona=1 THEN WriteLn('Autor: Robert Wróbel (GiGi)');
IF strona=1 THEN WriteLn('Napisany Dnia 20.09.97')
End.
Jak widać, teraz jest "trochę" bardziej naśmiecone, a co jeśli ma wykonać 50..100.. linijek ? Aż mi się włos jeży na głowie jak pomyślę :-)
Jest to również w pewnym sensie instrukcja grupująca i jest traktowana jak jedna instrukcja (podobnie jak Begin...End). Pętla zaczyna się słowem kluczowym REPEAT dalej znajdują się linie do wykonania a zakończona jest słowem UNTIL i warunkiem, który jeżeli zostanie spełniony przerywa pętlę i kontynuuje program, jeżeli nie, powraca na początek (po REPEAT) i wykonuje instrukcje pomiędzy nimi po raz kolejny i znowu dochodzi do UNTIL, znowu sprawdza warunek itd. jest to pętla która zostanie CO NAJMNIEJ RAZ WYKONANA, gdyż warunek znajduje się dopiero na końcu (jest też pętla WHILE .. DO .. w której warunek zostaje sprawdzany na początku) Przykład:
Uses CRT;
Var
licz:byte;
Begin
ClrScr;
REPEAT
Write('Wpisz jakąś liczbę (0-wyjscie) : ');
ReadLn(licz);
WriteLn('Potega liczby ',licz,' to ',licz*licz);
WriteLn;
UNTIL licz=0;
End.
Program tak długo podaje potęgi kwadratowe wpisanych liczb póki nie podamy mu cyfry 0, oczywiście te końcowe "0" również spotęguje gdyż dopiero sprawdzi warunek na końcu pętli. Ciekawą rzeczą którą można zrobić
to pętla nieskończona, sam zobacz dlaczego :)
Begin REPEAT UNTIL 1=2; End.
Uses CRT;
Const
haslo='Pascal';
Var
wprowadz:String;
petla:byte;
Begin
REPEAT
ClrScr;
GotoXY(31,12);
Write('Podaj haslo : ');
ReadLn(wprowadz);
IF petla=4 THEN
REPEAT
ClrScr;
GotoXY(31,12);
Write('Access Denied !');
Sound(3160);
Delay(500);
Sound(3190);
Delay(500);
UNTIL 1=2;
petla:=petla+1;
UNTIL wprowadz=haslo;
{ Haslo poprawne, dalsza część programu }
End.