
- •1 КОНЦЕПЦИИ ЯЗЫКА SMALLTALK-80
- •2 ОПИСАНИЕ ЯЫКА SQUEAK SMALLTALK
- •2.1 Основные понятия
- •2.2 Синтаксис языка Smalltalk
- •2.3 Описание классов объектов
- •3 ПАРАЛЛЕЛЬНАЯ РАБОТА
- •3.1 Объекты класса Process
- •3.2 Объект класса ProcessorScheduler
- •3.3 Объекты класса Semaphore
- •5.1 Децентрализованное управление процессами
- •5.2 Централизованное управление процессами
- •5.3 Разработка моделей систем с дискретными событиями
- •5.4 Протоколирование результатов моделирования
- •5.5 Учебные задачи моделирования
- •5.5.1 Обработка партии деталей на двух станках
- •5.5.2 Грузоперевозки автотранспортом
- •5.5.3 Управление посадкой самолетов
- •5.5.4 Исследование характеристик систем массового обслуживания
- •Библиографический список
SmallSym run. "Запуск модели на исполнение"
"Показать состояние счетчика и число сгенерированных им пульсов"
PopUpMenu inform: 'Число сгенерированных = ',(s1 print String) ,', Число подсчитанных = ',(s2 printString) .
"Освободить ресурсы интерпретатора" SmallSym free.
Smalltalk removeKey: #SmallSym.
В приведенном примере можно не заботиться о фактическом окончании порожденных подпроцессов, связанных с переменной continue. По оконча нии работы главной программы встроенный механизм управления памятью си стемы Smalltalk сам освободит все ранее занятые ресурсы, так как на них не останется ссылок.
5.4 Протоколирование результатов моделирования
Для наблюдения за результатами моделирования средствами языка Small talk разработан класс MyLog, позволяющий собирать протокол событий в моде ли.
Object subclass: #MyLog
instanceVariableNames: 'time who cod event ' classVariableNames: 'Log '
poolDictionaries: '' category: 'Simulation'
“Методы экземпляра” add
"Add record" Log add: self
cod ^cod
cod: aDetal
cod := aDetal
event ^event
40
event: aEvent
event := aEvent |
|
|
|
time |
|
|
|
^time. |
|
|
|
time: aTime |
|
|
|
time := aTime |
|
|
|
who |
|
|
|
^who |
|
|
|
who: aSt |
|
|
|
who:= aSt |
|
|
|
“Методы класса” |
|
|
|
clearLog |
|
|
|
"Clear protocol" |
|
|
|
Log := OrderedCollection new |
|
||
log |
|
|
|
"Return protocol" |
|
|
|
^Log |
|
|
|
showAndSaveTo: aFileName |
|
|
|
| lines | |
Who |
Дcode |
Event'. |
lines := 'Time |
|||
Log do: |
|
|
|
[ :ev | |
|
|
|
lines := lines, (ev time |
printString), ' |
', |
(ev who printString), ' |
', |
|
(ev cod printString), ' |
', |
|
(ev event printString), ' |
|
|
'. |
|
|
]. |
|
|
(StringHolder new contents: lines) |
|
|
openLabel: 'Simulation protocol ', |
|
|
Date today printString, ' / ', |
|
|
Time now print24. |
|
lines; |
(FileStream fileNamed: aFileName) nextPutAll: |
||
close. |
|
|
Для сбора статистики о параметрах модели разработан класс MyStat.
41
Object subclass: #MyStat
instanceVariableNames: 'list min max delta col num sum' classVariableNames: ''
poolDictionaries: '' category: 'Simulation'
Методы экземпляра
average
"Average value"
(num = 0) ifTrue: [ num := 1 ]. ^(sum / num) asFloat
col
"Amount of values"
^col
list ^list
min: aMin max: aMax col: aNum
"To Initiate new histogram"
min := aMin. max := aMax. col := aNum.
delta := (max - min)/aNum asFloat. list := OrderedCollection new.
(0 to: (col + 1) by: 1) do: [:i | list add: 0 ]. num := 0.
sum := 0
min: aMin max: aMax delta: aDelta "To Initiate new histogram"
| |
min := aMin. max := aMax.
col := ((max - min)/aDelta asFloat) truncated. delta := (max - min)/col asFloat.
list := OrderedCollection new.
(0 to: (col + 1) by: 1) do: [:i | list add: 0 ]. num := 0.
sum := 0
42
num
"Amount of values"
^num
put: aValue
"To Add in statistics" | i v |
((aValue - min) < 0.0) ifTrue: [ i := 1 ]. ((aValue - min) < 0.0) ifFalse:
[i := (((((aValue - min) / delta) + 0.0) asFloat) truncated) + 2].
(i > (col + 2)) ifTrue: [ i := col + 2 ]. v := (list at: i) + 1.
list at: i put: v. num := num + 1.
sum := sum + aValue.
show: aTitle
"To Build and show histogram"
| v vv sv lv svv sg sgg pr n lines |
lines := 'Amount of data=', (num printString), '; Total=', (sum printString),
'; Average value=', (self average printString),
' |
|
'. |
Frequency |
lines := lines, ' Interval |
|
'. |
|
pr := '<'. |
|
(1 to: (col + 2) by: 1) do: |
|
[:i |
n := i.
(i = (col + 2)) ifTrue: [ pr := '>'. n := i - 1 ]. sgg := (((((min + ((n - 1) * delta)) * 100.0)
asFloat truncated) / 100.0) printString). sg := pr, sgg.
pr := sgg, ' - '. lv := sg size.
(1 to: (20 - lv) by: 1) do: [:j | sg := sg, ' ' ]. v := (((((list at: i ) / num) * 10000)
asFloat truncated) / 10000) asFloat. vv := (v * 20.0 * col) truncated.
sv := (v printString). lv := sv size.
(1 to: (10 - lv) by: 1) do: [:j | sv := sv, ' ' ]. sv := sv, '|'.
43