2.1. Построение формальной схемы функционирования системы
2.2. Определение параметров и переменных модели
2.3. Определение единицы модельного времени
2.4. Определение закона функционирования системы
3. Алгоритмизация модели и ее машинная реализация
3.1. Выбор программных средств моделирования
3.2. Описание моделирующей программы
3.3. Проверка достоверности программы
3.4. Моделирование случайных воздействий
3.4.1. Моделирование случайных воздействий, имеющих
равномерное распределение
3.4.1.1. Аппаратный способ
3.4.1.2. Программный способ
3.4.1.3. Выбор генератора РРПСЧ
3.4.2. Моделирование случайных воздействий, имеющих
неравномерное распределение
3.5. Описание моделирующей программы для стохастической
модели
4. Получение и интерпретация результатов моделирования
5. Литература
2. Формализация концептуальной модели
2.1. Построение формальной схемы функционирования
системы
Построим формальную схему (Q-схему) заданной вычислительной системы.
И1
О
И2 К
И3
Рис. 1 Q - схема вычислительной системы
Здесь:
К - ЭВМ
О - Очередь
И1 - И3 - Сетевые машины
2.2.Определение параметров и переменных модели
tp - интервал между приходами пользователей
tgz1 - время подготовки задания 1-ым пользователем
tgz2 - время подготовки задания 2-ым пользователем
tgz3 - время подготовки задания 3-им пользователем
tm - время выполнения задания на ЭВМ
k - количество промоделированных на ЭВМ заданий
nz - наличие заявки на входе системы:
nz=0 - нет заявок ___
nz=i - наличие заявки на i-ой сетевой машине ( i=1-3 )
pz1 - подготовка задания сетевой машине 1
pz1=1 - идет подготовка задания на сетевой машине 1
pz1=0 - сетевая машина 1 не занята
pz2 - подготовка задания сетевой машине 2
pz2=1 - идет подготовка задания на сетевой машине 2
pz2=0 - сетевая машина 2 не занята
pz3 - подготовка задания сетевой машине 3
pz3=1 - идет подготовка задания на сетевой машине 3
pz3=0 - сетевая машина 3 не занята
znw - наличие заявки на выполнение задания
znw=0 - заявки отсутствуют ___
znw=i - наличие заявки от сетевой машины i ( i=1-3 )
wz - выполнение задания на ЭВМ
wz=0 - ЭВМ свободна
wz=i - ЭВМ выполняет заявку i
ocher[50] - очередь
в очереди хранятся номера сетевых машин с которых получены
заявки
n - индекс свободного элемента в очереди
w2 - количество вып. заданий от 2-го пользователя
На первом этапе имитационного моделирования создадим детерминированную модель заданной вычислительной системы, заменяя стохастические потоки их математическими ожиданиями:
- интервал между приходами пользователей 10 мин
- вероятность прихода каждого из пользователей 0.33
- время подготовки задания 1-ым пользователем 16 мин
- время подготовки задания 2-ым пользователем 17 мин
- время подготовки задания 3-им пользователем 18 мин
- время выполнения задания на ЭВМ 0.8 мин
2.3. Определение единицы модельного времени
За единицу модельного времени (emb) принимается минимальный интервал реального времени, в течение которого система не меняет своего состояния. В данной задаче за emb целесообразно принять время равное
0.1 мин.
2.4. Определение закона функционирования системы
Работу данной вычислительной системы отразим временными диаграммами.
пользователь
emb
160
И1
170
И2
180
И3
ЭВМ
Рис 2. Временные диаграммы работы системы
В машинный зал с интервалом 100 emb приходит один из пользователей.
В начале приходит первый, и начинает подготовку своего задания на это ему потребуется 160 emb. Через 100 emb приходит второй пользователь и тоже начинает подготовку задания на это ему отведено 170 emb. Вскоре после прихода 2-го пользователя (через 60 emb) заканчивает подготовку задания первый пользователь и выполняет его на ЭВМ в течении 8 emb. Через 100 emb после прихода второго пользователя приходит третий пользователь, при этом второй продолжает подготовку. Спустя 70 emb после прихода третьего пользователя заканчивает подготовку второй и выполняет свое задание на ЭВМ за 8 emb. Третий пользователь заканчивает подготовку спустя 180 emb после своего прихода, в это время
снова приходит первый пользователь на этом заканчивается первый цикл работы системы и все повторяется снова.
Таким образом за каждый цикл с периодом Т=300 emb выполняется три задания от каждого пользователя. Все они выполняются сразу же после подготовки и не задерживают друг друга, т. к. ЭВМ к моменту поступления этих заявок свободна. Все время работы очередь остается пустой. За время цикла выполняется одно задание от 2-го пользователя, следовательно процент выполненных заданий, поступивших от второго пользователя равен 33,3 %.
Нам нужно смоделировать выполнение 500 заданий, следовательно общее время работы системы равно (500/3)*300=50.000 emb. За это время ЭВМ проработала 500*8=4000 emb, следовательно загрузка ЭВМ равна 8%.
3. Алгоритмизация модели и ее машинная реализация
3.1. Выбор программных средств моделирования
Для написания программы мы выбираем язык программирования Borland C++. Этот язык хорошо зарекомендовал себя эффективностью, лаконичностью, стройностью программ. Во многих случаях программы, написанные на языке С++ сравнимы по скорости с программами, написанными на языке Ассемблера, при этом они более наглядны и просты в сопровождении. В системное окружение языка С++ входит много библиотек, в том числе библиотеки нужных нам стандартных функций.
Программа для детерминированной модели приведена в Приложении № 1.
3.2. Описание моделирующей программы для
детерминированного варианта модели
Параметры и переменные данной программы описаны в пункте 2.2.
Так как в выбранном языке программирования нельзя создать параллельные процессы, то мы применим принцип псевдораспараллеливания.
В программе организуем очередь ocher[50] в ячейках которой мы запоминаем адрес заявки (номер сетевой машины). Также вводим ряд вспомогательных переменных ( ztgz1, ztgz2, ztgz3, ztm, zk ) необходимых для хранения значений исходных параметров системы.
Данная моделирующая программа работает следующим образом:
Вначале программа запрашивает значения параметров системы. Далее организуется основной цикл, который выполняется k раз. Первым действием в цикле является оператор прибавления единицы машинного времени t=t+emb. После проверяем не пришел ли пользователь, если пришел то определяем какой ( конструкция switch (cikl) ). Далее в программе идет конструкция switch (nz) устанавливающая соответствующие флажки подготовки задания. После идет группа условий выполняющая уменьшение времени подготовки задания. Если задание подготовлено то подается запрос на выполнение. В этом блоке программы определяется не пуста ли очередь, если не пуста то выполняем задание из очереди иначе выполняем заявку с сетевой машины. Перед выполнением заявки проверяем занята ли ЭВМ, если занята то ставим заявку в очередь. Далее если на ЭВМ выполняемся задача то уменьшаем время выполнения этой задачи. После чего цикл повторяется. После завершения цикла производим подсчет процента выполненных заданий, поступивших от второго пользователя.
3.3. Проверка достоверности программы
Смоделируем работу системы с параметрами указанными в задании.
Протокол работы программы:
Введите интервал между приходами пользователей 100
Введите время подготовки задания 1-ым пользователем 160
Введите время подготовки задания 2-ым пользователем 170
Введите время подготовки задания 3-ым пользователем 180
Введите время выполнения задания на ЭВМ 8
Введите количество промоделированных на ЭВМ заданий 500
Процент вып. заданий, поступ. от 2-го польз.= 33%
Вывод:
Результаты работы моделирующей программы совпадают с рассчитанными теоретически, следовательно программа написана и работает правильно.
Определим оптимальную структуру вычислительной системы: оптимальная структура вычислительной системы обеспечивающая минимальное время простоя оборудования достигается при следующих параметрах: интервал между приходами пользователей 2
время подготовки задания 1-ым пользователем 1
время подготовки задания 2-ым пользователем 1
время подготовки задания 3-ым пользователем 1
время выполнения задания на ЭВМ 1
3.4. Моделирование случайных воздействий
3.4.1. Моделирование случайных воздействий имеющих
равномерное распределение
3.4.1.1. Аппаратный способ
При аппаратном способе случайные или псевдослучайные числа вырабатываются специальной электронной приставкой - генератором, который является внешним устройством ЭВМ либо входит в состав процессора. Наибольшее распространение на практике нашли генераторы псевдослучайных чисел (ГПСЧ), построенные на основе регистра сдвига с реализацией некоторой логической функции в цепи обратной связи (ОС) (в нашем случае это сумматор по модулю два).
Поскольку проведение натуральных опытов с разными схемами ГПСЧ трудоемко, то мы будем использовать программное средство позволяющее строить и исследовать различные ГПСЧ на программных моделях. Для этих целей подходят автоматизированная система подготовки и обработки статистической информации (АСПОСИ), которая представляет собой комплекс программных средств, позволяющих строить математические модели различных ГПСЧ и исследовать их характеристики.
Для получения ПСЧ будем пользоваться программой gener.
Работая в диалоговом режиме с ПВМ мы определяем структуру генератора, т. е. некоторую исходную информацию: разрядность регистра сдвига ГПСЧ, вид ОС, количество и номера подключенных в цепь ОС разрядов регистра, количество генерируемых чисел и др.
Полученные числа записываются в файл и анализируются (строится гистограмма) с помощью программы analize.
Для генерации чисел мы выбрали 3 различные структуры ГПСЧ:
1) Файл vihod1.dat
Разрядность: 50
Обратная связь: 30
Количество чисел: 1000
Разрядность числа: 25
Число сдвигов: 2
2) Файл vihod2.dat
Разрядность: 50
Обратная связь: 30
Количество чисел: 1000
Разрядность числа: 25
Число сдвигов: 3
3) Файл vihod3.dat
Разрядность: 70
Обратная связь: 35
Количество чисел: 1000
Разрядность числа: 25
Число сдвигов: 6
Проверим качество чисел в файлах программой analize.
Построим гистограммы:
vihod1.dat
vihod2.dat
vihod3.dat
Проверка соответствия чисел в последовательностях требуемому распределению дает следующие результаты: теоретические и статистические данные во всех 3-х файлах по критериям Колмогорова и Х2 не согласуются.
Вывод:
1) С увеличением числа сдвигов характеристики чисел улучшаются.
2) Из приведенных 3-ех файлов самые качественные числа находятся в
файле vihod3.dat, т. к. числа в последовательности достаточно
независимы. Но в то же время нет согласованности по обеим
критериям.
3.4.1.2. Программный способ
При программном способе псевдослучайные числа нам необходимо сформировать методом умножения.
Суть метода: выбирается два n - разрядных числа X1 и X2. X1>
Программа формирования ГСК на основе метода умножения приведена в Приложении № 2.
Полученные числа записываются в файл vi_gpsc1.dat и анализируются с помощью программы analize.
Проверка соответствия чисел последовательности требуемому распределению дает следующие результаты:
Критерий Хи-Квадрат:
Х2=12.9
С доверительной вероятностью 0.166 можно утверждать о согласованности теоретических и статистических данных.
Критерий Колмогорова:
Максимальная разность max| F(x)-F*(x) | = 0.0885
С доверительной вероятностью 0.999 можно утверждать о согласованности теоретических и статистических данных.
Определение характеристик корреляции
????
1
0 ?
5
Рис. 3. График изменения коэфф.
корреляции
Вывод:
Полученная по методу умножения последовательность СЧ, имеющих равномерный закон распределения удовлетворяет предъявленным требованиям по качеству и может быть использован в задачах моделирования, т. к.:
1) есть согласованность по критерию Колмогорова
2) числа не зависят друг от друга, о чем говорит график (Рис. 3.)
3.4.1.3. Выбор генератора РРПСЧ
Эффективность статистического моделирования и достоверность полученных результатов находятся в прямой зависимости от качества используемых в модели случайных последовательностей. Под качеством здесь понимается соответствие чисел последовательности заданной функции распределения (плотности распределения) и ее параметрам: М.О. и т.д.; независимость чисел последовательности друг от друга, т.е. отсутствие автокорреляции в последовательности случайных чисел.
Выберем генератор РРПСЧ, который используется для генерации времени между поступлениями заявок от пользователей.
Последовательность чисел, полученных аппаратным способом и хранящихся в файле vihod3.dat не совсем удовлетворяет предъявленным требованиям по качеству, т.к. нет согласия по критериям теоретических и статистических данных.
В пункте 3.4.1.2. мы делая вывод уже говорили о том, что генератор РРПСЧ сформированный программным способом (по методу умножения) можно использовать в задачах моделирования, но для простоты будем использовать встроенную функцию random( ), простую в программировании и имеющую хорошие характеристики.
3.4.2. Моделирование случайных воздействий,
имеющих неравномерное распределение
Для стохастической модели требуются числа распределенные по нормальному закону и по экспоненциальному закону.
Напишем функции формирования чисел по требуемому закону распределения. Эти числа запишем в файл. Оценим качество полученных последовательностей ПСЧ, пользуясь автоматизированной системой analize. Проанализируем результаты исследования и сделаем вывод о качестве каждой последовательности и о возможности их использования в стохастической модели.
Сведения о непрерывных случайных величинах
Закон распределения случайных величин Нормальный N(m,?? Экспоненц-ый ?????????Э???
Аналитическое выражение плотности вероятности f(x) 1 -(x-m) f(x)=-------- e 2? ????????????? ??x f(x)=??e
Определяющие параметры | m | < ?? > 0 ??> 0
Числовые m характеристики D m ? 1/??????????????????????
Алгоритм получения случайной величины ______ xi=????ln z1 cos2??z2 xi+1=????ln z1 cos2??z2 ( m=0; D=1 ) 1 xi=- ---- ln zi ?
Область значений случайной величины
Исследование последовательности нормально распределенных ПСЧ.
(Программа в приложении № 3)
С доверительной вероятностью 0.999 можно утверждать о согласованности теоретических и статистических данных.
Определение характеристик корреляции
????
1
0 ?
5
Рис. 4. График изменения коэффициента корреляции.
Вывод:
Полученная последовательность ПСЧ, имеющая нормальный закон распределения, удовлетворяет предъявленным требованиям по качеству и может быть использована в задачах моделирования, т. к.
- числовые характеристики имеют незначительное отклонение от
теоретических значений,
- по критериям согласия получены удовлетворительные значения
доверительных вероятностей,
- числа последовательности достаточно независимы, о чем свидетельствует
график (Рис. 4.)
Последовательности ПСЧ для 2-го и 3-го пользователей генерируются аналогично, с той лишь разницей, что мат. ожидание у них 17 и 18 соответственно.
Исследование последовательности экспоненциально распределенных ПСЧ
Проверка соответствия чисел последовательности требуемому закону распределения дает следующие результаты:
Критерий Хи-Квадрат:
Значение Х2=2310
С доверительной вероятностью 0.999 можно утверждать о согласованности теоретических и статистических данных.
Критерий Колмогорова:
Максимальная разность max| F(x)-F*(x) | = 0.023
С доверительной вероятностью 0.91 можно утверждать о согласованности теоретических и статистических данных.
Определение характеристик корреляции
????
1
0 ?
5
Рис. 5. График изменения коэффициента корреляции.
Вывод:
Полученная последовательность ПСЧ, имеющих экспоненциальный закон распределения, удовлетворяет предъявленным требованиям по качеству и может быть использована в задачах моделирования, т. к.
- числовые характеристики имеют незначительное отклонение от
теоретических значений,
- по критериям согласия получены удовлетворительные значения
доверительных вероятностей,
- числа последовательности достаточно независимы, о чем свидетельствует
график (Рис. 5.)
3.5. Описание моделирующей программы для
стохастической модели
Преобразуем ранее созданную детерминированную модель вычислительной системы в стохастическую модель. Для этого потребуются следующие изменения детерминированной программы:
- вставим программный генератор РРПСЧ - встроенную функцию random( )
возвращающую РРПСЧ в интервале (0,1) - для определения времени
между приходами пользователей.
- файл norm-1.dat, имеющий нормальный закон распределения с m=16, D=2
для определения времени подготовки задания на 1-ой сетевой машине.
- файл norm-2.dat, имеющий нормальный закон распределения с m=17, D=2
для определения времени подготовки задания на 2-ой сетевой машине.
- файл norm-3.dat, имеющий нормальный закон распределения с m=18, D=2
для определения времени подготовки задания на 3-ей сетевой машине.
- файл expon.dat, имеющий экспоненциальный закон распределения с m=0.8
для определения времени выполнения задания на ЭВМ.
- уберем функции ввода с клавиатуры которые использовались для ввода
параметров системы.
Стохастическая моделирующая программа приведена в Приложении № 4.
4. Получение и интерпретация результатов
моделирования
Значения выходных характеристик, полученные при прогонках модели с различными случайными воздействиями.
Вывод:
Усредненные значения выходной характеристики подтверждают данные детерминированной модели т.к. с введением вероятности прихода второго пользователя равной 0.1 в детерминированную модель теоретическое значение процента выполненных заданий поступивших от второго пользователя становится равным 10 %.
Литература
1. Разработка САПР. № 9
В.М. Черненький. Имитационное моделирование.
2. Лекции по курсу “Моделирование”.
3. Б. Страуструп. Язык программирования С++.
4. Шрайбер Г.Д. Моделирование на GPSS.
5. Е.И. Козелл. от Си к С++.
Приложение № 1
// ЗАДАНИЕ 15. Детерминированная модель системы.
#include
#include
const emb=1; //единица машинного времени
main()
{ int tp=100; //интервал между приходами пользователей
int tgz1=160; //время подготовки задания 1-ым пользователем
int tgz2=170; //время подготовки задания 2-ым пользователем
int tgz3=180; //время подготовки задания 3-им пользователем
int tm=8; //время выполнения задания на ЭВМ
int k=500; //количество промоделированных на ЭВМ заданий
int t=0; //время
char nz=0; //наличие заявки на входе системы
char cikl=0; //цикл прихода заявок
char pz1=0; //подготовка задания на сетевой машине 1
char pz2=0; //подготовка задания на сетевой машине 1
char pz3=0; //подготовка задания на сетевой машине 1
char znw=0; //наличие заявки на выполнение задания
char wz=0; //выполнение задания на ЭВМ
char ocher[50]; //очередь
char n=0; //индекс свободного элемента в очереди
int w2=0; //количество вып. заданий от 2-го пользователя
int ztgz1,ztgz2,ztgz3,ztm,zk; //перем.для запоминания параметров системы
printf("Введите интервал между приходами пользователей "); scanf("%d",&tp);
printf("Введите время подготовки задания 1-ым пользователем ");
scanf("%d",&tgz1); ztgz1=tgz1;
printf("Введите время подготовки задания 2-ым пользователем ");
scanf("%d",&tgz2); ztgz2=tgz2;
printf("Введите время подготовки задания 3-ым пользователем ");
scanf("%d",&tgz3); ztgz3=tgz3;
printf("Введите время выполнения задания на ЭВМ "); scanf("%d",&tm); ztm=tm;
printf("Введите количество промоделированных на ЭВМ заданий ");
scanf("%d",&k); zk=k;
//----------- моделирующий цикл -----------------------------------
while (k!=0)
{ t=t+emb;
//появление пользователя
if (t%tp==0)
switch (cikl)
{ case 0: nz=1; cikl=1; break;
case 1: nz=2; cikl=2; break;
case 2: nz=3; cikl=3; break;
case 3: nz=1; cikl=0;
}
//начало подготовки задания
switch (nz)
{ case 1: pz1=1; nz=0; break;
case 2: pz2=1; nz=0; break;
case 3: pz3=1; nz=0;
}
Приложение № 1 (продолжение)
//подготовка задания
if (pz1==1)
if (tgz1==0) {pz1=0; znw=1; tgz1=ztgz1;} else tgz1=tgz1-emb;
if (pz2==1)
if (tgz2==0) {pz2=0; znw=2; tgz2=ztgz2;} else tgz2=tgz2-emb;
if (pz3==1)
if (tgz3==0) {pz3=0; znw=3; tgz3=ztgz3;} else tgz3=tgz3-emb;
// запрос на выполнение
if (n!=0 && wz==0) { wz=ocher[n-1]; n--; } //если очередь не пуста а ЭВМ свобода
// то выпол. заявку из очереди
if (znw!=0) //если имеется заявка на выполнение
if (wz==0) { wz=znw; znw=0; } //если ЭВМ не занята
else //если ЭВМ занята, то ставим заявку в очередь
{ if (n>=50) { printf("nПереполнение очереди!n"); return 0; }
else { ocher[n]=znw; znw=0; n++; }
}
//выполнение задания на ЭВМ
switch (wz)
{ case 1: if (tm==0) {wz=0; k--; tm=ztm; } else tm=tm-emb; break;
case 2: if (tm==0) {wz=0; k--; w2++; tm=ztm; } else tm=tm-emb; break;
case 3: if (tm==0) {wz=0; k--; tm=ztm; } else tm=tm-emb;
}
}
printf("nПроцент вып. заданий, поступ. от 2-го польз.=%d%",100*w2/zk);
}
procedure expon (a:real ; var x: real);
begin
z1:=random;
x:=-(1/a)*ln(z1);
x:=sqrt(1/sqr(a))*x+0.8;
end;
Begin
clrscr;
assign(f1,'d:tpnorm-1.dat');
rewrite(f1);
assign(f3,'d:tpnorm-2.dat');
rewrite(f3);
assign(f4,'d:tpnorm-3.dat');
rewrite(f4);
writeln(' Нормальный закон:');
for i:=1 to 500 do
begin
norm1(y1,y2); write(f1,y1,' ');write(f1,y2,' ');
norm2(y3,y4); write(f3,y3,' ');write(f3,y4,' ');
norm3(y5,y6); write(f4,y5,' ');write(f4,y6,' ');
Приложение № 3 (продолжение)
end;
close (f1); close (f3); close (f4);
assign(f2,'d:tpexp.dat');
rewrite(f2);
writeln('Экспоненциальный закон ');
writeln('Введите параметр a: '); readln(a);
for i:=1 to 500 do begin expon(a,x);write(f2,x,' '); end;
close(f2);
End.
int ravnom()
{ fscanf(ravn,"%f ",&a);
return int(a*5);
}
int normal1()
{ fscanf(norm1,"%f ",&a);
return int(a*10);
}
int normal2()
{ fscanf(norm2,"%f ",&a);
return int(a*10);
}
int normal3()
{ fscanf(norm3,"%f ",&a);
return int(a*10);
}
int expon()
{ fscanf(exp,"%f ",&a);
return int(a*10);
}
//------------------------- основная программа ----------------------
main()
{ int tp=100; //интервал между приходами пользователей
int tgz1=160; //время подготовки задания 1-ым пользователем
int tgz2=170; //время подготовки задания 2-ым пользователем
int tgz3=180; //время подготовки задания 3-им пользователем
int tm=8; //время выполнения задания на ЭВМ
int k=500; //количество промоделированных на ЭВМ заданий
int t=0; //время
char nz=0; //наличие заявки на входе системы
char cikl=0; //цикл прихода заявок
char pz1=0; //подготовка задания на сетевой машине 1
char pz2=0; //подготовка задания на сетевой машине 1
char pz3=0; //подготовка задания на сетевой машине 1
char znw=0; //наличие заявки на выполнение задания
char wz=0; //выполнение задания на ЭВМ
char ocher[50]; //очередь
char n=0; //индекс свободного элемента в очереди
int w2=0; //количество вып. заданий от 2-го пользователя
//----------- моделирующий цикл -----------------------------------
while (k!=0)
{ t=t+emb;
//появление пользователя
if (t%tp==0)
{ tp=10+ravnom();
fscanf(ravn,"%f ",&a);
if (a
if (a>0.4 && a
if (a>0.5) nz=3;
}
//начало подготовки задания
switch (nz)
{ case 1: pz1=1; nz=0; break;
case 2: pz2=1; nz=0; break;
case 3: pz3=1; nz=0;
}
//подготовка задания
if (pz1==1)
if (tgz1==0) {pz1=0; znw=1; tgz1=normal1();} else tgz1=tgz1-emb;
if (pz2==1)
if (tgz2==0) {pz2=0; znw=2; tgz2=normal2();} else tgz2=tgz2-emb;
if (pz3==1)
if (tgz3==0) {pz3=0; znw=3; tgz3=normal3();} else tgz3=tgz3-emb;
// запрос на выполнение
if (n!=0 && wz==0) { wz=ocher[n-1]; n--; } //если очередь не пуста а ЭВМ свобода
// то выпол. заявку из очереди
if (znw!=0) //если имеется заявка на выполнение
if (wz==0) { wz=znw; znw=0; } //если ЭВМ не занята
else //если ЭВМ занята, то ставим заявку в очередь
{ if (n>=50) { printf("nПереполнение очереди!n"); return 0; }
else { ocher[n]=znw; znw=0; n++; }
}
//выполнение задания на ЭВМ
switch (wz)
{ case 1: if (tm==0) {wz=0; k--; tm=expon(); } else tm=tm-emb; break;
case 2: if (tm==0) {wz=0; k--; w2++; tm=expon(); } else tm=tm-emb; break;
case 3: if (tm==0) {wz=0; k--; tm=expon(); } else tm=tm-emb;
}
}
printf("nПроцент вып. заданий, поступ. от 2-го польз.=%d%",100*w2/500);
fclose(ravn);
fclose(norm1);
fclose(norm2);
fclose(norm3);
fclose(exp);
}