Tải bản đầy đủ (.pdf) (163 trang)

Bài giảng kỹ thuật lập trình hướng đối tượng với c++ hoàng kim bảng

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 (1.09 MB, 163 trang )

Kỹ thuật lập trình hướng đối
tượng với C++
GV: Hoàng Kim Bảng
Email :


Chương 1- Giới thiệu về lập trình hướng đối tượng
Lập trình hướng đối tượng (Object Oriented Programming - OOP)
được xem là:
- Cách tiếp cận mới, hiệu quả hơn
- Giúp tăng năng suất
- Dễ dàng bảo trì, sửa đổi, nâng cấp
Mục đích của lập trình hướng đối tượng:
- Giảm bớt thao tác viết trình
- Mô tả chân thực thế giới thực


Nhược điểm:
- Không sử dụng lại được các đoạn mã
- Không có khả năng kiểm soát phạm vi truy xuất dữ liệu
- Mọi dữ liệu trong chương trình là toàn cục
- Dữ liệu có thể bị sửa đổi ở bất cứ vị trí nào trong chương
trình
Không đáp ứng được việc triển khai phần mềm


1.1.2. Lập trình cấu trúc
Ra đời vào những năm 70:
Chương trình được chia nhỏ thành chương trình con:
•Thủ tục (Procedure)
•Hàm (Function)


Các chương trình con:
•Độc lập với nhau và có dữ liệu riêng
•Trao đổi qua: tham số và biến toàn cục
Xuất hiện khái niệm trừu tượng hoá
•Là khả năng quan sát sự vật mà:
–Không quan tâm tới các chi tiết không quan trọng bên
trong
–Không quan tâm tới việc thực hiện như thế nào
•Trừu tượng hoá dữ liệu
•Trừu tượng hoá thao tác
Ngôn ngữ lập trình cấu trúc: C, Pascal…


1.1.3. Lập trình môđun
Với lập trình môđun:
•Các thủ tục có chung một chức năng được nhóm lại với nhau
•Chương trình được chia thành nhiều phần nhỏ
•Các phần tương tác thông qua việc gọi thủ tục
•Mỗi mô đun có dữ liệu của riêng nó.
1.1.4. Nhược điểm của lập trình truyền thống
•Chương trình khó kiểm soát
•Khó khăn trong việc bổ sung, nâng cấp chương trình
•Khi thay đổi, bổ sung dữ liệu dùng chung thì phải thay đổi
gần như tất cả thủ tục/hàm liên quan
•Khả năng sử dụng lại các đoạn mã chưa nhiều
•Không mô tả đầy đủ, trung thực hệ thống trong thực tế


1.1.5. Lập trình hướng đối tượng
Là phương pháp lập trình:

•Mô tả chính xác các đối tượng trong thế giới
•Lấy đối tượng làm nền tảng xây dựng thuật toán
•Thiết kế xoay quanh dữ liệu của hệ thống
•Chương trình được chia thành các lớp đối tượng
•Dữ liệu được đóng gói, che dấu và bảo vệ
•Đối tượng làm việc với nhau qua thông báo
•Chương trình được thiết kết theo cách từ dưới lên (bottomup)


1.2. Một số khái niệm cơ bản
1.2.1. Đối tượng (object)
- Đối tượng là khái niệm trừu tượng phản ánh các thực thể trong
thế giới thực:
* Có thể là một thực thể vật lý
* Có thể là một khái niệm trừu tượng
- Đối tượng được định nghĩa là sự thể hiện của một lớp
- Đối tượng chính là các thực thể trong hệ thống hướng đối tượng
- Một đối tượng là sự đóng gói 2 thành phần:
* Dữ liệu
* Phương thức


* Thành phần dữ liệu bao gồm:
+ Hằng, biến
+ Tham số nội tại
Dữ liệu được xác định bởi kiểu dữ liệu gồm kiểu dữ liệu cơ sở,
kiểu dữ liệu tự định nghĩa.
* Phương thức là:
+ Các hàm nội tại của đối tượng
+ Có kiểu trả về

(Phương thức còn được gọi là hàm thành phần)


1.2.2. Lớp (class)
Lớp là tập hợp các đối tượng có cùng các thuộc tính và hành vi.
Lớp là bản thiết kế hoặc bản mẫu mô tả một cấu trúc dữ liệu
gồm:
* Các thành phần dữ liệu
* Các phương thức / hàm thành phần
Lớp được sử dụng như kiểu dữ liệu do người lập trình tự định
nghĩa


1.2.3. Sự đóng gói
Sự đóng gói là cơ chế ràng buộc dữ liệu và các thao tác trên dữ
liệu thành thể thống nhất.
Sự đóng gói gồm:
* Bao gói: người dùng giao tiếp với hệ thống qua giao diện
* Che dấu: ngăn chặn các thao tác không được phép từ bên
ngoài
Ưu điểm:
+ Quản lý sự thay đổi
+ Bảo vệ dữ liệu
1.2.4. Sự kế thừa
Là khả năng cho phép xây dựng lớp mới được thừa hưởng các
thuộc tính của lớp đã có
Đặc điểm:
•Lớp nhận được có thể bổ sung thêm các thành phần
•Hoặc định nghĩa lại các thành phần của lớp cha
Các loại kế thừa:

- Đơn kế thừa
- Đa kế thừa


1.2.5. Sự đa hình
Tính đa hình xuất hiện khi có khái niệm kế thừa, đó là khả năng
thực hiện một phương thức có cùng tên trong các lớp con.
Thực hiện bởi:
•Định nghĩa lại
•Nạp chồng hàm
1.3. Các bước thiết kế chương trình OOP
Các bước chính:
•Xác định các dạng đối tượng (lớp)
•Tìm dữ liệu dùng chung, chia xẻ
•Xác định lớp cơ sở dựa vào dữ liệu dùng chung
•Xây dựng lớp dẫn xuất từ lớp cơ sở


1.4. Ưu điểm của lập trình hướng đối tượng
•Loại bỏ các đoạn mã lặp lại
•Tạo ra các chương trình an toàn, bảo mật
•Dễ dàng mở rộng và nâng cấp
•Rút ngắn thời gian xây dựng hệ thống
•Tăng năng xuất và hiệu quả hơn
•Chương trình được thiết kế theo đúng qui trình
1.5. Một số ngôn ngữ lập trình hướng đối tượng
Có thể chia thành 2 loại:
•Ngôn ngữ hỗ trợ hướng đối tượng: Pascal, C++, VB…
•Ngôn ngữ hướng đối tượng: SmallTalk, JAVA…


Một số ngôn ngữ lập trình hướng đối tượng hiện nay:
Visual C++, VB.NET, C#, JAVA...


1.6. Ứng dụng của lập trình hướng đối tượng
Dùng để phát triển phần mềm trong nhiều lĩnh vực khác nhau,ví
dụ: hệ điều hành Windows…
Lĩnh vực chính:
•Hệ thống thời gian thực
•Cơ sở dữ liệu hướng đối tượng
•Hệ siêu văn bản, đa phương tiện
•Trí tuệ nhân tạo
•Lập trình song song, mạng nơron …


Bài tập chương 1 (ôn lại lập trình C).
1. Lập trình tìm Min, Max của một dãy có n số thực (n > 0).
2. Lập trình tính tổng S = 1 + 1/2 + … + 1/n (n > 0).
3. Lập trình sắp xếp tăng dần dãy n số thực (n > 0).
4. Lập trình quản lý danh sách sinh viên, thông tin gồm: họ tên,
điểm toán, điểm lý, điểm hóa, điểm trung bình. Viết các hàm
nhập danh sách, in danh sách, sắp xếp theo điểm trung bình
giảm dần.


Chương 2 - Một số mở rộng của C++ so với C
2.1. Lịch sử của C++
C++ được xây dựng trên nền của C
C++ được đưa ra bởi Bjarne Stroustrup, phiên bản đầu tiên ra
mắt năm 1980, với tên “C with class”. Phiên bản thương mại

đầu tiên vào năm 1986.
Ưu điểm của C++: Hỗ trợ lập trình hướng đối tượng, có nhiều
thư viện mẫu chuẩn.
2.2. Một số mở rộng của C++ so với C
2.2.1. Lời chú thích
Có hai cách chú thích:
- Cách 1: Dùng /* … */ chú thích trên nhiều dòng
Ví dụ: /* chu thich tren
nhieu dong*/
- Cách 2: Dùng // chú thích trên 1 dòng
Ví dụ: // Chu thich tren mot dong


2.2.2. Từ khóa mới
Một số từ khóa mới của C++:

asm
delete
new
protected
this
virtual

catch
friend
operator
public
throw

class

inline
private
template
try


2.2.3. Khai báo biến
C++ cho phép khai báo biến:
- Tại bất cứ đâu
- Trước khi sử dụng
Có hiệu lực trong phạm vi chương trình kể từ vị trí nó xuất
hiện
Ví dụ:
for(int i=0; i < n-1; i++)
for(int j = i+1; jif(x[i] > x[j])
{
float tg = x[i] ; x[i] = x[j] ; x[j] = tg;
}


2.2.4. Chuyển đổi và ép kiểu
C++ cho phép chuyển kiểu rộng rãi:
- Khi gán giá trị số vào biến kiểu khác
- Các kiểu số khác nhau trong cùng 1 biểu thức
Ép kiểu:
Ép kiểu theo kiểu cũ: (kiểu) biểu thức.
Ví dụ: myInt = (int) myFloat
Ép kiểu theo kiểu mới: kiểu (biểu thức).
Ví dụ: myInt = int (myFloat)

Ví dụ:
for(i=1; i<=n; i++) s += float(1)/i;


2.2.6. Vào ra trong C++
Cú pháp:
Xuất dữ liệu: cout << bt1 << … << btn;
Nhập dữ liệu: cin >> biến1>> biến2 >> ... >> biếnn;
Chú ý:
- Khi dùng cout, cin, phải có khai báo #include <iostream.h>
- Dùng cin.ignore(1) để bỏ kí tự ‘\n’ khi nhập chuỗi ký tự.
- Nhập một chuỗi ký tự (kể cả dấu cách) có độ dài không quá
dmax, ta dùng: cin.getline(biến, dmax);
Ví dụ:
char hoten[30];
…..
cout << ”Ho va ten: “;
cin.ignore(1);
cin.getline(hoten, 30);


- Để quy định số thực được in ra có đúng p chữ số sau dấu chấm
thập phân, ta dùng:
cout << setiosflags(ios::showpoint) << setprecision(p);
Ví dụ:
cout << setiosflags(ios::showpoint) << setprecision(3);
cout << 1.23456;
sẽ đưa ra số 1.235 (có đúng 3 chữ số lẻ).
- Để quy định độ rộng tối thiểu là w vị trí cho giá trị (nguyên,
thực, chuỗi), ta dùng hàm setw(w) (trong thư viện “iomanip.h”),

hàm này cần được đặt sau toán tử xuất và nó chỉ có hiệu lực cho
1 giá trị được in gần nhất
VD:
cout << "\n“ << setw(3) << stt << setw(25) << hoten<<
setw(10) << ngaysinh << setw(5) << diem;


2.2.7. Cấp phát và giải phóng bộ nhớ
Vẫn có thể dùng malloc(), calloc(), free() như đã biết trong C.
Ngoài ra, C++ sử dụng thêm hai toán tử new và delete:
new: để cấp phát bộ nhớ
Dạng 1: new <tên_kiểu_dữ_liệu>: cấp phát bộ nhớ cho 1 biến
Ví dụ:
int *p;
p = new int;
sẽ cấp phát một vùng nhớ cho một phần tử có kiểu int và gán cho
p địa chỉ tương ứng.
Dạng 2: new <tên_kiểu_dữ_liệu> [ n ] : cấp phát bộ nhớ cho n
phần tử.
Trong đó n là một biểu thức nguyên không âm, khi đó toán tử
new xin cấp phát một vùng nhớ để chứa n thành phần có kiểu dữ
liệu <tên_kiểu_dữ_liệu> và trả lại con trỏ đến đầu vùng nhớ đó
nếu cấp phát thành công.


Ví dụ:
int *p;
p = new int [100];
sẽ cấp phát vùng nhớ cho một mảng chứa 100 phần tử kiểu int và
đặt địa chỉ đầu của vùng nhớ cho biến p.


delete: để giải phóng bộ nhớ đã được cấp phát bởi new
Cú pháp: delete <con_trỏ>
Ví dụ: delete p;


Ví dụ 1: Cấp phát bộ nhớ động cho mảng 1 chiều:
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
main()
{
int n;
do { cout<<"Nhap vao so phan tu cua mang:";
cin>>n; } while(n <= 0);
int *p = new int[n];
if (p == NULL)
{
cout<<"Khong con bo nho de cap phat\n";
return 0;
}


for(int i=0; ip[i] = rand()%100; //Tao cac so ngau nhien tu 0 den 99
cout<<"Mang truoc khi sap xep\n";
for(i=0; ifor(i=0; ifor(int j=i+1; jif (p[i] > p[j])

{
int temp = p[i];
p[i] = p[j];
p[j] = temp;
}
cout<<"\nMang sau khi sap xep tang dan\n";
for(i=0; idelete p;
getch(); return 0;
}


Ví dụ 2: Cấp phát bộ nhớ động cho mảng 2 chiều:
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
main()
{ int m, n, i, j; float **p;
do
{ cout<<"Nhap vao so hang cua ma tran:"; cin >> m;
cout<<"Nhap vao so cot cua ma tran:"; cin >> n;
} while (m <= 0 || n <= 0);
//Cap phat bo nho dong
p = new float *[m];
if (p == NULL)
{ cout<<"Khong con bo nho de cap phat\n";
return 0; }
for(i = 0; i < m; i++) p[i] = new float [n];



×