Đề thi kết thúc học phần môn Phương pháp lập trình hướng đối tượng năm 2012

BÀI 1  
Lớp phân số (đặt tên là 푃ℎ푎푛푆표) được viết để cho phép tính toán trên phân số. Đoạn chương trình sau  
đây được viết để chạy thử các phương thức và phép toán đã viết:  
23 ...  
24 int main() {  
25  
PhanSo a(1, 3), c;  
26  
int b = 8;  
27  
c = a + (PhanSo)b;  
28  
29  
cout << "c = " << a << " + " << b << " = " << c << endl;  
cout << "++c: ";  
30  
31  
32  
cout << "c = " << ++c << endl;  
cout << "a = " << a << " + " << c << endl;  
a += c;  
33  
34  
cout << "a = " << a << endl;  
b = a;  
35  
36  
cout << "b = " << b << endl;  
return 0;  
37 }  
a) Giả sử các phép toán và phương thức của lớp 푃ℎ푎푛푆표 đã được viết đủ và đúng. Bạn hãy cho biết  
kết quả chạy của chương trình nói trên.  
b) Đọc kỹ từng dòng của mã nguồn (các dòng 24 – 37) để cho biết lớp 푃ℎ푎푛푆표 phải gồm tối thiểu  
những phương thức và phép toán nào. Viết tập tin 푃ℎ푎푛푆표. ℎ định nghĩa các phương thức cần  
thiết, như hướng dẫn trong bảng sau (chép lại mã nguồn và viết bổ sung đầy đủ):  
// Tập tin PhanSo.h  
#ifndef _PhanSo_h  
#define _PhanSo_h  
#include <iostream>  
using namespace std;  
class PhanSo {  
private:  
int tu, mau;  
public:  
PhanSo();  
// Các dòng mã cần viết thêm  
// ...  
};  
#endif  
c)  
Viết mã của 5 phương thức trong số các phương thức đã khai báo ở câu trên.  
BÀI 2  
a) Trình bày về khái niệm đa hình (polymorphism – đa xạ) và cho biết ý nghĩa, tầm quan trọng của  
tính chất này trong lập trình hướng đối tượng. Viết đoạn mã nguồn để minh họa và diễn giải.  
b) Trình bày khái niệm của lớp trừu tượng (abstract class). Lớp trừu tượng được cài đặt trong C++  
như thế nào? Hãy viết mã nguồn minh họa.  
BÀI 3  
#include <math.h>  
class Sin:public Function {  
#include <stdio.h>  
public:  
double Value(double x) {  
class Function {  
public:  
return sin(x);  
}
virtual double Value(double x)=0;  
virtual double Derive(double x)=0;  
double Derive(double x) {  
return cos(x);  
};  
}
};  
double DeriveProduct(Function* f, Function* g, double x)  
{
if (f != NULL && g != NULL) {  
return f->Derive(x)*g->Value(x) + f->Value(x)*g->Derive(x);  
}
return 0;  
}
double DeriveSum(Function* f, Function* g, double x)  
{
if (f != NULL && g != NULL) {  
return f->Derive(x) + g->Derive(x);  
}
return 0;  
}
void main() {  
double x = 3.14/6; // PI/6  
Sin* s = new Sin();  
double y = DeriveProduct(s, s, x);  
printf("sin(x) = %f; sin'(x) = %f\n", s->Value(x), s->Derive(x));  
printf("y = %f\n", y);  
}
Đoạn mã bên trên khai báo lớp 퐹푢푛푐푡ꢀ표푛 nhằm mục đích cài đặt việc tính giá trị của một hàm số 푓(푥)  
(phương thức 푉푎푙푢푒(푥)) và giá trị của đạo hàm 푓’(푥) của nó (phương thức 퐷푒푟ꢀ푣푒(푥)).  
a) Hãy giải thích việc khai báo các phương thức 푉푎푙푢푒(푥) và 퐷푒푟ꢀ푣푒(푥) trong lớp 퐹푢푛푐푡ꢀ표푛 (ý nghĩa  
của việc gán bằng 0 và từ khóa 푣ꢀ푟푡푢푎푙).  
b) Hãy viết mã nguồn của lớp 퐶표푠 tương ứng cho hàm 푓(푥) = 푐표푠(푥).  
c) Mã nguồn của hàm 퐷푒푟ꢀ푣푒푆푢푚() nhằm mục đích cài đặt việc tính đạo hàm tổng dựa vào công  
thức tổng (푓 + 푔)’(푥) = 푓’(푥) + 푔’(푥) và mã nguồn hàm 퐷푒푟ꢀ푣푒푃푟표푑푢푐푡() tính đạo hàm tích nhờ  
vào công thức tương ứng với tích (푓. 푔)’(푥) = 푓’(푥). 푔(푥) + 푓(푥). 푔’(푥). Bạn hãy viết các hàm cho  
phép tính:  
′
′
( ) ( ) ( )  
푥 푔 푥 −푓 푥 푔′(푥)  
-
Đạo hàm của hàm thương dựa vào công thức: (푔푓) (푥) = 푓  
2
푔 (푥)  
-
Đạo hàm của hàm hợp: (푓 ∘ 푔)’(푥) = 푓’(푔(푥))푔’(푥).  
d) Mã nguồn của hàm 푚푎ꢀ푛() bên trên có tạo một đối tượng của lớp 푆ꢀ푛 tức là hàm 푠ꢀ푛(푥). Nếu gọi  
toán tử 푛푒푤 nhiều lần thì sẽ có nhiều đối tượng của lớp 푆ꢀ푛 được tạo. Tuy nhiên trong thực tế ta  
chỉ cần một hàm 푠ꢀ푛(푥) nên việc tạo ra nhiều đối tượng như thế là phung phí bộ nhớ. Bạn hãy  
đề xuất giải pháp và sửa mã nguồn của lớp 푆ꢀ푛 sao cho người lập trình chỉ có thể dùng một đối  
tượng duy nhất của lớp 푆ꢀ푛.  
pdf 2 trang myanh 22940 Free
Bạn đang xem tài liệu "Đề thi kết thúc học phần môn Phương pháp lập trình hướng đối tượng năm 2012", để 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:

  • pdfde_thi_ket_thuc_hoc_phan_mon_phuong_phap_lap_trinh_huong_doi.pdf