Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 4: Chương trình con (SubPrograms) - Nguyễn Văn Hòa
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
1
Pascal Code Fragment
procedure C;
procedure A (P : procedure; i : integer);
procedure B;
begin B
write(i);
end B;
begin A
if i = 1 then A(B,2)
else P;
end A;
begin main
A(C,1);
end main.
2
JavaScript Code Fragment
function sub1() {
var x;
function sub2() {
alert(x);
};
function sub3() {
var x;
x = 3;
sub4(sub2);
};
function sub4(subx) {
var x;
x = 4;
subx();
};
x = 1;
sub3();
};
3
Chương trình con chung C++
template <class Type>
Type max(Type first, Type second) {
return first > second ? first : second;
}
int max(int first, int second)
{
return first > second ? first : second;
}
4
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)
5
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
ꢁ Trù tưꢈng dꢋ liꢃu (data abstraction): ñưꢈc chú trꢅng
trong 1980s
ꢀ Chương trình con (CTC):
ꢁ Mꢌt phép toán trꢉu tưꢈng tiꢄn trình (process) ñưꢈc
ñꢍnh nghĩa bꢎi ngưꢏi lꢐp trình
ꢁ Khi mꢌt khꢇi công viꢃc ñưꢈc lꢑp ñi lꢑp lꢒi nhiꢆu lꢓn
trong chương trình → CTC
ꢁ Hoꢑc CTC ñưꢈc dùng ñꢔ tách mꢌt khꢇi công viꢃc cꢕ
thꢔ, ñꢔ chương trình chính ñꢖ phꢗc tꢒp
6
Giꢂi thiꢃu (tt)
ꢀ ðꢑc tính cơ bꢀn cꢘa CTC
ꢁ Mꢙi chương trình con có mꢌt ñiꢔm vào duy nhꢊt
ꢁ Chương trình gꢅi CTC thì tꢒm dꢉng trong khoꢀng thꢏi
gian thꢚc hiꢃn CTC
ꢁ Ðiꢆu khiꢔn luôn ñưꢈc trꢀ vꢆ chương trình gꢅi khi kꢄt
thúc chương trình con
ꢁ Mô hình Master/Client
ꢀ Hai khía cꢒnh khi nói ñꢄn CTC
ꢁ ðꢍnh nghĩa CTC
ꢁ Lꢏi gꢅi CTC
7
Giꢂi thiꢃu (tt)
ꢀ CTC có thꢔ truy xuꢊt dꢋ liꢃu :
ꢁ Truy xuꢊt các biꢄn không cꢕc bꢌ
ꢁ Truyꢆn tham sꢇ
ꢀ Ưu ñiꢔm cꢘa CTC
ꢁ Cho phép sꢛ dꢕng nhiꢆu lꢓn 1 chꢗc năng/khꢇi công
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
ꢁ Tăng tính dꢁ ñꢅc hiꢔu cꢘa CT vì dꢁ dàng thꢊy cꢊu trúc
ñiꢆu khiꢔn cꢘa CT hơn
ꢁ Phát hiꢃn và sꢋa lꢙi dꢁ dàng
8
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)
9
ðꢄ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ꢇ)
ꢁ Tham sꢇ hình thꢗc: là danh sách các tham sꢇ ñưꢈc
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
ꢁ Header CTC = Tên + tham sꢇ hình thꢗc
ꢀ Hoꢒt ñꢌng cꢘa CTC hay phꢓn thân (body)
ꢁ Các khꢇi như các khai báo, các câu lꢃnh, etc
ꢀ Sꢇ lưꢈng kꢄt quꢀ trꢀ vꢆ và kiꢔu cꢘa chúng
10
VD CTC (thꢁ tꢆc) trong Pascal
procedure count(k: array[1..5] of real);
const
<constant-declarations>
type
<type-declarations>
var
<variable-declarations>
// nested procedures and functions go here
begin
<statements>
end;
11
VD CTC (thꢁ tꢆc) trong Ada
procedure Display_Even_Numbers is
< declarations>
function even (number:integer) return boolean is
begin
<statements>
end even;
begin
<statements>
end Display_Even_Numbers;
12
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)?
13
Các biꢇn cꢆc bꢀ (local) cꢁa CTC
ꢀ
Các biꢄn cꢕc bꢌ ñꢌng stack
ꢁ
Liên k
ꢄ
t vào các ô nh
ꢂ khi CTC bꢞt ñꢓu ñưꢈc thꢚc hiꢃn và
h
ꢘ
y liên k
ꢄ
t khi k t thúc CTC
ꢄ
ꢁ
Ưu ñiꢔm
ꢀ
Hꢙ trꢈ ñꢃ qui
ꢀ
Ô nhꢂ dành cho các biꢄn cꢕc bꢌ có thꢔ ñưꢈc shared giꢋa các
CTC
ꢁ
Khuyꢄt ñiꢔm
ꢀ
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
ꢀ
Các biꢄn cꢕc bꢌ tĩnh
ꢁ
ꢁ
ꢁ
Hi
Không hꢙ ñꢃ qui
Không th chia sꢟ các ô nhꢂ
ꢃu quꢀ hơn
ꢔ
14
Các biꢇn cꢆc bꢀ cꢁa CTC (tt)
ꢀ
Trong C và C++ biꢄn cꢕc bꢌ ñưꢈc khai báo tĩnh nꢄu ñꢗng
sau static
int adder (int list[], int listlen){
static int sum = 0;
int count;
for (count=0; count<listlen;count++)
sum += list[count];
return sum;
}
ꢀ
ꢀ
// count là biꢄn cꢕc bꢌ ñꢌng stack
// sum biꢄn tĩnh
15
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)
16
Các mô hình truyꢉn tham sꢈ
17
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
ꢁ Cách cài ñꢑt bình thưꢏng là copy
ꢁ Có thꢔ cài ñꢑt bꢠng cách truyꢆn ñꢍa chꢝ nhưng cách
này không ñưꢈc khuyꢄn khích (vì ñòi hꢡi biꢄn phꢀi
ñưꢈc ñꢑt ꢎ chꢄ ñꢌ write-protection)
ꢁ Khi tác vꢕ copy ñưꢈc dùng → cꢓn thêm không gian
lưu trꢋ
ꢁ Lưu trꢋ và tác vꢕ copy có thꢔ mꢊt thꢏi gian
ꢀ Trꢍ cuꢇi cùng cꢘa tham sꢇ thꢚc bꢍ mꢊt khi CTC
kꢄt thúc
18
Truyꢉn tham trꢊ - In Mode (tt)
ꢀ Các NNLT hꢙ trꢈ : C, Pascal, Ada, Scheme, Algol68
{ c : array [1..10] of integer;
m,n: integer;
procedure r(k,j: integer);
begin
k:=k+1; /* m = 6 */
j:= j+2; /* n = 5 */
end;
begin
m := 5; n:=3;
r(m,n);
writeln(m,n); /* 5 & 3 */
}
19
Truyꢉn kꢇt quꢅ - Out Mode
ꢀ
Tham sꢇ thꢚc không truyꢆn giá ñꢄn CTC; tham sꢇ hình
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
ꢀ
ꢀ
Khꢀ năng bꢍ ñꢕng ñꢌ vꢆ tham sꢇ
ꢁ
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
NNLT hꢙ trꢈ : Ada
20
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 4: Chương trình con (SubPrograms) - Nguyễn Văn Hòa", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
bai_giang_nguyen_ly_ngon_ngu_lap_trinh_chuong_4_chuong_trinh.pdf

