Metody symulacyjne
JĘZYK SYMULACYJNY MODSIM
wprowadzenie do składni
CECHY JĘZYKA
SYMULACYJNEGO
OPIS MODELOWANEGO SYSTEMU
PROCEDURY UPŁYWU CZASU
ŚLEDZENIE ZDARZEŃ, CZYNNOŚCI I
PROCESÓW
TWORZENIE I USUWANIE ZDARZEŃ ORAZ
PRZETWARZANIE DANYCH Z NIMI ZWIĄZANYCH
GENEROWANIE ZMIENNYCH LOSOWYCH O
ZADANYCH ROZKŁADACH
GROMADZENIE, ANALIZA I PREZENTACJA
WYNIKÓW SYMULACJI
Wytwórca środowiska programowego MODSIM
II
CACI PRODUCTS COMPANY
( www.caciasl.com
)
Podstawowe cechy języka:
język obiektowo zorientowany do programowania
symulacji dyskretno-zdarzeniowej
składnia zbliżona do składni języków:
Modula 2, Ada, Pascal
wersje dla systemów: Windows, Windows NT, UNIX,
OS/2 na platformy sprzętowe PC oraz RISC
MODSIM II wymaga preinstalowanego środowiska
C/C++
(np. MSVC v 1.5)
JĘZYK I ŚRODOWISKO
MODSIM II
Wprowadzenie
Umożliwia realizację:
upływu czasu
interakcji obiektów
wizualizacji i animacji
monitorowania przebiegu symulacji
Środowisko programowe stanowią:
edytor kodu źródłowego wraz z kompilatorem i
debuggerem
ModBench
edytor grafiki
SimDraw
edytor animacji
SimVideo
SimObj
ModBench
SimDraw
SimVideo
Moduły
Każdy program stworzony w
MODSIM II
musi posiadać:
dokładnie jeden moduł główny -
MAIN MODULE
dowolną liczbę par modułów skojarzonych w
osobnych plikach:
DEFINITION MODULE
- zawiera deklaracje
struktur, procedur i obiektów; udostępnia
procedury innym modułom
IMPLEMENTATION MODULE
- zawiera kod
wykonywalny oraz dodatkowe deklaracje
Uwaga:
w module DEFINITION nie może być kodu
wykonywalnego
IMPLEMENTATION występują zawsze w parze z
DEFINITION
stałe, typy, zmienne i procedury zadeklarowane w
module DEFINITION są widoczne w skojarzonym
IMPLEMENTATION oraz mogą być importowane z
innych modułów
Moduły c.d.
elementy zaimportowane do modułu DEFINITION nie są
widoczne w IMPLEMENTATION
nie można nic importować z modułu MAIN
do importowania służy polecenie
IMPORT
, np.
FROM UtilMod IMPORT DateTime, Delay;
sekwencja
FROM
...
IMPORT
... musi być umieszczona na
początku modułu (przed innymi sekwencjami poleceń)
nie można zaimportować całego modułu (biblioteki)
tylko poszczególne elementy
nazewnictwo:
MAIN MODULE
- MNazwa
mmnazwa.mod
DEFINITION MODULE
nazwa -
dnazwa.mod
IMPLEMENTATION MODULE
nazwa -
inazwa.mod
{ograniczenia na długość nazwy modułu}
Identyfikatory
- nazwy zdefiniowanych przez użytkownika
elementów programowych, np.: modułów,
stałych, zmiennych, typów, procedur itd.
Wymagania:
– nierozdzielony ciąg znaków (bez spacji,
myślników oraz podkreśleń) - liter i/lub cyfr
– pierwszy znak - litera (!)
Uwaga: w MODSIM rozróżnia się małe/wielkie
litery
Przykład:
– licznik, LICZNIK, Pole1,
liczbaStanowiskObslugi...
Deklaracje
blok programowy położony w module
definicyjnym lub przed częścią kodu
wykonywalnego w pozostałych
modułach lub podprogramach
zaczynający się od jednego ze słów
kluczowych: CONST, TYPE, VAR
opisuje definiowane przez
użytkownika wyrażenia przyjmujące
stałe i zmienne wartości oraz
opisujące nowe typy danych
Deklaracje
Definiowanie stałej wartości:
–
CONST
MaxLiczbaPacjentow = 30;
MaxCzasPracy = 120.0;
Definiowanie nowego typu danych:
–
TYPE
DniWolne = (Sobota, Niedziela);
DynamicznaTablica = ARRAY INTEGER
OF REAL;
Deklaracje c.d.
Definiowanie zmiennych:
–
VAR
liczbaPacjentow : INTEGER;
tablica : DynamicznaTablica; {zmienna
referencyjna}
Uwaga
: nie ma zmiennych wskaźnikowych tylko
referencje
Automatyczna inicjalizacja wartości
zmiennych podstawowego typu
:
INTEGER
: 0
REAL
: 0.0
BOOLEAN
: FALSE
STRING
: null
CHAR
: CHR(0)
skalarne :
INTEGER (32-bit): -2.147.483.648 do
+2.147.483.648
REAL (64-bit): +/- 1,7 E-308 do 1,7 E+308
CHAR:
pojedynczy znak, np. ’a’
BOOLEAN
{TRUE, FALSE}
łańcuchy znakowe (dynamiczne łańcuchy znaków
automatycznie zarządzane): STRING, np. „Pacjent
oczekuje w kolejce”
wyliczeniowe : dopuszczalne nazwane wartości
jednoznacznie wyliczone w deklaracji „TYPE” np.
Miesiace=(styczeń, luty);
okrojony typ skalarny lub wyliczeniowy, np. I = [1 ..
50]
Podstawowe typy danych
Operatory podstawowych
działań
:=
przypisanie
+
dodawanie/konkatenacja łańcuchów
znakowych
-
odejmowanie/znak ujemności
*
mnożenie
/
dzielenie rzeczywiste
DIV
dzielenie całkowitoliczbowe
MOD modulo
Uwaga: operandy muszą być kompatybilne;
operator powinien być dostosowany do typu
operand
– błędne wyrażenia: 2.0 + 2, 5 / 7, 5 + ’a’
Operatory relacji logicznych
Porównują wartości - wynik typu BOOLEAN
=
równy
<>
nierówny
<
mniejszy niż
<=
mniejszy niż lub równy
>
większy niż
>=
większy niż lub równy
Uwaga: operandy muszą być
kompatybilne
– błędne wyrażenia: 2.0 < 2, 5 = ’a’
Operatory działań logicznych
Dwie operandy po obu stronach
OR
suma logiczna
AND
iloczyn logiczny
Operand po prawej stronie
NOT
przeczenie
Uwaga: operandy muszą być wyrażeniami
logicznymi
Instrukcje sterujące
Instrukcja warunkowa
IF
:
IF Wyrażenie_logiczne1
Sekwencja_działań
[ ELSIF Wyrażenie_logiczne2
Sekwencja_działań]
[ ELSE
Sekwencja_działań ]
END IF;
Uwaga: -brak słowa kluczowego
THEN
-
END
występuje w parze z
IF
Instrukcje sterujące c.d.
Instrukcja wyboru
CASE
:
CASE [typ prosty | string]
WHEN a..e, m:
Sekwencja_działań
WHEN p:
Sekwencja_działań
WHEN x...z: Sekwencja_działań
[ OTHERWISE
Sekwencja_działań ]
END CASE;
Uwaga: -brak słowa kluczowego
OF
-
END
występuje w parze z
IF
Instrukcje sterujące c.d.
Instrukcje pętli
–
WHILE
:
WHILE Wyrażenie_logiczne
Sekwencja_działań
END WHILE;
–
LOOP
:
LOOP
Sekwencja_działań
END LOOP;
–
REPEAT
:
REPEAT
Sekwencja_działań
UNTIL Wyrażenie_logiczne;
Instrukcje sterujące c.d.
–
FOR
:
FOR ident := wyrażenie TO | DOWNTO wyrażenie [BY
wyrażenie]
Sekwencja_działań
END FOR;
–
FOREACH
:
FOREACH obiekt IN GROUP
Sekwencja_działań
END FOREACH;
Instrukcja natychmiastowego opuszczenia
pętli:
EXIT
Uwaga: -
END
występuje w parze z
nazwą
pętli
Przykłady pętli
WHILE a < b
a := a + 2;
END WHILE;
REPEAT
a := a + b;
UNTIL a < 100;
LOOP
…
IF a > b
EXIT;
END IF;
…
END LOOP;
FOR i := 1 TO 20 BY 2;
t[i] := i * 2;
END FOR;
FOR i := 100 DOWNTO -20
BY 4;
t[i] := i * 2;
END FOR;
FOREACH el IN kolejka;
el.a := 6;
END FOR;
Podprogramy
- nazwana, ograniczona kluczowymi słowami
część kodu programowego, dostępna z innych
części programu poprzez nazwę, realizująca
określone operacje
Typy:
funkcje - określają zwrotnie wartość
procedury - nie zwracają żadnych wartości
Podprogramy c.d.
Deklaracja :
PROCEDURE
NazwaProcedury(
IN
w1:W1;
INOUT
w2:W2;
OUT
w3:W3)[:
TypZwracanejWartości];
CONST
...
TYPE
...
VAR
...
BEGIN
......
[
RETURN
...]
END PROCEDURE
;
Podprogramy c.d.
Wywołanie procedury:
–
[w := ] NazwaProcedury(... , ... , ...);
Lista parametrów:
–
IN
- wartość przekazywana do procedury
–
OUT
- wartość zwracana przez procedurę po słowie
RETURN
–
INOUT
- wartość zmiennej przekazana do procedury i
zwrócona do tej zmiennej, bez tworzenia kopii
zmiennej
Podprogramy c.d.
Przykład:
PROCEDURE SrDlugoscKolejki(IN liczbaklientow: INTEGER;
IN liczbaKas : INTEGER) :
REAL;
VAR
srdlkol : REAL;
BEGIN
IF liczbaKas <> 0
srdlkol := FLOAT (liczbaKlientow) / FLOAT (liczbaKas);
END IF;
RETURN srdlkol;
END PROCEDURE;
wywołanie:
.....
OUTPUT ( „Wyliczono :”, SrDlugoscKolejki(95, 15) );
.....
Standardowe procedury
Wej/Wyj
INPUT (w1,... ,wN)
- wczytanie N ciągów znaków z
klawiatury oraz zinterpretowanie zgodnie z typami
zmiennych w1,..., wN
INPUT(dlugoscKolejki, liczbaKas);
OUTPUT (w1,... ,wN)
- wypisanie w powoływanym
oknie sekwencji wartości w1,...,wN
OUTPUT(nr, „Czas zmierzony = ” ,czasObslugi);
PRINT (w1,...,wN) WITH string
- wypisanie w
powoływanym oknie sekwencji wartości w postaci
sformatowanego zgodnie ze string ciągu wartości
w1,..,wN
PRINT(nr, kwota) WITH „Kasa *** zarobiła
*****.* zł.”
Uwaga:
w1,...,wN muszą być typu prostego
ciąg formatujący może być stałą, zmienną lub
znakowy
Złożone typy danych
Struktury statyczne :
FIXED ARRAY
- uporządkowany skończony zbiór
elementów
jednego typu, np.
Pole = (..., figuraSzachowa, ...);
PlanszaSzachowa = FIXED ARRAY [1..8],[1..8]
OF Pole;
elementy tablicy muszą mieć ustalony rozmiar
alokują ilość pamięci, zależną od ilości i typu
zadeklarowanych w definicji tablicy
elementów
dostęp do elementów tablicy przez indeksy:
plansza[2, 3]
nie mogą być przekazywane jako parametr IN
procedur
FIXED RECORD
- zdefiniowana przez użytkownika
struktura
danych złożona ze skończonej liczby nazwanych
pól prostego
lub złożonego typu, np.
Złożone typy danych c.d.
SrodekWalki = FIXED RECORD;
typ : TypSrodkaWalki;
zasieg : REAL;
szybkostrzelnosc : REAL;
jednostkaAmunicyjna : INTEGER;
END RECORD;
elementy rekordu muszą mieć ustalony rozmiar
alokują ilość pamięci, zależną od ilości i typu
zadeklarowanych w definicji rekordu pól
dostęp do pola uzyskuje się przez złożenie
nazwy rekordu
oraz nazwy pola, np.
srodekwalki.zasieg
może być używany w operacjach
arytmetycznych oraz
wyrażeniach logicznych, np.
srodekwalki.zasieg := 500.0;
Złożone typy danych c.d.
Struktury dynamiczne :
ARRAY
: tablica dynamicznie powoływana i
usuwana przez
procedury wbudowane NEW oraz DISPOSE
VAR kolejkiSklepu : ARRAY INTEGER, INTEGER OF
BOOLEAN;
k : INTEGER;
BEGIN
...
NEW( kolejkiSklepu, 1..5);
FOR k := 1 TO 5
NEW(kolejkiSklepu[k], 1..k);
DISPOSE(kolejkiSklepu[k]);
END FOR;
...
DISPOSE(kolejkiSklepu
);
Złożone typy danych c.d.
Efekt powyższej sekwencji poleceń :
Uwaga:
– w przypadku tablicy wielowymiarowej należy
pamiętać
o oddzielnym powołaniu jej pól
– procedurą DISPOSE można zwalniać tylko
wcześniej
zaalokowane obszary pamięci
– do chwili powołania tablicy zmienna typu
ARRAY jest
inicjalizowana na wartość NILARRAY
– tablice mogą być operandami w wyrażeniach
logicznych
’ = ’, ’ < > ’.
Złożone typy danych c.d.
RECORD
: struktura danych podobna do FIXED
RECORD-
różnice:
zajmuje pamięć dopiero po wykonaniu NEW(...),
zwalnia
natychmiast po wykonaniu DISPOSE(...)
pola mogą być dynamicznymi strukturami
danych
TYPE
playerType = RECORD
imie : STRING;
team : STRING;
pozycja : positionType;
kolejnyGracz : playerType;
END RECORD;
VAR
team, gracz : playerType;
Złożone typy danych c.d.
BEGIN
NEW(gracz);
team :=gracz;
NEW(gracz);
gracz.kolejnyGracz := team;
team := gracz;
...
dla rekordu predefiniowane są:
NILREC
– wartość zmiennej typu RECORD do
chwili
zaalokowania pamięci
ANYREC
– typ kompatybilny z każdym typem
RECORD, nie wolno używać go w procedurze
NEW
rekordy mogą być operandami w wyrażeniach
logicznych z
operatorami: ’ = ’ , ’ < > ’
Złożone typy danych c.d.
Wybrane działania na strukturach dynamicznych
:
przypisanie
TYPE
TypRekordowy = deklaracja;
VAR
j, k : INTEGER;
a, b : TypRekordowy;
...
BEGIN
k := 4; { przypisanie wartości }
NEW(b); { powołanie instancji b }
b := dane { uzupełnienie pól rekordu danymi }
...
j := k; { kopia wartości k przepisana do j }
a := b; { a oraz b wskazują na tę samą
instancję rekordu }
4
j
INTEGER
4
k
INTEGER
some
data
someRecType instance
a
someRecType reference
b
someRecType reference
4
k
INTEGER
0
j
INTEGER
some
data
someRecType instance
NILREC
a
someRecType
reference
b
someRecType reference
·
·
·
Pamięć przed przypisaniem
Pamięć po przypisaniu
Złożone typy danych c.d.
Złożone typy danych c.d.
klonowanie- działanie polegające na stworzeniu
kopii struktury dynamicznej oraz przypisaniu jej
do nowej zmiennej referencyjnej
TYPE
TypRekordowy = deklaracja;
VAR
j, k : INTEGER;
a, b : TypRekordowy;
...
BEGIN
k := 4; { przypisanie wartości }
NEW(b); { powołanie instancji b }
b := dane { uzupełnienie pól rekordu danymi }
...
j := k; { kopia wartości k przepisana do j }
a := CLONE(b); { a wskazuje teraz na kopię instancji
b}
some
data
someRecType instance
4
k
INTEGER
0
j
INTEGER
some
data
someRecType instance
NILREC
a
someRecType reference
b
someRecType reference
a
someRecType reference
b
someRecType reference
·
·
some
data
someRecType instance
4
j
INTEGER
4
k
INTEGER
·
Pamięć przed przypisaniem
Pamięć po przypisaniu
Złożone typy danych c.d.