OPIS PODSTAW JĘZYKA ARLANG ========================== ZASADY OGÓLNE: - Zasadniczo w jednej linii może być zapisana dokładnie jedna instrukcja. Jeśli jednak w jednej linii chcemy zapisać kilka instrukcji, to musimy je oddzielić od siebie średnikami np: REPEAT; A:=A+1; UNTIL A>20 - Jeśli w linii wystąpi znak '$', to cała treść tej linii następująca po tym znaku jest interpretowana jako komentarz - Nazwy zmiennych, procedur i funkcji nie mogą być dłuższe, niż 80 znaków. W przypadku zmiennych indeksowanych do dlugości tej wlicza się także nawias otwierający - Wszystkie spacje i znaki tabulatora są ignorowane ZMIENNE: - Wszystkie zmienne są typu rzeczywistego („floating point”). - Rozróżniamy zmienne proste i zmienne indeksowane (tablice). - Zmienne proste pisane małymi i dużymi literami są rozróżniane - Zmienne indeksowane pisane małymi i dużymi literami nie są rozróżniane - Zmienna prosta jest automatycznie definiowana przy pierwszym podstawieniu pod nią jakiejkolwiek wartości np. A:=b+5*(b-3) - Tablica może być zadeklarowana w dowolnym miejscu programu, ale tylko przed pierwszym odwołaniem do niej. Tablice mogą być tylko jednowymiarowe. Ich elementy numerowane są od 1 do rozmiaru tablicy. Maksymalny rozmiar tablicy może być 10000. Maksymalna ilość zadeklarowanych w danym programie tablic wynosi 250. Nie można powtórnie deklarować tablicy o danej nazwie w celu zmiany jej rozmiaru. Deklaracja tablicy ma postać: ARRAY nazwa(rozmiar) Przykłady: ARRAY TABELA(3) ARRAY B(a+5) Odwołanie do zmiennej indeksowanej ma postać: nazwa(indeks) Przykłady: TABELA(j):=13 a:=B(13) WYRAZENIA ARYTMETYCZNE: - W skład wyrażeń arytmetycznych mogą wchodzić operatory +,-,/,* oraz następujące funkcje: ABS( ) - wartość bezwzględna SIN( ) - funkcja sinus kąta podanego w radianach COS( ) - funkcja cosinus kąta podanego w radianach ARCTAN( ) - funkcja arcus tangens (wynik w radianach) ARCTAN2( ) - dwuargumentowa funkcja arcus tangens, zwracająca wartość kąta zawartego pomiędzy osią X a półprosta wychodzącą z początku układu współrzędnych i przechodzącą przez punkt o współrzędnych (X1,Y1) którego współrzędna Y1 jest pierwszym parametrem funkcji ARCTAN2, zaś współrzędna X1 jest drugim parametrem funkcji ARCTAN2 (wynik w radianach) SQRT( ) - pierwiastek kwadratowy PI() - funkcja zwracająca wartość liczby PI EXISTS( ) - funkcja zwracająca wartość 1, gdy istnieje zmienna prosta o nazwie będącej parametrem tej funkcji, zaś zwracająca wartość 0, gdy zmienna taka nie istnieje Funkcje trygonometryczne operują na radianach. Duże i małe litery nie są rozróżniane w nazwach funkcji - Zachowywane jest pierwszeństwo dzielenia i mnożenia przed dodawaniem i odejmowaniem, chyba że kolejność działań zmieniona jest przez zastosowanie nawiasów. - Oprócz funkcji standardowych w wyrażeniach arytmetycznych mogą też wystąpić funkcje zdefiniowane w bibliotekach specjalistycznych np. związanych z generowaniem i realizacją instrukcji sterujących dla robota. - Stopień złożoności wyrażeń arytmetycznych jest nieograniczony INSTRUKCJE PODSTAWIENIA: - Ich postać ogólna jest następująca: Zmienna := Wyrażenie_arytmetyczne Przykłady: DELTA:=B*B-4*A*C X1:=(-B-SQRT(DELTA))2/A X2:=(-B+SQRT(DELTA))2/A PROCEDURY NIEBIBLIOTECZNE: - Pod pojęciem procedur niebibliotecznych rozumiemy tutaj procedury definiowane przez użytkownika w programie - Definicje procedur niebibliotecznych mogą występować w dowolnej kolejności, jednak zawsze przed programem głównym (patrz „struktura programu”) - Treść pojedynczej procedury niebibliotecznej zawarta jest miedzy instrukcjami: PROCEDURE ..... ..... ENDPROC Przykład: PROCEDURE OBLICZ_C C:=A*2 ENDPROC - Wywoływanie procedur niebibliotecznych odbywa się za pomocą instrukcji: CALL Przykład: CALL OBLICZ_C - Duże i małe litery nie są rozróżniane w nazwach procedur - Opcjonalnie może wystąpić w instrukcji CALL lista parametrów aktualnych przekazywanych do procedury. Lista ta zamieszczana jest w nawiasach zwykłych i składa się z szeregu wyrażeń arytmetycznych oddzielonych przecinkami np.: CALL OBLICZENIE(a,b,c*4) - Podstawienie wartości parametrów aktualnych pod odpowiednie zmienne wykorzystywane przez procedurę odbywa się w tej procedurze przez wywołanie instrukcji PARAMETERS o postaci: PARAMETERS nazwa1,nazwa2,nazwa3.... gdzie nazwa1, nazwa2, nazwa3.... - nazwy zmiennych prostych, pod które mają być podstawione wartości parametrów aktualnych podane w instrukcji CALL np.: PARAMETERS x,y,z Instrukcja PARAMETERS powinna być w zasadzie wywołana zaraz po nagłówku procedury. - W instrukcji CALL dopuszczalne jest zastąpienie fragmentu nazwy wywoływanej procedury przez wyrażenie arytmetyczne, którego wynik odpowiada łańcuchowi tekstowemu będącemu w.w. fragmentem nazwy. W takim przypadku wspomniane wyrażenie arytmetyczne należy zapisać w nawiasach klamrowych. Przykładowo, jeśli zmienna "a" ma wartość 3, to zapis: CALL PROC{a*5}{a} jest równoważny zapisowi: CALL PROC153 STRUKTURA PROGRAMU: - Główny blok programu zaczyna się od instrukcji PROGRAM, a kończy wraz z końcem pliku tekstowego, w którym jest zawarty ten program. Wszystkie definicje procedur niebibliotecznych (wywoływanych w bloku głównym lub nawzajem przez siebie) musza się znajdować przed instrukcją PROGRAM - Linie programu nie dające się prawidłowo zinterpretować są ignorowane przez interpreter, przy czym po zakończeniu programu wyświetlone będą stosowne komunikaty o wystąpieniu błędów. INSTRUKCJE WARUNKOWE: - Instrukcje realizowane warunkowo znajdują się miedzy instrukcjami: IF .... .... ELSE .... .... ENDIF Przykład: if a>b c:=5;a:=c+1 else c:=-5 endif - Człon "else" ma charakter opcjonalny np.prawidłowa jest innstrukcja warunkowa: if c=0 d:=9 endif - Maksymalne zagnieżdżenie instrukcji warunkowych wynosi 250 poziomów. PĘTLE "REPEAT": - Instrukcje realizowane wielokrotnie (w pętli) znajdują się miedzy instrukcjami: REPEAT .... UNTIL Przykład: k:=0 repeat k:=k+1 until k>20 - Maksymalny stopień zagnieżdżenia pętli REPEAT ... UNTIL wynosi 250 poziomów. WARUNKI LOGICZNE: - Warunki logiczne wykorzystywane są w instrukcjach warunkowych (if… else… endif) oraz w pętlach (repeat… until…) - Warunki logiczne dzielimy na proste i złożone - Rozróżniamy warunki logiczne proste następujących typów: WYRAŻENIE1 > WYRAŻENIE2 WYRAŻENIE1 < WYRAŻENIE2 WYRAŻENIE1 = WYRAŻENIE2 WYRAŻENIE1 <> WYRAŻENIE2 gdzie WYRAŻENIE1 i WYRAŻENIE2 są dowolnymi wyrażeniami arytmetycznymi. O spełnieniu bądź niespełnieniu ostatnich 2 warunków decyduje różnica pomiędzy wartościami WYRAŻENIE1 i WYRAŻENIE2 wynosząca do 0.001. Na przykład: Jeśli A=5 i B=5.000001, to warunek A=B jest spełniony Jeśli A=5 i B=5.01, to warunek A=B nie jest spełniony Dopuszczalne jest także, aby warunek logiczny był po prostu wyrażeniem arytmetycznym. W tym przypadku warunek uważany jest za spełniony, gdy wartość tego wyrażenia jest większa od 0.001, zaś w przypadku przeciwnym warunek jest uważany za niespełniony. Przyklad: A:=0 IF A B:=1 ELSE B:=2 ENDIF (w powyższym przykładzie zmienna B przyjmuje wartość 2 ) - Warunki logiczne złożone są warunkami złożonymi z kilku warunków prostych, związanych ze sobą operatorami koniunkcji .&. na przykład: IF a>b+5 .&. a) Każdy z parametrów może być albo łańcuchem znaków i wtedy musi wystąpić w pojedynczych apostrofach np.: WRITELN(DBG,'Koniec_programu') (przy czym spacje w tym łańcuchu należy zastąpić znakami _), albo też może być wyrażeniem arytmetycznym. W tym drugim przypadku, jeśli chcemy sformatować postać zapisywanej liczby, można zastosować notację analogiczną do stosowanej w języku PASCAL: : lub :: Pierwsze wyrażenie arytmetyczne, to zapisywana wartość, drugie - liczba pozycji, na których ma być zapisana ta wartość, a trzecie - liczba miejsc po kropce dziesiętnej (jeśli nie podana, to przyjmowana standardowo 0) Przykład: WRITELN(DBG,'Wartosc_wyrazenia_delta:_',b*b-4*a*c:6:3)