Đề thi kết thúc học kỳ I môn Phương pháp lập trình hướng đối tượng - Năm học 2016-2017 - Đại học Khoa học Tự nhiên thành phố Hồ Chí Minh
MÃ LƯU TRỮ
(do phòng KT-ĐBCL ghi)
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN, ĐHQG-HCM
ĐỀ THI KẾT THÚC HỌC PHẦN
Học kỳ I – Năm học 2016-2017
Tên học phần:
Phương pháp Lập trình Hướng đối tượng
Mã HP: CTT006
Ngày thi: 14/01/2017
Thời gian làm bài: 110 phút
☑
Ghi chú: Sinh viên [ ¨ được phép / không được phép] sử dụng tài liệu khi làm bài.
Câu 1 (05 điểm)
01 #include <iostream>
02 #include <sstream>
03 #include <string>
04 #include <typeinfo>
05 using namespace std;
06 const double PI = 3.1415928;
07 class Shape
51 class Ellipse : public Shape
52 {
53 private:
54 float majorR, minorR;
55 public:
56 Ellipse(float a, float b)
57
58
59
60
:Shape(), majorR(a), minorR(b)
08 {
09 public:
{
}
cerr << "construct Ellipse" << endl;
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 };
28
Shape(){ cerr<<"construct Shape"<<endl; }
virtual string Description() {
stringstream ss;
61 string Description() {
62
stringstream ss;
ss<<"Shape(area=" << this->Area() << ")"; 63
ss << "Ellipse(a=" << this->majorR
<< ", b=" << this->minorR << ")";
return ss.str();
return ss.str();
}
virtual float Area() = 0;
virtual void Scale(float scaleFactor) = 0; 67 float Area(){ return PI*majorR*minorR; }
const type_info& InterfaceType() {
return typeid(Shape);
64
65
66
}
68 void Scale(float scaleFactor) {
69
70
71
this->majorR *= scaleFactor;
this->minorR *= scaleFactor;
}
const type_info& ImplementationType() {
return typeid(*this);
}
virtual ~Shape(){
cerr<<"destruct Shape"<<endl;
}
}
72 void Scale(float sa, float sb) {
73
74
75
this->majorR *= sa;
this->minorR *= sb;
}
76 const type_info& InterfaceType() {
77
78
return typeid(Ellipse);
}
29 class Circle : public Shape
30 {
31 private:
79 ~Ellipse(){
80
81
cerr<<"destruct Ellipse"<<endl;
}
32
33 public:
Circle(float r) :Shape(), radius(r) {
cerr << "construct Circle" << endl;
float radius;
82 };
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 };
}
string Description() {
stringstream ss;
ss << "Circle(r=" << this->radius << ")";
return ss.str();
}
float Area() { return PI*radius*radius; }
void Scale(float scaleFactor) {
this->radius *= scaleFactor;
}
const type_info& InterfaceType() {
return typeid(Circle);
}
~Circle(){ cerr<<"destruct Circle"<<endl; }
(Đề thi gồm 4 trang)
[Trang 1/4]
Họ tên người ra đề/MSCB: .........................................................Chữ ký: .................
Họ tên người duyệt đề: ..............................................................Chữ ký:..................
MÃ LƯU TRỮ
(do phòng KT-ĐBCL ghi)
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN, ĐHQG-HCM
ĐỀ THI KẾT THÚC HỌC PHẦN
Học kỳ I – Năm học 2016-2017
83 int main()
84 {
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
Ellipse ellipse(2.0/3, 6);
Shape *shape = &ellipse;
shape->Scale(1.0/2);
//shape->Scale(3, 1.0/3);
cout << "ellipse: " << endl;
cout << ellipse.Description() << endl;
cout << ellipse.Area() << endl;
cout << ellipse.InterfaceType().name() << endl;
cout << ellipse.ImplementationType().name() << endl;
cout << "shape = &ellipse: " << endl;
cout << shape->Description() << endl;
cout << shape->Area() << endl;
cout << shape->InterfaceType().name() << endl;
100 cout << shape->ImplementationType().name() << endl;
101
102 //Shape ashape;
103 //cout << ashape.Description() << endl;
104
105 return 0; //no error
106}
Chú thích về chương trình C++ bên trên:
• cerrvà coutlà 2 luồng xuất chuẩn đều xuất ra màn hình console.
•
typeidlà toán tử tính kiểu của một biểu thức, trả về đối tượng type_info.
VD: class X; typeid(X).name()=="X";
X *a; typeid(a).name()=="X*";
Hãy trả lời những câu hỏi liên quan tới chương trình bên trên:
a) Hãy viết kết quả xuất ra màn hình sau khi chương trình chạy xong.
b) Trong chương trình có nhiều hàm có cùng tên, chúng có quan hệ gì với nhau (hay không có
quan hệ gì hết)? Hãy giải thích quan hệ giữa 2 hàm trong những cặp trùng tên sau: (Nêu tên
quan hệ nếu có, nêu ý nghĩa và ứng dụng của quan hệ đó.)
•
•
•
•
Shape::Description()và Circle::Description()
Ellipse::Scale(float)và Ellipse::Scale(float, float)
Shape::InterfaceType() và Circle::InterfaceType()
Circle::InterfaceType() và Ellipse::InterfaceType()
c) Nếu bỏ dấu comment (//) của các dòng 88, 102 và 103 ra thì chương trình gặp lỗi gì?
d) [*] Phải thay thế vào chỗ của các dòng bị comment (88, 102 và 103) những dòng code như thế
nào để thực hiện được ý đồ của các dòng code đó:
• Ở dòng 88 muốn gọi phương thức Ellipse::Scale(float, float) thông qua con trỏ
shape(chứ không phải thông qua biến đối tượng ellipse).
• Ở dòng 102 và 103 muốn gọi được phương thức Shape::Description().
* Lưu ý: Những câu đánh dấu sao [*] là không bắt buộc (tính điểm cộng).
(Đề thi gồm 4 trang)
Họ tên người ra đề/MSCB: .........................................................Chữ ký: .................
Họ tên người duyệt đề: ..............................................................Chữ ký:..................
[Trang 2/4]
MÃ LƯU TRỮ
(do phòng KT-ĐBCL ghi)
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN, ĐHQG-HCM
ĐỀ THI KẾT THÚC HỌC PHẦN
Học kỳ I – Năm học 2016-2017
Câu 2 (05 điểm)
Bệnh viện Nhân dân 115 là một trong những bệnh viện lớn tại TP.HCM. Hiện bệnh viện đang
có nhu cầu xây dựng hệ thống quản lý hoạt động khám chữa bệnh của các bệnh nhân. Mỗi bệnh
nhân được cấp 1 mã số (MSBN) để tiện việc quản lý danh sách các bệnh nhân. Bệnh viện cho phép
khám điều trị nội trú và ngoại trú. Nếu cùng 1 người có cả hoạt động khám ngoại trú lẫn điều trị nội
trú thì sẽ được cấp 2 mã số khác nhau và được quản lý riêng như 2 người khác nhau. Viện phí của
từng bệnh nhân được tính như sau:
Với bệnh nhân ngoại trú: Bệnh viện thu một mức phí nhất định cho mỗi lần khám tùy theo mỗi
loại bệnh lý.
Với bệnh nhân nội trú: Tiền khám chữa bệnh = số ngày nằm viện * (phí khám bệnh mỗi ngày +
đơn giá phòng).
Có 3 loại phòng cho bệnh nhân điều trị nội trú chọn lựa với đơn giá:
• Phòng loại C, đơn giá 600.000 đ/ngày.
• Phòng loại B, đơn giá 900.000 đ/ngày.
• Phòng loại A, đơn giá 1.400.000 đ/ngày.
Mỗi hoạt động khám chữa bệnh điều được ghi nhận lại dưới dạng nhật ký (log hoạt động) theo
tháng. Tùy theo từng loại hoạt động, mỗi dòng log sẽ có các thông tin tương ứng như sau:
-
-
-
-
BN ngoại trú khám bệnh: Ngày, MSBN, "KB", phí khám chữa bệnh.
BN nội trú nhập viện: Ngày, MSBN, "NV", phí khám chữa bệnh mỗi ngày, loại phòng.
BN nội trú xuất viện: Ngày, MSBN, "XV".
Tổng kết viện phí (cuối cùng trong log): Ngày, -1, "TKVP".
Trong đó:
-
-
-
Ngày là một số nguyên từ 1 tới 31 thể hiện ngày trong tháng.
MSBN là một số tự nhiên, được đánh số liên tiếp từ 1.
"KB", "NV", "XV", "TKVP" là các chuỗi ký tự thể hiện loại hoạt động.
Ví dụ một log họat động 8 ngày đầu tiên của tháng 12:
(Giả sử chưa có bệnh nhân nào trong danh sách.)
(Đề thi gồm 4 trang)
[Trang 3/4]
Họ tên người ra đề/MSCB: .........................................................Chữ ký: .................
Họ tên người duyệt đề: ..............................................................Chữ ký:..................
MÃ LƯU TRỮ
(do phòng KT-ĐBCL ghi)
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN, ĐHQG-HCM
ĐỀ THI KẾT THÚC HỌC PHẦN
Học kỳ I – Năm học 2016-2017
Nội dung tập tin log hoạt động
1 001 KB 20000
Giải thích ý nghĩa & Viện phí tới ngày hôm đó (VPTL)
new BN[MSBN=001] khám bệnh => VPTL = 20kđ
1 002 NV 100000 B
new BN[MSBN=002] nhập viện vào phòng loại B, mỗi ngày
khám chữa bệnh hết 100kđ
6 003 KB 50000
6 001 KB 30000
6 004 NV 300000 C
new BN[MSBN=003] khám bệnh => VPTL = 50kđ
BN[MSBN=001] khám bệnh => VPTL = 20kđ + 30kđ = 50kđ
new BN[MSBN=004] nhập viện vào phòng loại C, mỗi ngày
khám chữa bệnh hết 300kđ
7 004 XV
BN[MSBN=004] xuất viện => VPTL = 1*(300k+600kđ) =
900kđ
8 -1 TKVP
Tổng kết viện phí:
+ BN[MSBN=001] => VPTL = 50kđ
+ BN[MSBN=002] đã nằm 7 ngày ở phòng loại B
=> VPTL = 7*(100kđ+900kđ) = 7000kđ
+ BN[MSBN=003] => VPTL = 50kđ
+ BN[MSBN=004] => VPTL = 900kđ
= => Tổng viện phí = 50kđ + 7000kđ + 50kđ + 900kđ =
8000kđ
a) Hãy áp dụng các tính chất hướng đối tượng đã học để vẽ sơ đồ lớp (cả chi tiết các thành
phần trong lớp lẫn quan hệ giữa các lớp) cho chương trình thực hiện các việc sau:
• Đọc dữ liệu các bệnh nhân từ tập tin nhật ký hoạt động để lập danh sách bệnh nhân
(thay cho việc nhập liệu từ bàn phím như thông thường).
•
In ra màn hình bảng thống kê viện phí của từng bệnh nhân và tổng viện phí bệnh viện
thu vào trong tháng.
•
Cho biết bệnh viện có bao nhiêu bệnh nhân nội trú và bao nhiêu bệnh nhân ngoại trú.
b) Viết chương trình cài đặt cho thiết kế ở câu a. (Cài đặt ngay trong khai báo lớp, không cần
tách riêng khai báo lớp với định nghĩa hàm. Được phép sử dụng bộ thư viện chuẩn STL:
string, vector, v.v…)
c) [*] Để việc điều trị hiệu quả hơn, các bác sĩ cần biết được lịch sử điều trị của từng bệnh
nhân. Hãy nâng cấp hệ thống để bổ sung thêm hoạt động Lập hồ sơ bệnh án cho bệnh nhân.
Hồ sơ bệnh án của mỗi bệnh nhân sẽ ghi lại mọi hoạt động của bệnh nhân đó trong tháng để
có thể tra cứu lại các hoạt động khi cần thiết. Bạn sẽ thay đổi hay bổ sung thêm cho các lớp
đối tượng như thế nào? Hãy giải thích và minh họa thêm trên sơ đồ lớp ở câu a.
* Lưu ý: Những câu đánh dấu sao [*] là không bắt buộc (tính điểm cộng).
(Đề thi gồm 4 trang)
Họ tên người ra đề/MSCB: .........................................................Chữ ký: .................
Họ tên người duyệt đề: ..............................................................Chữ ký:..................
[Trang 4/4]
Bạn đang xem tài liệu "Đề thi kết thúc học kỳ I môn Phương pháp lập trình hướng đối tượng - Năm học 2016-2017 - Đại học Khoa học Tự nhiên thành phố Hồ Chí Minh", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
de_thi_ket_thuc_hoc_ky_i_mon_phuong_phap_lap_trinh_huong_doi.pdf

