Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
iStark
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 10
#1

Адаптация примера из книги под Visual Studio - C++

24.12.2013, 14:41. Просмотров 412. Ответов 7
Метки нет (Все метки)

Есть книга по объектно-ориентированному моделированию Ильи Труба, там примеры кажется написанные в dev c++.
Не могу запустить в vs2012 пример из 9 главы.
http://www.piter.com/download/978546900893 - все листинги здесь.

9-1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
#include<cstdio>
#include<ctime>
#include "erlang.h"       //генераторы распределений Эрланга
                          //и экспоненциального
#include "normal.h"       //генератор нормального распределения
#include "random.h"
FILE *qu1;                //файл для сбора статистики о длине очереди
                          //на погрузку
FILE *qu2;                //файл для сбора статистики о длине очереди
                          //на разгрузку
enum states {Que_Fuller=1,Full,Full_Move,Que_Emptier,Empty,Empty_Move};
int S=4;                  //количество самосвалов
int completed=0;          //счетчик разгруженных самосвалов
float que1_ave=0;         //счетчик средней длины очереди на погрузку
float que2_ave=0;         //счетчик средней длины очереди на разгрузку
long int total;           //счетчик общего времени моделирования
float ro_fuller=0;        //счетчик средней загрузки пункта погрузки
long int ro_buld=0L;      //счетчик средней загрузки бульдозера
float ro_emptier=0;       //счетчик средней загрузки пункта разгрузки
long int path_full=0L;    //счетчик времени, проведенного самосвалами в пути
                          //на разгрузку
long int path_empty=0L;   //счетчик времени, проведенного самосвалами 
                          //в пути на погрузку
long int take=0L;         //счетчик времени, проведенного в пункте погрузки
long int give=0L;         //счетчик времени, проведенного в пункте разгрузки
class HeavyCar
{
 const static float direct_ave=22.0;
 const static float direct_disp=3.0;
 const static float back_ave=18.0;
 const static float back_disp=3.0;
 int id;                  //порядковый номер самосвала
 enum states   state;                 //текущее состояние самосвала
 int to_pfull;            //время до прибытия в пункт разгрузки
 int to_pempty;           //время до прибытия в пункт погрузки
 void *f;                 //указатель на пункт погрузки
 void *e;                 //указатель на пункт разгрузки
 public:
//Пункты погрузки и разгрузки будут манипулировать самосвалами
 friend class Fuller;
 friend class Emptier;
 HeavyCar(int i);         //метод-конструктор
 void putFuller(Fuller *f1); 
 void putEmptier(Emptier *e1);
 void run();              //метод-диспетчер
 void Print();
 int State() { return(state); }
};
class Fuller
{
 const static int volume=2;
 const static float mu=0.25;
 const static int rest=300;
 float *perf;               //массив производительностей погрузчиков
 int to_buldoser;           //время до завершения работы бульдозера
 int *to_full;              //массив времен до завершения погрузки,
                            //-1 - в случае простоя
 HeavyCar **serving;        //массив указателей на загружаемые самосвалы
 HeavyCar **queue;          //массив указателей на самосвалы, ждущие
                            //в очереди
 int *to_rest;              //массив времен до завершения отдыха,
                            //-1 в случае, если погрузчик находится
                            //не в состоянии отдыха
 int *isHeap;               //массив признаков того, готова ли куча земли
                            //для погрузчика
 public: 
 Fuller(HeavyCar **h);      //метод-конструктор
 ~Fuller();                 //метод-деструктор
 void GroundReady();        //обработчик события: бульдозер подготовил кучи 
 void Complete(int i);      //обработчик события: i-й погрузчик завершил
                            //погрузку
 void RestComplete(int i);  //обработчик события: i-й погрузчик "отдохнул"
 void Arrival(HeavyCar *h); //обработчик события: прибыл самосвал h
 int BestAvail();           //выбор наилучшего свободного погрузчика
 void Print();              //вывод на печать содержимого объекта
 int qLength();             //вычисление текущей длины очереди
 int State(int i);          //вычисление состояния i-го погрузчика
 int Busy();                //вычисление количества занятых погрузчиков
 void run();                //метод-диспетчер
};
class Emptier
{
 const static int volume=1;
 const static int border1=120;
 const static int border2=480;
 int *to_empty;             //массив времен до завершения разгрузки,
                            //-1 в случае простоя
 HeavyCar **serving;        //массив указателей на разгружаемые самосвалы
 HeavyCar **queue;          //массив указателей на самосвалы, ждущие
                            //в очереди
 public: 
 Emptier();                 //метод-конструктор
 ~Emptier();                //метод-деструктор
 void Complete(int i); //обработчик события: i-й самосвал завершил разгрузку
 void Arrival(HeavyCar *h); //обработчик события: прибыл самосвал h
 void Print();              //печать содержимого объекта
 int qLength();
 int Busy();
 int FirstAvail();          //выбор первого по порядку свободного
                            //разгрузчика
 void run();                //метод-диспетчер
};
 
HeavyCar::HeavyCar(int i)
{
 id=i;
 state=Que_Fuller;          //первоначально все самосвалы стоят в очереди
                            //на погрузку
 to_pfull=-1;
 to_pempty=-1;
}
void HeavyCar::putFuller(Fuller *f1)
{
 f=f1;
}
void HeavyCar::putEmptier(Emptier *e1)
{
 e=e1;
}
void HeavyCar::Print()
{
 switch(state)
 {
  case Que_Fuller: printf("Самосвал %d находится в очереди на погрузку\n", id); break;
  case Full: printf("Самосвал %d загружается\n", id); break;
  case Full_Move: printf("Самосвал %d движется с грузом. Прибудет на разгрузку через %.1f минут\n", id, ((float)to_pfull)/60); break;
  case Que_Emptier: printf("Самосвал %d находится в очереди на разгрузку\n", id); break;
  case Empty: printf("Самосвал %d разгружается\n", id); break;
  case Empty_Move: printf("Самосвал %d движется порожний. Прибудет на погрузку через %.1f минут\n", id, ((float)to_pempty)/60); break;
 }
}
void HeavyCar::run()
{
 if (state==3)                    //груженый самосвал находится в пути
 {
  to_pfull--;
  if (to_pfull==0)                //самосвал прибыл в пункт разгрузки
  { 
   to_pfull=-1; 
   ((Emptier*)e)->Arrival(this);  //сообщаем об этом в пункт разгрузки
  }
 }
 else if (state==Empty_Move)      //порожний самосвал находится в пути
 {
  to_pempty--;
  if (to_pempty==0)               //самосвал прибыл в пункт погрузки
  { 
   to_pempty=-1; 
   ((Fuller*)f)->Arrival(this);   //сообщаем об этом пункту погрузки
  }
 }
 else;                            //обработка других состояний самосвала -
                                  //в других классах
//Инкремент счетчика общего времени пребывания самосвалов в различных //состояниях
 switch(state)
 {
  case Que_Fuller: take++; break;         //очередь на погрузку
  case Full: take++; break;             //погрузка
  case Full_Move: path_full++;  break;    //путь к пункту разгрузки
  case Que_Emptier: give++; break;        //очередь на разгрузку
  case Empty: give++;       break;      //разгрузка
  case Empty_Move: path_empty++; break;   //путь к пункту погрузки
 }
 return;
}
Fuller::Fuller(HeavyCar **h)
//В начальном состоянии все погрузчики простаивают, все самосвалы ждут 
//в очереди, бульдозеры приступают к работе
{
 int i; 
 to_buldoser=(int)(get_erlang(mu,volume,0.001)*60);
 to_full=new int[volume];
 to_rest=new int[volume];
 perf=new float[volume];
 isHeap= new int[volume];
 serving=new HeavyCar *[volume];
 queue=new HeavyCar *[S];
 perf[0]=0.0714;   //производительность первого погрузчика - 1/14 самосвала
                   //в минуту
 perf[1]=0.0833;   //производительность второго - 1/12 самосвала в минуту
 for(i=0;i<volume;i++)
 {
  to_full[i]=-1;
  to_rest[i]=-1;
  isHeap[i]=0;
  serving[i]=NULL;
 }
 for(i=0;i<S;i++)
   queue[i]=h[i];
}
Fuller::~Fuller()
{
 delete[] to_full;
 delete[] perf;
 delete[] isHeap;
 delete[] to_rest;
 delete [] serving;
 delete [] queue;
}
void Fuller::Print()
{
 int i;
 if (to_buldoser>0) printf("Бульдозер работает. Подготовит фронт работ через %d минут\n", to_buldoser/60);
 else printf("Бульдозер не работает\n");
 printf("В очереди на погрузку - %d самосвалов\n", qLength());
 for(i=0;i<S;i++)
 {
  if (!queue[i]) break;
  printf("%d-й в очереди - самосвал № %d\n", i+1, queue[i]->id); 
 }
 for(i=0;i<volume;i++)
 {
  switch(State(i))
  {
   case 1:
   printf("%d-й погрузчик работает. Он обслуживает самосвал № %d. До окончания погрузки %d минут\n",i+1,serving[i]->id,to_full[i]/60);
   case 2: 
    printf("%d-й погрузчик отдыхает. До окончания отдыха %d минут\n",i+1,to_rest[i]/60);
   case 3:
    printf("%d-й погрузчик простаивает.\n",i+1);
  }
 }
 return;
}
int Fuller::State(int i)
//Вычисление состояния i-го погрузчика 
{
 if (serving[i]!=NULL) return(1);   //работает
 if (to_rest[i]>0) return(2);       //отдыхает после погрузки
 return(3);                         //свободен
}
int Fuller::qLength()
{
 int i;
 for(i=0;i<S;i++)
  if (queue[i]==NULL) return(i);
 return(S);                         //все места в очереди заняты
} 
int Fuller::BestAvail()
{
 float max=0; 
 int k=-1;
 for(int i=0;i<volume;i++)
 {
//Нас интересуют только погрузчики, которые свободны и имеют //подготовленную кучу земли. Их них выбираем наилучший
  if ((State(i)==3)&&(perf[i]>max)&&(isHeap[i]==1))
  {
   max=perf[i];
   k=i;
  }
 }
 return(k); 
}
int Fuller::Busy()
{
 int k=0;
 for(int i=0;i<volume;i++)
  if (State(i)==1) k++;  
 return(k);
}
void Fuller::GroundReady()
{
 int i, k, mi, j;
//Возле каждого погрузчика появилась куча земли
 for(i=0;i<volume;i++)
  isHeap[i]=1; 
 to_buldoser=-1;                         //бульдозер прекращает работу
//На обслуживание поступает количество самосвалов, равное значению минимума //длины очереди и числа погрузчиков
 if (qLength()<volume) mi=qLength();
 else mi=volume;
 for(j=0;j<mi;j++)
 {
 k=BestAvail();                          //выбираем наилучший из доступных
                                         //погрузчиков
 if (k==-1) return; 
 to_full[k]=(int)(get_exp(perf[k])*60);  //разыгрываем длительность погрузки
 serving[k]=queue[0];                    //ставим на погрузку первый
                                         //самосвал из очереди
 queue[0]->state=Full;                 //переводим этот самосвал
                                         //в состояние погрузки
 for(i=0;i<(S-1);i++)                    //продвижение очереди
  queue[i]=queue[i+1]; 
 queue[S-1]=NULL;
 }
}
void Fuller::Arrival(HeavyCar *h)        //в пункт погрузки прибыл пустой
                                         //самосвал
{
 int k, p;
 k=BestAvail();                          //выбираем наилучший из доступных 
                                         //погрузчиков
 if (k==-1)                              //такового нет, ставим самосвал
                                         //в очередь
 {
  p=qLength();
  queue[p]=h;
  queue[p]->state=Que_Fuller;
 }
 else                           //ставим самосвал на обслуживание
 {
  to_full[k]=(int)(get_exp(perf[k])*60);  
  serving[k]=h;
  serving[k]->state=Full;
 } 
}
void Fuller::Complete(int i)    //i-й погрузчик завершил погрузку
{
 int j;
 to_rest[i]=rest;               //i-й погрузчик приступил к отдыху
 isHeap[i]=0;
 to_full[i]=-1;                 //i-й погрузчик временно не занимается
                                //погрузкой
 serving[i]->state=Full_Move;   //изменяем состояние загруженного самосвала
//Разыгрываем для загруженного самосвала время в пути до пункта разгрузки
serving[i]->to_pfull=(int)(get_normal(serving[i]->direct_ave,  serving[i] -> direct_disp,0.001)*60); 
 serving[i]=NULL;               //на i-м погрузчике самосвала нет
//Проверяем, все ли погрузчики освободились
 for(j=0;j<volume;j++)
  if (isHeap[j]==1) break;
 if (j==volume)                 //все освободились, запускаем бульдозер
  to_buldoser=(int)(get_erlang(mu,volume,0.001)*60);  
}
void Fuller::RestComplete(int i)
{
 int k;
 to_rest[i]=-1;                 //отдых завершен
 if (qLength()==0) return;      //самосвалов нет, делать погрузчику нечего
 if (isHeap[i]==0) return;      //куча земли не готова, делать погрузчику
                                //нечего
 to_full[i]=(int)(get_exp(perf[i])*60);   //работа есть, разыгрываем время
                                          //погрузки
 serving[i]=queue[0];           //ставим на обслуживание первый самосвал
                                //из очереди
 queue[0]->state=Full;        //изменяем состояние этого самосвала
 for(k=0;k<(S-1);k++)           //продвигаем очередь
  queue[k]=queue[k+1];  
 queue[S-1]=NULL;
}
void Fuller::run()
{
 if (to_buldoser>0) to_buldoser--; 
 if (to_buldoser==0) GroundReady();     //бульдозер завершил работу
 for(int i=0;i<volume;i++)
 {
  if (to_full[i]>0) to_full[i]--;
  if (to_full[i]==0) Complete(i);       //i-й погрузчик завершил работу
  if (to_rest[i]>0) to_rest[i]--;
  if (to_rest[i]==0) RestComplete(i);   //i-й погрузчик завершил отдых
 }
 fprintf(qu1,"%d\n", qLength());        //запись текущей длины очереди
                                        //к погрузчику в файл и пересчет
                                        //средней длины очереди
                                        //и коэффициента загрузки
                                        //погрузчика
 que1_ave=que1_ave*(1-1.0/(total+1))+((float)qLength())/(total+1);
 ro_fuller=ro_fuller*(1-1.0/(total+1))+(((float)Busy())/volume)/(total+1);
 if (to_buldoser>0) ro_buld++;          //инкремент счетчика загрузки
                                        //бульдозера
} 
Emptier::Emptier()
//В начальный момент времени пункт разгрузки пуст
{
 int i; 
 to_empty=new int[volume];
 serving=new HeavyCar *[volume];
 queue=new HeavyCar *[S];
 for(i=0;i<volume;i++)
 {
  to_empty[i]=-1;
  serving[i]=NULL;
 }
 for(i=0;i<S;i++)
  queue[i]=NULL;
}
Emptier::~Emptier()
{
 delete[] to_empty;
 delete [] serving; 
 delete [] queue;
}
void Emptier::Print()
{
 int i;
 printf("В очереди на разгрузку - %d самосвалов\n", qLength());
 for(i=0;i<S;i++)
 {
  if (queue[i]==NULL) break;
  printf("%d-й в очереди - самосвал № %d\n", i+1, queue[i]->id); 
 }
 for(i=0;i<volume;i++)
 {
   if (to_empty[i]>0)
   printf("%d-й разгрузчик работает. Он обслуживает самосвал № %d. До окончания погрузки %d минут\n",i+1,serving[i]->id,to_empty[i]/60);
   else printf("%d-й разгрузчик простаивает.\n",i+1);
  }
 return;
}
int Emptier::qLength()
{
 int i;
 for(i=0;i<S;i++)
  if (queue[i]==NULL) return(i);
 return(S);
} 
int Emptier::Busy()
{
 int k=0;
 for(int i=0;i<volume;i++)
  if (to_empty[i]>0) k++;  
 return(k);
}
int Emptier::FirstAvail()
{
 for(int i=0;i<volume;i++)
  if (to_empty[i]==-1) return(i);
 return(-1); 
}
 
void Emptier::Arrival(HeavyCar *h)   //прибытие самосвала
{
 int k, p;
 k=FirstAvail();                     //какой разгрузчик свободен?
 if (k==-1)                          //свободного разгрузчика нет
 {
  p=qLength();
  queue[p]=h;
  queue[p]->state=Que_Emptier;
 }
 else                                //свободный разгрузчик есть
 {
  to_empty[k]=border1+rand()%(border2-border1+1);  
  serving[k]=h;
  serving[k]->state=Empty;
 } 
}
void Emptier::Complete(int i)        //i-й разгрузчик завершил разгрузку
{
 int j;
 serving[i]->state=Empty_Move;       //меняем состояние разгруженного
                                     //самосвала
//Вычисляем для него время в пути до пункта погрузки
 serving[i]->to_pempty=(int)(get_normal(serving[i]->back_ave, serving[i]->back_disp,0.001)*60);
 if (qLength()==0)                   //очередь пуста
 {
  to_empty[i]=-1;
  serving[i]=NULL;
 }
 else                                //очередь не пуста, ставим первый
                                     //самосвал на разгрузку, меняем его
                                     //состояние и продвигаем очередь
 {
  to_empty[i]=border1+rand()%(border2-border1+1);  
  serving[i]=queue[0];
  serving[i]->state=Empty;  
  for(j=0;j<(S-1);j++)
   queue[j]=queue[j+1];  
  queue[S-1]=NULL;
 }
}
void Emptier::run()
{
 for(int i=0;i<volume;i++)
 {
  if (to_empty[i]>0) to_empty[i]--;
//Разгрузка завершена. Вызываем метод-обработчик и делаем инкремент //счетчика разгруженных самосвалов
  if (to_empty[i]==0) {
   Complete(i);
   completed++;
  }
 }
//Запись текущей длины очереди в файл, пересчет средней длины очереди 
//и коэффициента загрузки разгрузчика
 fprintf(qu2,"%d\n", qLength());
 que2_ave=que2_ave*(1-1.0/(total+1))+((float)qLength())/(total+1);
 ro_emptier=ro_emptier*(1-1.0/(total+1))+(((float)Busy())/volume)/(total+1);
}
9-2.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#define N 28800               //общая длительность моделирования
#include "9-1.h"
int main()
{
  int i;
  HeavyCar **masCar;          //массив указателей на самосвалы и выделение
                              //памяти для него
  masCar=new HeavyCar *[S];
  srand((unsigned)time(0));   //инициализация ГСЧ
//Открытие файлов для сбора статистики по длинам очередей
  qu1=fopen("que1", "wt");
  qu2=fopen("que2", "wt");  
//Инициализация самосвалов
    for(i=0;i<S;i++)
   masCar[i]=new HeavyCar(i+1);
//Инициализация пунктов погрузки и загрузки
  Fuller fu(masCar);
  Emptier em;
//Установление связи самосвалов с пунктами
  for(i=0;i<S;i++)
  {
   masCar[i]->putFuller(&fu);
   masCar[i]->putEmptier(&em);
  }
//Основной моделирующий цикл
 for(total=0L;total<N;total++)
 {
  for(i=0;i<S;i++)
   masCar[i]->run();
  fu.run();
  em.run();
 }
//Учет остаточного состояния самосвалов
 for(i=0;i<S;i++)
  if ((masCar[i]->State()!=Que_Fuller)&&(masCar[i]->State()!=Empty_Move)) completed++;
//Очистка памяти, выделенной под объекты
 for(i=0;i<S;i++)
  delete masCar[i];
 delete [] masCar;
 fclose(qu1);
 fclose(qu2);
//Вывод результатов моделирования
 printf("Разгружено самосвалов %d\n", completed);
  printf("Средняя длина очереди на погрузку %.3f\n", que1_ave);
  printf("Средняя длина очереди на разгрузку %.3f\n", que2_ave);
 printf("Коэффициент загрузки пункта погрузки %.3f\n", ro_fuller);
 printf("Коэффициент загрузки пункта разгрузки %.3f\n", ro_emptier);
 printf("Коэффициент загрузки бульдозера %.3f\n", ((float)ro_buld)/total);
 printf("Самосвалы: доля времени, проведенного в пути порожняком %.3f\n", ((float)path_empty)/(S*total));
 printf("Доля времени, проведенного в пути гружеными %.3f\n", ((float)path_full)/(S*total));
 printf("Доля времени, проведенного в пункте погрузки %.3f\n", ((float)take)/(S*total));
 printf("Доля времени, проведенного в пункте разгрузки %.3f\n", ((float)give)/(S*total));
}
erlang.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
float get_erlang(float mu, int k, float eps);
float equ(float mu, float right, int k, float eps);
float function(float mu, int k, float x);
float get_erlang(float mu, int k, float eps)
{
  int r_num; float root, right;
  r_num=rand();
  right=(float)r_num/32768;
  root=equ(mu, right, k, eps);
  return(root);
}
/*вычисление функции F(t) - левой части уравнения - в заданной точке t*/
float function(float mu, int k, float t)
{
 float prod, s; int i;
 prod=1; s=1;
 for(i=1;i<k; i++)
 {
  prod=prod*mu*t/i;
  s+=prod;
 } 
 s=s*exp(-mu*t); return(1-s);
}
float equ(float mu, float right, int k, float eps)
{
 float edge1, edge2, middle, value;
 /*инициализация отрезка, на котором ищется корень. Правая граница - среднее плюс десятикратное среднеквадратичное отклонение*/
 edge1=0.0; edge2=(float)k/mu+10*sqrt((float)k)/mu; 
 /*если длина начального отрезка все-таки мала - удваиваем его, пока корень уравнения не окажется внутри отрезка*/
 while(function(mu, k, edge2)<right) edge2*=2;
 /*итерируем, пока не достигнута заданная точность*/
 while((edge2-edge1)>eps)
 {
  middle=(edge1+edge2)/2; 
  value=function(mu, k, middle); /*вычисляем значение левой части в середине текущего интервала локализации корня*/
  /*корень лежит в правой половине текущего интервала*/
  if ( (value-right)<0 )  edge1=middle;
  /*корень лежит в левой половине текущего интервала*/
  else  edge2=middle; 
 }
 return((edge1+edge2)/2);
}
normal.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
float get_normal(float mean, float disp, float eps);
float simpson(float A, float B, float mean, float disp);
float equ(float bottom_bound, float top_bound, float mean, float disp, float almost_all, float eps, float right);
float function(float mean, float disp, float x);
float get_normal(float mean, float disp, float eps)
{
  int r_num; 
  float root, bottom_bound, top_bound, almost_all, right;
  /*вычисление конечных аппроксимаций пределов интегрирования в соответствии с заданной точностью*/
  bottom_bound=mean-disp*sqrt(-log(2*M_PI*eps*eps*disp*disp));
  top_bound=mean+disp*sqrt(-log(2*M_PI*eps*eps*disp*disp));
  /*вычисление интеграла в этих пределах*/
  almost_all=simpson(bottom_bound, top_bound, mean, disp); 
  r_num=rand();
  right=(float)r_num/32768;
  root=equ(bottom_bound, top_bound, mean, disp, almost_all, eps, right);
  return(root);
}
 
float simpson(float A, float B, float mean, float disp)
{
 float k1, k2, k3, s, x, h1, h;
 /*шаг интегрирования принимается равным 0.01. В "товарных" реализациях метода
 применяется процедура автоматического выбора шага с помощью апостериорных оценок*/
 h=0.01;
 s=0;  h1=h/1.5; 
 k1=function(mean, disp, A);
 for(x=A; (x<B)&&((x+h-B)<=h1); x=x+h)
 {
  k2=function(mean, disp, x+h/2);
  k3=function(mean, disp, x+h);
  s=s+k1+4*k2+k3;
  k1=k3;
 }
 s=s*h/6;
 return(s);
}
 
float function(float mean, float disp, float x)
{
 float result;
 result=(1.0/(disp*sqrt(2*M_PI)))*exp(-0.5*((x-mean)/disp)*((x-mean)/disp));
 return(result);
}
float equ(float bottom_bound, float top_bound, float mean, float disp, float almost_all, float eps, float right)
{
 float edge1, edge2, middle, cover, value;
 edge1=bottom_bound; edge2=top_bound; 
 if (right>almost_all) return(top_bound); else;
 if (right<(1-almost_all)) return(bottom_bound); else;
 cover=0; /*введена для повышения производительности. В новой точке вычисление интеграла
 производится не от bottom_bound, а от edge1, в то время как значение интеграла от
 bottom_bound до edge1 уже накоплено в cover*/
 while((edge2-edge1)>eps)
 {
  middle=(edge1+edge2)/2; value=simpson(edge1, middle, mean, disp);
  if ( (cover+value-right)<0 ) { edge1=middle; cover=cover+value; }
  else edge2=middle; 
 }
 return((edge1+edge2)/2);
}
random.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
float get_exp(float mu)    //генератор случайных чисел, распределенных
                           //экспоненциально (см. главу 3)
{
  int r_num; float root, right;
  r_num=rand();                        /*получение случайного целого
                                       /числа*/
  right=((float)r_num)/(RAND_MAX+1);   /*проекция на интервал (0;1)*/
  root=-log(1-right)/mu;               /*вычисление значения обратной
                                       /функции*/
  return(root);
}
 
int get_uniform(int a, int b)
{ //Генерация равномерно распределенной величины a+b
 int x, y;
 x=rand()%(b+1);
 y=rand()%2;
 if (y==0) return(a-x);
 return(a+x);
}
 
float get_triangle(float A, float B, float C)
{
  int r_num; float root, right;
  r_num=rand();                      //получение случайного целого
                                    //числа
right=((float)r_num)/(RAND_MAX+1);   //проекция на интервал (0;1).                      
//Константа RAND_MAX=32767 (215-1) определена в cstdlib
  if (right<(C-A)/(B-A)) root=A+sqrt(right*(B-A)*(C-A));
  else root=B-sqrt((1-right)*(B-A)*(B-C));
  return(root);
}
 
float get_pareto(float A, float B)
{
  int r_num; float root, right;
  r_num=rand();                    /*получение случайного целого числа*/
  right=(float)r_num/RAND_MAX+1;   /*проекция на интервал (0;1)*/
  root=A/(pow(1-right, 1.0/B));    /*вычисление значения обратной функции*/
  return(root);
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2013, 14:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Адаптация примера из книги под Visual Studio (C++):

Обчислить значение примера С++ (Visual Studio) - C++
Вроде не тяжело, но под конец дня не могу уже(( Может поможет кто? На завтра капец надо...

Visual Studio под Windows Xp - C++
Есть ли VS для Windows Xp x32? И, если есть, то какие? Заранее благодарен.

Переделать код под Visual studio, С++ - C++
Как переделать код под visual studio 2013 или хотя бы сказать работает ли она на visual studio 2012? #include &quot;argz.h&quot; int main() ...

Исходник змейки под Visual Studio - C++
Ктота имеет код игры змейка на чистом си, который бы работал в Visual Studio 2010?Или ссылку в интернете если не трудно. Все которые нашел...

Ищу исходник Sokoban под visual studio - C++
Нашел код сокобана c++, открываю в vs новый проект win32, вставляю код, отмечает ошибку(Не удается открыть источник файл &quot;stdafx.h&quot;). В чем...

Изменить код Visual Studio под Borland C++ - C++
Исходный код: #include&lt;iostream&gt; #include&lt;string&gt; #include&lt;fstream&gt; #include &lt;ctype.h&gt; #include&lt;stdio.h&gt; #include&quot;модуль.h&quot; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.12.2013, 16:54 #2
Цитата Сообщение от iStark Посмотреть сообщение
Не могу запустить в vs2012 пример из 9 главы.
Что-то же пишет? Поделились бы...
0
iStark
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 10
24.12.2013, 18:13  [ТС] #3
Изначально ссорится на 3 вещи,
1. на то что эти константы
const static int volume=2;
const static float mu=0.25;
const static int rest=300;
внутри класса, убрал const static
2. Ссорилось на M_Pi заменил math.h на cmath или наоборот
3. Error 17 error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\users\сашка\documents\visual studio 2013\projects\course_new_b\course_new_b\course_new_b.cpp 18 1 course_new_b
- если заюзать директиву //#pragma warning( once : 4996 ) - появляется около 50 ошибок типа
Error 48 error LNK2005: "public: void __thiscall HeavyCar:utFuller(class Fuller *)" (?putFuller@HeavyCar@@QAEXPAVFuller@@@Z) already defined in Classes.obj C:\Users\Сашка\documents\visual studio 2013\Projects\course_new_b\course_new_b\course_new_b.obj course_new_b
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.12.2013, 18:49 #4
Цитата Сообщение от iStark Посмотреть сообщение
если заюзать директиву //#pragma warning( once : 4996 ) - появляется около 50 ошибок типа
Почему не то, что пишется?
Цитата Сообщение от iStark Посмотреть сообщение
To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
Добавлено через 13 минут
Вот тут, как в свойствах проекта можно отключить: Ошибка в SCANF
1
iStark
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 10
24.12.2013, 21:42  [ТС] #5
Отключил SDL checks, опять те же 50 ошибок ;(
0
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 1
24.12.2013, 21:51 #6
А ты попробуй в main'е закомментировать сначала все строки, а потом по одно открывать и пытаться компилировать..
Цитата Сообщение от iStark Посмотреть сообщение
убрал const static
Сдается мне, были они там неспроста, и где то использовались, а теперь, когда ты убрал - появилась другая ошибка. Это так, к слову.
0
iStark
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 10
24.12.2013, 22:03  [ТС] #7
Убрал все вплоть до чистого main, те же 50 ошибок, вернее 52
Error 55 error LNK2005: "struct _iobuf * qu2" (?qu2@@3PAU_iobuf@@A) already defined in Classes.obj C:\Users\Сашка\documents\visual studio 2013\Projects\course_new_b\course_new_b\course_new_b.obj course_new_b
Error 54 error LNK2005: "struct _iobuf * qu1" (?qu1@@3PAU_iobuf@@A) already defined in Classes.obj C:\Users\Сашка\documents\visual studio 2013\Projects\course_new_b\course_new_b\course_new_b.obj course_new_b
Error 47 error LNK2005: "public: void __thiscall HeavyCar:utFuller(class Fuller *)" (?putFuller@HeavyCar@@QAEXPAVFuller@@@Z) already defined in Classes.obj C:\Users\Сашка\documents\visual studio 2013\Projects\course_new_b\course_new_b\course_new_b.obj course_new_b

и так далее
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.12.2013, 23:22 #8
В normal.h (для M_PI):
C++
1
2
#define _USE_MATH_DEFINES
#include<math.h>
В radom.h (get_pareto()):
C++
1
root=A/(pow(1.0 - right, 1.0/B));    /*вычисление значения обратной функции*/
И вынести инициализацию const static float за пределы класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class HeavyCar
{
    const static float direct_ave;
    const static float direct_disp;
    const static float back_ave;
    const static float back_disp;
    int id;                  //порядковый номер самосвала
    enum states   state;                 //текущее состояние самосвала
    int to_pfull;            //время до прибытия в пункт разгрузки
    int to_pempty;           //время до прибытия в пункт погрузки
    void *f;                 //указатель на пункт погрузки
    void *e;                 //указатель на пункт разгрузки
public:
    //Пункты погрузки и разгрузки будут манипулировать самосвалами
    friend class Fuller;
    friend class Emptier;
    HeavyCar(int i);         //метод-конструктор
    void putFuller(Fuller *f1); 
    void putEmptier(Emptier *e1);
    void run();              //метод-диспетчер
    void Print();
    int State() { return(state); }
};
 
const float HeavyCar::direct_ave = 22.0;
const float HeavyCar::direct_disp=3.0;
const float HeavyCar::back_ave=18.0;
const float HeavyCar::back_disp=3.0;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Fuller
{
    const static int volume = 2;
    const static float mu;
    const static int rest = 300;
    float *perf;               //массив производительностей погрузчиков
    int to_buldoser;           //время до завершения работы бульдозера
    int *to_full;              //массив времен до завершения погрузки,
    //-1 - в случае простоя
    HeavyCar **serving;        //массив указателей на загружаемые самосвалы
    HeavyCar **queue;          //массив указателей на самосвалы, ждущие
    //в очереди
    int *to_rest;              //массив времен до завершения отдыха,
    //-1 в случае, если погрузчик находится
    //не в состоянии отдыха
    int *isHeap;               //массив признаков того, готова ли куча земли
    //для погрузчика
public: 
    Fuller(HeavyCar **h);      //метод-конструктор
    ~Fuller();                 //метод-деструктор
    void GroundReady();        //обработчик события: бульдозер подготовил кучи 
    void Complete(int i);      //обработчик события: i-й погрузчик завершил
    //погрузку
    void RestComplete(int i);  //обработчик события: i-й погрузчик "отдохнул"
    void Arrival(HeavyCar *h); //обработчик события: прибыл самосвал h
    int BestAvail();           //выбор наилучшего свободного погрузчика
    void Print();              //вывод на печать содержимого объекта
    int qLength();             //вычисление текущей длины очереди
    int State(int i);          //вычисление состояния i-го погрузчика
    int Busy();                //вычисление количества занятых погрузчиков
    void run();                //метод-диспетчер
};
 
const float Fuller::mu = 0.25;
В 9-2.cpp добавить:
C++
1
2
3
4
5
6
7
#include <clocale>
...
int main()
{
    setlocale(0, "");
...
}
1
Миниатюры
Адаптация примера из книги под Visual Studio  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2013, 23:22
Привет! Вот еще темы с ответами:

Visual studio запускается только под правами администратора - C++
Добрего. вижуал студио ранее работала под обычной учеткой, решил закинуть в нее шаблонов, она потребовала доступ до реестра, дал ей...

Имеются ли отличия в компиляторах у сред разработки Visual Studio 2006 и Visual Studio 2015 ? - C++
скажите а где найти среду 2006 года? или можно использовать 2015 год?

Не удаётся создать проект в Visual Studio 2012 Professional под Windows 8.1 - C++
Здравствуйте! Такая проблема: попытке создать проект пишет &quot;Не удалось создать &quot;imageSource&quot; на основе текста &quot;..\Images\Medium.png&quot;.&quot;...

Visual Studio Team Foundation Serverl или Visual Studio Professional - C++
Visual Studio Team Foundation Server 2010 Кто пользовался Visual Studio Team Foundation Server 2010, и чем она отличаеться от Visual...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.12.2013, 23:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru