32 0 2MB
TrÇn Nguyªn H-¬ng
Bµi TËP thùc hµnh
lËp tr×nh h-íng ®èi t-îng víi C++
Hà Nội - 2017 1
Môc lôc Môc lôc .............................................................................................................................. 2 Lêi më ®Çu ......................................................................................................................... 4 Ch-¬ng 1. ng«n ng÷ lËp tr×nh c++ ........................................................................... 1
1.1. TÓM TẮT LÝ THUYẾT ............................................................................................... 1 1.1.1. Tên định danh, từ khóa, hằng, biến và các kiểu dữ liệu cơ bản .............................. 1 1.1.2. Một số tệp tiêu đề thường dùng .............................................................................. 3 1.1.3. Nhập xuất dữ liệu .................................................................................................... 4 1.1.4. Biểu thức và phép toán ............................................................................................ 4 1.1.5. Cấu trúc điều khiển ................................................................................................. 5 1.1.6. Khai báo và sử dụng hàm ....................................................................................... 8 1.1.7. Cấu trúc chương trình C++ ................................................................................... 11 1.1.8. Mảng và con trỏ .................................................................................................... 12 1.1.9. Kiểu xâu ký tự ....................................................................................................... 12 1.1.10. Kiểu dữ liệu cấu trúc (struct) .............................................................................. 13 1.1.11. Tệp tin ................................................................................................................. 14 1.2. BÀI TẬP ....................................................................................................................... 17 1.2.1. Bài tập mẫu ........................................................................................................... 17 1.2.2. Bài tập tự giải ........................................................................................................ 68 Ch-¬ng 2. Líp vµ ®èi t-îng ...................................................................................... 71
2.1. TÓM TẮT LÝ THUYẾT ............................................................................................. 71 2.1.1. Xây dựng lớp ......................................................................................................... 71 2.1.2. Khai báo đối tượng, truy xuất thành viên của lớp ................................................. 72 2.1.3. Hàm tạo (constructor) ........................................................................................... 72 2.1.4. Hàm hủy (destructor) ............................................................................................ 74 2.1.5. Hàm tạo sao chép (copy constructor) .................................................................... 75 2.1.6. Hàm thành viên tĩnh (static) .................................................................................. 76 2.1.7. Hàm bạn và lớp bạn (friend) ................................................................................. 77 2.1.8. Hàm hằng, đối tượng hằng (const) ........................................................................ 78 2.2. BÀI TẬP ....................................................................................................................... 79 2.2.1. Bài tập mẫu ........................................................................................................... 79 2.2.2. Bài tập tự giải ...................................................................................................... 116 Ch-¬ng 3. n¹p chång to¸n tö ................................................................................ 119
3.1. TÓM TẮT LÝ THUYẾT ........................................................................................... 119 3.1.1. Toán tử và nạp chồng toán tử .............................................................................. 119 3.1.2. Đa năng hóa một số toán tử................................................................................. 119 3.2. BÀI TẬP ..................................................................................................................... 120 3.2.1. Bài tập mẫu ......................................................................................................... 120 3.2.2. Bài tập tự giải ...................................................................................................... 139 Ch-¬ng 4. kÕ thõa vµ ®a h×nh ................................................................................. 141
4.1 TÓM TẮT LÝ THUYẾT ............................................................................................ 141 4.1.1. Xây dựng lớp dẫn xuất ........................................................................................ 141 4.1.2. Hàm tạo, hàm hủy trong kế thừa ......................................................................... 141 4.1.3. Lớp cơ sở ảo ........................................................................................................ 142 4.1.4. Hàm ảo và tính đa hình ....................................................................................... 142 4.1.5. Hàm thuần ảo, lớp trừu tượng ............................................................................. 143 2
4.2 BÀI TẬP ...................................................................................................................... 144 4.2.1. Bài tập mẫu ......................................................................................................... 144 4.2.2. Bài tập tự giải ...................................................................................................... 176 Ch-¬ng 5. khu«n h×nh............................................................................................... 182
5.1 TÓM TẮT LÝ THUYẾT ............................................................................................ 182 5.1.1. Khuôn hình hàm .................................................................................................. 182 5.1.2. Khuôn hình lớp ................................................................................................... 182 5.2 BÀI TẬP ...................................................................................................................... 183 5.2.1. Bài tập mẫu ......................................................................................................... 183 5.2.2. Bài tập tự giải ...................................................................................................... 193 Ch-¬ng 6. BµI TËP TæNG HîP .................................................................................... 195
6.1. CÂU HỎI TRẮC NGHIỆM ....................................................................................... 195 6.2. ĐỂ ÔN TẬP ............................................................................................................... 199 6.3. BÀI TẬP LỚN ........................................................................................................... 203 PHô LôC: MéT Sè HµM TH¤NG DôNG ......................................................................... 211
3
Lêi më ®Çu Ngày nay, lập trình hướng đối tượng là phương pháp lập trình hiện đại, sử dụng hầu hết trong các ngôn ngữ lập trình bậc cao như C++, Java, C#,... Nắm vững phương pháp lập trình hướng đối tượng với C++, sinh viên sẽ có nền tảng để học tốt các ngôn ngữ lập trình cao hơn. Cuốn bài tập thực hành Lập trình hướng đối tượng với C++ này gồm 2 phần: Phần ngôn ngữ lập trình C++ và phần phương pháp lập trình hướng đối tượng. Trong phần ngôn ngữ lập trình C++, nội dung gồm các kiến thức nền tảng về ngôn ngữ C++ như các kiểu dữ liệu, cấu trúc điều khiển, hàm, mảng, con trỏ, xâu ký tự, kiểu dữ liệu struct, tệp tin... Phần phương pháp lập trình hướng đối tượng tập chung vào 3 tính chất quan trọng là tính đóng kín, tính kế thừa và tính đa hình. Tài liệu gồm 06 chương và 01 phụ lục: Chương 1. Ngôn ngữ lập trình C++: Cung cấp các bài tập thực hành về ngôn ngữ lập trình C++ Chương 2. Lớp và đối tượng: Cung cấp các bài tập thực hành về xây dựng lớp, khai báo và sử dụng các thành phần dữ liệu và hàm thành phần như hàm tạo, hàm hủy, hàm tạo sao chép, hàm bạn, hàm tĩnh, hàm hằng, hàm thành viên thông thường. Chương 3. Nạp chồng toán tử: Cung cấp các bài tập thực hành về nạp chồng các toán tử thường dùng với các đối tượng. Chương 4. Tính kế thừa và đa hình: Cung cấp các bài tập thực hành về đơn kế thừa, đa kế thừa, lớp cơ sở ảo, lớp trừu tượng, hàm ảo, hàm thuần ảo và tính đa hình. Chương 5. Khuôn hình: Cung cấp các bài tập thực hành về khuôn hình hàm và khuôn hình lớp. Chương 6. Bài tập tổng hợp: Cung cấp một số câu hỏi trắc nghiệm, đề ôn tập và một số bài tập lớn tổng hợp kiến thức. Trừ chương 6, cấu trúc các chương 1, 2, 3, 4, 5 như sau: - Tóm tắt lý thuyết: Trình bày tóm tắt lý thuyết phục vụ cho các bài tập. - Bài tập mẫu: Trình bày các bài tập có hướng dẫn giải và chương trình. - Bài tập tự giải: Các bài tập không có lời giải, sinh viên tự viết chương trình. Phần cuối tài liệu là phụ lục cung cấp cho sinh viên một số hàm cơ bản thường dùng trong C và C++, sinh viên dùng để tra cứu khi cần thiết. Tài liệu này sẽ hữu ích cho sinh viên các trường đại học, cao đẳng cũng như độc giả tự học về lập trình hướng đối tượng với C++. Tác giả xin chân thành cảm ơn PGS.TS. Đỗ Trung Tuấn giảng viên ĐH Khoa học Tự Nhiên, ĐH Quốc Gia Hà Nội, PGS.TS. Lê Khắc Thành giảng viên Đại học Sư phạm Hà Nội, TS. Lê Văn Phùng nguyên cán bộ Viện Công nghệ thông tin – Viện Hàn lâm Khoa học và Công nghệ Việt Nam; ThS. Lê Trung Kiên giảng viên Đại học Kinh doanh và Công nghệ Hà Nội; NGƯT.TS. Đặng Lộc Thọ - Hiệu trưởng, TS. Nguyễn Huy Đức - phó Hiệu trưởng trường Cao đẳng Sư phạm Trung ương đã đóng góp ý kiến quí báu đồng thời tạo điều kiện động viên để tôi xuất bản tài liệu này. Tuy đã hết sức cố gắng nhưng chắc chắn không thể tránh được thiếu sót, tác giả rất mong nhận được các ý kiến đóng góp của bạn đọc để tài liệu ngày càng hoàn thiện hơn. Thông tin góp ý xin gửi tới địa chỉ email: [email protected] Hà Nội, tháng 06/2017
Trần Nguyên Hương
4
Ch-¬ng 1. ng«n ng÷ lËp tr×nh c++ 1.1. TÓM TẮT LÝ THUYẾT 1.1.1. Tên định danh, từ khóa, hằng, biến và các kiểu dữ liệu cơ bản a. Tên định danh (idenfifier): - Dùng để đặt tên cho biến số, hằng số, hàm, kiểu dữ liệu, lớp, đối tượng .v.v. - Là dãy ký tự liên tiếp (không chứa dấu cách) và phải bắt đầu bằng chữ cái hoặc gạch nối. - Phân biệt kí tự in hoa và thường. - Không được trùng với từ khóa. b. Từ khóa (key words): Một số từ khóa thường dùng: asm
continue
for
new
signed
try
auto
default
friend
operator
sizeof
typedef
break
delete
goto
private
static
union
case
double
if
protected
struct
unsigned
catch
else
inline
public
switch
using
char
enum
int
register
template
virtual
class
extern
long
return
this
void
const
float
namespace short
throw
while
c. Các kiểu dữ liệu cơ bản (data type): TT 1
Nhóm dữ liệu Ký tự
Kiểu dữ liệu
Kích thước
unsigned char char
1 byte 1 byte
1
Miền giá trị 0 đến 255 – 128 đến 127
2
Nhóm dữ liệu Số nguyên
3
Số thực
TT
Kiểu dữ liệu
Kích thước
unsigned int short int short int unsigned long long float
2 2 2 2 4 4
bytes bytes bytes bytes bytes bytes
double long double
8 bytes 10 bytes
Miền giá trị 0 đến 65,535 – 32,768 đến 32,767 – 32,768 đến 32,767 – 32,768 đến 32,767 0 đến 4,294,967,295 – 2,147,483,648 3.4 * 10–38 đếnđến 3.4 * 1038 2,147,483,648 1.7 * 10–308 đến 1.7 * 10308 3.4 * 10–4932 đến 1.1 * 104932
Trong C++, string là kiểu dữ liệu mới được định nghĩa sẵn, nó có nhiều ưu điểm vượt trội và giúp tránh được những phiền phức so với chuỗi kiểu char* của C d. Hằng số (const): Hai cách khai báo: #define Tên_hằng giá trị //không có dấu ; const Kiểu_dữ_liệu Tên_hằng = giá trị; Ví dụ: #define PI 3.14159265 const int width = 100;
e. Biến số (variable): * Khai báo biến số: Kiểu_dữ_liệu Tên biến; Nếu khai báo nhiều biến số thì mỗi biến số cách nhau bởi dấu phẩy. Có thể vừa khai báo vừa khởi tạo giá trị cho biến số, khai báo biến mọi nơi trong chương trình. Một biến số gồm hai phần: giá trị và địa chỉ. Tên biến mang giá trị, &Tên biến là địa chỉ của biến số. Ví dụ: int a=5;//Khai báo biến a kiểu int chiếm 2 byte bộ nhớ, giá trị biến a là a=5, địa chỉ biến a là &a; int x, y, z; //Khai báo nhiều biến double dien_tich =0,chu_vi = 1;//Khai báo và khởi tạo giá trị cho biến *Khai báo biến con trỏ : Kiểu_dữ _liệu *Tên_biến_trỏ;
Mỗi biến con trỏ (có kiểu bất kỳ) được cấp phát bộ nhớ trong vùng nhớ tĩnh (stack), vùng nhớ chứa giá trị (dữ liệu) do con trỏ trỏ tới nằm trong vùng nhớ động (heap). Một biến con trỏ gồm hai phần: giá trị và địa chỉ. *Tên_biến_trỏ mang giá trị, Tên_biến_trỏ mang địa chỉ của vùng nhớ do biến trỏ đó trỏ tới. Xin cấp phát vùng nhớ cho biến động: Tên_ biến_trỏ =new Kiểu_dữ_liệu; Ví dụ: int *p; p=new int; *p=5; // Ở đây: p chứa địa chỉ, *p chứa giá trị (*p=5) do p trỏ tới. 2
1.1.2. Một số tệp tiêu đề thường dùng #include - Tệp tiêu đề này được thêm vào chương trình để sử dụng các chức năng nhập (cin), xuất (cout). Tuy nhiên đây là phiên bản cũ của C++ (trước năm 1998), sau khi chuẩn hóa thì tệp tiêu đề này không được sử dụng nữa mà thay thế là (không có .h). - Một số trình biên dịch cũ hỗ trợ tệp tiêu đề này như Turbo C++ 3.0, phiên bản cũ của DEV C++ và Visual Studio 6.0. Một số trình biên dịch mới của C++ không hỗ trợ tệp tiêu đề #include - Đây là tệp tiêu đề được chuẩn hóa (ISO/IEC 14882:1998 standard). Trong chuẩn này đã bỏ #include - Tệp tiêu đề này sử dụng để thực hiện các chức năng nhập xuất dữ liệu cin, cout, getline và nhập xuất dữ liệu từ tệp tin. - Khi xử dụng nhập, xuất dữ liệu chuẩn, ta thường khai báo sử dụng không gian tên std : using namespace std ; - Trình biên dịch Turbo C++ 3.0 không hỗ trợ khai báo #include . #include - Cung cấp các thư viện nhập xuất chuẩn của ngôn ngữ C ra màn hình và tệp tin như : printf, scanf, gets, fprintf, fscanf, fopen, fclose,... #include - Cung cấp các thư viện để làm việc với màn hình console và bàn phím như : getch, clrscr... #include - Cung cấp các thư viện để định dạng dữ liệu khi in ra màn hình, định dạng dữ liệu số setw, setprecision, setiosflags #include - Cung cấp các lớp để làm việc với tệp tin: ifstream, ofstream, fstream #include - Đây là thư viện của C, chứa các hàm toán học : sqrt, round, exp, pow, log #include - Cung cấp các hàm xử lý xâu ký tự được khai báo kiểu char : strcmp, strlen, strcpy, strcat #include - Lớp string chứa các hàm compare, copy, length, reserve, substr, replace... khi xâu ký tự khai báo kiểu string. Để biết thêm chi tiết, mời bạn đọc xem tại : http://www.cplusplus.com/reference
3
1.1.3. Nhập xuất dữ liệu Để sử dụng nhập xuất trong C++ cần khai báo tệp tiêu đề, có hai cách khai báo tệp tiêu đề #include hoặc #include (không có .h) tùy theo môi trường lập trình và phiên bản sử dụng: * Nhập dữ liệu: cin>>biến số; cin>>biến số 1>> biến số 2 >> biến số 3 …;
Ví dụ: double x, y; cin>>x>>y; * Xuất dữ liệu: - Xuất ra màn hình thông báo: coutx = " x >, xuat =8.0\n"; for (i=0; i=8.0) ds[i].hien(); getch(); return 0; }
Kết quả chạy chương trình: Nhap so SV n=2 Sinh vien thu 1: -Ma sv:01 -Ho ten:Huong -Ngay sinh:1/1/1997 -Gioi tinh:Nam -Ten Hoc phan: Toan -Diem chuyen can:7 -Diem thuong xuyen:8 -Diem bai tap lon:9 -Diem thi:8 Sinh vien thu 2: -Ma sv:02 -Ho ten:Hoa -Ngay sinh:1/5/1997 -Gioi tinh:Nu -Ten Hoc phan: Tin -Diem chuyen can:7 -Diem thuong xuyen:8 -Diem bai tap lon:7 -Diem thi:6 Danh sach sinh vien cua nhap: 01 Huong 1/1/1997 02 Hoa 1/5/1997
Nam Nu
8.1 6.7
SV co diem >=8.0 01 Huong 1/1/1997
Nam
8.1
Bài 4.5. Hàm tạo, hàm hủy trong kế thừa a) Xây dựng lớp Hình tròn: gồm + Thành phần dữ liệu: bán kính + Hàm thành phần: - Hàm thành phần khởi tạo (constructor) - DienTich(), ChuVi() : để tính diện tích và chu vi của hình tròn - Hien(): in lên màn hình diện tích và chu vi hình tròn b) Xây dựng lớp Hình Trụ kế thừa từ lớp hình tròn, có thêm + Thành phần dữ liệu: Chiều cao + Hàm thành phần: 153
- Hàm thành phần khởi tạo (constructor) - DienTich(): tính diện tích toàn phần - TheTich(): tính thể tích của hình trụ - Hien(): in lên màn hình diện tích toàn phần và thể tích của hình trụ đó. c) Chương trình chính: + Sử dụng Hàm thành phần khởi tạo để khởi tạo bán kính và chiều cao của 2 hình trụ. + Tính và in lên màn hình diện tích toàn phần, thể tích của từng hình trụ. + Tính và in lên màn hình tổng thể tích của 2 hình trụ vừa nhập. Lời giải: a. Hướng dẫn Công thức tính: + Hình tròn bán kính r: Diện tích = PI*r*r; Chu vi = 2*PI*r; + Hình trụ bán kính r, chiều cao h: i. Diện tích toàn phần = Chu vi đáy * chiều cao = 2*PI*r*h; ii. Thể tích = Diện tích đáy * Chiều cao = PI*r*r*h; Trong chương trình sau, hàm tạo của lớp Hình tròn có 1 tham số mặc định là bán kính r HinhTron(int bk=1){r=bk;}
Hàm tạo của lớp Hình trụ gọi hàm tạo của lớp Hình tròn như sau: HinhTru(int bk=2, int cao=1):HinhTron(bk) {h=cao;}
b. Chương trình #include #include using namespace std; class HinhTron { public: int r; HinhTron(int bk=1){r=bk;} double DienTich() {return 3.14*r*r;}; double ChuVi(){return 3.14*2*r;} void hien(){cout