KẾ HOẠCH GIẢNG DẠY 1 Chương 1 9 6 3 Học trên phòng máy Khái niệm lập trình hướng đối tượng Phân biệt phương pháp lập trình hướng đối tượng với phương pháp lập trình kiểu cấu tr
Trang 1TRƯỜNG ĐẠI HỌC KINH TẾ QUỐC DÂN
VIệN CÔNG NGHệ THÔNG TIN KINH Tế
THÔNG TIN GIẢNG VIÊN
Nhóm GV: TS Phạm Minh Hoàn
TS Nguyễn Trung Tuấn
ThS Nguyễn Quỳnh Mai
Địa chỉ: BM Công nghệ thông tin - C100, ĐH Kinh tế
Quốc dân, 207 Đường Giải Phóng, Hai Bà Trưng, Hà Nội
Trang 2KẾ HOẠCH GIẢNG DẠY
1 Chương 1 9 6 3
Học trên phòng máy
Khái niệm lập trình hướng đối tượng
Phân biệt phương pháp lập trình hướng đối tượng với phương pháp lập trình kiểu
cấu trúc
Mục tiêu của lập trình hướng đối tượng
Các đặc điểm của lập trình hướng đối tượng
Giới thiệu các ngôn ngữ lập trình hướng đối tượng: Ngôn ngữ C++
Phương pháp phân tích bài toán theo cách tiếp cận hướng đối tượng
1.2 Sự mở rộng của C++
Khả năng khai báo linh hoạt
Toán tử ép kiểu
Khả năng vào/ra mới của C++
Bổ sung toán tử quản lý bộ nhớ động: new, delete
Trang 3 Phạm vi truy nhập đến các thành phần của lớp cơ sở
3.2 Hàm tạo, hàm huỷ đối với tính kế thừa
Hàm tạo của lớp dẫn xuất
Hàm huỷ của lớp dẫn xuất
Trang 4CHƯƠNG 4: TÍNH ĐA HÌNH
4.1 Phương thức ảo và tương ứng bội
Định nghĩa phương thức ảo
Quy tắc gọi phương thức ảo
Tương ứng bội
Liên kết động
4.2 Lớp cơ sở ảo
Lớp cơ sở ảo và phương thức ảo
Hàm tạo, hàm hủy và lớp cơ sở ảo
CHƯƠNG 5: DÕNG DỮ LIỆU NHẬP XUẤT
5.1 Mô hình tổng quát của I/O streams trong C++
Trang 5CHƯƠNG 6: XỬ LÝ NGOẠI LỆ
6.1 Xử lý ngoại lệ trong C++
Xử lý lỗi theo kiểu truyền thống
Giới thiệu về ngoại lệ
Khai báo lớp ngoại lệ
Hàm tạo, hàm hủy của lớp ngoại lệ
hàng tuần và tham gia thảo luận trên lớp
Kiểm tra giữa kỳ: 20% số điểm
Hình thức: kiểm tra, lập trình trên máy tính
Thi kết thúc học phần: 70% số điểm
Hình thức: lập trình trên máy tính
Điều kiện dự thi:
Sinh viên phải có mặt trên lớp tối thiểu 80% số tiết học
Trang 6TÀI LIỆU THAM KHẢO
1. Phạm Minh Hoàn, Bài giảng môn lập trình hướng đối
tượng, Bộ môn Công nghệ thông tin, trường Đại học
Kinh tế Quốc dân
TÀI LIỆU THAM KHẢO
5. Bruce Eckel, President, Thinking in C++,
Volume 1 and 2, 2nd Edition, January 13,
2000
6. Ivar Jacobson, Object - Oriented Software
Engineering, Addison-Wesley Publishing
Company, 1992
7. Michael Blaha, William Premerlani, Object -
Oriented Modeling and Design for Database
Applications, Prentice Hall, 1998
8. Jim Keogh & Mario Giannini Biên dịch Ngọc
Trang 7Trình bày nhược điểm của phương pháp lập
trình cấu trúc, cách tiếp cận hướng đối tượng
Trình bày đặc điểm, khái niệm cơ bản của lập
trình hướng đối tượng và phương pháp phân tích
bài toán theo cách tiếp cận hướng đối tượng
Trình bày khái niệm ngôn ngữ lập trình hướng
và một vài mở rộng của ngôn ngữ lập trình
Trang 8NỘI DUNG CHƯƠNG 1
1.1 Lập trình hướng đối tượng
Tiếp cận hướng đối tượng
Nhược điểm của phương pháp lập trình hướng thủ tục
Định nghĩa lập trình hướng đối tượng
Khái niệm cơ bản lập trình hướng đối tượng
Các bước giải bài toán theo phương pháp lập trình hướng đối tượng
Giới thiệu ngôn ngữ lập trình hướng đối tượng
1.2 Mở rộng của ngôn ngữ C++
Khai báo linh hoạt
Toán tử ép kiểu
Xuất/nhập dữ liệu (Vào/ra dữ liệu)
Toán tử quản lý bộ nhớ động: new, delete
quan hệ với nhau
Đối với việc tổ chức chương trình, ứng
dụng có thể được định nghĩa như một tập
các thực thể - hoặc các đối tượng, sao cho
quá trình tái tạo những suy nghĩa là gần sát
Trang 9NHƯợC ĐIểM CủA LậP TRÌNH HƯớNG THủ
TụC
Lập trình hướng thủ tục (LTHTT) là cách tiếp cận theo
các hàm chức năng Một hệ thống phần mềm gồm một
dãy các công việc cần thực hiện như đọc dữ liệu, tính
toán, xử lý, lập báo cáo và in ấn kết quả v.v Mỗi
công việc đó sẽ được thực hiện bởi một số hàm nhất
định
Chương trình khó kiểm soát và khó khăn trong việc bổ
sung, nâng cấp chương trình
Mô hình được xây dựng theo cách tiếp cận hướng thủ
tục không mô tả được đầy đủ, trung thực hệ thống
trong thực tế
Phương pháp LTHTT đặt trọng tâm vào hàm là hướng
tới hoạt động sẽ không thực sự tương ứng với các thực
thể trong hệ thống của thế giới thực 17
Oriented Programming - OOP) là
phương pháp lập trình lấy đối tượng
làm nền tảng để xây dựng thuật giải,
xây dựng chương trình
trình xoay quanh dữ liệu của hệ thống
Trang 10tin cấu trúc dữ liệu và các thao tác
Trang 11LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
KHÁI NIệM CƠ BảN
Lớp là khái niệm tĩnh
Đối tượng là khái niệm động
Đối tượng được xác định trong bộ nhớ
của máy tính
Đối tượng được tạo ra để xử lý thông
tin, thực hiện nhiệm vụ được thiết kế,
sau đó bị hủy bỏ khi đối tượng đó hết
KHÁI NIệM CƠ BảN
Trừu tượng hóa dữ liệu và bao gói thông tin
Trừu tượng hóa là cách biểu diễn những đặc tính chính và
bỏ qua những chi tiết vụn vặt hoặc những giải thích
Bao gói thông tin là việc đóng gói dữ liệu và các phương
thức vào một đơn vị cấu trúc lớp
Dữ liệu được tổ chức sao cho thế giới bên ngoài (các đối
tượng ở lớp khác) không truy nhập vào được
Phương thức của lớp sẽ đóng vai trò như là giao diện giữa dữ
liệu của đối tượng và phần còn lại của chương trình
Nguyên tắc bao gói dữ liệu để ngăn cấm sự truy nhập trực
tiếp trong lập trình được gọi là sự che giấu thông tin
Trang 12LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
KHÁI NIệM CƠ BảN
Kế thừa là quá trình mà các đối tượng của lớp này
được quyền sử dụng một số tính chất của các đối
tượng của lớp khác
Sự kế thừa cho phép định nghĩa một lớp mới trên
cơ sở các lớp đã tồn tại Lớp mới này, ngoài những
thành phần được kế thừa, sẽ có thêm những thuộc
khái niệm có thể sử dụng với nhiều
chức năng khác nhau
Tương ứng bội đóng vai quan trọng
trong việc tạo ra các đối tượng có cấu
trúc bên trong khác nhau nhưng cùng
Trang 13LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
KHÁI NIệM CƠ BảN
Liên kết động là dạng liên kết các thủ
tục và hàm khi chương trình thực hiện
lời gọi tới các hàm, thủ tục đó
Trong liên kết động, nội dung của
đoạn chương trình ứng với thủ tục,
hàm sẽ không được biết cho đến khi
thực hiện lời gọi tới thủ tục, hàm đó.
KHÁI NIệM CƠ BảN
Truyền thông báo cho một đối tượng
là yêu cầu đối tượng thực hiện một
việc gì đó
Sự trao đổi thông tin chỉ có thể thực
hiện trong thời gian đối tượng tồn tại
Trang 14CÁC BƯớC GIảI BÀI TOÁN THEO
OOP
Xác định các dạng đối tượng (lớp) của bài toán
Tìm kiếm các đặc tính chung (dữ liệu chung) trong
các dạng đối tượng này, những gì chúng cùng nhau
chia sẻ
Xác định lớp cơ sở dựa trên cơ sở các đặc tính chung
của các dạng đối tượng
Xây dựng các lớp dẫn xuất chứa các thành phần,
những đặc tính không chung còn lại của các dạng đối
tượng từ lớp cơ sở Ngoài ra, ta còn đưa ra các lớp có
quan hệ với các lớp cơ sở và lớp dẫn xuất
GIớI THIệU NGÔN NGữ OOP
Ngôn ngữ lập trình hướng đối tượng là ngôn
ngữ bao gồm 4 khái niệm trụ cột của lập trình
hướng đối:
1 Tính bao gói thông tin (Encapsulation)
2 Tính che dấu dữ liệu (Data hiding)
Trang 15KHAI BÁO LINH HOạT
Lệnh khai báo biến có thể đặt bất
kỳ chỗ nào trong chương trình
trước khi các biến được sử dụng
khối trong đó biến được khai báo
Trang 16MỞ RỘNG CỦA NGÔN NGỮ C++
KHAI BÁO LINH HOạT
Ví dụ: Nhập một dãy số thực rồi sắp xếp theo thứ tự
Trang 17MỞ RỘNG CỦA NGÔN NGỮ C++
TOÁN Tử ÉP KIểU
Ngoài phép chuyển kiểu bắt buộc
đƣợc viết trong C theo cú pháp:
3
1 2 1
1
Trang 18for (int i=1;i<=n;++i)
s+= float(1)/float(i); //chuyen kieu theo C++
3
1 2
cout được định nghĩa trước như một đối
tượng biểu diễn cho thiết bị xuất chuẩn
của C++ là màn hình,
cout được sử dụng kết hợp với toán tử
chèn << để hiển thị giá trị các biểu thức
Trang 19 Toán tử cin được định nghĩa trước như
một đối tượng biểu diễn cho thiết bị vào
Để sử dụng các loại toán tử và phương thức nói
trên cần khai báo tập tin dẫn hướng iostream.h
#include iostream.h;
Để nhập một chuỗi không quá n ký tự và lưu vào
mảng một chiều s (kiểu char) có thể dùng hàm
Trang 20 Quy định độ rộng tối thiểu để hiển thị k vị trí cho giá trị
(nguyên, thực, chuỗi) dùng hàm: setw(k)
Hàm này cần đặt trong toán tử xuất và nó chỉ có hiệu lực cho
một giá trị đƣợc in gần nhất Các giá trị in ra tiếp theo sẽ có
Trang 21MỞ RỘNG CỦA NGÔN NGỮ C++
XUấT / NHậP Dữ LIệU
Ví dụ: Nhập một danh sách n thí sinh (n<=100)
Dữ liệu mỗi thí sinh gồm họ tên, các điểm thi môn
1, môn 2, môn 3 Sau đó in danh sách thí sinh theo
thứ tự giảm dần của tổng điểm
#include <iostream> // thu vien cout, cin
#include <conio.h> // thu vien getch()
#include <iomanip.h> // thu vien setw
#include <string.h> // thu vien ham chuoi ky tu
Trang 22tg=ts[i]; ts[i]=ts[j]; ts[j]=tg;
} cout<< "\ Danh sach thi sinh sau khi sap xep :";
Trang 23TOÁN Tử QUảN LÝ Bộ NHớ ĐộNG: NEW,
C++ đưa thêm một cách thức mới để
thực hiện việc cấp phát và giải phóng
Trong đó: tên kiểu là kiểu dữ liệu của biến con trỏ,
nó có thể là: các kiểu dữ liệu chuẩn như int, float,
double, char, hoặc các kiểu do người lập trình
Trang 24TOÁN Tử QUảN LÝ Bộ NHớ ĐộNG: NEW,
Trong đó: tên kiểu là kiểu dữ liệu của biến con trỏ,
nó có thể là: các kiểu dữ liệu chuẩn như int, float,
double, char, hoặc các kiểu do người lập trình
Biến con trỏ = new kiểu[n];
Trong đó n là số nguyên dương xác định
Trang 25TOÁN Tử QUảN LÝ Bộ NHớ ĐộNG: NEW,
Trang 26TOÁN Tử QUảN LÝ Bộ NHớ ĐộNG: NEW,
DELETE
Ví dụ: Viết chương trình minh hoạ cách dùng new
để cấp phát bộ nhớ chứa n thí sinh Mỗi thí sinh là một
cấu trúc gồm các trường ht(họ tên), sobd(số báo
danh), và td(tổng điểm) Chương trình sẽ nhập n, cấp
phát bộ nhớ chứa n thí sinh, kiểm tra lỗi cấp phát bộ
nhớ, nhập n thí sinh, sắp xếp thí sinh theo thứ tự giảm
của tổng điểm, in danh sách thí sinh sau khi sắp xếp,
Trang 27TOÁN Tử QUảN LÝ Bộ NHớ ĐộNG: NEW,
cin.get (ts[i].ht,20); //cin(ts[i].ht);
cout << "so bao danh";
Trang 28TOÁN Tử QUảN LÝ Bộ NHớ ĐộNG: NEW,
HÀM NộI TUYếN (INLINE)
thành các đơn vị độc lập
độ thực hiện chương trình: cấp phát vùng
nhớ cho các tham số và biến cục bộ,
truyền dữ liệu của các tham số cho các đối,
giải phóng vùng nhớ trước khi thoát khỏi
Trang 29MỞ RỘNG CỦA NGÔN NGỮ C++
HÀM NộI TUYếN (INLINE)
Chú ý:
Trong mọi trường hợp, từ khóa inline phải xuất hiện trước
các lời gọi hàm thì trình biên dịch mới biết cần xử lý hàm
theo kiểu inline
Ví dụ: Hàm f() trong chương trình sau sẽ không phải là
hàm nội tuyến vì inline viết sau lời gọi hàm
Cách làm này sẽ tăng tốc độ chương trình do không
phải thực hiện các thao tác có tính thủ tục khi gọi hàm
Hàm inline làm tăng khối lượng bộ nhớ chương trình
(nhất là đối với các hàm nội tuyến có nhiều câu lệnh)
Vì vậy chỉ nên dùng hàm inline đối với các hàm có nội
dung đơn giản
Không phải khi gặp từ khoá inline là chương trình
dịch nhất thiết phải xử lý hàm theo kiểu nội tuyến Từ
khoá inline chỉ là một từ khoá gợi ý cho chương trình
dịch chứ không phải là một mệnh lệnh bắt buộc
Trang 30MỞ RỘNG CỦA NGÔN NGỮ C++
HÀM NộI TUYếN (INLINE)
Ví dụ 2: Chương trình sau sử dụng hàm inline để tính
cout<<"\n Hinh chu nhat thu "<<i+1<<":";
cout<<"\n Do dai hai canh "<<a[i]<<"va"<<b[i];
cout<<"\n dien tich "<<dt[i];
cout<<"\n chu vi "<<cv[i];
Trang 31HÀM TảI BộI (FUNCTION
OVERLOADING)
tên và có tập tham số khác nhau (về
số lượng các tham số hoặc kiểu của
tham số)
Trình biên dịch căn cứ vào số lượng
và kiểu các tham số để gọi hàm có
đúng tên và đúng các tham số tương
nguyên và max của một dãy số thực Trong
chương trình có 6 hàm: hai hàm dùng để nhập
dãy số nguyên và dãy số thực có tên chung là
nhapds, bốn hàm: tính max 2 số nguyên, tính
max 2 số thực, tính max của dãy số nguyên,
tính max của dãy số thực được đặt chung một
Trang 32HÀM TảI BộI (FUNCTION
void nhapds(int *x, int n);
void nhapds(double *x, int n);
int max(int x,int y);
double max(double x, double y);
Trang 33HÀM TảI BộI (FUNCTION
Trang 34HÀM TảI BộI (FUNCTION
cout<<"\n So phan tu nguyen n: "; cin>>ni;
cout<<"\n Nhap day so nguyen: "; nhapds(a,ni);
cout<<"\n So phan tu so thuc: "; cin>>nd;
cout<<"\n Nhap day so thuc: "; nhapds(x,nd);
maxi = max(a,ni);
maxd = max(x,nd);
cout<<"\n Max day so nguyen ="<<maxi;
cout<<"\n Max day so thuc="<<maxd;
Bài 1: Viết chương trình thực hiện các
yêu cầu sau đây:
Nhập dữ liệu cho các sinh viên (dùng cấu
trúc danh sách liên kết đơn), các thông tin
của sinh viên bao gồm: mã sinh viên, họ tên,
lớp, điểm trung bình
Chương trình có sử dụng toán tử new và
delete
In ra danh sách sinh viên có sắp xếp vị thứ
theo điểm trung bình
Trang 35MỞ RỘNG CỦA NGÔN NGỮ C++
BÀI TậP
Bài 2: Viết chương trình thực hiện các
yêu cầu sau đây:
Nhập dữ liệu cho các sinh viên (dùng mảng
động), các thông tin của sinh viên bao gồm:
mã sinh viên, họ tên, lớp, điểm trung bình
Chương trình có sử dụng toán tử new và
delete
In ra danh sách sinh viên có sắp xếp vị thứ
theo điểm trung bình
In ra những sinh viên có điểm trung bình
Định nghĩa, các khái niệm cơ bản và các bước
giải bài toán theo phương pháp lập trình hướng
đối tượng
Giới thiệu ngôn ngữ lập trình hướng đối tượng,
khai báo linh hoạt, toán tử ép kiểu, xuất/nhập dữ
liệu (vào/ra dữ liệu) với iostream, toán tử quản lý
bộ nhớ động: new, delete Hàm inline và hàm
tải bội (Function overloading) 70
Trang 36của đối tƣợng, con trỏ mà mảng đối tƣợng
Trình bày khái niệm thành phần tĩnh, dữ
Trang 37NỘI DUNG CHƯƠNG 2
nghĩa, có thể tạo ra nhiều đối tượng khác
nhau, mỗi đối tượng có vùng nhớ riêng 74
Trang 38 Dữ liệu và hàm thành viên được
gọi chung là các thành phần của
Trang 39LỚP
THÀNH PHẦN DỮ LIỆU
Khai báo các thuộc tính (dữ liệu)
đƣợc thực hiện nhƣ khai báo biến có
kiểu chuẩn hoặc kiểu ngoài chuẩn đã
Trang 40(kiểu void) hoặc có thể trả về một giá trị có
kiểu bất kỳ, kể cả giá trị kiểu đối tượng, con trỏ
đối tượng, tham chiếu đối tượng
bất kỳ: kiểu chuẩn, kiểu ngoài chuẩn, kiểu đối
tượng của chính phương thức, con trỏ hoặc tham
chiếu đến kiểu đối tượng này
Trang 41LỚP
THÀNH PHẦN PHƯƠNG THỨC (HÀM)
Chú ý :
Các thành phần dữ liệu khai báo là
private nhằm bảo đảm nguyên lý che dấu
thông tin, bảo vệ an toàn dữ liệu của lớp,
không cho phép các hàm bên ngoài xâm
nhập vào dữ liệu của lớp
Các hàm thành phần khai báo là public
Trang 42cout<<”\nNhap hoanh do (cot) va
tung do (hang) cua diem:”;
Trang 43vùng: vùng sở hữu riêng (private) và vùng
dùng chung (public) để quy định phạm vi sử
Trang 44LỚP
CON TRỎ THIS
Mỗi hàm thành phần của lớp có một tham số ẩn,
đó là con trỏ this Con trỏ this trỏ đến từng đối
Con trỏ this là tham số thứ nhất của hàm
thành phần Khi một lời gọi hàm thành
phần đƣợc phát ra bởi một đối tƣợng thì
tham số truyền cho con trỏ this chính là
địa chỉ của đối tƣợng đó
Ví dụ: Xét một lời gọi tới hàm nhapsl():