Chương 1: Giới thiệu tổng quan về các phương pháp lập trình
Trình bày các phương pháp lập trình tuyến tính, lập trình cấu trúc và đặc biệt, làm quen với các khái niệm trong lập trình hướng đối tượng.
Chương 2: Con trỏ và mảng
Trình bày cách khai báo và sử dụng các kiểu con trỏ và mảng trong ngôn ngữ C++.
1. Trong các khai báo con trỏ sau, những khai báo nào là đúng:
a. int A*;
b. *int A;
c. int* A, B;
d. int* A, *B;
e. int *A, *B;
2. Với khai báo:
int a = 12;
int *pa;
Các phép gán nào sau đây là hợp lệ:
a. pa = &a;
b. pa = a;
c. *pa = &a;
d. *pa = a;
3. Với khai báo:
int A[5] = {10, 20, 30, 40, 50};
int *pa = A+2;
Khi đó, *pa = ?
a. 10
b. 20
c. 30
d. 40
e. 50
4. Với đoạn chương trình:
int A[5] = {10, 20, 30, 40, 50};
int *pa = A;
*pa += 2;
Khi đó, *pa = ?
a. 10
b. 12
c. 30
d. 32
5. Với đoạn chương trình:
int A[5] = {10, 20, 30, 40, 50};
int *pa = A;
pa += 2;
Khi đó, *pa = ?
a. 10
b. 12
c. 30
d. 32
6. Với đoạn chương trình:
int A[5] = {10, 20, 30, 40, 50};
int *pa = A;
pa += 2;
Khi đó, pa = ?
a. &A[0]
b. A[2]
c. &A[2]
d. Không xác định
7. Với đoạn chương trình:
int A[5] = {10, 20, 30, 40, 50};
int *pa = A;
pa -= 2;
Khi đó, pa = ?
a. &A[0]
b. &A[2]
c. &A[4]
d. Không xác định
8. Với đoạn chương trình:
int A[3][3] = {
{10, 20, 30},
{40, 50, 60},
{70, 80, 90}
};
int *pa;
Khi đó, để có được kết quả *pa = 50, các lệnh nào sau đây là đúng?
a. pa = A + 4;
b. pa = (*(A+1)) + 1;
c. pa = &A[1][1];
d. pa = *((*(A+1)) + 1);
9. Giả sử ta khai báo một hàm có sử dụng con trỏ hàm với khuôn mẫu như sau:
int Calcul(int a, int b, int (*Xcalcul)(int x, int y)){}
Và ta có cài đặt một số hàm như sau:
int add(int a, int b);
void cal(int a, int b);
int squere(int a);
Khi đó, lời gọi hàm nào sau đây là đúng:
a. Calcul(5, 10, add);
b. Calcul(5, 10, add(2, 3));
c. Calcul(5, 10, cal);
d. Calcul(5, 10, squere);
10. Ta muốn cấp phát bộ nhớ cho một con trỏ kiểu int và khởi đầu giá trị cho nó là 20. Lệnh nào sau đây là đúng:
a. int *pa = 20;
b. int *pa = new int{20};
c. int *pa = new int(20);
d. int *pa = new int[20];
11. Ta muốn cấp phát bộ nhớ cho một mảng động kiểu int có chiều dài là 20. Lệnh nào sau đây là đúng:
a. int *pa = 20;
b. int *pa = new int{20};
c. int *pa = new int(20);
d. int *pa = new int[20];
12. Xét đoạn chương trình sau:
int A[5] = {10, 20, 30, 40, 50};
int *pa = A;
pa = new int(2);
Khi đó, *pa = ?
a. 10
b. 30
c. 2
d. Không xác định
13. Xét đoạn chương trình sau:
1> int A[5] = {10, 20, 30, 40, 50};
2> int *pa = A;
3> pa += 15;
4> delete pa;
Đoạn chương trình trên có lỗi ở dòng nào?
a. 1
b. 2
c. 3
d. 4
14. Viết chương trình thực hiện các phép toán cộng, trừ, nhân, chia trên đa thức. Các đa thức được biểu diễn bằng mảng động một chiều. Bậc của đa thức và các hệ số tương ứng được nhập từ bàn phím.
15. Viết chương trình thực hiện các phép toán cộng, trừ, nhân hai ma trận kích thước m*n. Các ma trận được biểu diễn bằng mảng động hai chiều. Giá trị kích cỡ ma trận (m, n) và giá trị các phần tử của ma trận được nhập từ bàn phím.
Chương 3: Kiểu dữ liệu có cấu trúc
Trình bày cách biểu diễn và cài đặt một số kiểu cấu trúc dữ liệu trừu tượng trong C++. Sau đó, trình bày cách áp dụng các kiểu dữ liệu này trong các ứng dụng cụ thể.
1. Để định nghĩa một cấu trúc sinh viên có tên là Sinhvien, gồm có tên và tuổi sinh viên.
Định nghĩa nào sau đây là đúng:
a. struct Sinhvien{
char name[20];
int age;
};
b. struct {
char name[20];
int age;
} Sinh vien;
c. typedef struct Sinhvien{
char name[20];
int age;
};
2. Một cấu trúc được định nghĩa như sau:
struct Employee{
char name[20];
int age;
};
Khi đó, cách khai báo biến nào sau đây là đúng:
a. struct Employee myEmployee;
b. struct employee myEmployee;
c. Employee myEmployee;
d. employee myEmployee;
3. Một cấu trúc được định nghĩa như sau:
typedef struct employee{
char name[20];
int age;
} Employee;
Khi đó, cách khai báo biến nào sau đây là đúng:
a. Employee myEmployee;
b. employee myEmployee;
c. struct Employee myEmployee;
d. struct employee myEmployee;
4. Với cấu trúc được định nghĩa như trong bài 3. Khi đó, cách khởi tạo biến nào sau đây là đúng:
a. Employee myEmployee = {‘A’, 27};
b. Employee myEmployee = {“A”, 27};
c. Employee myEmployee = (‘A’, 27);
d. Employee myEmployee = (“A”, 27);
5. Với cấu trúc được định nghĩa như trong bài 3. Khi đó, các cách cấp phát bộ nhớ cho biến con trỏ nào sau đây là đúng:
a. Employee *myEmployee = new Employee;
b. Employee *myEmployee = new Employee();
c. Employee *myEmployee = new Employee(10);
d. Employee *myEmployee = new Employee[10];
6. Định nghĩa một cấu trúc về môn học của một học sinh có tên Subject, bao gồm các thông tin:
• Tên môn học, kiểu char[];
• Điểm tổng kết môn học, kiểu float;
7. Định nghĩa cấu trúc về học sinh tên là Student bao gồm các thông tin sau:
• Tên học sinh, kiểu char[];
• Tuổi học sinh, kiểu int;
• Lớp học sinh, kiểu char[];
• Danh sách điểm các môn học của học sinh, kiểu là một mảng các cấu trúc Subject
đã được định nghĩa trong bài tập 6.
• Xếp loại học lực, kiểu char[];
8. Khai báo một biến có cấu trúc là Student đã định nghĩa trong bài 7. Sau đó, thực hiện tính điểm trung bình của tất cả các môn học của học sinh đó, và viết một thủ tục xếp loại học sinh dựa vào điểm trung bình các môn học:
• Nếu điểm tb nhỏ hơn 5.0, xếp loại kém
• Nếu điểm tb từ 5.0 đến dưới 6.5, xếp loại trung bình.
• Nếu điểm tb từ 6.5 đến dưới 8.0, xếp loại khá
• Nếu điểm tb từ 8.0 trở lên, xếp loại giỏi.
9. Viết một chương trình quản lí các học sinh của một lớp, là một dãy các cấu trúc có kiểu Stupid định nghĩa trong bài 7. Sử dụng thủ tục đã cài đặt trong bài 8 để thực hiện các thao tác sau:
• Khởi tạo danh sách và điểm của các học sinh trong lớp.
• Tính điểm trung bình và xếp loại cho tất cả các học sinh.
• Tìm tất cả các học sinh theo một loại nhất định
10. Sử dụng cấu trúc ngăn xếp đã định nghĩa trong bài để đổi một số từ kiểu thập phân sang kiểu nhị phân: Chi số nguyên cho 2, mãi cho đến khi thương <2, lưu các số dư vào ngăn xếp. Sau đó, đọc các giá trị dư từ ngăn xếp ra, ta sẽ thu được chuỗi nhị phân tương ứng.
11. Mở rộng cấu trúc hàng đợi đã định nghĩa trong bài để trở thành hàng đợi có độ ưu tiên:
• Cho mỗi node thêm một thuộc tính là độ ưu tiên của node đó
• Khi thêm một node vào hàng đợi, thay vì thêm vào cuối hàng đợi như thông thường, ta tìm vị trí có độ ưu tiên phù hợp để chèn node vào, sao cho dãy các node trong hàng đợi là một danh sách có độ ưu tiên của các node là giảm dần.
• Việc lấy ra là không thay đổi: lấy ra phần tử ở đầu hàng đợi, chính là phần tử có độ ưu tiên cao nhất.
12. Áp dụng hàng đợi có độ ưu tiên trong bài 11 để xây dựng chương trình quản lí tiến trình có độ ưu tiên của hệ điều hành, mở rộng ứng dụng trong bài ngăn xếp.
13. Mở rộng cấu trúc danh sách liên kết đơn trong bài thành danh sách liên kết kép:
• Mỗi node có thêm một con trỏ prev để trỏ đến node trước nó
• Đối với node header, cũng cần 2 con trỏ: trỏ đến node đầu tiên và node cuối cùng của danh sách
• Riêng với node đầu tiên (front) của danh sách, con trỏ prev của nó sẽ trỏ đến NULL. Giống như con trỏ next của node rear.
14. Cài đặt lại hai tháo tác thêm vào một node và xoá một node ở một vị trí xác định trong một cấu trúc danh sách liên kết kép định nghĩa trong bài 13.
15. Áp dụng các định nghĩa và thao tác trong các bài 13 và 14. Cài đặt lại chương trình quản lí nhân viên ở chương trình 3.6c bằng danh sách liên kết kép.
Chương 4: Vào ra trên tệp
Trình bày các thao tác đọc, ghi dữ liệu trên các tệp tin khác nhau: tệp tin văn bản và tệp tin nhị phân. Trình bày các cách truy nhập tệp tin trực tiếp.
1. Muốn mở một tệp tin tên là abc.txt để đọc dữ liệu, lệnh mở tệp nào sau đây là đúng:
a. fstream myFile(“abc.txt”, ios::in);
b. fstream myFile(“abc.txt”, ios::out);
c. fstream myFile(“abc.txt”, ios::app);
d. fstream myFile(“abc.txt”, ios::ate);
2. Muốn mở một tệp tin abc.txt nằm trong thư mục xyz để ghi dữ liệu vào. Lệnh mở nào sau đây là đúng:
a. fstream myFile(“xyz\abc.txt”, ios::out);
b. fstream myFile(“xyz\\abc.txt”, ios::out);
c. fstream myFile(“xyz/abc.txt”, ios::out);
d. fstream myFile(“xyz//abc.txt”, ios::out);
3. Muốn mở một tệp tin abc.txt để ghi thêm dữ liệu vào cuối tệp, lệnh nào sau đây là đúng:
a. fstream myFile(“abc.txt”, ios::out);
b. fstream myFile(“abc.txt”, ios::app);
c. fstream myFile(“abc.txt”, ios::out|ios::app);
d. fstream myFile(“abc.txt”, ios::out||ios::app);
4. Xét hai lệnh khai báo sau:
fstream myFile1(“abc.txt”, ios::out);
ofstream myFile2(“abc.txt”, ios::out);
Nhận định nào sau đây là đúng:
a. myFile1 và myFile2 có chức năng giống nhau.
b. myFile1 và myFile2 có chức năng khác nhau
5. Xét hai lệnh khai báo sau:
fstream myFile1(“abc.txt”, ios::in);
ifstream myFile2(“abc.txt”, ios::in);
Nhận định nào sau đây là đúng:
a. myFile1 và myFile2 có chức năng giống nhau.
b. myFile1 và myFile2 có chức năng khác nhau
6. Xét đoạn chương trình sau:
ofstream myFile(“abc.txt”, ios::out);
if(myFile) myFile << “abc.txt”;
Chương trình sẽ làm gì?
a. Ghi ra màn hình dòng chữ “abc.txt”
b. Ghi vào tệp tin abc.txt dòng chữ “abc.txt”
c. Đọc từ tệp tin abc.txt dòng chữ “abc.txt”
d. Chương trình sẽ báo lỗi.
7. Xét đoạn chương trình sau:
ifstream myFile(“abc.txt”, ios::in);
char text[20];
if(myFile) myFile >> text;
Chương trình sẽ làm gì, nếu tệp tin abc.txt có nội dung là dòng chữ “abc.txt”?
a. Ghi ra màn hình dòng chữ “abc.txt”
b. Ghi vào tệp tin abc.txt dòng chữ “abc.txt”
c. Đọc từ tệp tin abc.txt dòng chữ “abc.txt”
d. Chương trình sẽ báo lỗi.
8. Xét đoạn chương trình sau:
fstream myFile(“abc.txt”, ios::out);
if(myFile) myFile << “abc.txt”;
myFile.close();
myFile.open(“abc.txt”, ios::in);
char text[20];
if(myFile) myFile >> text;
cout << text;
Chương trình sẽ làm gì, nếu tệp tin abc.txt có nội dung là dòng chữ “abc.txt”?
a. Ghi vào tệp tin abc.txt dòng chữ “abc.txt”
b. Đọc từ tệp tin abc.txt dòng chữ “abc.txt”
c. Ghi ra màn hình dòng chữ “abc.txt”
d. Cả ba đáp án trên.
e. Chương trình sẽ báo lỗi.
9. Xét đoạn chương trình sau:
ifstream myFile(“abc.txt”, ios::in);
if(myFile) cout << myFile.tellg();
Chương trình sẽ in ra màn hình kết quả gì?
a. 0
b. 1
c. 8
d. 16
10. Xét đoạn chương trình sau, nếu tệp abc.txt chứa một số lượng kí tự đủ lớn:
ifstream myFile(“abc.txt”, ios::in);
if(myFile){
char c;
myFile >> c;
cout << myFile.tellg();
}
Chương trình sẽ in ra màn hình kết quả gì?
a. 0
b. 1
c. 8
d. 16
11. Xét đoạn chương trình sau, nếu tệp abc.txt chứa một số lượng kí tự đủ lớn:
ifstream myFile(“abc.txt”, ios::in);
if(myFile){
myFile.seekg(sizeof(char)*5, ios::beg);
myFile.seekg(sizeof(char)*5, ios::cur);
cout << myFile.tellg();
}
Chương trình sẽ in ra màn hình kết quả gì?
a. 0
b. 5
c. 10
d. 80
12. Viết một chương trình gộp nội dung của hai tệp tin có sẵn vào một tệp tin thứ ba. Tên các tệp tin được nhập vào từ bàn phím.
13. Viết một chương trình tìm kiếm trên tệp nhị phân có cấu trúc được tạo bởi chương trình 4.4: Tìm tất cả các nhân viên có tên là X, X được nhập từ bàn phím. Hiển thị kết quả là tất cả các thông tin về các nhân viên được tìm thấy.
14. Viết một chương trình tìm kiếm trên tệp nhị phân có cấu trúc được tạo bởi chương trình 4.4: Tìm tất cả các nhân viên có năm sinh là X, X được nhập từ bàn phím. Hiển thị kết quả là tất cả các thông tin về các nhân viên được tìm thấy.
15. Viết một chương trình tìm kiếm trên tệp nhị phân có cấu trúc được tạo bởi chương trình 4.4: Tìm tất cả các nhân viên có lương cao hơn hoặc bằng một giá trị X, X được nhập từ bàn phím. Hiển thị kết quả là tất cả các thông tin về các nhân viên được tìm thấy.
16. Viết một chương trình sao chép một đoạn đầu nội dung của một tệp tin vào một tệp tin thứ hai. Tên các tệp tin và độ dài đoạn nội dung cần sao chép được nhập từ bàn phím.
17. Viết một chương trình sao chép một đoạn cuối nội dung của một tệp tin vào một tệp tin thứ hai. Tên các tệp tin và độ dài đoạn nội dung cần sao chép được nhập từ bàn phím.
Chương 5: Lớp đối tượng
Trình bày các khái niệm mở đầu cho lập trình hướng đối tượng trong C++, bao gồm cách khai báo và sử dụng lớp, các thuộc tính của lớp; cách khởi tạo và huỷ bỏ đối tượng, các quy tắc truy nhập đến các thành phần của lớp.
1. Trong các khai báo lớp sau, những khai báo nào là đúng:
a. class MyClass;
b. Class MyClass;
c. class MyClass{…};
d. Class MyClass{…};
2. Giả sử ta đã định nghĩa lớp MyClass, bây giờ ta khai báo một đối tượng thuộc kiểu lớp này. Khai báo nào là đúng:
a. class MyClass me;
b. MyClass me;
c. MyClass me();
d. MyClass me{};
3. Trong các khai báo thuộc tính ngay trong phạm vi của khai báo lớp như sau, những khai báo nào là đúng:
a. int myAge;
b. private int myAge;
c. public int myAge;
d. private: int myAge;
4. Trong các khai báo phương thức ngay trong phạm vi của khai báo lớp MyClass như sau, những khai báo nào là đúng:
a. public: void show();
b. void show();
c. void show(){cout << “hello!”;};
d. void MyClass::show(){cout << “hello!”;}
5. Xét đoạn chương trình sau:
class MyClass{
int age;
public:
int getAge();
};
MyClass me;
Khi đó, trong các lệnh sau, lệnh nào có thể thêm vào cuối đoạn chương trình trên:
a. cout << MyClass::age;
b. cout << me.age;
c. cout << me.getAge();
d. cin >> me.age;
6. Trong các khai báo hàm khởi tạo cho lớp MyClass như sau, những khai báo nào là đúng:
a. myClass();
b. MyClass();
c. MyClass(MyClass);
d. void MyClas();
e. MyClass MyClass();
7. Trong các khai báo hàm hủy bỏ cho lớp MyClass như sau, những khai báo nào là đúng:
a. ~myClass();
b. ~MyClass();
c. ~MyClass(MyClass);
d. void ~MyClas();
e. MyClass ~MyClass();
8. Giả sử ta khai báo lớp MyClass có một thuộc tính age và một hàm khởi tạo:
class MyClass{
int age;
public:
MyClass(MyClass me){
…
};
int getAge(){return age};
};
Trong các dòng lệnh sau, những dòng nào có thể xuất hiện trong hàm khởi tạo trên:
a. age = MyClass.age;
b. age = me.age;
c. age = MyClass.getAge();
d. age = me.getAge();
e. age = 10;
9. Xét khai báo lớp như sau:
class MyClass{
public:
MyClass(MyClass);
MyClass(int);
};
Khi đó, trong số các khai báo đối tượng sau, những khai báo nào là đúng:
a. MyClass me;
b. MyClass me();
c. MyClass me(10);
d. MyClass me1(10), me2(me1);
10. Xét khai báo lớp như sau:
class MyClass{
public:
MyClass();
};
Khi đó, trong số các khai báo con trỏ đối tượng sau, những khai báo nào là đúng:
a. MyClass *me;
b. MyClass *me();
c. MyClass *me = new me();
d. MyClass *me = new MyClass();
11. Xét khai báo lớp như sau:
class MyClass{
public:
MyClass(int i=0, int j=0, float k=0);
};
Khi đó, trong số các khai báo con trỏ đối tượng sau, những khai báo nào là đúng:
a. MyClass *me;
b. MyClass *me = new MyClass();
c. MyClass *me = new MyClass(1, 20);
d. MyClass *me = new MyClass(1, 20, 30);
12. Khai báo một lớp nhân viên, có tên là Employee, với ba thuộc tính có tính chất private:
- Tên nhân viên, có dạng một con trỏ kiểu char
- Tuổi nhân viên, có kiểu int
- Luơng nhân viên, có kiểu float.
13. Thêm vào lớp Employee trong bài 12 các phương thức có tính chất public:
- set/get giá trị thuộc tính tên nhân viên
- set/get giá trị thuộc tính tuổi nhân viên
- set/get giá trị thuộc tính luơng nhân viên.
14. Viết một hàm khởi tạo không có tham số cho lớp Employee trong bài 13, các thuộc tính của lớp nhận giá trị mặc định:
- giá trị thuộc tính tên nhân viên, mặc định là chuỗi kí tự rỗng “”
- giá trị thuộc tính tuổi nhân viên, mặc định là 18
- giá trị thuộc tính luơng nhân viên, mặc định là $100.
15. Viết thêm một hàm khởi tạo với đầy đủ ba tham số tương ứng với ba thuộc tính của lớp Employee trong bài 14.
16. Thêm vào lớp Employee một phương thức show() để giới thiệu về tên, tuổi và lương của đối tượng nhân viên.
17. Viết một hàm hủy bỏ tường minh cho lớp Employee nhằm giải phóng vùng nhớ của con trỏ char, là kiểu của thuộc tính tên nhân viên.
18. Viết một chương trình sử dụng lớp Employee được xây dựng sau bài 17 với các thao tác sau:
- Khai báo một đối tượng kiểu Employee, dùng hàm khởi tạo không tham số
- Dùng hàm show() để giới thiệu về đối tượng đó
19. Viết một chương trình sử dụng lớp Employee được xây dựng sau bài 17 với các thao tác sau:
- Khai báo một đối tượng kiểu Employee, dùng hàm khởi tạo không tham số
- Nhập từ bàn phím giá trị các thuộc tính tên, tuổi, lương nhân viên.
- Gán các giá trị này cho các thuộc tính của đối tượng đã khai báo, dùng các hàm set
- Dùng hàm show() để giới thiệu về đối tượng đó
20. Viết một chương trình sử dụng lớp Employee được xây dựng sau bài 17 với các thao tác sau:
- Khai báo một đối tượng kiểu Employee, dùng hàm khởi tạo vởi đủ 3 tham số
- Dùng hàm show() để giới thiệu về đối tượng đó
21. Viết một chương trình sử dụng lớp Employee được xây dựng sau bài 17 với các thao tác sau:
- Khai báo một con trỏ đối tượng kiểu Employee
- Cấp phát bộ nhớ, dùng hàm khởi tạo vởi đủ 3 tham số
- Dùng hàm show() để giới thiệu về đối tượng mà con trỏ này đang trỏ tới
22. Viết một chương trình nhập dữ liệu cho một mảng động các đối tượng của lớp Employee trong bài 17. Chiều dài mảng động cũng được nhập từ bàn phím.
23. Viết một chương trình tìm kiếm trên mảng động đã được xây dựng trong bài 22: tìm kiếm và giới thiệu về nhân viên trẻ nhất và nhân viên già nhất trong mảng đó.
24. Viết một chương trình tìm kiếm trên mảng động đã được xây dựng trong bài 22: tìm kiếm và giới thiệu về nhân viên có lương cao nhất và nhân viên có lương thấp nhất trong mảng đó.
25. Viết một chương trình tìm kiếm trên mảng động đã được xây dựng trong bài 22: tìm kiếm và giới thiệu về nhân viên có tên xác định, do người dùng nhập từ bàn phím.
Chương 6: Tính kế thừa và tương ứng bội
Trình bày cách thức kế thừa giữa các lớp trong C++, các nguyên tắc truy nhập trong kế thừa, định nghĩa nạp chồng các phương thức và tính đa hình trong lập trình hướng đối tượng với C++.
1. Trong các khai báo sau, khai báo nào là đúng cú pháp kế thừa lớp:
a. class A: public class B{…};
b. class A: public B{…};
c. class A: class B{…};
d. class A:: public B{…};
2. Trong các kiểu dẫn xuất sau, từ các phương thức lớp dẫn xuất, không thể truy nhập đến các thành phần private của lớp cơ sở:
a. private
b. protected
c. public
d. Cả ba kiểu trên
3. Trong các kiểu dẫn xuất sau, từ đối tượng của lớp dẫn xuất, có thể truy nhập đến các thành phần của lớp cơ sở:
a. private
b. protected
c. public
d. Cả ba kiểu trên
4. A là lớp dẫn xuất public từ lớp cơ sở B. Giả sử có các kiểu khai báo:
A myA, *ptrA;
B myB, *ptrB;
Khi đó, các lệnh nào sau đây là không có lỗi:
a. myA = myB;
b. myB = myA;
c. ptrA = &myB;
d. ptrB = &myA;
e. ptrA = ptrB;
f. ptrB = ptrA;
5. A là lớp dẫn xuất public từ lớp cơ sở B. Giả sử có các kiểu khai báo và nguyên mẫu hàm:
A myA;
B myB;
void show(A, B);
Khi đó, các lệnh gọi hàm nào sau đây là không có lỗi:
a. show(myA, myA);
b. show(myA, myB);
c. show(myB, myA);
d. show(myB, myB);
6. A là lớp dẫn xuất public từ lớp cơ sở B. Giả sử B có một hàm khởi tạo:
B(int, float);
Khi đó, định nghĩa hàm khởi tạo nào sau đây của lớp A là chấp nhận được:
a. A::A(){…};
b. A::A(): B(){…};
c. A::A(int x, float y): B(){…};
d. A::A(int x, float y): B(x, y){…};
7. A là lớp dẫn xuất public từ lớp cơ sở B. Giả sử B có hai hàm khởi tạo:
B();
B(int, float);
Khi đó, những định nghĩa hàm khởi tạo nào sau đây của lớp A là chấp nhận được:
a. A::A(){…};
b. A::A(): B(){…};
c. A::A(int x, float y): B(){…};
d. A::A(int x, float y): B(x, y){…};
8. A là lớp dẫn xuất public từ lớp cơ sở B. Giả sử B có hàm huỷ bỏ tường minh:
~B();
Khi đó, những định nghĩa hàm huỷ bỏ nào sau đây của lớp A là chấp nhận được:
a. A::~A(){…};
b. A::~A(): ~B(){…};
c. A::~A(int x){…};
d. A::~A(int x): ~B(){…};
9. Giả sử B là một lớp được khai báo:
class B{
int x;
public: int getx();
};
và A là một lớp dẫn xuất từ lớp B theo kiểu private:
class A: private B{
};
khi đó, nếu myA là một đối tượng lớp A, lệnh nào sau đây là chấp chận được:
a. myA.x;
b. myA.getx();
c. Cả hai lệnh trên.
d. Không lệnh nào cả.
10. Giả sử B là một lớp được khai báo:
class B{
int x;
public: int getx();
};
và A là một lớp dẫn xuất từ lớp B theo kiểu protected:
class A: protected B{
};
khi đó, nếu myA là một đối tượng lớp A, lệnh nào sau đây là chấp chận được:
a. myA.x;
b. myA.getx();
c. Cả hai lệnh trên.
d. Không lệnh nào cả.
11. Giả sử B là một lớp được khai báo:
class B{
int x;
public: int getx();
};
và A là một lớp dẫn xuất từ lớp B theo kiểu public:
class A: public B{
};
khi đó, nếu myA là một đối tượng lớp A, lệnh nào sau đây là chấp chận được:
a. myA.x;
b. myA.getx();
c. Cả hai lệnh trên.
d. Không lệnh nào cả.
12. Giả sử B là một lớp được khai báo:
class B{
public: void show();
};
và A là một lớp dẫn xuất từ lớp B theo kiểu public, có định nghĩa chồng hàm show():
class A: public B{
public: void show();
};
khi đó, nếu myA là một đối tượng lớp A, muốn thực hiện phương thức show() của lớp B thì lệnh nào sau đây là chấp chận được:
a. myA.show();
b. myA.B::show();
c. B::myA.show();
d. A::B::show();
13. Muốn khai báo một lớp A kế thừa từ hai lớp cơ sở B và C, những lệnh nào là đúng:
a. class A: B, C{…};
b. class A: public B, C{…};
c. class A: public B, protected C{…};
d. class A: public B, public C{…};
14. B là một lớp có hai hàm khởi tạo:
B();
B(int);
C cũng là một lớp có hai hàm khởi tạo:
C();
C(int, int);
Và A là một lớp kế thừa từ B và C:
class A: public B, public C{…};
Khi đó, hàm khởi tạo nào sau đây của lớp A là chấp nhận được:
a. A::A(){…};
b. A::A():B(),C(){…};
c. A::A(int x, int y): C(x, y){…};
d. A::A(int x, int y, int z): B(x), C(y, z){…};
e. A::A(int x, int y, int z): C(x, y), B(z){…};
15. Muốn khai báo lớp A kế thừa từ lớp cơ sở trừu tượng B, những khai báo nào sau đây là đúng:
a. virtual class A: public B{…};
b. class virtual A: public B{…};
c. class A: virtual public B{…};
d. class A: public virtual B{…};
16. Lớp A là một lớp dẫn xuất, được kế thừa từ lớp cơ sở B. Hai lớp này đều định nghĩa hàm show(). Muốn hàm này trở thành trừu tượng thì những định nghĩa nào sau đây là đúng:
a. void A::show(){…} và void B::show(){…}
b. virtual void A::show(){…} và void B::show(){…}
c. void A::show(){…} và virtual void B::show(){…}
d. virtual void A::show(){…} và virtual void B::show(){…}
17. Khai báo lớp người (Human) bao gồm các thuộc tính sau:
• Tên người (name)
• Tuổi của người đó (age)
• Giới tính của người đó (sex)
Sau đó khai báo lớp Cá nhân (Person) kế thừa từ lớp Human vừa được định nghĩa ở trên.
18. Bổ sung các phương thức truy nhập các thuộc tính của lớp Human, các phương thức này có tính chất public.
19. Bổ sung thêm các thuộc tính của lớp Person: địa chỉ và số điện thoại. Thêm các phương thức truy nhập các thuộc tính này trong lớp Person.
20. Xây dựng hai hàm khởi tạo cho lớp Human: một hàm không tham số, một hàm với đủ ba tham số tương ứng với ba thuộc tính của nó. Sau đó, xây dựng hai hàm khởi tạo cho lớp Person có sử dụng các hàm khởi tạo của lớp Human: một hàm không tham số, một hàm đủ năm tham số (ứng với hai thuộc tính của lớp Person và ba thuộc tính của lớp Human).
21. Xây dựng một hàm main, trong đó có yêu cầu nhập các thuộc tính để tạo một đối tượng có kiểu Human và một đối tượng có kiểu Person, thông qua các hàm set thuộc tính đã xây dựng.
22. Xây dựng hàm show() cho hai lớp Human và Person. Thay đổi hàm main: dùng một đối tượng có kiểu lớp Person, gọi hàm show() của lớp Person, sau đó lại gọi hàm show() của lớp Human từ chính đối tượng đó.
23. Khai báo thêm một lớp người lao động (Worker), kế thừa từ lớp Human, có thêm thuộc tính là số giờ làm việc trong một tháng (hour) và tiền lương của người đó (salary). Sau đó, khai báo thêm một lớp nhân viên (Employee) kế thừa đồng thời từ hai lớp: Person và Worker. Lớp Employee có bổ sung thêm một thuộc tính là chức vụ (position).
24. Chuyển lớp Human thành lớp cơ sở trừu tượng của hai lớp Person và Worker. Xây dựng thêm hai hàm show() của lớp Worker và lớp Employee. Trong hàm main, khai báo một đối tượng lớp Employee, sau đó gọi đến các hàm show() của các lớp Employee, Person, Worrker và Human.
25. Chuyển hàm show() trong các lớp trên thành phương thức trừu tượng. Trong hàm main, khai báo một con trỏ kiểu Human, sau đó, cho nó trỏ đến lần lượt các đối tượng của các lớp Human, Person, Worker và Employee, mỗi lần đều gọi phương thức show() để hiển thị thông báo ra màn hình.
Chương 7: Một số lớp quan trọng
Trình bày cách sử dụng một số lớp có sẵn trong thư viện chuẩn của C++, bao gồm các lớp: lớp tập hợp, lớp chuỗi, lớp ngăn xếp, lớp hàng đợi và lớp danh sách liên kết.
1. Dùng thư viện lớp stack để kiểm tra một số tự nhiên nhập vào từ bàn phím có phải là một số parlindom hay không: Một số tự nhiên là parlindom nếu đổi ngược thứ tự các chữ số, ta vẫn thu được chính số đó, ví dụ, 87278 là một số như vậy.
2. Viết lại chương trình 7.1 dùng lớp tập hợp, nhưng dùng kiểu của các phần tử là lớp Car đã được định nghĩa trong chương 5.
3. Dùng thư viện lớp String để viết chương trình chia nhỏ một chuỗi ban đầu thành một số chuỗi con, ranh giới phân chia là một chuỗi con được nhập vào từ bàn phím. Ví dụ “abcacb”, mà chia nhỏ theo chuỗi con “c” sẽ thu được các chuỗi: “ab”, “ca”, “cb”.
4. Dùng thư viện lớp String để viết chương trình thay thế các chuỗi con của một chuỗi ban đầu bằng một chuỗi con khác. Các chuỗi con được nhập từ bàn phím.
5. Viết lại chương trình 7.5 , vẫn dùng thư viện lớp List, nhưng thay thế kiểu phần tử bằng kiểu lớp Car đã được định nghĩa trong chương 5.
Chương 2
1. c và e.
2. a và d.
3. c.
4. b.
5. c.
6. c.
7. d.
8. b và c.
9. b.
10. c.
11. d.
12. c.
13. d.
Chương 3
1. a.
2. c.
3. a.
4. b.
5. b và d.
6. Gợi ý:
struct Subject{
char subject[20];
float note;
};
Hoặc:
typedef struct {
char subject[20];
float note;
}Subject;
7. Gợi ý:
typedef struct {
char name[20];
int age;
char class[20];
Subject* subjects;
char type[20];
}Student;
Chương 4
1. a.
2. b.
3. c.
4. a.
5. a.
6. b.
7. c.
8. d.
9. a.
10. b.
11. c.
Chương 5
1. a và c.
2. b.
3. d.
4. a, b và c.
5. c.
6. b và c.
7. b và c.
8. b, d và e.
9. c và d.
10. a và d.
11. a, b, c và d.
12. Gợi ý (từ bài 12 đến bài 17):
class Employee{
char* name;
int age;
float salary;
public:
Employee();
Employee(char* nameIn=””, int ageIn=18, float
salaryIn=100);
void setName(char*);
char* getName();
void setAge(int);
int getAge();
void setSalary(float);
float getSalary();
void show();
~Employee();
};
Chương 6
1. b.
2. d.
3. c.
4. b, d và f.
5. b và d.
6. d.
7. a, b, c và d.
8. a và c.
9. d.
10. d.
11. b.
12. b.
13. c và d.
14. a, b, c và d.
15. c và d.
16. b và c.
17. Gợi ý (từ bài 17 đến bài 25):
class Human{
char* name;
int age;
int sex;
public:
Human();
Human(char*, int, int);
void setName(char*);
char* getName();
void setAge(int);
int getAge();
void setSex(int);
int getSex();
void show();
~Human();
};
class Person: public virtual Human{
char* address;
char* phone;
public:
Person();
Person(char*, int, int, char*, char*);
void setAddress(char*);
char* getAddress();
void setPhone(char*);
char* getPhone();
void show();
~Person();
};
class Worker: public virtual Human{
int hour;
float salary;
public:
Worker();
Worker(int, float);
void setHour(int);
int getHour();
void setSalary(float);
float getSalary();
void show();
};
class Employee: public Person, public Worker{
char* position;
public:
Employee();
Employee(char*, int, int, char*, char*, int, float,
char*);
void setPosition(char*);
char* getPosition();
void virtual show();
~Employee();
};
Chương 7
2. Gợi y
void main(){
clrscr();
Set<Car> mySet;
int function;
do{
clrscr();
cout << “CAC CHUC NANG:” << endl;
cout << “1: Them mot phan tu vao tap hop” << endl;
cout << “2: Loai bo mot phan tu khoi tap hop” << endl;
cout << “3: Xem tat ca cac phan tu cua tap hop” << endl;
cout << “5: Thoat!” << endl;
cout << “===========================================” << endl;
cout << “Chon chuc nang: ” << endl;
cin >> function;
switch(function){
case ‘1’: // Thêm vào
Car car = new Car();
cout << “O to them vao: ” << endl;
cout << “Toc do: ”;
int speed;
cin >> speed;
car.setSpeed(speed);
cout << “Nhan hieu:”;
char[] mark;
cin >> mark;
car.setMark(mark);
float price;
cout << “Gia xe:”;
cin >> price;
car.setPrice(price);
mySet.insert(car);
break;
case ‘2’: // Loại ra
Set<Car>::iterator index;
cout << “Loai bo xe o vi tri: ”;
cin >> index;
if(index >= mySet.begin())&&(index < mySet.end())
mySet.erase(mySet[index]);
break;
case ‘3’: // Duyệt
cout<<“Cac phan tu cua tap hop la:”<<endl;
Set<char>::iterator i;
for(i=mySet.begin(); i<mySet.end(); i++){
cout << mySet[i].getSpeed() << “ ”;
cout << mySet[i].getMark() << “ ”;
cout << mySet[i].getPrice() << “ ”;
}
break;
}while(function != ‘5’);
return;
}
5. Gợi ý
void main(){
clrscr();
List<Car> myList;
int function;
do{
clrscr();
cout << “CAC CHUC NANG:” << endl;
cout << “1: Them mot xe o to” << endl;
cout << “2: Xoa mot xe o to” << endl;
cout << “3: Xem tat ca cac o to” << endl;
cout << “5: Thoat!” << endl;
cout << “=======================================” << endl;
cout << “Chon chuc nang: ” << endl;
cin >> function;
switch(function){
case ‘1’: // Thêm vào ds
int possition;
Car car = new Car();
cout << “Vi tri can chen: ”;
cin >> possition;
cout << “Toc do: ”;
int speed;
cin >> speed;
car.setSpeed(speed);
cout << “Nhan hieu:”;
char[] mark;
cin >> mark;
car.setMark(mark);
float price;
cout << “Gia xe:”;
cin >> price;
car.setPrice(price);
myList.insert(possition, car);
break;
case ‘2’: // Lấy ra khỏi ds
int possition;
cout << “Vi tri can xoa: ”;
cin >> possition;
Car result = myList.erase(possition);
if(result != NULL){
cout << “O to bi loai: ” endl;
cout<<“Toc do:”<<result.getSpeed()<<endl;
cout << “Nhan hieu: ” << result.getMark()
<< endl;
cout<<“Gia: ”<<result.getPrice()<<endl;
}
break;
case ‘3’: // Duyệt ds
cout << “Cac o to hien co:” << endl;
Car result = myList.front();
do{
cout << result.getSpeed() << “ ”
<< result.getMark() << “ ”
<< result.getPrice() << endl;
result = myList.next();
}while(result != NULL);
break;
}while(function != ‘5’);
return;
}
0 nhận xét:
Đăng nhận xét