2. Start: pierwszy program i kilka elementów składni
By móc wykonać napisane przez nas programy musimy zainstalować
interpreter REXXa oraz specjalnie przygotowany preprocesor, umożliwiający
pewne - potrzebne w tym wykładzie - zmiany składniowe, które uproszczą nam
późniejsze przejście do języka Java.
Instalacja jest bardzo prosta i szybka -
zob. jak zainstalować interpreter i preprocesor REXXa.
Programy piszemy w dowolnym edytorze tekstów i zapisujemy na dysku
jako pliki tekstowe (czysty tekst, a nie format dokumentów procesorów
tekstu, np. Worda!). Jako rozszerzenie pliku można przyjąć "rexx" lub
"rex".
Następnie je uruchamiamy -
zob. jak uruchomić program napisany w uproszczonym zmodyfikowanym REXXie.
Nasz pierwszy program będzie realizował następujący algorytm:
Terminem konsola określa się znakowy terminal
służący do interakcji użytkownika z programami. W Windows jest to "okienko
DOS". O wprowadzanych z konsoli danych mówi się jako o standardowym
strumieniu wejściowym, wyprowadzane - tworzą standardowy
strumień wyjściowy, w skrócie standardowe wejście i standardowe
wyjście.
- Zapytaj o imię, wypisując na konsoli odpowiedni komunikat
- Odczytaj z konsoli podane imię
- Jeżeli podano imię, to wypisz na konsoli powitanie
z imieniem, w przeciwnym razie wypisz na konsoli powitanie
bez imienia
- Podaj godzinę
Oto tekst programu:
/* Pierwszy program: powitanie */
say "Jak się nazywasz?"; /* wypisz tekst na konsoli */
name = linein(); /* wczytaj dane z konsoli */
/*
jeżeli nie podano imienia, wypisz "Witaj"
w przeciwnym razie - Witaj, imie i wykrzyknik
*/
if name = "" then say "Witaj!";
else say "Witaj," name "!";
/* podaj godzine */
say "Teraz jest godzina:" time();
Proszę zapisać ten program i uruchomić na własnym komputerze.
Mamy tu kilka elementów.
W Javie oprócz stosowania znaków /* */ mamy jeszcze
inne sposoby komentowania programu m.in. użycie znaków //
Po pierwsze komentarze: tekst pomiędzy znakami /* i */ traktowany jest jako komentarz,
który nie stanowi części programu "do wykonania" i nie wpływa na działanie
programu. Dobrą praktyką programistyczną jest komentowanie programu,
wyjaśnianie jaki jest sens poszczególnych jego części. Nie należy z tym
jednak przesadzać: oczywistych rzeczy raczej się nie komentuje, a w powyższym
przykładzie zawarto komentarze tylko po to by pokazać sposoby komentowania
programu.
Na niebiesko zaznaczono
słowa kluczowe, reprezentujące instrukcje języka. Program jest
tekstem składającym się symboli - ciągów znaków, rozdzielonych separatorami
(takimi jak spacje, przecinki, średniki, nawiasy). Pomijając komentarze,
każdy taki symbol (i separator) ma określone znaczenie dla działania
programu i nie może pojawić się w całkiem przypadkowym miejscu. Pewne,
ściśle określone, symbole-słowa oznaczają instrukcje do wykonania np.
sprawdzenie warunku, wykonanie iteracji.
Generalnie każdy ciąg symboli programu zakończony średnikiem
traktowany jest jako instrukcja.
Już teraz zacznijmy się przyzwyczajać do kończenia wszystkich
instrukcji średnikiem (choć nie jest to warunek konieczny w REXXie,
przyda nam się to przyzwyczajenie w Javie).
W więlu językach programowania, w tym w Javie, wprowadzanie
- wyprowadzanie danych z konsoli realizowane jest za pomoca funkcji.
W REXXie w tym celu możemy używać zarówno instrukcji, jak i funkcji
Pierwszy wykonywalny wiersz naszego programu jest właśnie
taką instrukcją: instrukcja say
wyprowadza podany w niej napis na konsolę. Napis podano w cudzysłowie,
literalnie - stąd nazwa takiej konstrukcji językowej literał.
Niektóre napisy w programie określają zmienne. Zmienna
sluży do przechowywania danych i zawsza ma nazwę. W naszym pierwszym
programie mamy zmienną o nazwie name. Przechowujemy
w niej wprowadzone z konsoli imię.
Tego wprowadzenia dokonuje funkcja linein(). Funkcje - to wyodrębnione fragmenty kodu, które
wykonują jakieś czynności (w tekście programu zaznaczone na
zielono). Możemy je wywołać, dopisując w tym celu
po nazwie funkcji nawiasy okrągłe i ew. umieszcając w tych nawiasach
informację, która ma być przekazana funkcji (argumenty). Wywołanie
funkcji linein() powoduje przekazanie sterowania do gotowego fragmentu
kodu (treści tej funkcji, zawartej w samym REXXie, dlatego funkcja nazywa
się "wbudowaną", a jej kod nie jest dla nas widoczny). Kod ten czeka
na wpisanie wiersza na konsoli. Kiedy użytkownik wciśnie ENTER, odczytuje
wprowadzony wiersz i zwraca go do miejsca wywołania funkcji. Zwrócona
wartość jest za pomocą znaku = przypisywana zmiennej
name . Zatem jeżeli użytkownik programu w odpowiedzi na
pytanie "Jak się nazywasz?" wpisał na konsoli tekst "Ala" i wcisnął ENTER,
to napis Ala będzie teraz znajdował się w zmiennej name. Jeżeli natomiast
nie wpisał nic, a tylko wcisnął ENTER, to zmienna name zawiera pusty napis,
który w programie możemy literalnie wyrazić jako 'nic' pomiędzy znakami
cudzysłowu : "" .
Specjalnymi instrukcjami języka są instrukcje sterujące
. Zmieniają one przebieg wykonania programu. Do takich instrukcji
należy instrukcja if, która służy do sprawdzania prawdziwości
jakichś warunków i podejmowania decyzji jakie instrukcje będą wykonane
jeśli warunek okaże się prawdziwy.
W naszym programie sprawdzamy czy zmienna name zawiera
pusty napis ( if name = "") i jeśli tak wypisujemy na konsoli
tylko słowo "Witaj!" ( then say "Witaj!"). W przeciwnym razie
( else ) wyprowadzamy napis "Witaj," połączony z napisem
zawartym w zmiennej name i znakiem "!" (else say "Witaj!" name "!"
).
Ostatni wiersz programu wypisuje na konsoli aktualną godzinę,
korzystając z wbudowanej funkcji time().
Pisząc program musimy posługiwać się regułami składniowymi
języka, które określają jakie napisy w treści programu są dopuszczalne.
Na przykład, nie możemy w całkiem dowolny sposób nazywać zmiennych
(np. zamiast name - 123) ani wadliwie formułować instrukcji (if name
= "" else say "Witaj!") albo też zapomnieć o zamknięciu cudzysłowu lub
nawiasu (say "Witaj!). Wszystko to będzie odebrane jako błąd składniowy.
W językach kompilowanych zostanie on wykryty w trakcie kompilacji, w
językach interpretowanych - w trakcie wykonania lub wcześniej za pomocą
specjalnych programów sprawdzających składnię. W rezultacie nasz program
nie będzie wykonany.
Informacja o błędach jest podawana przez kompilatory lub
części interpreterów, sprawdzające składnię.
Dowiemy się z niej o prawdopobnej przyczynie błędu i o
miejscu w którym on wystąpił. Programowanie w dużej części polega
na walce z błędami składniowymi, dlatego warto zwracać baczną uwagę
na to co mówią kompilatory lub inne sprawdzacze składni o naszym programie.
Np. gdybyśmy w naszym programie napisali:
say "Jak się nazywasz
to interpreter mógłby podać następującą informację:
Error 6 running "Greet.rexx", line 3: Unmatched "/*" or
quote
Error 6.3: Unmatched double quote (")
Błąd wystąpił w trzecim wierszu programu i polega na tym,
że zapomnieliśmy zamknąć cudzysłów.
Dzięki tej informacji możemy ten błąd łatwo odszukać i
poprawić.
|