close

Вход

Забыли?

вход по аккаунту

?

Моделир - Лаба№5

код для вставкиСкачать
Министерство высшего и профессионального образования Российской Федерации
Ульяновский Государственный Технический Университет
кафедра "Вычислительная техника"
дисциплина "Моделирование"
Лабораторная работа №5
Выполнил: студент группы ЭВМд-32
Кургузов И.С.
Проверил: Куцоконь Н.С.
Ульяновск 2002.
Стохастические сетевые модели вычислительных систем
Цель работы. Изучение стохастических сетевых моделей вычислительных систем (ВС) и выполнение расчета основных характеристик экспоненциальной стохастической сети. Структурная схема сети на основе матрицы коэффициентов передач имеет вид:
ЗАДАНИЕ
Рассчитать основные характеристики и построить структурную схему разомкнутой стохастической сети, представленной совокупностью систем массового обслуживания (СМО) и заданной в виде матрицы вероятностей передач 6-го порядка.
Определению подлежат следующие характеристики стационарного режима разомкнутой стохастической сети :
а) загрузка каждой СМО (ri);
б) среднее число занятых каналов каждой СМО (bi);
в) вероятности состояния сети (p0i)
г) средние длины очередей заявок, ожидающих обслуживания в СМО;
д) среднее число заявок m1 ..mi , пребывающих в каждой из систем сети;
е) средние времена пребывания u1..ui заявок в системах S1 ..Si ;
ж) характеристики сети в целом.
В соответсвии с заданным вариантом решения задачи произвести численное определение Р1i..Р5i. Составить матрицу вероятности передач, дополнив некоторые клетки матрицы значениями Рji так, чтобы выполнялось условие Результаты (таблица переходов):
12345678|->S[0]S[0]->S[1]|->S[0]S[2]->S[3]S[1]->S[0]S[1]->S[0]S[4]->S[2]S[1]->S[2]|->S[0]S[2]->S[3]S[1]->S[0]S[0]->S[1]S[4]->S[1]S[3]->S[5]S[1]->S[0]S[1]->S[0]|->S[0]S[1]->S[5]S[0]->S[1]S[0]->S[1]S[1]->S[2]S[4]->S[3]S[2]->S[1]S[2]->S[1]S[0]->S[1]|->S[0]|->S[0]S[0]->S[1]S[1]->S[0]S[5]->S[1]S[1]->S[2]S[1]->S[0]|->S[0]|->S[0]|->S[0]S[1]->S[0]S[2]->S[4]S[1]->S[2]S[1]->S[0]S[1]->S[0]|->S[0]S[0]->S[1]|->S[0]S[3]->S[5]S[1]->S[0]S[5]->S[3]S[2]->S[3]S[1]->S[0]S[0]->S[1]|->S[0]|->S[0]S[5]->S[1]S[4]->S[1]S[3]->S[5]S[1]->S[0]S[1]->S[0]|->S[0]|->S[0]S[0]->S[1]S[0]->S[1]S[1]->S[2]S[2]->S[1]S[3]->S[5]S[1]->S[0]|->S[0]S[0]->S[1]|->S[0]S[0]->S[1]S[2]->S[5]S[1]->S[2]S[1]->S[0]S[1]->S[5]S[0]->S[1]|->S[0]|->S[0]S[0]->S[1]S[1]->S[0]S[3]->S[5]S[5]->S[1]S[1]->S[0]|->S[0]|->S[0]|->S[0]S[1]->S[3]S[1]->S[0]S[5]->S[3]S[1]->S[4]S[5]->S[1]|->S[0]S[3]->S[5]|->S[0]S[5]->S[4]S[5]->S[1]S[1]->S[0]S[1]->S[0]S[1]->S[2]S[0]->S[1]S[0]->S[1]|->S[0]S[3]->S[5]S[1]->S[0]S[2]->S[5]S[4]->S[1]S[2]->S[3]S[1]->S[0]S[5]->S[1]S[0]->S[1]S[0]->S[1]S[1]->S[0]S[5]->S[1]S[1]->S[2]S[1]->S[3]|->S[0]|->S[0]S[1]->S[0]S[0]->S[1]S[1]->S[0]S[3]->S[5]S[2]->S[4]S[1]->S[4]|->S[0]S[1]->S[0]S[0]->S[1]S[0]->S[1]S[1]->S[0]S[1]->S[4]S[1]->S[0]S[4]->S[1]S[0]->S[1]|->S[0]S[0]->S[1]S[1]->S[0]S[1]->S[0]S[5]->S[1]S[1]->S[0]S[3]->S[5]|->S[0]|->S[0]S[0]->S[1]S[3]->S[5]S[1]->S[0]S[4]->S[1]S[4]->S[1]S[1]->S[0]|->S[0]|->S[0]S[1]->S[0]S[4]->S[2]S[1]->S[3]S[1]->S[0]S[1]->S[3]S[5]->S[1]|->S[0]S[0]->S[1]S[0]->S[1]S[5]->S[1]S[3]->S[5]S[5]->S[2]S[3]->S[5]S[3]->S[5]|->S[0]|->S[0]S[0]->S[1]S[0]->S[1]S[1]->S[3]S[1]->S[3]S[1]->S[5]S[1]->S[0]S[0]->S[1]S[0]->S[1]S[0]->S[1]S[0]->S[1]S[5]->S[1]S[2]->S[3]S[5]->S[4]S[5]->S[1]|->S[0]|->S[0]S[1]->S[0]S[0]->S[1]S[1]->S[4]S[3]->S[5]S[1]->S[0]S[1]->S[0]|->S[0]|->S[0]S[0]->S[1]S[1]->S[3]S[3]->S[5]S[1]->S[0]S[4]->S[1]S[1]->S[0]|->S[0]|->S[0]S[0]->S[1]S[5]->S[1]S[4]->S[1]S[3]->S[1]S[5]->S[1]S[1]->S[0]|->S[0]|->S[0]S[0]->S[1]S[0]->S[1]S[5]->S[1]S[5]->S[2]S[1]->S[0]S[1]->S[0]|->S[0]S[5]->S[1]S[1]->S[3]S[2]->S[3]S[1]->S[2]S[1]->S[2]S[1]->S[0]S[1]->S[0]|->S[0]S[0]->S[1]S[0]->S[1]S[0]->S[1]S[1]->S[0]S[1]->S[0]S[1]->S[0]S[1]->S[0]S[1]->S[0]S[1]->S[0]S[0]->S[1]S[0]->S[1]S[2]->S[3]S[2]->S[3]S[1]->S[0]S[1]->S[0]S[0]->S[1]|->S[0]S[0]->S[1]S[3]->S[5]S[1]->S[0]S[1]->S[0]S[1]->S[5]S[1]->S[3]|->S[0]|->S[0]S[3]->S[5]S[1]->S[2]S[3]->S[5]S[3]->S[5]S[5]->S[1]S[3]->S[5]|->S[0]S[0]->S[1]S[1]->S[4]S[0]->S[1]S[1]->S[3]S[2]->S[3]S[1]->S[2]S[1]->S[2]|->S[0]|->S[0]S[0]->S[1]S[0]->S[1]S[5]->S[3]S[1]->S[5]S[1]->S[3]S[1]->S[3]S[0]->S[1]|->S[0]S[0]->S[1]S[5]->S[4]S[1]->S[0]S[5]->S[1]S[2]->S[3]S[3]->S[5]|->S[0]S[0]->S[1]S[0]->S[1]S[0]->S[1]S[3]->S[5]S[3]->S[5]S[3]->S[5]S[1]->S[2]|->S[0]|->S[0]S[5]->S[1]S[0]->S[1]S[1]->S[3]S[1]->S[0]S[1]->S[0]S[5]->S[1]|->S[0]|->S[0]S[4]->S[2]S[3]->S[5]S[5]->S[3]S[5]->S[4]S[5]->S[2]S[1]->S[0]S[0]->S[1]S[0]->S[1]S[1]->S[2]S[1]->S[0]S[3]->S[5]S[1]->S[2]S[3]->S[5]S[5]->S[1]|->S[0]|->S[0]S[0]->S[1]S[2]->S[1]S[1]->S[2]S[4]->S[1]S[1]->S[4]S[1]->S[0]|->S[0]S[1]->S[0]S[0]->S[1]S[0]->S[1]S[5]->S[4]S[5]->S[1]S[2]->S[3]S[1]->S[3]S[1]->S[0]|->S[0]S[0]->S[1]S[0]->S[1]S[3]->S[5]S[2]->S[3]S[5]->S[1]S[2]->S[4]|->S[0]|->S[0]S[2]->S[1]S[4]->S[1]S[1]->S[3]S[1]->S[4]S[1]->S[2]S[3]->S[5]S[0]->S[1]S[0]->S[1]S[0]->S[1]S[0]->S[1]S[2]->S[4]S[3]->S[5]S[4]->S[1]S[1]->S[2]|->S[0]|->S[0]S[1]->S[2]S[5]->S[2]S[3]->S[1]S[1]->S[2]S[2]->S[3]S[2]->S[3]|->S[0]|->S[0]S[0]->S[1]S[1]->S[0]S[4]->S[1]S[4]->S[1]S[3]->S[5]S[5]->S[1]S[0]->S[1]|->S[0]S[0]->S[1]S[0]->S[1]S[5]->S[2]S[5]->S[4]S[1]->S[2]S[3]->S[1]|->S[0]S[0]->S[1]S[2]->S[3]S[0]->S[1]S[1]->S[0]S[2]->S[3]S[3]->S[5]S[2]->S[3]|->S[0]|->S[0]S[0]->S[1]S[0]->S[1]S[3]->S[5]S[1]->S[3]S[5]->S[1]S[3]->S[5]|->S[0]|->S[0]S[1]->S[0]S[0]->S[1]S[4]->S[1]S[4]->S[1]S[1]->S[0]S[4]->S[1]|->S[0]|->S[0]S[0]->S[1]S[2]->S[5]S[2]->S[3]S[3]->S[5]S[2]->S[3]S[5]->S[1]|->S[0]|->S[0]S[0]->S[1]S[1]->S[0]S[5]->S[3]S[1]->S[5]S[5]->S[1]S[1]->S[0]|->S[0]S[0]->S[1]S[1]->S[0]S[0]->S[1]S[1]->S[0]S[5]->S[1]S[1]->S[0]S[1]->S[0]S[0]->S[1]|->S[0]S[2]->S[3]S[0]->S[1]S[3]->S[5]S[3]->S[5]S[3]->S[5]S[1]->S[0]S[1]->S[2]S[1]->S[0]S[0]->S[1]S[0]->S[1]S[1]->S[0]S[1]->S[0]S[1]->S[0]S[1]->S[0]|->S[0]|->S[0]S[3]->S[5]S[0]->S[1]S[3]->S[5]S[5]->S[1]S[5]->S[1]S[1]->S[0]|->S[0]|->S[0]S[0]->S[1]S[0]->S[1]S[5]->S[2]S[1]->S[2]S[1]->S[5]S[1]->S[3]|->S[0]S[0]->S[1]S[0]->S[1]S[0]->S[1]S[1]->S[2]S[5]->S[1]S[1]->S[3]S[3]->S[5]|->S[0]|->S[0]S[0]->S[1]S[0]->S[1]S[5]->S[2]S[1]->S[0]S[5]->S[1]S[1]->S[2]S[0]->S[1]|->S[0]S[1]->S[3]S[1]->S[0]S[2]->S[3]S[2]->S[4]S[3]->S[5]S[5]->S[1]|->S[0]S[0]->S[1]S[3]->S[5]S[5]->S[1]S[1]->S[0]S[1]->S[0]S[1]->S[0]S[2]->S[3]|->S[0]|->S[0]S[5]->S[2]S[0]->S[1]S[3]->S[5]S[4]->S[2]S[5]->S[1]S[3]->S[5]S[0]->S[1]|->S[0]S[0]->S[1]S[0]->S[1]S[2]->S[3]S[1]->S[3]S[1]->S[0]S[5]->S[1]|->S[0]|->S[0]S[0]->S[1]S[0]->S[1]S[1]->S[0]S[2]->S[1]S[1]->S[0]S[1]->S[0]|->S[0]|->S[0]S[0]->S[1]S[1]->S[0]S[2]->S[3]S[3]->S[5]S[1]->S[0]S[1]->S[0]|->S[0]S[0]->S[1]S[1]->S[3]S[1]->S[2]S[5]->S[4]S[1]->S[4]S[1]->S[0]S[1]->S[0]|->S[0]|->S[0]S[3]->S[5]S[2]->S[4]S[3]->S[5]S[1]->S[0]S[1]->S[0]S[1]->S[0] |->S[0]S[5]->S[1] S[5]->S[1]S[1]->S[0] Характеристики:
Для каждой СМО:
S[0]:S[1]:S[2]:S[3]:S[4]:S[5]:Intensity0,00690,00410,0130,01140,03010Business0,00690,01220,03890,03430,09030,0001Idle coefficient0,99310,98780,96110,96570,90971,0001Msg count32,147238,33230,10,075030840,48Queue wait time2334,0058236,61146,8105,225372918,75Transfere coefficient10,58721,87961,6584,36120,0053Общие:
* Среднее число заявок, находящихся на обслуживании в сети
* Среднее время ожидания в сети
M30911,14W21678,67
Исходные тексты программы-модели:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <math.h>
const N = 100;
const double p = 0.71;
FILE *file;
double fact(int a);
double C(int m, int n);
double P(int x);
double F(int x);
double binom_rnd();
int get_channel(int J_index);
class MSG
{
public:
int type;
int user;
int length;
int time;
long start_time;
int queue_time;
MSG();
void print();
void fprint(FILE *file);
private:
int rnd_type();
int rnd_user(int);
int rnd_length(int);
int rnd_time(int);
};
class CQueue
{
MSG *queue[100];
MSG *channel;
float msg_time;
public:
int delay;//channel work delay
int nParsed;//number of already parsed items
int nCount;//number of elements in the queue
MSG *Export_msg;//value to get from the channel
public://properties:
int type_cnt_1,type_cnt_4;
long queue_time;
long total_msg;
int total_cnt;
//---------------------
float intensity;//1
float business;//2
float idle;//3
float msg_cnt;//5
float queue_wait;//6
float transfere;//8
public:
CQueue();
int push(MSG *msg, long cur_time);
int CheckChannel(long time);
int pop(MSG *msg, long cur_time);
void print_stat(FILE *file,float int0);
//void send
};
void main()
{
randomize();
file = fopen("#data.txt","wt");
printf("Laboratory work by modelling N 5...\n");
printf("\tDesigned by @lien.\n");
int i,x,l,u;
//int last_time[4] = {0,0,0,0};
//int IdleTime[4] = {0,0,0,0};
//float TotalTime[4] = {0,0,0,0};
//int TypeCnt[4] = {0,0,0,0};
//int QueueTime[4] = {0,0,0,0};
//float M[4] = {0,0,0,0};
//int SystemTime[4] = {0,0,0,0};
//float D[4] = {0,0,0,0};
//float BusyCf[4] = {0,0,0,0};
//float Intens[4] = {0,0,0,0};
//int MaxLength[4] = {0,0,0,0};
//int User[4][5];
//memset(User,0,sizeof(int[4][5]));
long QueueLen = 0;
int QueueCnt = 0;
long total_time = 0;
// main table:
printf("Initializing...");
MSG *msg = new MSG[100];
int start_time_tmp = 0;
for (i = 0; i < 100; i++, start_time_tmp += random(50))
msg[i].start_time = start_time_tmp;
printf("done.\n");
CQueue *S = new CQueue[6];
S[0].delay = 1.0; //second
for (i = 1; i < 6; i++) S[i].delay = 3.0; //seconds
//int start_time_tmp = 0;
total_time = 0;
/////////////////////////////////////////////////////////////////
fprintf(file,"System\tDirection\tTime\tType\tUser\
tLength\tStartTime\tTimeInQueue\tTimeInChannel\n");
int index;
int lastI = 0;
int nLeftCount = 0;
MSG *tmp_msg;
for (long t = 0; /**/nLeftCount < 100/**S[0].nParsed < 100/**/; t++)
{
for (i = lastI; i < 100; i++)
if (t == msg[i].start_time)
{
lastI = i;
fprintf(file,"|->S[0]\n");
S[0].push(&(msg[lastI]),t);
lastI++;
QueueLen += S[0].nCount;
QueueCnt++;
}
for (i = 0; i < 6; i++)
{
S[i].CheckChannel(t);
tmp_msg = S[i].Export_msg;
/**/
if (tmp_msg != NULL)
{
index = get_channel(i);
fprintf(file,"S[%d]->S[%d]\n",i,index);
if (index == 0)
{
nLeftCount++;
//fprintf(file,"\n");
}
else
{
//fprintf(file,"\t");
S[index].push(tmp_msg,t);
}
}
/**/
}
printf("parsed = %2d; Left = %2d\r",S[0].nParsed,nLeftCount);
total_time = t;
}
fprintf(file,"S[0]:\n");
S[0].print_stat(file,1.0/(S[0].type_cnt_1*0.83 +
S[0].type_cnt_4*0.17));
for (i = 1; i < 6; i++)
{
fprintf(file,"S[%d]:\n",i);
S[i].print_stat(file,S[0].intensity);
}
float M = 0.0, W = 0.0;
for (i = 0; i < 6; i++)
{
M += S[i].msg_cnt;
W += S[i].transfere*S[i].queue_wait;
}
fprintf(file,"M\t%2.2f\nW\t%2.2f",M,W);
printf("\nPress any key to continue...");
fclose(file);
getch();
}
double fact(int a)
{
double f = 1;
for (int i = 1; i <= a; i++) f *= i;
return f;
}
double C(int m, int n)
{
return fact(n)/(fact(m)*fact(n-m));
}
double P(int x)
{
return C(x,N)*exp(x*log(p))*exp((N-x)*log(1-p));
}
double F(int x)
{
double sum = 0.0;
for (int i = 1; i < x; i++)
sum += P(i);
return sum;
}
double binom_rnd()
{
double rj = (double)random(10001)/10000.0;
int x,xprev = 1;
for (x = 2; x < N; xprev = x, x++)
if ((F(xprev) < rj) && (rj <= F(x))) break;
return xprev + (rj-F(x))/(F(x)-F(xprev))*(x-xprev);
}
int get_channel(int J_index)
{
int x = random(101);
switch (J_index)
{
case 0:
return 1;
case 1:
if ((x >= 0)&&(x <= 60)) return 0;//exit all system
else if ((x > 60)&&(x <= 80)) return 2;
else if ((x > 80)&&(x <= 91)) return 3;
else if ((x > 91)&&(x <= 96)) return 4;
else if ((x > 96)&&(x <= 100)) return 5;
case 2:
if ((x >= 0)&&(x <= 11)) return 1;
else if ((x > 11)&&(x <= 81)) return 3;
else if ((x > 81)&&(x <= 89)) return 4;
else if ((x > 89)&&(x <= 100)) return 5;
case 3:
if ((x >= 0)&&(x <= 13)) return 1;
else return 5;
case 4:
if ((x >= 0)&&(x <= 54)) return 1;
else if ((x > 54)&&(x <= 90)) return 2;
else if ((x > 90)&&(x <= 94)) return 3;
else if ((x > 94)&&(x <= 100)) return 5;
case 5:
if ((x >= 0)&&(x <= 60)) return 1;
else if ((x > 60)&&(x <= 80)) return 2;
else if ((x > 80)&&(x <= 90)) return 3;
else if ((x > 90)&&(x <= 100)) return 4;
default:
return 0;
}
}
/////////////////MSG/////////////////////////////////////
MSG::MSG()
{
type = rnd_type();
user = rnd_user(type);
length = rnd_length(type);
time = rnd_time(type);
start_time = 0;
queue_time = 0;
}
void MSG::print()
{
printf("type=%1d;user=%1d;len=%2d;s_time=%4d;
q_time=%3d;time=%2d\n",type,user,length,start_time,
queue_time,time);
}
void MSG::fprint(FILE *file)
{
fprintf(file,"%1d\t%1d\t%2d\t%4d\t%3d\t
%2d\n",type,user,length,start_time,queue_time,time);
}
int MSG::rnd_type()
{
int x = random(101);
if ((x >= 0)&&(x <= 83)) return 1;
else if ((x > 83)&&(x <= 100)) return 4;
return -1;
}
int MSG::rnd_user(int ntype)
{
int x = random(101);
switch (ntype)
{
case 1:
if ((x >= 0)&&(x <= 62)) return 1;
else if ((x > 62)&&(x <= 89)) return 3;
else if ((x > 89)&&(x <= 98)) return 4;
else if ((x > 98)&&(x <= 100)) return 5;
case 2:
case 3:
case 4:
if ((x >= 0)&&(x <= 59)) return 1;
else if ((x > 59)&&(x <= 75)) return 2;
else if ((x > 75)&&(x <= 81)) return 3;
else if ((x > 81)&&(x <= 89)) return 4;
else if ((x > 89)&&(x <= 100)) return 5;
default:
return 0;
}
}
int MSG::rnd_length(int ntype)
{
int Length = 0;
int x = random(50)-25;
switch (ntype)
{
case 1:
Length = (int)binom_rnd();
return Length;
case 2:
case 3:
case 4:
Length = 68;
return Length + x;
}
return 0;
}
int MSG::rnd_time(int ntype)
{
switch (ntype)
{
case 1:
return (int)binom_rnd();
case 2:
case 3:
case 4:
return random(100);
}
return 0;
}
///////////////////////////////////////////////////////////
CQueue::CQueue()
{
channel = NULL;
for (int i = 0; i < 100; i++) queue[i] = NULL;
nCount = 0;
msg_time = 0;
nParsed = 0;
delay = 1;
}
int CQueue::push(MSG *msg, long cur_time)
{
//statistics--------------
if (msg->type == 1) type_cnt_1++;
else if (msg->type == 4) type_cnt_4++;
//------------------------
msg->start_time = cur_time;
if (channel == NULL)
{
channel = msg;
msg_time = (float)msg->time;
//fprintf(file,"Channel\t%4d\t",cur_time);
//msg->fprint(file);
//nParsed++;
return 1;
}
else
{
int no = nCount;
//pushing to queue:
for(int i = 0; i < nCount; i++)
if (queue[i]->type > msg->type)
{
no = i;
for (int j = nCount-1; j >= no; j--)
queue[j+1] = queue[j];
break;
}
nCount++;
queue[no] = msg;
//fprintf(file,"*Queue*\t%4d\t",cur_time);
//queue[no]->fprint(file);
return 0;
}
}
int CQueue::CheckChannel(long time)
{
Export_msg = NULL;
if (channel != NULL)
{
if (msg_time <= 0.0)
{
Export_msg = channel;
channel = NULL;
nParsed++;
}
else
{
msg_time -= 1.0/delay;
return 0;
}
}
else //channel == NULL
{
if (nCount > 0)
{
pop(queue[0], time);
}
}
return 1;
}
int CQueue::pop(MSG *msg, long cur_time)
{
if (channel != NULL) return 0;
channel = msg;
msg_time = (float)msg->time;
msg->queue_time = cur_time - msg->start_time;
for (int i = 0; i < nCount; i++)
queue[i] = queue[i+1];
nCount--;
//fprintf(file,"-\tChannel\t%4d\t",cur_time);
//msg->fprint(file);
//statistics--------------
queue_time += msg->queue_time;
total_msg += nCount;
total_cnt++;
//------------------------
return 1;
}
void CQueue::print_stat(FILE *file, float int0)
{
intensity = 1.0/(type_cnt_1*0.83 + type_cnt_4*0.17);
business = intensity*(float)delay/1.0;
idle = 1.0 - business;
msg_cnt = (float)total_msg/(float)total_cnt;
queue_wait = (float)queue_time/(float)total_cnt;
transfere = intensity/int0;
fprintf(file,"Intensity\t%2.4f\n",intensity);
fprintf(file,"Business\t%2.4f\n",business);
fprintf(file,"Idle coefficient\t%2.4f\n",idle);
fprintf(file,"Msg count\t%2.4f\n",msg_cnt);
fprintf(file,"Queue wait time\t%2.4f\n",queue_wait);
fprintf(file,"Transfere coefficient\t%2.4f\n",transfere);
} Вывод:
Таким образом, я построил стахостическую сетевую модель системы массового обслуживания, состоящей из пяти подсистем, рассмотренных в лабораторной работе №4, которые взаимодействуют между собой, обмениваясь заявками согласно матрице вероятности передач:
S0 S1 S2 S3 S4 S5 S0 0 1 0 0 0 0 S1 0,6 0 0,20 0,11 0,05 0,04 S2 0 0,11 0 0,70 0,08 0,11 S3 0 0,13 0 0 0 0,87 S4 0 0,54 0,36 0,04 0 0,06 S5 0 0,6 0,2 0,1 0,1 0
1
Документ
Категория
Компьютеры, Программирование
Просмотров
41
Размер файла
170 Кб
Теги
моделирование, моделир, лабы, лаба
1/--страниц
Пожаловаться на содержимое документа