Phần tiếp theo bài giảng Phương pháp lập trình hướng đối tượng: Nhìn lại lập trình cơ bản qua lăng kính Lập trình hướng đối tượng cung cấp cho người học các kiến thức về Hàm - Đơn vị xử lý dữ liệu. Mời các bạn cùng tham khảo nội dung chi tiết.
Trang 1GV: Lê Xuân Định
Trang 2L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 3 M ỗi thao tác xử lý dữ liệu được thực hiện bởi 1 hàm
Tương đương với 1 động từ (1) trong ngôn ng ữ tự nhiên
V ới mỗi hàm, phải xác định những dữ liệu được xử lý
( đầu vào) và những kết quả xử lý (đầu ra)
Ví d ụ:
Tính t ổng tất cả các ước số của một số nguyên cho trước
Cho m ột mảng các số thập phân, tìm số lớn nhất trong những
ph ần tử mảng nhỏ hơn một số nguyên cho trước
Ki ểm tra xem tổng các số trong một mảng các số nguyên có phải
là m ột số nguyên tố hay không
_
Trang 4L.X.Định 4
M ỗi thao tác xử lý dữ liệu được thực hiện bởi 1 hàm
Tương đương với 1 động từ (1) trong ngôn ng ữ tự nhiên
V ới mỗi hàm, phải xác định những dữ liệu được xử lý
( đầu vào ) và nh ững kết quả xử lý ( đầu ra )
Ví d ụ:
Tính t ổng ất cả các ước số của một s ố nguyên cho trước
Cho m ột mảng các số thập phân , tìm s ố lớn nhất trong nh ững
ph ần tử mảng nhỏ hơn một số nguyên cho trước
Ki ểm tra xem t ổng các số trong m ột mảng các số nguyên có
ph ải là một số nguyên tố hay không
_
1) Nếu hàm có giá trị trả về, ta thường đặt tên hàm là danh/tính từ tương ứng CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 5 Chương trình là một cuộc trò chuy ện giữa
các hàm
B ắt đầu từ hàm main():
main() chia toàn chương trình thành các tác vụ, và
main() giao vi ệc (tác vụ) cho các hàm con
M ỗi hàm con lại nói chuyện với các hàm khác
để hoàn thành công việc
Giao ti ếp giữa các hàm: Gọi tên, truyền đối
s ố, trả về kết quả
Trang 6void nhap(∎) float tinhDTK(∎)
void scanf( ) void printf( )
Trang 7 Chương trình là một cuộc trò chuy ện giữa
Trang 8L.X.Định 9
các hàm G ồm nhiều cuộc đối thoại
void main()
float tinhDTK(∎)
main() - tinhDTK()
• main() g ọi hàm tinhDTK():
• main() truy ền tham số
Này tinhDTK, hãy thực hiện
với đối số <giá trị của a>
Kết quả là <giá trị của dtk>
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 9 Chương trình là một cuộc trò chuy ện giữa
các hàm G ồm nhiều cuộc đối thoại
float tinhDTK(∎) return dtk; }
Trang 10}
/// Hàm tính điểm tổng kết theo công thức:
/// điểm TK = (điểm LT*6 + điểm TH*4) / 10 /// Input: struct chứa điểm LT và TH; Output: điểm TK
}
/// Hàm tính điểm tổng kết theo công thức:
/// điểm TK = (điểm LT*6 + điểm TH*4) / 10 /// Input: struct chứa điểm LT và TH; Output: điểm TK
float tinhDTK(SinhVien sv);
Giao di ện Cài đặt
S ử dụng
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 11 T ập hợp các giao diện và đặc tả của một hệ
th ống tạo nên bộ Giao di ện Lập trình (API) của
Trang 13 Ta đứng trên quan điểm sử dụng hàm f() khi
f() là m ột hàm có s ẵn , VD: printf() trong thư viện stdio; Hoặc
Trách nhi ệm thiết kế & cài đặt hàm là của người khác,
VD: nhà phát tri ển thư viện, thành viên khác trong nhóm
Khi đó
Bên s ử dụng là bên ngoài!
Coi ph ần bên trong hàm tức phần cài đặt là hộp đen
Nguyên m ẫu hàm:
Giao di ện Cài đặt
S ử dụng
Trang 14L.X.Định 15
An toàn!!!
Bên s ử dụng là bên ngoài!
Coi ph ần bên trong hàm tức phần cài đặt là hộp đen
Chỉ cần biết hàm này làm cái gì (qua đặc tả), không nên quan tâm nó
làm th ế nào ở bên trong
Tuân thủ quy tắc “hộp đen”:
Dù th ấy được c ũng coi như không thấy !!!
(Chớ nên phụ thuộc vào nó!)
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 15Tương ứng 1-1
Bên s ử dụng là bên ngoài!
Coi ph ần bên trong hàm tức phần cài đặt là hộp đen
Chỉ cần biết hàm này làm cái gì (qua đặc tả), không nên quan tâm nó
làm th ế nào ở bên trong
Ph ải g ọi hàm đúng theo giao di ện , t ức nguyên mẫu hàm
Cũng như dùng biến:
Muốn dùng hàm (gọi hàm) thì phải khai báo nguyên m ẫu hàm;
Rồi gọi đúng tên hàm và truyền tham số có kiểu tương thích với nguyên mẫu hàm đã khai báo
Nguyên m ẫu hàm:
Giao di ện Cài đặt
S ử dụng
Trang 16L.X.Định 17
Bên s ử dụng là bên ngoài!
Coi ph ần bên trong hàm tức phần cài đặt là hộp đen
Chỉ cần biết hàm này làm cái gì (qua đặc tả), không nên quan tâm nó
làm th ế nào ở bên trong
Ph ải g ọi hàm đúng theo giao di ện , t ức nguyên mẫu hàm
Cũng như dùng biến,
Muốn dùng hàm (gọi hàm) thì phải khai báo nguyên m ẫu hàm;
Rồi gọi đúng tên hàm và truyền tham số có kiểu tương thích với nguyên mẫu hàm đã khai báo
V ề việc “khai báo nguyên mẫu hàm”:
Các thư viện thường gom sẵn các nguyên mẫu hàm trong file header
#include “myLib.h” ⇔ khai báo t ất cả các hàm trong “myLib.h”
Nếu phần cài đặt hàm đặt trước lời gọi hàm thì không cần khai báo lại
vì ngay trên phần cài đặt hàm đã có nguyên mẫu hàm
Nguyên m ẫu hàm:
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 17Tham s ố trong Giao diện Hàm
Trong C/C++ có 2 lo ại tham số (và 2 loại đối số tương ứng)
Tr ị (tham trị & đối trị): Truyền và nhận giá tr ị dữ liệu
Bên ngoài truy ền giá trị vào qua đối trị
VD1: s=cong(12,21); //c ộng 12 với 21, lưu vào s
VD2: s=cong(s,33); //c ộng giá tr ị của s với 33, lưu
vào s
Giá tr ị truyền vào được copy & lưu vào biến tham số
tương ứng bên trong
VD: int cong(int x, int y) { /* bi ến x, y lưu giá tr ị đối số */ }
Bi ến (tham biến & đối biến): Truyền và nhận bi ến DL
Trang 18float z = (float)x / y; return z;
pass(copy)
return 3.3333
Trang 19Tham s ố trong Giao diện Hàm
Trong C/C++ có 2 lo ại tham số (và 2 loại đối số tương ứng)
Tr ị (tham trị & đối trị): Truyền và nhận giá tr ị dữ liệu
Bi ến (tham biến & đối biến): Truyền và nhận bi ến DL
Bên ngoài truy ền biến (chứa giá trị cần truyền) vào qua đối biến,
và c ũng nh ận lại giá trị qua biến đó
VD1: hoanvi(a,b); //hoán v ị giá trị lưu trong a và b
VD2: hoanvi(a,10); //l ỗi cú pháp! (10 ko phải biến)
V ới bên trong, bi ến truyền vào được sử dụng trực tiếp thông
qua tên tham bi ến tương ứng
VD: void hoanvi(int & x, int & y) {/* bi ến x,y chính là 2 bi ến bên ngoài với tên khác */}
Đặc biệt: Tham số m ảng mặc định là tham biến
Không thêm “&” vào trước tham số mảng
Trang 21D ữ liệu Đầu ra của Hàm
return s; } //trả về giá tr ị lưu trong biến s
Người gọi hàm nhận giá trị trả về và sử dụng
VD1: int s=cong(12,21); //lưu kết quả vào biến s
VD2: xuat(cong(12,21),”Tong”);//truyền kết quả vào hàm xuat()
Tham bi ến
Nếu có nhiều giá trị cần phải trả về thì chúng ta phải lưu chúng vào trong các tham biến
Trang 22/// b = a + b
void congDon(int a, int & b);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 23 Hãy s ử dụng các hàm sau:
int Thương(int a, int b); /// tr ả về phần nguyên [b/a]
void Dư(int &a, int &b, int &c); /// c = a - [a/b]*b
int Nh ập(); /// tr ả về số nguyên được nhập
void Xu ấtUSCLN(int a, int b, int c);
void Xu ấtTuầnThứ(int thu, int tuan);
Vi ết CTrình tính USCLN của 2 số
Nh ập từ Khán giả/Random, xuất ra Bảng/Projector
Tính b ằng Tay, sau nâng cấp lên bằng Máy
Trang 25 Hãy s ử dụng các hàm sau:
int Thương(int a, int b); /// tr ả về phần nguyên [b/a]
void Dư(int &a, int &b, int &c); /// c = a - [a/b]*b
int Nh ập(); /// tr ả về số nguyên được nhập
void Xu ấtUSCLN(int a, int b, int c);
void Xu ấtTuầnThứ(int thu, int tuan);
Vi ết CTrình cho nhập một ngày trong tháng và nhập
tháng này b ắt đầu từ Thứ mấy, xong hiển thị cho biết
ngày này là Th ứ mấy trong Tuần thứ mấy trong tháng
Trang 26L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt 30
Trang 27 Giao di ện (nguyên mẫu hàm)
ki ểu_trả_về tên_hàm ( danh_sách_khai_báo_tham_s ố )
float thuong (int a, int b);
S ử dụng (lời gọi hàm)
bi ến_trả_về = tên_hàm ( danh_sách_đối_số );
int x = 1;
float q = thuong( x , 15 );
// Đọc máy móc: g ọi hàm thuong() với 2 đối số (giá
tr ị của x và 15), rồi gán giá trị trả về vào biến q
// Đọc tự nhiên: lưu kết quả tính thương của x và 15
vào bi ến q
Trang 28L.X.Định 32
Giao di ện (nguyên mẫu hàm)
ki ểu_trả_về tên_hàm ( danh_sách_khai_báo_tham_s ố )
VD: int f( char ch, float a [] ) // đọc máy móc: Hàm f nh ận 2 tham số (1 ký tự ch
Trang 29 Giao di ện (nguyên mẫu hàm)
ki ểu_trả_về tên_hàm ( danh_sách_khai_báo_tham_s ố )
VD: float thuong (int a, int b)
Khai báo tham s ố := khai báo bi ến
S ử dụng (lời gọi hàm)
bi ến_trả_về = tên_hàm ( danh_sách_đối_số );
VD: float q = thuong (x,15);
Truy ền đối số := truyền giá tr ị cho biến
Giá tr ị vào/ra có kiểu tương ứng với khai báo trong
giao di ện
Tương ứng 1-1
Trang 30L.X.Định 34
Giao di ện thì phải có ki ểu , s ử dụng thì không ghi kiểu,
nhưng giá-trị vào/ra phải có kiểu tương ứng với khai báo
trong giao di ện
Ví d ụ:
Giao di ện: float thuong( int a, int b)
S ử dụng: q = thuong(x,y);
Các bi ến q,x,y phải có kiểu: float q; int x,y;
Giao di ện: float thuong( int a, int b)
S ử dụng: q = thuong(x,1.2);
L ỗi cú pháp: 1.2 không thuộc kiểu int
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 31 Giao di ện thì phải có ki ểu , s ử dụng thì không ghi kiểu,
nhưng giá-trị vào/ra phải có kiểu tương ứng với khai báo
trong giao di ện
Ví d ụ:
Giao di ện: float thuong(a, b)
L ỗi cú pháp: a, b thiếu kiểu trong nguyên mẫu hàm
S ử dụng: float q = thuong( int x=2, int y=3)
L ỗi cú pháp: ghi kiểu trong lời gọi hàm
Trang 32L.X.Định 36
Giao di ện thì phải có ki ểu , s ử dụng thì không ghi kiểu,
nhưng giá-trị vào/ra phải có kiểu tương ứng với khai báo
trong giao di ện
Ví d ụ:
Giao di ện: void thuong( int a, int b)
S ử dụng: printf(“%f”, thuong(2,3));
L ỗi cú pháp: sử dụng giá trị trả về không được khai báo
Giao di ện: float thuong( int a, int b)
S ử dụng: thuong(2,3);
L ỗi ngữ nghĩa: b ỏ mất giá trị trả về
Có giá tr ị trả về thì
s ử dụng không b ắt đầu bằng tên hàm
Không có giá tr ị trả
v ề thì sử dụng b ắt đầu bằng tên hàm
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 33 Các c ấp phụ thuộc: Biến Hàm
Khai báo (giao di ện) & sử dụng phải tương thích với nhau
Tóm t ắt: Giao diện & Sử dụng
Khai báo (giao di ện) S ử dụng
Bi ến
Kiểu, tên biến Đọc/ghi giá trị có kiểu tương ứng:
• Khi đọc phải có giá trị xác định
Truy ền tham số cho hàm:
• Gián tiếp đọc/ghi giá trị
Trang 34L.X.Định 39
Hãy khai báo nguyên m ẫu hàm cho các hàm sau (trước hàm main)
và s ử dụng chúng (1 lời g ọi hàm tương ứng với mỗi hàm) trong hàm
main
1. Ki ểm tra xem một số nguyên có phải là số chẵn hay không
2. Ki ểm tra xem một số nguyên này có chia hết cho một số nguyên kia hay không
3. Tính thương của hai số nguyên (chỉ lấy phần nguyên)
Trang 35 Hãy khai báo nguyên m ẫu hàm (tiếp theo)
Hãy vi ết các khái báo hàm trong file MyLib.h để chương trình sau
d ịch được:
#include “MyLib.h”
void main(){
float a[100]; int x;
for(int i=0; i<10; i++){
Trang 36Giao diện (lập trình) (Programming) interface Application programming
interface (API) là 1 b ộ giao diện
Nguyên mẫu hàm (Function) prototype Còn g ọi “function signature”,
“function type”
Gọi hàm Function call
Phần cài đặt Implementation
Đặc tả Specification
Hộp đen, hộp xám Black box, gray box
CuuDuongThanCong.com https://fb.com/tailieudientucntt