« poprzedni punkt  następny punkt »

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.

  1. Zapytaj o imię, wypisując na konsoli odpowiedni komunikat
  2. Odczytaj z konsoli podane imię
  3. Jeżeli podano imię, to wypisz na konsoli powitanie z imieniem, w przeciwnym razie wypisz na konsoli powitanie bez imienia
  4. 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ć.


« poprzedni punkt  następny punkt »