-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathChuyenBay.cpp
626 lines (561 loc) · 17.8 KB
/
ChuyenBay.cpp
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
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
#include "Header.h"
#include "ChuyenBay.h"
#include "DanhSachVeSuccess.h"
#include "Ve.h"
#include <string>
/********************************************
* @Description Hàm khởi tạo Chuyến Bay mới có timestamp: 0, trạng thái: còn vé,
* số lượng vé: 0, số chỗ của chuyến bay: MAX_SO_LUONG_VE, số lượng ghế trống: MAX_SO_LUONG_VE,
danh sách vé là một mảng trống bao gồm "số chỗ" phần tử.
********************************************/
template <class DataType>
ChuyenBay<DataType>::ChuyenBay() {
_lTimestamp = 0;
_iTrangThai = 1;
_iSoLuongVe = 0;
_iSoCho = MAX_SO_LUONG_VE;
_iSoLuongGheTrong = MAX_SO_LUONG_VE;
_danhSachVe = new Ve[_iSoCho];
}
/********************************************
* @Description Hàm khởi tạo Chuyến Bay mới với mã chuyến bay, số hiệu máy bay,
* ngày khởi hành, sân bay đến.
* @parameter Mã chuyến bay, số hiệu máy bay, ngày khởi hành, sân bay đến.
********************************************/
template <class DataType>
ChuyenBay<DataType>::ChuyenBay(string maChuyenBay, string soHieuMayBay, string ngayKhoiHanh, string sanBayDen) {
_strMaChuyenBay = maChuyenBay;
_strSoHieuMayBay = soHieuMayBay;
_strNgayKhoiHanh = ngayKhoiHanh;
_strSanBayDen = sanBayDen;
_lTimestamp = 0;
_iTrangThai = 1;
_iSoLuongVe = 0;
_iSoCho = MAX_SO_LUONG_VE;
_iSoLuongGheTrong = MAX_SO_LUONG_VE;
_danhSachVe = new Ve[_iSoCho];
}
/********************************************
* @Description Hàm hiển thị thông tin của chuyến bay
********************************************/
template <class DataType>
void ChuyenBay<DataType>::display() {
cout << setw(15) << left << _strMaChuyenBay;
cout << setw(25) << left << _strNgayKhoiHanh;
cout << setw(25) << left << _strSanBayDen;
cout << setw(15) << left;
switch (_iTrangThai)
{
case 0:
cout << "HUY CHUYEN";
break;
case 1:
cout << "CON VE";
break;
case 2:
cout << "HET VE";
break;
case 3:
cout << "HOAN TAT";
break;
default:
break;
}
cout << setw(100);
string result = "";
for (int i = 0; i < _iSoLuongVe; i++) {
stringstream ss;
ss << _danhSachVe[i].getSoGhe();
string temp;
ss >> temp;
if (i != _iSoLuongVe - 1) {
temp = temp + ",";
}
result += temp;
}
cout << left << result << endl;
}
/********************************************
* @Description Hàm hiển thị thông tin chi tiết của chuyến bay
********************************************/
template <class DataType>
void ChuyenBay<DataType>::displayDetail() {
cout << setw(10) << left << _strSoHieuMayBay;
cout << setw(15) << left << _strMaChuyenBay;
cout << setw(20) << left << _strNgayKhoiHanh;
cout << setw(20) << left << _strSanBayDen;
cout << setw(15) << left;
switch (_iTrangThai)
{
case 0:
cout << "HUY CHUYEN";
break;
case 1:
cout << "CON VE";
break;
case 2:
cout << "HET VE";
break;
case 3:
cout << "HOAN TAT";
break;
default:
break;
}
cout << setw(15) << left << _iSoCho;
cout << setw(20) << left << _iSoLuongGheTrong;
cout << setw(100);
string result = "";
for (int i = 0; i < _iSoLuongVe; i++) {
stringstream ss;
ss << _danhSachVe[i].getSoGhe();
string temp;
ss >> temp;
if (i != _iSoLuongVe - 1) {
temp = temp + ",";
}
result += temp;
}
cout << left << result << endl;
}
/********************************************
* @Description Hàm hiển thị danh sách khách hàng đặt vé của chuyến bay
********************************************/
template <class DataType>
void ChuyenBay<DataType>::hienThiDanhSachKhach() {
setColor(2);
cout << "\t\t\t\t\t";
cout << "DANH SACH VE:" << endl;
setColor(7);
if (_iSoLuongVe == 0) {
cout << "\t\t\t";
setColor(4);
cout << "Khong co khach hang nao dat ve." << endl;
setColor(7);
return;
}
cout << setfill('-');
setColor(4);
cout << setw(130) << "-" << endl;
setColor(7);
cout << setfill(' ');
cout << setw(20) << left << "MA VE";
cout << setw(20) << left << "MA CHUYEN BAY";
cout << setw(20) << left << "CMND";
cout << setw(20) << left << "HO TEN";
cout << setw(20) << left << "SO GHE";
cout << setw(50) << left << "DATE" << endl;
cout << setfill('-');
setColor(4);
cout << setw(130) << "-" << endl;
setColor(7);
cout << setfill(' ');
for (int i = 0; i < _iSoLuongVe; i++) {
_danhSachVe[i].displayDetail();
cout << endl;
}
cout << setfill('-');
setColor(4);
cout << setw(130) << "-" << endl;
setColor(7);
cout << setfill(' ');
}
/********************************************
* @Description Hàm hiển thị danh sách ghế còn trống của chuyến bay
********************************************/
template <class DataType>
void ChuyenBay<DataType>::hienThiDanhSachGheTrong() {
setColor(2);
cout << "\t\t\t\t\t";
cout << "DANH SACH GHE TRONG:" << endl;
setColor(7);
if (_iSoLuongGheTrong == 0) {
setColor(4);
cout << "\t\t\t";
cout << "Chuyen bay khong con ghe trong!" << endl;
setColor(7);
return;
}
cout << setfill('-');
setColor(4);
cout << setw(130) << "-" << endl;
setColor(7);
cout << setfill(' ');
for (int i = 0; i < _iSoLuongGheTrong; i++) {
cout << _danhSachGheTrong[i];
if (i != _iSoLuongGheTrong - 1) {
cout << ",";
}
}
cout << endl;
cout << setfill('-');
setColor(4);
cout << setw(130) << "-" << endl;
setColor(7);
cout << setfill(' ');
}
/********************************************
* @Description Hàm set số chỗ cho chuyến bay
* @parameter Số chỗ của chuyến bay
* @attention: Tạo một danh sách vé có số chỗ tối đa phần tử sau khi set số chỗ
********************************************/
template <class DataType>
void ChuyenBay<DataType>::setSoCho(int soCho) {
_iSoCho = soCho;
_iSoLuongGheTrong = _iSoCho;
_danhSachVe = new Ve[_iSoCho];
}
/********************************************
* @Description Hàm set trạng thái cho chuyến bay
* @parameter Chuỗi temp: là chuỗi trạng thái, đọc từ file, ví dụ: "0", "1", "2", "3"
* @attention: Chuyển từ chuỗi trạng thái sang số, sau đó set trạng thái cho chuyến bay
********************************************/
template <class DataType>
void ChuyenBay<DataType>::setTrangThai(string temp) {
stringstream ss(temp);
int trangThai;
ss >> trangThai;
_iTrangThai = trangThai;
}
/********************************************
* @Description Hàm remove ghế trống cho chuyến bay
* @parameter Vị trí index của ghế trống muốn xóa
********************************************/
template <class DataType>
void ChuyenBay<DataType>::removeGhe(int index) {
for (int i = index; i < _iSoLuongGheTrong - 1; i++) {
_danhSachGheTrong[i] = _danhSachGheTrong[i + 1];
}
_iSoLuongGheTrong--;
}
/********************************************
* @Description Hàm set danh sách ghế trống cho chuyến bay
********************************************/
template <class DataType>
void ChuyenBay<DataType>::setDanhSachGheTrong() {
//Khởi tạo danh sách ghế trống từ 1 đến số số chỗ
for (int i = 0; i < _iSoLuongGheTrong; i++) {
_danhSachGheTrong[i] = i + 1;
}
//Xóa các ghế khách đã đặt khỏi danh sách ghế trống
for (int i = 0; i < _iSoLuongGheTrong; i++) {
for (int j = 0; j < _iSoLuongVe; j++) {
if (_danhSachVe[j].getSoGhe() == _danhSachGheTrong[i]) {
removeGhe(i);
i--;
break;
}
}
}
}
/********************************************
* @Description Hàm set danh sách vé khách đặt cho chuyến bay
* @parameter Một chuỗi danhSachVe (ví dụ: 1,2) đọc từ file, Mã chuyến bay đọc từ file,
* Danh sách Vé thành công
********************************************/
template <class DataType>
void ChuyenBay<DataType>::setDanhSachVe(string danhSachVe, string maChuyenBay, DanhSachVeSuccess<DataType> DSVS) {
stringstream ss(danhSachVe);
string temp;
while (getline(ss, temp, ',')) {
stringstream sss;
sss << temp;
int ssss;
sss >> ssss;
Ve* timKiemVe = DSVS.timKiemVe(ssss, maChuyenBay);
if (timKiemVe != NULL) {
themVeMoi(*timKiemVe);
}
}
}
/********************************************
* @Description Hàm thêm vé mới vào danh sách vé cho chuyến bay
* @parameter Đối tượng Vé
********************************************/
template <class DataType>
void ChuyenBay<DataType>::themVeMoi(Ve data) {
_danhSachVe[_iSoLuongVe] = data;
_iSoLuongVe++;
}
/********************************************
* @Description Hàm xóa vé khỏi danh sách vé của chuyến bay
* @parameter Số ghế của vé muốn xóa
********************************************/
template <class DataType>
void ChuyenBay<DataType>::removeVe(int soGhe) {
int pVe = -1;
//tìm vị trí của vé dựa trên số ghế
for (int i = 0; i < _iSoLuongVe; i++) {
if (soGhe == _danhSachVe[i].getSoGhe()) {
pVe = i;
break;
}
}
//Xóa vé đó khỏi danh sách vé nếu tìm thấy
if (pVe != -1) {
for (int i = pVe + 1; i < _iSoLuongVe; i++) {
_danhSachVe[i - 1] = _danhSachVe[i];
}
_iSoLuongVe--;
}
}
/********************************************
* @Description Hàm thêm ghế trống mới vào danh sách ghế trống của chuyến bay
* @parameter Số ghế muốn thêm
********************************************/
template <class DataType>
void ChuyenBay<DataType>::themGheTrongMoi(int soGhe) {
_danhSachGheTrong[_iSoLuongGheTrong] = soGhe;
_iSoLuongGheTrong++;
}
/********************************************
* @Description Hàm xóa ghế trống khỏi danh sách ghế trống của chuyến bay
* @parameter Số ghế muốn xóa
********************************************/
template <class DataType>
void ChuyenBay<DataType>::removeGheTrong(int soGhe) {
for (int i = soGhe - 1; i < _iSoLuongGheTrong; i++) {
_danhSachGheTrong[i] = _danhSachGheTrong[i + 1];
}
_iSoLuongGheTrong--;
}
/********************************************
* @Description Hàm lấy mã chuyến bay của chuyến bay
* @return Mã chuyến bay của chuyến bay
********************************************/
template <class DataType>
string ChuyenBay<DataType>::getMaChuyenBay() {
return _strMaChuyenBay;
}
/********************************************
* @Description Hàm lấy số hiệu máy bay của chuyến bay
* @return Số hiệu máy bay của chuyến bay
********************************************/
template <class DataType>
string ChuyenBay<DataType>::getSoHieuMayBay() {
return _strSoHieuMayBay;
}
/********************************************
* @Description Hàm lấy trạng thái hiện tại của chuyến bay
* @return Trạng thái của chuyến bay
********************************************/
template <class DataType>
int ChuyenBay<DataType>::getTrangThai() {
return _iTrangThai;
}
/********************************************
* @Description Hàm kiểm tra xem chuyến bay đã đầy chỗ chưa
* @return True nếu số lượng ghế trống = 0, ngược lại False
********************************************/
template <class DataType>
bool ChuyenBay<DataType>::isFullSeat() {
return _iSoLuongGheTrong == 0;
}
/********************************************
* @Description Hàm kiểm tra xem số ghế khách đặt có hợp lệ hay không
* @parameter Mã số ghế khách đặt
* @return 1 nếu mã số ghế không hợp lệ, 2 nếu đã có khách khác đặt, còn lại 3: có thể đặt được
********************************************/
template <class DataType>
// 1: KHONG HOP LE, 2: DA DAT, 3: CHUA DAT
int ChuyenBay<DataType>::isBooked(int maSoGhe) {
if (maSoGhe > _iSoCho || maSoGhe < 1) {
return 1;
}
for (int i = 0; i < _iSoLuongVe; i++) {
if (_danhSachVe[i].getSoGhe() == maSoGhe) {
return 2;
}
}
return 3;
}
/********************************************
* @Description Hàm kiểm tra xem số ghế khách đặt có hợp lệ hay không
* @parameter Mã số ghế khách đặt
* @return 1 nếu mã số ghế không hợp lệ, 2 nếu đã có khách khác đặt, còn lại 3: có thể đặt được
********************************************/
template <class DataType>
// 1: SO GHE KHONG HOP LE, 2: DA DAT, 3: CHUA DAT
int ChuyenBay<DataType>::kiemTraMaSoGhe(int maSoGhe) {
if (maSoGhe > _iSoCho || maSoGhe < 1) {
return 1;
}
for (int i = 0; i < _iSoLuongVe; i++) {
if (_danhSachVe[i].getSoGhe() == maSoGhe) {
return 2;
}
}
return 3;
}
/********************************************
* @Description Hàm lấy Danh Sách Vé của chuyến bay
* @return Mảng danh sách vé
********************************************/
template <class DataType>
DataType* ChuyenBay<DataType>::getDanhSachVe() {
return _danhSachVe;
}
/********************************************
* @Description Hàm lấy số lượng Vé của chuyến bay
* @return Số lượng vé
********************************************/
template <class DataType>
int ChuyenBay<DataType>::getSoLuongVe() {
return _iSoLuongVe;
}
/********************************************
* @Description Hàm cập nhật trạng thái cho chuyến bay
* @attention Nếu chuyến bay chưa bị hủy:
* @attention: Nếu thời gian hiện tại đã qua thời gian khởi hành thì cập nhật
* trạng thái hoàn tất cho chuyến bay
* @attention: Nếu số lượng ghế trống = 0 thì cập nhật
* trạng thái hết vé cho chuyến bay
* @attention: Nếu số lượng ghế trống > 0 thì cập nhật
* trạng thái còn vé cho chuyến bay
********************************************/
template <class DataType>
void ChuyenBay<DataType>::updateTrangThai() {
if (_iTrangThai != 0) {
if (getCurrentTimestamp() >= _lTimestamp) {
_iTrangThai = 3;
}
else if (_iSoLuongGheTrong == 0) {
_iTrangThai = 2;
}
else if (_iSoLuongGheTrong > 0) {
_iTrangThai = 1;
}
}
}
/********************************************
* @Description Hàm set Timestamp cho chuyến bay
* @attention Lấy thời gian khởi hành của chuyến bay, chuyển thành timestamp,
* sau đó cập nhật timestamp cho chuyến bay
********************************************/
template <class DataType>
void ChuyenBay<DataType>::setTimestamp() {
string temp;
stringstream s(_strNgayKhoiHanh);
vector<string> separateData;
vector<int> result;
while (getline(s, temp, ' ')) {
separateData.push_back(temp);
}
if (separateData.size() == 2) {
stringstream ss;
ss << (separateData[0]);
while (getline(ss, temp, '/')) {
stringstream sss(temp);
int data;
sss >> data;
result.push_back(data);
}
stringstream ssss;
ssss << (separateData[1]);
while (getline(ssss, temp, ':')) {
stringstream sssss(temp);
int data;
sssss >> data;
result.push_back(data);
}
int convertTimestamp = convertDateToTimestamp(result[0], result[1], result[2], result[3], result[4], 0);
_lTimestamp = convertTimestamp;
}
}
/********************************************
* @Description Hàm get Timestamp của chuyến bay
********************************************/
template <class DataType>
long ChuyenBay<DataType>::getTimestamp() {
return _lTimestamp;
}
/********************************************
* @Description Hàm sắp xếp danh sách vé của chuyến bay theo số ghế
* @parameter Loại muốn sắp xếp (type): 1 nếu tăng dần, -1 nếu giảm dần
********************************************/
template <class DataType>
void ChuyenBay<DataType>::sapXepDanhSachVe(int type) {
if (type == -1) {
//Giam Dan
for (int i = 0; i < _iSoLuongVe - 1; i++) {
for (int j = i + 1; j < _iSoLuongVe; j++) {
if (_danhSachVe[j].getSoGhe() > _danhSachVe[i].getSoGhe()) {
swap(_danhSachVe[j], _danhSachVe[i]);
}
}
}
}
else if (type == 1) {
//Tang Dan
for (int i = 0; i < _iSoLuongVe - 1; i++) {
for (int j = i + 1; j < _iSoLuongVe; j++) {
if (_danhSachVe[j].getSoGhe() < _danhSachVe[i].getSoGhe()) {
swap(_danhSachVe[j], _danhSachVe[i]);
}
}
}
}
}
/********************************************
* @Description Hàm sắp xếp danh sách ghế trống của chuyến bay theo số ghế
* @parameter Loại muốn sắp xếp (type): 1 nếu tăng dần, -1 nếu giảm dần
********************************************/
template <class DataType>
void ChuyenBay<DataType>::sapXepDanhSachGheTrong(int type) {
if (type == 1) {
//Tang Dan
for (int i = 0; i < _iSoLuongGheTrong - 1; i++) {
for (int j = i + 1; j < _iSoLuongGheTrong; j++) {
if (_danhSachGheTrong[j] < _danhSachGheTrong[i]) {
swap(_danhSachGheTrong[j], _danhSachGheTrong[i]);
}
}
}
}
else if (type == -1) {
//Giam Dan
for (int i = 0; i < _iSoLuongGheTrong - 1; i++) {
for (int j = i + 1; j < _iSoLuongGheTrong; j++) {
if (_danhSachGheTrong[j] > _danhSachGheTrong[i]) {
swap(_danhSachGheTrong[j], _danhSachGheTrong[i]);
}
}
}
}
}
/********************************************
* @Description Hàm chuyển thông tin của chuyến bay thành một chuỗi để ghi ra file
* @return Chuỗi thông tin của chuyến bay, ngăn cách bởi dấu "|" để chuẩn bị ghi file
********************************************/
template <class DataType>
string ChuyenBay<DataType>::thongTinFile() {
string result = "";
stringstream ss;
ss << _iTrangThai;
string trangThaiString;
ss >> trangThaiString;
string danhSachVeString = "";
for (int i = 0; i < _iSoLuongVe; i++) {
stringstream ss;
ss << _danhSachVe[i].getSoGhe();
string veString;
ss >> veString;
danhSachVeString = danhSachVeString + veString;
if (i != _iSoLuongVe - 1) {
danhSachVeString = danhSachVeString + ",";
}
}
string danhSachGheTrongString = "";
for (int i = 0; i < _iSoLuongGheTrong; i++) {
stringstream ss;
ss << _danhSachGheTrong[i];
string gheTrongString;
ss >> gheTrongString;
danhSachGheTrongString = danhSachGheTrongString + gheTrongString;
if (i != _iSoLuongGheTrong - 1) {
danhSachGheTrongString = danhSachGheTrongString + ",";
}
}
result = _strMaChuyenBay + "|" + _strSoHieuMayBay + "|" + _strNgayKhoiHanh + "|" + _strSanBayDen + "|" + trangThaiString + "|" + danhSachVeString + "|" + danhSachGheTrongString;
return result;
}