Tải bản đầy đủ (.doc) (8 trang)

Đề thi môn lập trình hướng đối tượng và c++

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (91.83 KB, 8 trang )

ĐỀ THI THAM KHẢO MÔN LẬP TRÌNH HƯỜNG ĐỐI TƯỢNG VÀ C++

Đề thi môn
Lập trình hướng đối tượng và C++
Đề số

Khoa CNTT – Bộ môn KHMT
Chủ nhiệm bộ môn

CNT45DH
GROUP

Câu 1:
a) Cho lớp Vector được khai báo như sau:
class Vector{
public:
int getSize()const; // trả về độ dài của vector
int &kthElement(int k); // trả về phần tử dữ liệu thứ k của thành viên data
private:
int data[100];
int size;
};
Hãy cài đặt hai hàm getSize() và kthElement() và các hàm cấu tử sau của lớp Vector trên:
cấu tử mặc định, cấu tử có 1 tham số mặc định là kích thước của biến thành viên size, hàm
cấu tử có hai tham số tương ứng với hai biến thành viên của lớp.
b) Cài đặt một hàm toán tử * và một hàm bạn multiply cho phép lấy tích vô hướng của
hai đối tượng thuộc lớp Vector trên.
Câu 2:
a) Cho lớp Computer được khai báo như sau:
class Computer{
public:


char * getCode() const; // trả về giá trị biến thành viên code
float getPrice() const; // trả về giá trị biến thành viên price
void setPrice(float); // thiết lập giá trị cho biến price;
void setCode(char *); // thiết lập giá trị cho biến code;
friend void sort(Computer [], int size);
private:
char code[4];
float price;
};
Hãy cài đặt hàm sort sắp xếp một mảng các đối tượng Computer theo thứ tự tăng dần
của biến thành viên code, nếu cùng giá trị code thì so sánh theo biến price.
b) Giả sử có hàm sau:
template <class T>
void sort(T [], int size);
Hãy cài đặt các hàm toán tử so sánh >, ==, <, <=, >= cho lớp Computer để có thể sử dụng
hàm sort với một mảng các đối tượng của lớp đó và cài đặt hàm sau:
template <class T>
int 2ndElement(T [], int size);
trả về chỉ số của phần tử lớn thứ hai (theo tiêu chí so sánh như hàm sort trong phần a)
trong một mảng. Sử dụng hàm 2ndElement hãy viết một đoạn chương trình đưa ra màn
hình các giá trị code và price của đối tượng Computer lớn thứ hai của một mảng các đối
tượng thuộc lớp Computer Clist.
Thời gian làm bài là 60 phút – Thí sinh không được phép mở bất kỳ tài liệu nào

8


ĐỀ THI THAM KHẢO MÔN LẬP TRÌNH HƯỜNG ĐỐI TƯỢNG VÀ C++

Đề thi môn

Lập trình hướng đối tượng và C++
Đề số

Khoa CNTT – Bộ môn KHMT
Chủ nhiệm bộ môn

CNT45DH
GROUP

Câu 1:
a) Cho đoạn chương trình sau:
class Work{
public:
char * getName();
char * getDes();
private:
char * name; // tên công việc
char * description; // mô tả về công việc
};
template <class T>
T max(T list[], int size){
T temp = list[size-1];
for(int i=0;iif(temptemp = list[i];
return new T(temp);
}
int main(){
Work works[2];
works[0] = new Work(“1”,”hard”);

works[1] = new Work(“2”);
sort(works, 2);
return 0;
}
Hãy đưa ra và cài đặt các hàm cấu tử mà lớp Work cần có để đoạn chương trình trên có thể
chạy đúng. Chỉ rõ dòng lệnh nào tương ứng với hàm toán tử nào được dùng.
b) Ngoài các hàm toán tử lớp Work trên còn cần thêm các hàm nào nữa hãy cài đặt các
hàm đó.
Câu 2:
a) Trình bày khái niệm chồng hàm (overload), khi nào nên dùng chồng hàm, khi nào
không nên, nêu ví dụ cụ thể? Các trường hợp sau có là chồng hàm hay không?
void swap(int &, int &);
void swap(float *, float *);
template <class T>
void swap(T &, T &);
b) Một hàng truy cập Internet cần viết một chương trình tính tiền truy cập cho khách. Đối
với mỗi khách hàng chương trình chỉ cần quản lý các thông tin: tên khách hàng, giờ
bắt đầu vào mạng, giờ kết thúc, số máy sử dụng để vào mạng. Hãy đưa ra các lớp (nêu
rõ các phương thức và dữ liệu) và mối quan hệ giữa các lớp mà bạn cho là cần thiết để
xây dựng chương trình trên?
Thời gian làm bài là 60 phút – Thí sinh không được phép mở bất kỳ tài liệu nào

8


ĐỀ THI THAM KHẢO MÔN LẬP TRÌNH HƯỜNG ĐỐI TƯỢNG VÀ C++

Đề thi môn
Lập trình hướng đối tượng và C++
Đề số


Khoa CNTT – Bộ môn KHMT
Chủ nhiệm bộ môn

CNT45DH
GROUP

Câu 1:
a) Cho lớp số phức ComplexN được khai báo như sau
class ComplexN{
public:
float * getReal();
float * getImg();
private:
float r; // phần thực
float i ; // phần ảo.
};
Hãy cài đặt 3 hàm cấu tử khác nhau cho lớp ComplexN trong đó có hàm cấu tử mặc định.
b) Giả sử người ta thêm vào hai hàm toán tử bạn phục vụ cho các thao tác nhập xuất dữ
liệu cho các đối tượng của lớp số phức trên, hãy cài đặt hai hàm này và sử dụng chúng
để viết một đoạn chương trình cho phép nhập dữ liệu cho một dãy 10 số phức và in
chúng ra màn hình.
Câu 2:
a) Có đoạn chương trình sau:
enum Days{Monday, Tuesday, Wenesday,Thursday, Friday, Saturday, Sunday};
Days & operator ++(Days & d, int){
if(d==Sunday)
return d=Monday;
int temp = d;
return d = static_cast<Days>(++temp);

}
int main(){
Days day = Monday;
for(;;)
{
cout << day << endl;
day ++;
if(day==Sunday)
break;
}
return 0;
}
Hãy cho biết kết quả của đoạn chương trình trên. Nếu muốn chương trình in ra màn hình
là: Thuhai, Thuba, Thutu, Thunam, Thusau, Thubay, Chunhat thì cần có thêm hàm như thế
nào, hãy đưa ra cài đặt cụ thể của hàm đó.
b) Tại sao các hàm cấu tử lại được gán nhãn là pubic, có thể có hàm cấu tử gán nhãn
private được không? Có thể khởi tạo các thành phần static trong cấu tử được không?
Thời gian làm bài là 60 phút – Thí sinh không được phép mở bất kỳ tài liệu nào

8


ĐỀ THI THAM KHẢO MÔN LẬP TRÌNH HƯỜNG ĐỐI TƯỢNG VÀ C++

Đề thi môn
Lập trình hướng đối tượng và C++
Đề số

Khoa CNTT – Bộ môn KHMT
Chủ nhiệm bộ môn


CNT45DH
GROUP

Câu 1:
a) Cho lớp IntList cài đặt danh sách móc nối các số nguyên được khai báo như sau:
class IntList{
public:
IntList(); // khởi tạo danh sách rỗng kích thước bằng 100
IntList(int Size); // khởi tạo danh sách rỗng kích thước bằng Size
int getFirst(); // trả về giá trị phần tử ở đầu danh sách
int getLast(); // trả về giá trị phần tử ở cuối danh sách
void delFirst(); // xóa phần tử ở đầu danh sách
Void delLast(); // xóa phần tử ở cuối danh sách
int getSize(); // trả về số phần tử của danh sách
private:
int * data
int size;
};
Dựa vào lớp IntList hãy kế thừa và xây dựng lớp IntStack gồm các phương thức sau:
IntStack(); // khởi tạo stack rỗng kích thước bằng 100
IntStack(int Size); // khởi tạo stack rỗng kích thước bằng Size
Bool isEmpty(); // kiểm tra stack rỗng
int Pop(); // loại bỏ phần tử ở đỉnh stack
void Push(int); // thêm 1 phần tử vào đỉnh stack
b) Thế nào là ràng buộc động, cho ví dụ? Cách thức trình biên dịch giải quyết ràng buộc
động?
Câu 2:
a) Cho lớp Song và một đoạn chương trình như sau:
class Song{

public:
friend void sort(Song [], int size);
private:
char * title;
char * content;
};
int main(){
Song songs[2];
songs[0] = new Song(“Yesterday”,””);
songs[1] = new Song();
sort(songs,2);
return 0;
}
Lớp Song có cần hủy tử và các hàm toán tử gán, cấu tử copy không, tại sao? Hãy cài đặt
các hàm này?
b) Giả sử trong chương trình người ta muốn đếm số các đối tượng thuộc lớp Song bằng
cách sử dụng một biến thành viên tĩnh, hãy viết các hàm cần thiết và đoạn chương
trình đưa ra màn hình các đối tượng thuộc lớp Song.
Thời gian làm bài là 60 phút – Thí sinh không được phép mở bất kỳ tài liệu nào

8


ĐỀ THI THAM KHẢO MÔN LẬP TRÌNH HƯỜNG ĐỐI TƯỢNG VÀ C++

Đề thi môn
Lập trình hướng đối tượng và C++
Đề số

Khoa CNTT – Bộ môn KHMT

Chủ nhiệm bộ môn

CNT45DH
GROUP

Câu 1:
a) Cho lớp Set cài đặt một tập hợp các ký tự được khai báo như sau:
const int MAX_SIZE = 255;
class CharSet{
public:
CharSet();
Bool isIn(char) const; // kiểm tra xem một ký tự có trong tập hợp không
Bool isFull()const; // kiểm tra tập hợp đã đầy chưa
Bool isEmpty() const; // kiểm tra tập hợp rỗng
int getSize() const; // trả về số phần tử của tập hợp
void add(char); // thêm vào tập hợp một ký tự mới
void del(char); // loại bỏ một ký tự khỏi tập hợp
void print()const; // in các ký tự trong tập hợp ra màn hình
private:
char data[MAX_SIZE];
int top;
};
Hãy cài đặt các các hàm của lớp Set trừ hai hàm getSize() và print().
b) Cài đặt hàm toán tử + thực hiện phép toán hợp hai tập hợp, kết quả trả về là một tập
hợp mới.
Câu 2:
a) Cho một hàm bản mẫu hoán đổi giá trị của hai đối tượng bất kỳ và đoạn chương trình
sau:
template<class T>
void swap(T& x, T& y){

T tmp = x;
x = y;
y = tmp;
}
int main(){
int i, j; swap(i, j);
float a, b ; swap(a, b);
char c, d; swap(c, d);
Person p1, p2; swap(p1, p2);
return 0;
}
Trong đó Person là một lớp có hai thành viên dữ liệu là name (một xâu ký tự có độ dài
không quá 37) và age (một số nguyên dương). Hãy cho biết để có thể dùng hàm swap với
một lớp nào đó thì lớp đó phải thỏa mãn điều kiện gì, hãy đưa ra cài đặt cụ thể với lớp
Person. Trong đoạn chương trình chính trên có các thể nghiệm hàm bản mẫu nào được
trình biên dịch sinh ra?
b) Thế nào là lớp trừu tượng, cho ví dụ? Khi nào người ta nên dùng lớp trừu tượng? Với
một lớp trừu tượng thực sự có thể dùng hàm hủy tử ảo thực sự được không, tại sao?
Thời gian làm bài là 60 phút – Thí sinh không được phép mở bất kỳ tài liệu nào

8


ĐỀ THI THAM KHẢO MÔN LẬP TRÌNH HƯỜNG ĐỐI TƯỢNG VÀ C++

Đề thi môn
Lập trình hướng đối tượng và C++
Đề số

Khoa CNTT – Bộ môn KHMT

Chủ nhiệm bộ môn

CNT45DH
GROUP

Câu 1:
a) Cho lớp Animal mô tả các đối tượng động vật nói chung và lớp Cat mô tả các đối
tượng mèo kế thừa từ lớp Animal và có thêm 1 thành viên dữ liệu là color để mô tả
màu lông, lớp Animal được khai báo như sau:
class Animal{
public:
Animal(char * N = “”):age(0){
name = new char[strlen(N)+1];
strcpy(name, N);
}
Animal(char * N, int Age):age(Age){
name = new char[strlen(N)+1];
strcpy(name, N);
}
~Animal(){delete name;}
private:
char * name;
int age;
};
Giả sử lớp Cat có hai cấu tử: một cấu tử mặc định và một cấu tử có đầy đủ 3 tham số cho
các biến thành viên và một hủy tử. Hãy đưa ra cài đặt của lớp Cat.
b) Nêu sự khác nhau giữa việc gọi một hàm ảo và một hàm bình thường? Có thể thực
hiện chồng hàm hủy tử của một lớp được không, tại sao?
Câu 2:
Cho lớp bản mẫu Stack được khai báo như sau:

template <class T>
class Link{
T data;
Link* next;
void initialize(T dat, Link* nxt){};
public: friend class Stack<T>;
~Link(){delete next;}
};
template <class D>
class Stack {
Link<D>* head;
public:
void initialize(); // khởi tạo một Stack rỗng
void push(D dat); // thêm một phần tử vào đầu Stack
D pop(); // loại bỏ phần tử trên đỉnh Stack
~Stack();
};
Hãy đưa ra cài đặt đầy đủ của lớp Stack và cho biết một lớp C bất kỳ cần thỏa mãn điều
kiện gì để có thể sử dụng lớp thể nghiệm Stack<C>.
Thời gian làm bài là 60 phút – Thí sinh không được phép mở bất kỳ tài liệu nào

8


ĐỀ THI THAM KHẢO MÔN LẬP TRÌNH HƯỜNG ĐỐI TƯỢNG VÀ C++

Đề thi môn
Lập trình hướng đối tượng và C++
Đề số


Khoa CNTT – Bộ môn KHMT
Chủ nhiệm bộ môn

CNT45DH
GROUP

Câu 1:
a) Cho hai lớp A, B các lớp C, D dựa trên hai lớp A, B như sau:
class C{
class D{
public:
public:
C();
D();
~C();
~D();
private:
private:
A aObj;
A aObjList[10];
B bObj;
};
};
Giả sử các lớp A, B có đầy đủ các hàm cấu tử và hủy tử hãy cho biết thứ tự gọi tới các
hàm cấu tử và hủy tử của hai đối tượng aObj, bObj đối với lớp C và các đối tượng của
mảng aObjList đối với lớp D.
b) Chỉ ra các chỗ sai trong đoạn chương trình sau và sửa lại (có thể bỏ đi nếu cần thiết)
cho đúng:
class Point {
public:

Point(float x, float y); // hàm cấu tử khởi tạo tọa độ
Point(float r, float a); // hàm cấu tử khởi tạo tọa độ
Point():x(0.0), y(0.0), numberOfPoints(0){}; // hàm cấu tử khởi tạo
~Point();
private:
float x, y;
static int numberOfPoints; // biến dùng để đếm số đối tượng thuộc lớp Point
};
main(){
Points p[10];
cout << “So cac diem hien tai la:” << Points::numberOfPoints;
}
Đưa ra đoạn cài đặt cần thiết để đoạn chương trình trong hàm main có thể chạy đúng.
Câu 2:
a) Cho hàm bản mẫu Max trả về phần tử lớn nhất của một mảng khai báo như sau:
template <class T>
T & Max(T a[], int size);
Hãy cài đặt hàm Max và các hàm cần thiết khác để đoạn chương trình sau đây có thể chạy
đúng:
main(){
int a[] = {1, 3 , -9}, char * str[] = {“Nam”, “Bac”, “Dong”, “Tay”};
cout << Max(a, 3) << “ “ << Max(str, 4);
}
b) Trong thuật toán sắp xếp nổi bọt giảm dần khi xét phần tử thứ i, ta sẽ đổi chỗ nó với
phần tử lớn nhất trong số n – i phần tử đứng sau nó. Hãy viết hàm bản mẫu Sort sắp
xếp một mảng bất kỳ bằng cách sử dụng gợi ý trên và hàm bản mẫu Max ở phần a.
Thời gian làm bài là 60 phút – Thí sinh không được phép mở bất kỳ tài liệu nào

8



ĐỀ THI THAM KHẢO MÔN LẬP TRÌNH HƯỜNG ĐỐI TƯỢNG VÀ C++

Đề thi môn
Lập trình hướng đối tượng và C++
Đề số

Khoa CNTT – Bộ môn KHMT
Chủ nhiệm bộ môn

CNT45DH
GROUP

Câu 1:
a) Cho lớp Stdlib được khai báo như sau:
class Stdlib {
public:
static int strlen(const char* s) { return ::strlen(s); }
static int strcmp(const char* a, const char* b) { return ::strcmp(a, b); }
};
Khai báo trên có gì sai không, nếu có hãy chỉ rõ chỗ sai và sửa lại. Cho biết giá trị của
sizeof(Stdlib). Để sử dụng các phương thức của lớp Stdlib có cần tạo ra đối tượng nào
tương ứng hay không, cho ví dụ cụ thể?
b) Cho hai lớp Base và Derived được khai báo như sau:
class Base {
class Derived : public Base {
private:
private:
int x;
int y;

public:
char* s;
Base() : x(0) {}
public:
Base(int x) : x(x) {}
Derived() : Base(), y(0), s(0) {}
protected:
Derived(int x,int y): Base(x), y(0), s(0){}
void print(ostream&);
void print(ostream& s);
};
};
Hãy cho biết giá trị của sizeof(Base), sizeof(Derived) và giải thích?
Câu 2:
Cho lớp bản mẫu LinkList được khai báo như sau:
template <class T>
class Node{
T data;
Node* next;
void initialize(T dat, Node* nxt):data(dat), next(nxt){};
friend class LinkList;
~Node(){delete next;}
};
template <class D>
class LinkList{
Node<D>* head;
public:
LinkList(); // khởi tạo một danh sách rỗng
void add(D & dat); // thêm một phần tử vào danh sách
void del(D & dat); // loại bỏ phần tử khỏi danh sách

void sort(); // sắp xếp danh sách
~LinkList();};
Hãy đưa ra cài đặt đầy đủ của lớp LinkList và cho biết một lớp C bất kỳ cần thỏa mãn điều
kiện gì để có thể sử dụng lớp thể nghiệm LinkList<C>.
Thời gian làm bài là 60 phút – Thí sinh không được phép mở bất kỳ tài liệu nào

8



×