Đặc tả chương trình con– Tên của chương trình con – Số lượng, thứ tự các tham số và kiểu dữ liệu của mỗi tham số – Số lượng, thứ tự các kết quả trả về và kiểu dữ liệu của mỗi kết quả – H
Trang 1Bài giảng
LÝ THUYẾT NGÔN NGỮ LẬP TRÌNH
Trang 2Chương 6
CHƯƠNG TRÌNH CON
Trang 3Nội dung Chương 6
• Trừu tượng hóa là một phương pháp giúp người lập trình
biết cách:
- Tập trung vào những vấn đề, những thuộc tính bản chất
của chương trình
- Bỏ qua các thuộc tính không cần thiết
- Mục đích của nó là đơn giản hóa quá trình lập trình.
• Có hai loại trừu tượng hóa cơ bản trong ngôn ngữ lập trình:
- Trừu tượng hóa quá trình
- Trừu tượng hóa dữ liệu.
Trang 4Nội dung Chương 6
• Trừu tượng hoá dữ liệu là việc tạo ra kiểu dữ liệu trừu tượng:
- Kiểu dữ liệu trừu tượng là một tập hợp các đối tượng dữ liệu
- Tập hợp các phép toán, thao tác trên các đối tượng dữ liệu đó
• Khi cài đặt một kiểu dữ liệu trừu tượng trên một ngôn ngữ lập trình cụ
thể, chúng ta phải thực hiện hai nhiệm vụ:
- Biểu diễn kiểu dữ liệu trừu tượng bằng một cấu trúc dữ liệu hoặc một
kiểu dữ liệu trừu tượng khác đã được cài đặt
- Viết các chương trình con thực hiện các phép toán trên kiểu dữ liệu
trừu tượng mà ta thường gọi là cài đặt các phép toán
• Ví dụ: các cấu trúc dữ liệu:
- Chuỗi ký tự
- Ngăn xếp.
- Hàng đợi
Trang 5Nội dung Chương 6
• Trừu tượng hóa quá trình:
- Phân chia chương trình thành những chương trình con
- Mỗi chương trình con có tên, đảm nhiệm một tác vụ nào đó.
• Sự phân chia này sẽ che dấu tất cả các lệnh cài đặt chi tiết trong các
chương trình con Ở cấp chiều chương trình chính, ta chỉ thấy lời gọi các
chương trình con và điều này được gọi là sự đóng gói
• Ví dụ: như một chương trình quản lý sinh viên được viết bằng trừu tượng hóa :
Nhap, Sap_Xep, Xuat là các phép toán trừu tượng
Chúng che dấu bên trong rất nhiều lệnh phức tạp mà
ở cấp chiều chương trình chính ta không nhìn thấy được
Trang 66.1 Khái niệm
• Chương trình con là một phép toán trừu tượng được định
nghĩa bởi người lập trình.
• Thông thường khi tạo ra ngôn ngữ lập trình nào đó Nhà sản
xuất tạo sẵn các chương trình con đơn gian Tạo thuận lợi
cho người lập trình.
• Các chương trình con này thường gọi các hàm có sẵn hay
các thủ tục có sẵn.
Trang 76.1 Khái niệm
• Các đặc tính chung của chương trình con:
- Tất cả chương trình con đều chỉ có một điểm vào (entry point)
- Chương trình gọi: là chương trình có chứa lời gọi để cho chương trình con thi hành.
- Chương trình gọi bị tạm dừng trong thời gian chương trình con thi hành.
- Khi quá trình thực thi chương trình con kết thúc, quyền điều khiển
sẽ trả về chương trình gọi để thực hiện các hoạt động khác nằm sau chương trình con bị gọi này
Trang 86.1 Khái niệm
• Chương trình con trả về một kết quả duy nhất trong
lời gọi chương trình con thì thường được gọi là hàm
(Function).
• Chương trình con trả về nhiều hơn một kết quả hoặc
không có kết quả trả về trong lời gọi chương trình con thì
thường được gọi là thủ tục (procedure hoặc subroutine)
Trang 96.2 Đặc tả và cài đặt chương trình con
6.2.1 Đặc tả chương trình con 6.2.2 Cài đặt chương trình con
Trang 106.2.1 Đặc tả chương trình con
– Tên của chương trình con – Số lượng, thứ tự các tham số và kiểu dữ liệu của mỗi tham số – Số lượng, thứ tự các kết quả trả về và kiểu dữ liệu của mỗi kết quả – Hoạt động được thực hiện bởi chương trình con
Trong C, Chỉ có một loại chương trình con gọi là hàm
Trang 116.2.1 Đặc tả chương trình con
• Cú pháp điển hình đặc tả được quy định trong NNLT C:
[Kiểu dữ liệu] Tên hàm ([Danh sách các tham số])
[Khai báo kiểu dữ liệu cho các tham số];
{ [Khai báo kiểu cho các biến cục bộ];
- Tên hàm : là tên hợp lệ trong C, buộc phải có
- Danh sách các tham số : là các tham số và được gọi là tham số hình thức
Có hoặc không tùy trường hợp cụ thể Nếu có nhiều tham số thì phải có dấu
Trang 126.2.1 Đặc tả chương trình con
- Khai báo kiểu cho các tham số: nếu hàm có các tham số hình
thức và vẫn chưa được khai báo kiểu thì ta cần khai báo kiểu
dữ liệu cho các tham số như khai báo với các biến Nếu các tham số có cùng kiểu dữ liệu thì phải có dấu phẩy (,) để phân cách chúng.
- Phần trong { }: là thân hàm Cặp dấu { } luôn phải có Thân
hàm gồm:
- Khai báo các biến cục bộ: là các biến chỉ có tác động và phạm vi ảnh
hưởng đối vời hàm chứa nó.
- Các câu lệnh: có thể là câu lệnh đơn hoặc câu lệnh có cấu trúc
- Trong thân hàm có thể sử dụng câu lệnh return([biểu thức]); câu lệnh
return có thể được dùng nhiều lần ở các vị trí khác nhau nhưng cũng có thể không được sử dụng lần nào Giá trị của biểu thức trong câu lệnh
Trang 13Đặc tả này xác định hàm tính giai thừa của một số nguyên n
tham số])
[Khai báo kiểu dữ liệu cho các tham số];
{ [Khai báo kiểu cho các biến cục bộ];
Các câu lệnh;
[return [biểu thức];]
}
Trang 14
Các câu lệnh;
[return [biểu thức];]
}
Trang 15Đặc tả này tính tổng biểu thức a+b
Sự đặc tả chương trình con bao gồm những thành phần nào ?
Trang 166.2.2 Cài đặt chương trình con
• Các phép toán nguyên thủy được cài đặt bằng cách dùng cấu trúc dữ liệu và các phép toán được cung cấp bởi máy tính ảo bên dưới NNLT
• Chương trình con biểu diễn một phép toán được xây dựng bởi người lập trình nên được cài đặt bằng cách dùng cấu trúc dữ liệu và các phép toán được cung cấp bởi chính bản thân NNLT đó.
• Sự cài đặt chương trình con được xác định bởi:
- Việc khai báo dữ liệu cục bộ xác định cấu trúc dữ liệu cho chương trình con
- Các lệnh xác định hành động sẽ làm khi chương trình con thực hiện
Trang 176.2.2 Cài đặt chương trình con
• Sự khai báo và các lệnh thường được đóng gói Do đó:
- Người sử dụng không thể truy xuất tới dữ liệu cục bộ và các lệnh bên trong chương trình con
- Người sử dụng chỉ có thể gọi chương trình con với một tập hợp các tham số và nhận lại các kết quả đã được tính toán
• Tùy thuộc vào từng NNLT mà trong một chương trình con nào đó có thể chứa các chương trình con khác Và các chương trình con này chỉ được dùng cho chương trình con chứa chúng mà không thể được gọi tới từ bên ngoài.
• Kiểm tra kiểu cũng là một vấn đề quan trọng đối với chương trình con
Trang 186.3 Phương pháp truyền tham số cho chương trình con
• Phương pháp truyền tham số cho chương trình con là lộ trình mà trên đó các tham số được truyền đến và/hoặc truyền từ các chương trình con được gọi
• Tham số có 2 loại:
- Tham số hình thức: là một loại đặc biệt của ĐTDL trong chương trình
con Nó được xác định lúc định nghĩa chương trình con
- Tham số thực tế: là một ĐTDL được gửi cho chương trình con bằng
cách truyền cho nó lời gọi thực hiện chương trình con
Trang 196.3 Phương pháp truyền tham số cho chương trình con
float area(int x, int y, int h){
- Các tham số hình thức nằm trong định nghĩa CTC
- Các tham thực nằm trong lời gọi CTC
- Tên của tham số hình thức và tham số thực có thể trùng nhau
Trang 206.3 Phương pháp truyền tham số cho chương trình con
• Các tham số hình thức được khai báo trong 3 mô hình ngữ nghĩa riêng biệt sau:
- In mode: chúng có thể nhận dữ liệu từ tham số thực tế tương ứng
- Out mode: chúng có thể chuyển dữ liệu cho các tham số thực tế
- In-out mode: chúng có thể làm cả hai việc đó
Trang 216.3 Phương pháp truyền tham số cho chương trình con
• Có nhiều phương pháp truyền tham số được phát triển bởi các nhà thiết kế ngôn ngữ để lập trình viên lựa chọn
- Truyền bằng giá trị
- Truyền bằng kết quả
- Truyền bằng giá trị - kết quả
- Truyền bằng tham chiếu
- Truyền bằng tên
Trang 226.3.1 Truyền bằng giá trị
• Truyền bằng giá trị thực thi cho các tham số In mode
• Trong phương pháp này:
- Các tham số hình thức là tham số chỉ vào, tức là chỉ nhận giá trị vào cho chương trình con mà không trả kết quả về cho chương trình gọi
- Tham số hình thức được xem như là một biến cục bộ của chương trình con và được cấp phát ô nhớ riêng
- Các tham số thực là một biểu thức (một biến, một hằng, một hàm, một biểu thức thực sự)
Trang 236.3.1 Truyền bằng giá trị
Ví dụ 6.4: Xét chương trình đổi 2 số nguyên bằng ngôn ngữ
giả tựa Pascal như sau:
Trước khi gọi
Tại thời điểm gọi
Trong thời điểm
CTC thực hiện
Khi kết thúc
Trang 246.3.2 Truyền bằng kết quả
• Truyền bằng kết quả thực thi cho các tham số Out mode
• Trong phương pháp này:
- Tham số hình thức: là tham số chỉ ra, tức là chỉ trả kết quả về cho chương trình gọi mà không nhận giá trị vào
- Tham số hình thức được xem như là một biến cục bộ và được cấp phát ô nhớ riêng
- Tham số thực là một biến, tức là một ĐTDL có ô nhớ
• Phương pháp thực hiện:
- Giá trị của tham số thực không được sử dụng trong chương trình con
- Tham số hình thức có thể được gán trị như đối với một biến cục bộ
- Trong quá trình thực hiện: mọi thao tác trên tham số hình thức là sự thao tác trên ô nhớ riêng của nó, không ảnh hưởng đến tham số thực
- Khi kết thúc: giá trị cuối cùng của tham số hình thức được sao chép vào ô nhớ của tham số thực
Trang 256.3.1 Truyền bằng kết quả
Ví dụ 6.4: Xét chương trình đổi 2 số nguyên bằng ngôn
ngữ giả tựa Pascal như sau:
Trước khi gọi
Tại thời điểm gọi
Trong thời điểm
CTC thực hiện
Khi kết thúc
Trang 266.3.2 Truyền bằng giá trị - kết quả
• Truyền bằng giá trị - kết quả thực thi cho các tham số In-out mode, mà trong đó các tham số thực được sao chép lại
• Đặc điểm của phương pháp truyền giá trị - kết quả:
- Có sự kết hợp của truyền bằng giá trị và truyền bằng kết quả
- Giá trị của tham số thực được dùng như giá trị khởi đầu của tham số hình thức tương ứng, và các tham số này sau đó hoạt động như một biến cục bộ
- Khi truyền bằng giá trị - kết quả các tham số hình thức phải có bộ nhớ cục bộ kết hợp với chương trình con được gọi
- Tại thời điểm dùng chương trình con, tham số hình thức được trả về lại cho tham số thực
Trang 276.3.2 Truyền bằng giá trị - kết quả
• Phương pháp này nhiều khi còn được gọi là truyền bằng cách sao chép
• Hạn chế của cả 3 phương pháp này là việc đòi hỏi nhiều ô nhớ cho các tham số
và thời gian sao chép các giá trị
Trang 286.3.1 Truyền bằng giá trị - kết quả
Ví dụ 6.4: Xét chương trình đổi 2 số nguyên bằng ngôn ngữ
giả tựa Pascal như sau:
Trước khi gọi
Tại thời điểm gọi
Trong thời điểm
CTC thực hiện
Khi kết thúc
Trang 296.3.2 Truyền bằng tham chiếu
• Truyền bằng tham chiếu là phương pháp thực thi thứ 2 cho các tham số In-out mode
- Khi kết thúc: mọi thay đổi giá trị của tham số hình thức đều làm giá trị của tham
số thực thay đổi theo
• Ngoài bốn phương pháp trên, còn một phương pháp đó là truyền bằng tên, là một phương pháp truyền các tham số In-out mode Tuy nhiên, nó không được sử dụng rộng rãi trong các NNLT
Trang 306.3.2 Truyền bằng tham chiếu
Ví dụ 6.4: Xét chương trình đổi 2 số nguyên bằng ngôn ngữ giả tựa
Pascal như sau:
Tại thời điểm gọi
Trong thời điểm
Trang 31Phương thức truyền tham số trong một số NNLT
• Với Fotran
- Luôn thực thi với tham số in-out mode
- Các phiên bản trước Fortran 77: truyền bằng tham chiếu
- Từ Fortran 77 trở về sau: các biến vô hướng thường truyền bằng giá trị-kết quả
- Phần lớn các tham số đều được truyền bằng giá trị
- Các tham số đối tượng được truyền bằng tham chiếu
Trang 326.4 Chương trình con chung
• Sự đặc tả chương trình con thông thường liệt kê số lượng, thứ tự và kiểu dữ
liệu của các tham số
• Chương trình con chung (chương trình con đa hình) là một chương trình con có
một tên nhưng có nhiều định nghĩa khác nhau, được phân biệt bởi số lượng, thứ tự
a:=x; b:=y;
….
end;
begin a:= 50; b:= 100;
hoanvi_2so(a,b);
… end.
Trang 336.4 Chương trình con chung
Ví dụ 6.5: Xét chương trình tính tổng 2 số:
chương_trình_con Tong_2so(x: integer; y: real);
khai báo tg: integer;
bắt đầu
in(x+y);
kết thúc;
chương_trình_con Tong_2so(x: real; y: integer);
khai báo tg: integer;
Trang 346.4 Chương trình con chung
• Khi sử dụng chương trình con chung, trình biên dịch cần xác định đúng ý nghĩa
của nó trong một tập hợp nhiều ý nghĩa có thể có
• Để nhận biết ý nghĩa đích thực của chương trình con chung cần dựa vào thông
tin về đối số của phép toán hoặc tham số của nó
Trang 356.5 Đồng thường trình (Coroutines)
• Mối quan hệ giữa chương trình gọi và chương trình con bị gọi là mối quan hệ chủ-tớ
• Chương trình gọi: là chương trình chủ
• Chương trình con bị gọi: là chương trình tớ
• Ví dụ:
void main() {
Nhap();
Xuat();
}
Chương trình gọi : chủ
Lời gọi chương trình con Nhap() : Tớ
Lời gọi chương trình con Xuat(): Tớ
Chương trình main() Nhap()
Xuat()
Nhap()Thao tác nhập 1Thao tác nhập 2
Xuat()Thao tác xuất 1Thao tác xuất 2
TớChủ
Trang 366.5 Đồng thường trình (Coroutines)
• Đồng thường trình là một loại đặc biệt của chương trình con, thay cho mối quan
hệ chủ-tớ giữa chương trình gọi (chủ) và chương trình con được gọi (tớ) trong
cách gọi truyền thống
• Đồng thường trình là chương trình con có nhiều điểm vào, và các điểm vào đó
được điều khiển bởi chính chương trình con đó
• Kỹ thuật điều khiển đồng thường trình thường được gọi là mô hình điều khiển
đơn vị đối xứng Nghĩa là đồng thường trình gọi và đồng thường trình bị gọi có
mức ưu tiên như nhau
• Lời gọi đồng thường trình gọi là Resume (Tiếp tục lại)
- A, B là các chương trình con
- Trong A có lời gọi B
- Trong B có lời gọi A
- A, B gọi là các đồng
thường trình
Trang 376.5 Đồng thường trình (Coroutines)
• Một trong những đặc trưng của chương trình con được duy trì trong các đồng
thường trình là:
- Chỉ duy nhất một đồng thường trình thực sự thực thi trong một thời điểm
- Lần thực thi thứ hai của một đồng thường trình thường bắt đầu bằng một điểm vào khác với điểm vào của lần đầu tiên
- Các đồng thường trình thường thực thi một phần sau đó chuyển điều khiển đến một đồng thường trình khác
- Khi khởi động lại, một đồng thường trình sẽ thực thi phần tiếp ngay sau mệnh
đề đã được dùng để chuyển tiếp điều khiển
- Đồng thường trình phải có các biến cục bộ tĩnh
Trang 38Điều khiển thực thi đồng thường trình
Trang 39Điều khiển thực thi đồng thường trình với vòng lặp
Trang 406.5 Đồng thường trình (Coroutines)
• Các đồng thường trình được tạo ra trong một ứng dụng bởi một chương trình
gọi là đơn vị chủ, mà đơn vị này không phải là đồng thường trình
• Khi được tạo ra, các đồng thường trình thực thi mã ban đầu của chúng và sau
đó trả quyền điều khiển về cho đơn vị chủ
• Khi tất cả các đồng thường trình đã được xây dựng xong, chương trình chủ sẽ
bắt đầu lại với mỗi một trong các đồng thường trình khác theo thứ tự cho đến khi công việc của chúng được hoàn thành (nếu có thể)
• Nếu sự thực thi của một đồng thường trình đến được điểm cuối cùng của đoạn
mã của nó, quyền điều khiển được chuyển về cho đơn vị chủ đã tạo ra nó
Trang 416.6 Thực thi chương trình con
6.6.1 Cú pháp chung gọi chương trình con 6.6.2 Thực thi chương trình con «đơn giản»
6.6.3 Thực thi chương trình con với ngăn xếp
động các biến cục bộ
Trang 426.6.1 Cú pháp chung gọi chương trình con
• Quá trình thực hiện:
– Nếu có tham số, trước tiên tham số sẽ được gán giá trị thực tương ứng– Thực thi các câu lệnh trong thân chương trình con từ lệnh đầu tiên đến lệnh cuối cùng
– Thoát khỏi chương trình con và trở về chương trình gọi để tiếp tục thực hiện các lệnh tiếp theo của chương trình gọi