Chương trình lớn có hàng nghìn, triệu... dòng lệnh, có nhiều đoạn tương tự nhau. Vậy làm sao để quản lý được logic chương trình để không phải viết những đoạn code lặp lại? Mời các bạn cùng tham khảo bài giảng để tìm hiểu về cách giải quyết vấn đề này như thế nào.
Trang 1Tuần 9 - Hàm và việc tổ chức
chương trình
Giáo viên: Hà Đại Dương
duonghd@mta.edu.vn
Kỹ thuật lập trình
Vấn đề
• Các chương trình đã viết (từ đầu môn học):
– Ngắn gọn
– Dễ hiểu (??)
– Dễ quản lý về logic (??)
• Chương trình lớn: hàng nghìn, triệu dòng
lệnh, có nhiều đoạn tương tự nhau
Làm sao để quản lý được logic
chương trình? Không phải viết những
đoạn code lặp lại
Modul hoá chương trình
• Chia chương trình thành những modul (đoạn)
chuyên biệt nhằm thực hiện một công việc
nào đó
• Logic trong mỗi modul có thể được kiểm soát
dễ dàng hơn
• Logic của cả chương trình thông qua việc sử
dụng các modul cũng trở nên dễ dàng, tường
minh hơn
Trang 2Ví dụ
• Viết chương trình nhập vào 2 ma trận A, B
tính và in ra ma trận tổng C = A+B
• Có thể chia bài toán trên (chương trình của
bài toán đó) thành các modul:
– Nhập ma trận A
– Nhập ma trận B
– Tính ma trận tổng
– In ma trận kết quả.
Modul hoá …
• Ở ví dụ trên có 2 công việc:
– Nhập ma trận A
– Nhập ma trận B
• Có thể nhận thấy chúng tương đối giống nhau
• Làm sao để không phải viết lại?
• Modul hoá giúp có thể khái quát hoá vấn đề
nào đó (ví dụ là nhập ma trận) thành một vấn
đề chung và có thể sử dụng nhiều lần
Ví dụ
• Bài toán xét xem điểm M nằm trong hay ngoài
tam giác ABC
• Một phương pháp khả
thi là:
– Tính sABC, sMAB,
sMBC, và sMAC
– So sánh
Nếu sABC > sMAB+sMBC+sMAC: M ngoài ABC
và ngược lại.
Trang 3Modul hoá …
• Như vậy có thể khái quát việc tính diện tích
tam giác thành một hàm để tính các diện tích
sABC, sMAB, sMBC, và sMAC
Nội dung bài học
• Hàm (function) là gì?
• Khai báo (viết hàm)
• Gọi (sử dụng) hàm
• Một số vấn đề khác:
– Hàm không trả về giá trị
– Các dạng tham số của hàm
– Hàm trùng tên
– Hàm với đối mặc định
– Khai báo nguyên hàm
Hàm (function)
Trang 4Hàm (function)
• Trong C mỗi modul được hiểu là 1 hàm
• Hàm:
– Là một modul (đoạn) nhằm thực hiện một công
việc nào đó.
– Truyền vào một số tham số
– Trả về một giá trị (qua tên hàm)
• Khi nào viết hàm:
– Cầm tách biệt 1 chức năng nào đó
– Khái quát hoá 1 công việc để tránh viết lại
Khai báo hàm
Khai báo hàm
• Cú pháp:
Kiểu Tên_Hàm(Danh sách tham số đầu vào)
{
Các lệnh của C
…
returnBiểu_Thức;
}
Trang 5Trong đó
• Kiểu: Là kiểu dữ liệu trả về thông qua tên
hàm
– Là voidnếu không trả về kiểu dữ liệu cụ thể (xét
sau)
• Tên_Hàm: Tên theo qui tắc đặt tên trong C
– Tuy nhiên C cho phép đặt tên hàm trùng nhau
nhưng phải có sự khác nhau về: số các tham số
hoặc/và kiểu dữ liệu của các tham số đó.
• return: Lệnh (từ khoá) của C
Trong đó …
• Danh sách các tham số đầu vào
– Tên,
– kiểu và
– số lượng các tham số
• Biểu_Thức: Giá trị của biểu thức này được trả
về qua tên hàm, và có kiểu cùng với Kiểu của
hàm
Ví dụ 1
• Hàm tính khoảng cách khi biết toạ độ 2 điểm
(a, b) trong không gian:
– Toạ độ của a: (ax, ay)
– Toạ độ của b: (bx, by)
– Khoảng cách (eclide) từ a đến b là
kc = Căn bậc 2 của (ax-bx) 2 +(ay-by) 2
– Trong C hàm lấy căn bậc 2 là sqrt() trong thư viện
math.h
Trang 6Ví dụ 1 …
Kiểu Tên hàm Danh sách các tham số đầu vào
Các lệnh của C Biểu thức trả về
Gọi hàm
Gọi hàm
• Cú pháp:
Tên_hàm(Các tham số đầu vào thực)
• Ví dụ tính khoảng cách từ (1,2) đến (5,3)
kc(1, 2, 5, 3)
– 1: Tham số thực tương ứng với ax
– 2: Tham số thực tương ứng với ay
– 5: Tham số thực tương ứng với bx
– 3: Tham số thực tương ứng với by
Trang 7Ví dụ 2
• Viết chương trình tính diện tích tam giác ABC
(khi biết toạ độ các điểm A, B, C)
• Diện tích ABC khi biết độ dài 3 cạnh (l,m,n)
SABC= sqrt(p*(p-l)*(p-m)*(p-n))
• Không dùng hàm -> Vẫn làm được, nhưng phải
viết các đoạn code lặp lại
• Sử dụng hàm kc() ở ví dụ 1 (15 phút)
Ví dụ 2 …
Lời gọi hàm kc()
Hàm không trả về giá trị
Trang 8Khai báo
• Cú pháp:
void Tên_Hàm(Danh sách tham số đầu vào)
{
Các lệnh của C
…
[return;]
}
• Nhằm thực hiện 1 công việc nào đó
Ví dụ 3
• Viết hàm in kết quả diện tích của tam giác
Trang 9Tham số của hàm
Bài toán đổi giá trị 2 số
• Có 2 số a bviết hàm cho phép đổi chỗ 2 số
này
• Sau khi thực hiện acó giá trị của bvà ngược
lại bcó giá trị của a
Ví dụ 4
Trang 10Ví dụ 4 …
• Kết quả
a, b không đổi cho nhau vì sao?
• Trong hàm DoiCho x, y là tham số đầu vào và
là 2 biến cục bộ của DoiCho
• Trong lời gọi hàm:
– a là tham số thực tương ứng với x
– b là tham số thực tương ứng với y
• Biến x nhận giá trị của a và biến y nhận giá trị
của b
• Trong DoiCho x, y thực sự đổi chỗ cho nhau
nhưng điều đó không ảnh hưởng đến a,b
Tham số dạng con trỏ
• Để hàm DoiCho() thực sự đổi được giá trị của
a và b
Khai báo x, y dạng con trỏ
Trang 11Tham số dạng con trỏ …
• Để hàm DoiCho() thực sự đổi được giá trị của
a và b
Thực hiện lời gọi hàm
Tham số dạng tham chiếu
• Để hàm DoiCho() thực sự đổi được giá trị của
a và b
Khai báo x, y dạng tham chiếu (C++)
Trang 12Tham số dạng tham chiếu …
• Để hàm DoiCho() thực sự đổi được giá trị của
a và b
Thực hiện lời gọi hàm
Ba cách khai báo tham số
Tham trị
Con trỏ
Gọi hàm Hàm với các dạng tham số đầu vào
a, b không đổi
Trang 13Hàm trùng tên
Vấn đề
• Đã có hàm DoiCho(x,y) với x, y là số nguyên
• Muốn xây dựng hàm đổi chỗ 2 số thực làm thế
nào?
– Viết hàm với tên khác: Khả thi, nhưng hơi phiền
hà khi sử dụng.
– Viết hàm trùng tên, cũng là DoiCho(x,y) nhưng các
tham số x, y là thực: C/C++ cho phép làm điều này.
• C/C++ cho phép viết các hàm trùng tên nhưng
phải khác nhau về số lượng và/hoặc kiểu dữ
liệu của các tham số
Trang 14Thêm hàm DoiCho 2 số thực
• Kết quả
Hàm với đối mặc định
Trang 15Vấn đề
• C++ cho phép khai báo tham số với giá trị mặc
định để khi gọi có thể truyền giá trị cho các
tham số này hoặc không Khi không truyền thì
các tham số này nhận giá trị mặc định
Cú pháp Kiểu Tên_Hàm(Kiểu1 th1, , Kiểu tm1 = gt1,… )
{
Các lệnh của C
…
returnBiểu_Thức;
}
• Ví dụ: Viết hàm tính luỹ thừa y của x
Ví dụ 5 - Hàm luythua
Trang 16Khai báo nguyên hàm
Vấn đề
• Ở ví dụ 5 đưa luythua() về sau main() ??
Khi biên dịch
• Xuất hiện thông báo lỗi
Trang 17Khai báo nguyên hàm (prototype)
• Ý nghĩa: Khai báo dạng thức của hàm bao gồm
tên hàm, số lượng và kiểu các tham số đầu
vào, kiểu giá trị trả về của hàm
• Cú pháp
Kiểu Tên_Hàm(Danh sách tham số);
• Ví trí: Thường đặt trước hàm main()
Ví dụ 6
Bài tập
Trang 18Bài tập
1 A, B, C và M là các điểm trên mặt phẳng Viết
chương trình kiểm tra xem M có nằm trong
tam giác ABC hay không?
Tổ chức thành các hàm:
– Tính khoảng cách
– Tính diện tích
– Nhập dữ liệu từ fie (không trả về giá trị)
Bài tập
2 Viết chương trình nhập 1 mảng n phần tử từ
file dữ liệu dạng text, sắp xếp tăng dần và in
mảng đó ra màn hình
Tổ chức thành các hàm
– Nhập mảng từ file
– Sắp xếp
– In danh sách
Bài tập về nhà
1 Hàm chuẩn hoá họ tên
2 Hàm tính số ngày giữa 2 ngày
3 Hàm đổi số tiền dạng số thành chữ
4 Hàm tính số tiền taxi
5 Hàm tính số tiền điện