1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 4: Chương trình con (SubPrograms)

44 9 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 44
Dung lượng 221,34 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 4: Chương trình con (SubPrograms) giới thiệu chương trình con, cơ chế gọi chương trình con, truyền tham số cho chương trình con, chương trình con đa năng (overloaded), chương trình con chung (generic).

Trang 1

Ch ươ ng 4: Chươ ng trình con

(SubPrograms)

Giảng viên: Ph.D Nguyễn Văn Hòa Khoa KT-CN-MT – ðH An Giang

Trang 2

Pascal Code Fragment

end A;

begin main

A(C,1);

end main.

Trang 3

JavaScript Code Fragment

Trang 4

Ch ươ ng trình con chung C++

template <class Type>

Type max(Type first, Type second) {

return first > second ? first : second;

Trang 5

N ộ i dung chính c ủ a ch ươ ng

 Giới thiệu chương trình con

 Cơ chế gọi chương trình con

 Truyền tham số cho chương trình con

 Chương trình con ña năng (overloaded)

 Chương trình con chung (generic)

Trang 6

Gi ớ i thi ệ u

 Có hai cách trù tượng hóa

 Trù tượng tiến trình (process abstraction): ñược chú

trọng ngày từ rất sớm

trong 1980s

 Chương trình con (CTC):

ñịnh nghĩa bởi người lập trình

trong chương trình → CTC

thể, ñể chương trình chính ñỡ phức tạp

Trang 7

Gi ớ i thi ệ u (tt)

 ðặc tính cơ bản của CTC

Trang 8

Gi ớ i thi ệ u (tt)

 CTC có thể truy xuất dữ liệu :

 Ưu ñiểm của CTC

việc ~ CTC → tiết kiệm không gian lưu trữ code và ẩn giấu các chi tiết của CT

ñiều khiển của CT hơn

Trang 9

Mô hình cài ñặ t CTC

 Mô hình cài ñặt của CTC trong các NNLT có thểkhác nhau

 ðiều khiển tuần tự (Imperative) :

 Thủ tục : một khối các câu lệnh ñể thực hiện 1 chức năng

 Hàm : một khối câu lệnh trả về 1 kết quả duy nhất

 Ngôn ngữ C không phân biệt hàm và thủ tục

 Hàm: VD Hàm tính dãy Fibonacci

 Logic: Mệnh ñề Horn (Horn claus)

Trang 10

ðặ c t ả c ủ a CTC

 Tên của CTC

 Số lượng, thứ tự và kiểu của các tham số (ñối số)

dùng trong CTC ở phần Header của CTC

 Tham số thực: là các giá trị hoặc ñịa chỉ ô nhớ ñược

dùng trong lời gọi CTC

 Hoạt ñộng của CTC hay phần thân (body)

 Số lượng kết quả trả về và kiểu của chúng

Trang 13

Các y ế u t ố khi thi ế t k ế CTC

 Các hình thức truyền tham số: tham trị hay quy

chiếu,…?

 Có kiểm tra kiểu hay không?

 Các biến cục bộ là tĩnh (static) hay ñộng?

 Một CTC có thể ñược khai báo lòng vào một CTC khác không?

 CTC có ñược ña năng hóa (overloaded) không?

 CTC là chung hay không (generic subprogram)?

Trang 14

 Cần thời gian cấp, giải phóng và khởi tạo

 Không thể lưu giá trị của biến giữa các lần gọi CTC

 Hiệu quả hơn

 Không hỗ ñệ qui

 Không thể chia sẽ các ô nhớ

Trang 15

Các bi ế n c ụ c b ộ c ủ a CTC (tt)

sau static

int adder (int list[], int listlen){

static int sum = 0;

Trang 16

Truy ề n tham s ố

 Khi gọi CTC, các tham số ñược truyền bằng một trong các cách sau ñây :

 Truyền tham trị (Pass-by-value)

 Truyền kết quả (Pass-by-result)

 Truyền trị và kết quả (Pass-by-value-result)

 Truyền quy chiếu (Pass-by-reference)

Trang 17

Các mô hình truy ề n tham s ố

Trang 18

Truy ề n tham tr ị - In Mode

 Giá trị của tham số thực ñược dùng ñể truyền vào tham số hình thức tương ứng

này không ñược khuyến khích (vì ñòi hỏi biến phải

ñược ñặt ở chế ñộ write-protection)

lưu trữ

 Trị cuối cùng của tham số thực bị mất khi CTC

kết thúc

Trang 19

Truy ề n tham tr ị - In Mode (tt)

 Các NNLT hỗ trợ : C, Pascal, Ada, Scheme, Algol68

Trang 20

Truy ề n k ế t qu ả - Out Mode

thức tương ứng ñống vai trò như biến cục bộ nhưng khi kết thúc CTC thì trị của tham số này ñược trả về cho

tham số thực

 Yêu cầu không gian lưu trữ và tác vụ copy

 Tham số thực phải là 1 biến

 Sub(p1,p1); một khi tham số hình thức ñược copy trở lại thì lần copy sau cũng thể hiện trị của p1

Trang 21

Truy ề n tham tr ị & k ế t qu ả - Inout Mode

 Sự kết hợp truyền trị và truyền kết quả (pass-by-value and pass-by-result)

 Tham số hình thức cần không gian lưu trữ cục bộ

 Tham số hình thức phải là 1 biến (có ô nhớ), copy trị

 Giá trị cuối cùng của tham số hình thức ñược copy

cho tham số thực

 Khuyết ñiểm:

 Các khuyết ñiểm của truyền tham trị

 Các khuyết ñiểm của truyền kết quả

 NNLT hỗ trợ : Fortran

Trang 22

Truy ề n tham tr ị & k ế t qu ả (tt)

Trang 23

Truy ề n quy chi ế u - Pass by Reference

 Cách cài ñặt thứ 2 của Inout Mode

 Truyền bằng 1 ñường dẫn, có thể ñịa chỉ ô nhớ

 Tham số hình thức là pointer

 Hiệu quả hơn (không cần không gian lưu trữ)

 Khuyết ñiểm

bởi vì các truy xuất là không cục bộ VD trong C

void fun(int &first, int &second) lúc gọi fun(total,total)

Trang 24

Cài ñặ t các cách truy ề n tham s ố

 Hầu hết các NNLT ñiều dùng stack ñể xây dựng

cơ chế truyền tham số

 Truyền tham trị sẽ copy giá trị của tham số thực vào trong stack tương ứng giá trị của tham số hình thức

 Truyền tham trị-kết quả thì giá trị của tham số

hình thức ñược lưu trong stack và sẽ trả về cho

tham số thực

 Truyền quy chiếu là ñơn giản nhất, chỉ cần lưu ñịa chỉ ô nhớ vào trong stack

Trang 25

Cài ñặ t các cách truy ề n tham s ố

Trang 26

Cách truy ề n tham s ố trong các NNLT

 Fortran

 Luôn dùng mô hình Inout

 Trước Fortran 77: truyền quy chiếu

 Từ fortran 77 trở về sau: truyền kết quả

 Truyền quy chiếu với tham số hình thức khai báo kiểu con trỏ

 Tham số ñối tượng truyền quy chiếu

 Java

 Tất cả tham số ñều truyền tham trị

 Tham số ñối tượng truyền quy chiếu

Trang 27

Cách truy ề n tham s ố trong các NNLT

 Ada

 Dùng 3 từ khóa ñể xác ñịnh cách truyền tham số : in ,

out , in out ; mặc ñịnh là in

 Có thể gán trị cho tham số hình thức ñược khai báo với

out nhưng trị ñó không ñược tham khảo, còn những tham

số ñược khai báo với in thì không trả về trị; tham số với

in out thì truyền tham trị và trả về kết quả

 C#

 Mặc ñịnh là truyền tham trị

 Truyền tham số ñược xác ñịnh trong cả tham số hình thức

và tham số thực bởi từ khóa ref

 PHP: Giống như C#

 Perl: tất các các tham số thực ñiều ñược ñặt sau @_

Trang 28

Ki ể m tra ki ể u các tham s ố

 Kiểm tra kiểu của các tham số là rất cần thiết (for reliability)

 FORTRAN 77 và original C: không kiểm tra

 Pascal, FORTRAN 90, Java, và Ada: luôn luôn kiểm tra kiểu

 ANSI C và C++: Tùy thuộc vào người dùng

Double sin(x) Double sin (double x){….}

double x; {…}

 Perl, JavaScript, và PHP thì không kiểm tra kiểu

Trang 29

Tham s ố là mãng nhi ề u chi ề u

 Nếu tham số của CTC là mãng nhiều và CTC và

CT gọi CTC ñược dịch ñộc lập thì chương trình dịch cần khai báo kích thước của mãng ñể xây

dựng các chỉ số index

Trang 30

Tham s ố mãng nhi ề u chi ề u: C và C++

 Yêu câu người dùng phải chỉ rõ số cột trong tham

số hình thức ñối với mãng 2 chiều

 void fun(int matrix[][10]);

 CTC không ñược linh hoạt

 Giải pháp: dùng biến con trỏ trỏ ñến mãng và

kích thước của các chiều thì truyền bằng cách

tham số khác ~ người dùng phải chỉ ra kích thước lưu trữ của mãng thông qua các tham số

 VD void(float *mat_ptr, int num_rows, int num_cols);

Trang 31

Tham s ố là mãng nhi ề u chi ề u : Java

và C#

 Mãng là 1 ñối tượng, do ñó tất cả các mãng ñều 1 chiều nhưng từng phần tử có thể là mãng

 Mỗi mãng thừa kế 1 hằng số (length trong

Java, Length trong C#) ñược xem là chiều dài của mãng ngay lúc khởi tạo

Trang 32

là nên dùng truyền 1 chiều nhiều nhất có thể

Trang 33

Tham s ố là tên c ủ a CTC

 Mội vài NNLT cho phép dùng tên của CTC như

là một tham số

 VD hàm integral

procedure integrate(function (fun(x :

real) : real; lbound, rbound : real);

 C và C++: không hỗ trợ cơ chế dùng tên hàm

như tham số

Trang 34

Tham s ố là tên c ủ a CTC - javaScript

function sub1(){

var x;

function sub2(){

alert(x) };

Giá tr ị c ủ a x là bao nhiêu 4 hay 1 trong ngôn

ng ữ ph ạ m vi ñộ ng và liên k ế t c ạ n và liên k ế t sâu

Trang 35

Ch ươ ng trình con ñ a n ă ng

 Hầu hết các NNLT ñiều có các phép toán ña năng

 Chương trình con ña năng là CTC có cùng tên với

hàm có sẵn trong cùng một phạm vi

 Tất cả các phiên bản ñều có chung 1 protocol

 Trình biên dịch chọn phiên bản thích hợp dựa trên các tham số của hàm

 Ada, Java, C++, và C# cho phép người dùng viết

nhiều phiên bản của CTC chùng tên nhau

 C++, Java, C#, và Ada cho phép thêm vào các CTC

ña năng (VD toán tử)

Trang 36

 int a; long b; MyAbs(a); MyAbs(b) : trình biên

dịch dựa vào kiểu của tham số ñể xác ñịnh phiên bản thích hợp

Trang 37

Ch ươ ng trình con chung

 CTC chung (generic) hay ña hình (polymorphic) là

một tên CTC có thể chấp nhận các tham số có nhiều kiểu khác nhau

 CTC ña năng là trường hợp ñặc biệt của CTC chung

 Các tham số chung dùng ñể mô tả các kiểu khác nhau gọi là tham số ña hình (parametric polymorphism)

Trang 38

VD tính ñ a hình c ủ a CTC: C++

 ðịnh nghĩa 1 template

template <class Type>

Type max(Type first, Type second) {

return first > second ? first : second;

 VD so sánh cho kiểu integer thông thường

int max (int first, int second) {

return first > second? first : second; }

Trang 39

VD tính ñ a hình c ủ a CTC: C++ (tt)

template <class type>

void generic_sort (Type list[], int len){

int top, bottom;

Type temp;

for(top=0;top<len-2;top++)

for(bottom=top+1;bottom<len-1;bottom++) if(list[top]>list[bottom]){

Trang 40

Khi thi ế t k ế hàm : các y ế u t ố

 Có cho phép hiệu ứng lề không?

 Các tham số nên ở in-mode ñể giảm hiệu ứng lề (như

Ada)

 Cho phép giá trị trả về có kiểu gì?

 Hầu hết các NNLT ñiều giới hạn kiểu trả về

 C cho phép trả về với bất cứ kiểu gì trừ kiểu mãng

 C++ cũng giống như C nhưng bao gồm luôn cả kiểu do

người dùng ñịnh nghĩa

 Ada cho phép tất cả các kiểu

 Java và C# không có hàm nhưng các methods có thể trả

về bất kỳ kiểu gì?

Trang 41

Phép toán ñ a ngh ĩ a: do ng ườ i dùng cài ñặ t

for Index in A’range loop

Sum := Sum + A(Index) * B(Index) end loop

Trang 42

S ự ñ ang xen (Coroutines)

 Xự ñang xen là một CTC có nhiều ñiểm vào

(multiple entries ) và ñiều khiển lẫn nhau

 Chương trình gọi (caller) và bị gọi (called) gọi ñang xem lẫn nhau

 Còn ñược gọi là ñiều khiển ñối xứng (symmetric control)

 Sự gọi ñang xen ñược ñặt tên là resume

 Sự ñang xen có thể lập ñi lập lại và có thể không

dừng

Trang 43

Minh h ọ a s ự ñ ang xen: tr ườ ng h ợ p 1

Trang 44

Minh h ọ a s ự ñ ang xen: tr ườ ng h ợ p 2

Ngày đăng: 08/05/2021, 19:41

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w