Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 3: Cấu trúc điều khiển - Nguyễn Văn Hòa
Tóm tắt Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 3: Cấu trúc điều khiển - Nguyễn Văn Hòa: ...Giải phỏp ủể giải quyết hiệu ứng lề NNLT khụng cho phộp hàm tham chiếu cỏc biến khụng cục bộ và truyền quy chiếu Ưu ủiểm : dễ thực hiện Khuyết ủiểm : khụng linh hoạt NNLT phải qui ủịnh thứ tự ưu tiờn của cỏc toỏn hạng Khuyết ủiểm : giảm khả năng tối ưu code của trỡnh biờn dịch Ng...ể phõn ủịnh Perl yờu cầu cõu lệnh ghộp (if else ủầy ủủ) 22 Sự lựa chọn lũng nhau C, C++, C# if (sum == 0){ if (count == 0) result = 0; }else result = 1; Ada if (sum == 0) then if (count == 0)then result = 0; else result = 1; end if end if if (sum == 0) then if (count == 0)t...Kiểu của biến lặp phải là kiểu số nguyờn Biến lặp khụng ủược thay ủổi trong thõn vũng lặp Fortran 95 do bien_lap = trị_bat_dau, trị_ket_thuc [, buoc_nhay] end do 30 VD - lệnh lặp với bộ ủếm (tt) Cỳ phỏp lệnh for của Pascal for bien_lap := bat_dau (to|downto) ket_thuc do bien_la...
1Chương 3: Cấu trúc điều
khiển
Giảng viên: Ph.D Nguyễn Văn Hịa
Khoa KT-CN-MT – ðH An Giang
2Giới thiệu
Dữ liệu và tác vụ là 2 yếu tố cơ bản của CT
Mỗi sự kết hợp của chúng gắn liền với cấu trúc
điều khiển
Cấu trúc điều khiển là tập hợp các qui tắc xác
định thứ tự thực hiện chương trình
Xét về cấu trúc thì cĩ 3 loại điều khiển
ðiều khiển trong biểu thức
ðiều khiển giữa các lệnh (phát biểu): như cấu trúc điều
kiện hay cấu trúc lặp
ðiều khiển trong chương trình con: gọi trả về hay đệ
qui
3Giới thiệu (tt)
Xét về thiết kế ngơn ngữ thì cĩ 2 loại điều khiển
ðiều khiển ngầm: được thiết kế trong ngơn ngữ LT,
VD qui tắc ưu tiên của các tốn tử
ðiều khiển tường minh: được xác định bởi programmer
Hai cấu trúc điều khiển
ðiều khiển tuần tự
ðiều khiển cạnh tranh (concurrency) : 2 hoặc nhiều
hơn đoạn chương trình được thực thi song song
Cấu trúc điều khiển tốt
Dễ viết
Dễ đọc
4Nội dung chính của chương
ðiều khiển trong biểu thức
Lệnh lựa chọn hay điều kiện
Lệnh lặp
Rẽ nhánh khơng điều kiện
Luồng điều khiển khơng tuần tự
5ðiều khiển trong biểu thức
Cơ chế điều khiển trong biểu thức là sự chồng
chất hàm (functional composition)
Tác vụ hay phép tốn
Các đối số hay tốn hạng
Tốn hạng: hằng, các kết quả của các phép tham
khảo dữ liệu (biến) hoặc kết quả của các phép
tốn khác
Cơ chế chồng được biểu
diễn bởi một cấu trúc cây
(A+B)*(C-A)
*
+ -
A B C A
6ðiều khiển trong biểu thức (tt)
Thứ tự ưu tiên của các tốn tử
Các tốn tử cùng độ ưu tiên
Thứ tự các tốn hạng
Hiệu ứng lề
Tính đa năng của tốn tử
7Thứ tự ưu tiên các tốn tử
Kết quả của biểu thức 3 + 5 * 2 ?? → phụ thuộc
thứ tự thực hiện các tốn tử
Thứ tự thực hiện các tốn tử trong NNLT
FORTRAN 95 C Ada
** postfix ++,-- **, abs
*, / prefix ++, *, /, mod
-âm, +dương rem
-âm, +dương *, /, % -âm, +dương
+,- +,- +,-
8Các tốn tử cùng ưu tiên (associativity)
Các phép tốn cĩ cùng ưu tiên, + và -, cần cĩ 1
qui luật để xác định thứ tự thực hiện
VD a-b+c-d
Các NNLT qui định thứ tự thực hiện
Từ trái sang phải
Trừ Fortran (từ phải sang trái)
Ada bắt buộc phải cĩ dấu ngoặc ((a-b)+c)-d
Nếu cĩ ngấu ngoặc thì thứ tự ưu tiên của các tốn
tử bị mất đi và thực hiện theo dấu ngoặc
9Biểu thức điều kiện
Tốn tử «?» là tốn tử tam phân (ternary)
Biểu thức điều kiện chỉ cĩ trong ngơn ngữ C
VD average = (count == 0)? 0 : sum / count
Cĩ thể dùng câu lệnh if-then-else thay thế
if (count == 0)
average = 0;
else
average = sum /count;
10
Biểu thức quan hệ
Biểu thức quan hệ: 1 tốn tử quan hệ và 2 tốn
hạng cĩ nhiều kiểu khác nhau
Trị của biểu thức quan hệ: đúng hoặc sai
VD tốn tử quan hệ
FORTRAN 95 C Ada
Bằng .EQ. = = = = =
Khơng Bằng .NE. != /=
Lớn hơn .GT. > > >
Nhỏ hơn .LT. < < <
Lớn hơn or bằng .GN. >= >= >=
Nhỏ hơn or bằng .LN. <= <= <=
11
Biểu thức logic
Biểu thức logic: 1 tốn tử logic và 2 tốn hạng cĩ
kiểu logic
Trị của biểu thức logic: đúng hoặc sai
VD các tốn tử logic
FORTRAN 77 FORTRAN 90 C Ada
.AND. and && and
.OR. or || or
.NOT. not ! not
xor
12
Thứ tự thực hiện các tốn tử : C
Hậu tố (++, --)
Tiền tố (++, --, !) âm dương (+, -)
*, /, %
+, -
,=
==, !=
&&
||
13
Hiệu ứng lề
Hiệu ứng lề là 1 phép tốn trả về kết quả ẩn
Hàm hiệu ứng lề là hàm thay đổi biến khơng cục
bộ hoặc cĩ truyền quy chiếu
int a= 5;
int fun1(){a = 17; return 3;}
void fun2(){a = a + fun1();}
void main(){
fun2();
}
Kết quả của a là 8 hay 20
14
Hiệu ứng lề
Giải pháp để giải quyết hiệu ứng lề
NNLT khơng cho phép hàm tham chiếu các biến khơng
cục bộ và truyền quy chiếu
Ưu điểm : dễ thực hiện
Khuyết điểm : khơng linh hoạt
NNLT phải qui định thứ tự ưu tiên của các tốn hạng
Khuyết điểm : giảm khả năng tối ưu code của trình biên dịch
Ngơn ngữ C trả về giá trị của a là 20
15
Cú pháp của biểu thức
Dạng trung tố (infex)
Phổ biến và tự nhiên nhất: kí hiệu phép tốn được viết
giữa 2 tốn hạng
VD (A + B) * (C - A)
Dạng tiền tố (prefix)
Kí hiệu phép tốn được viết trước các tốn hạng
VD * (+ (A B)) – (C A))
Dạng hậu tố (posfix)
Kí hiệu phép tốn được viết sau các tốn hạng
VD ((A B) +) (C A) -)*
16
Tốn tử đa năng hĩa (overloaded)
Một tốn tử cĩ thực hiện nhiều phép tốn → tốn
tử đa năng hĩa
Phép tốn + với kiểu số nguyên và kiểu số thực
Phép tốn &: lấy địa chỉ và phép tốn And (bit)
int x, y, z ;
x = &y // trả về địa chỉ ơ nhớ của y cho x
x = y&z // trả về giá trị của phép tốn And trên y,z
Phép tốn *
Trả về trị của ơ nhớ mà pointer trỏ đến hoặc phép tốn
nhân
17
Lệnh điều khiển
Ba loại cấu trúc điều khiển cơ bản
Lệnh tuần tự
Lệnh gán, lệnh gọi chương trình con
Lệnh xuất / nhập
Lệnh lựa chọn hay điều kiện
Lệnh lặp
Lệnh rẽ nhánh khơng điều kiện
18
Lệnh lựa chọn hay điều kiện
Lệnh điều kiện là một lệnh biểu thị sự lựa chọn
của hai hoặc đa nhánh để thực hiện
Chia làm 2 loại
Chỉ cĩ 2 lựa chọn (lệnh IF)
Nhiều lựa chọn (lệnh CASE)
19
Lệnh lựa chọn : 2 lựa chọn
Dạng phổ biến :
if control_expression then clause
else clause
Các yếu tố trong lệnh 2 lựa chọn
Dạng và kiểu của biểu thức lựa chọn như thế nào : quan
hệ, tốn và logic?
Các câu lệnh gì sau then và sau else?
Lệnh lựa chọn cĩ lịng nhau hay khơng?
20
Biểu thức lựa chọn (2 lựa chọn)
ALGOL 60 : chỉ dùng biểu thức logic
if (boolean_expr) then stmt
else stmt
C (89 trở về trước) : chỉ dùng biểu thức logic
C (99) và C++ : biểu thức tốn và logic
VD if(5-3) printf(«A») else printf(«B»);
C/C++/Java: if (expr) stmt else stmt
Ada, Java và C# chỉ cho phép dùng biểu thức
logic
21
Sự lựa chọn lịng nhau
Thí dụ trong Java
if (sum == 0)
if (count == 0)
result = 0;
else result = 1;
Lệnh if nào sẽ đi cùng với lệnh else?
NN Java qui định lệnh if và lệnh else gần nhau nhất
sẽ đi cùng nhau
C, C++, C# yêu cầu dùng {} để phân định
Perl yêu cầu câu lệnh ghép (if else đầy đủ)
22
Sự lựa chọn lịng nhau
C, C++, C#
if (sum == 0){
if (count == 0)
result = 0;
}else result = 1;
Ada
if (sum == 0) then
if (count == 0)then
result = 0;
else
result = 1;
end if
end if
if (sum == 0) then
if (count == 0)then
result = 0;
end if
else
result = 1;
end if
23
Lệnh lựa chọn đa nhánh
Cho phép lựa chọn 1 nhánh trong số nhiều
nhánh lệnh để thực hiện
Các yếu tố trong lệnh lựa chọn đa nhánh
Kiểu và dạng của biểu thức điều khiển là gì?
Cơng việc của từng nhánh lệnh là gì?
Cĩ nhánh lệnh khơng thỏa điều kiện khơng? Nếu cĩ
nĩ thực hiện lệnh gì?
24
Mơ hình switch-case
switch (expr){
case const_expr_1 : stmt_1;
case const_expr_n : stmt_n;
[default: stmt_n+1;]
}
Switch-case trong C, C++, Java
Biểu thức điều khiển phải là kiểu nguyên
Câu lệnh được chọn cĩ thể 1 câu lệnh đơn hoặc lệnh hợp
thành
Default : được chọn nếu khơng cĩ giá trị nào thỏa expr
25
Mơ hình switch-case
Switch-case trong Ada
case expression is
when choice list => stmt_sequence;
when choice list => stmt_sequence;
when others => stmt_sequence;]
end case;
Dễ đọc hơn switch-case của C
C# chỉ cho phép thực hiện 1 lệnh đơn trong
trường hợp được chọn
26
Chọn đa nhánh với lệnh if
Lệnh chọn đa nhánh cĩ thể chuyển thành lệnh
chọn 2 nhánh với else-if
if (expr == const_expr_1 ) stmt_1;
else if (expr == const_expr_2) stmt_2
Else if (expr == const_expr_n) stmt_n;
else stmt_n+1;
Phải kết với hợp với lệnh nhảy (goto)
Code rất nghèo nàng
27
Lệnh lặp
Lệnh lặp là để thực hiện một số lần lệnh đơn hay
lệnh hợp thành
Các yếu tố trong lệnh lặp
Làm thể nào để kiểm sốt lặp?
Kiểm sốt lặp xuất hiện ở đâu trong vịng lặp?
28
Lệnh lặp với bộ đếm
Lệnh cĩ 1 biến đếm, giá trị của biến này từ giá trị
bắt đầu (initial) đến giá trị kết thúc (terminal) và
giá trị của bước nhảy (stepsize)
Các yếu tố trong lệnh lặp :
Biến lặp cĩ kiểu gì và phạm vi nào?
Giá trị của biến lặp khi vịng lặp kết thúc là bao nhiêu?
Giá trị của biến lặp cĩ được thay đổi trong thân vịng
lặp khơng? Nếu cĩ thì cĩ ảnh hưởng đến vịng lặp
khơng?
29
VD - lệnh lặp với bộ đếm
Cú pháp của Fortran 90
do bien_lap = trị_bat_dau, trị_ket_thuc [, buoc_nhay]
Trị của bước nhảy là bất kỳ (trừ 0), mặc định 1
trị_bat_dau, trị_ket_thuc cĩ thể là biểu thức
Kiểu của biến lặp phải là kiểu số nguyên
Biến lặp khơng được thay đổi trong thân vịng lặp
Fortran 95
do bien_lap = trị_bat_dau, trị_ket_thuc [, buoc_nhay]
end do
30
VD - lệnh lặp với bộ đếm (tt)
Cú pháp lệnh for của Pascal
for bien_lap := bat_dau (to|downto)
ket_thuc do
bien_lap cĩ kiểu số nguyên
Sau khi kết thúc vịng lặp, giá trị của bien_lap là khơng
xác định
Giá trị của bien_lap khơng thể thay đổi trong thân vịng
lập;
bat_dau, ket_thuc cĩ thể là biểu thức, nhưng các tham
số cĩ thể thay đổi trong vịng lặp và khơng ảnh hưởng
đến vịng lặp
31
VD - lệnh lặp với bộ đếm (tt)
Cú pháp lệnh for trong Ada
for bien_lap in [reverse] day_roi_rac loop
end loop
day_roi_rac : miền con số nguyên, 1..10, hoặc kiểu
liệt kê monday..friday
Phạm vi của biến cĩ bao gồm vịng lặp
Giá trị của biến lặp là khơng xác đinh sau khi vịng lặp
kết thúc
32
VD - lệnh lặp với bộ đếm (tt)
Cú pháp của for trong C
for ([expr_1] ; [expr_2] ; [expr_3])
statement
Mọi thứ cĩ thể thay đổi trong thân vịng lặp
Biểu thức expr_1 được định lượng 1 lần (trước khi thực
hiện vịng lặp), expr_2 và expr_3 được định lượng ở
mọi lần lặp
C++ vs C
C++ : cho phép khai báo kiểu trong expr_1
For(int count =0; count<len; count++) {}
33
Lệnh lặp cĩ điều kiện
Lệnh lặp chỉ được thực hiện khi điều kiện đúng
Các yếu tố trong lệnh lặp cĩ điều kiện
Kiểm tra điều kiện trước hay sau
Cĩ phải lệnh lặp cĩ điều kiện là trường hợp đặc biệt
của lệnh lặp với bộ đếm
Cú pháp
While (ctrl_expr) do
loop body loop body
while (ctrl_expr)
34
Lệnh lặp cĩ điều kiện (tt)
Pascal phân chia rõ ràng kiểm tra điều kiện trước
và sau : while-do và repeat-until
C và C++ dùng cả (while-do and do-while);
kiểm tra trước là lặp nếu điều kiện đúng nhưng
kiểm tra điều kiện sau là lặp đến khi điều kiện sai
Cũng giống như C, nhưng biểu thức điều kiện của
Java cĩ kiểu boolean
Ada chỉ cĩ lặp kiểm tra trước
35
Rẽ nhánh khơng điều kiện
Lệnh rẽ nhánh khơng điều kiền được đưa ra 1960s
Cho phép thay đổi thứ tự thực hiện chương trình
Cơ chế phổ biến nhất là lệnh: goto
Một số NNLT khơng hỗ trợ lệnh goto
C# cung cấp lệnh goto, cĩ thể dùng trong switch-
case
Lệnh goto làm cho CT trở nên khĩ đọc và khĩ
bảo trì
36
Luồng điều khiển khơng từng tự
(Nonlocal control flow)
Cho phép thốt khỏi luồng điều khiển thơng thường
Ứng dụng
Thốt sớm trong các cấu trúc lặp
Trả về (return) sớm trong các hàm
Bắt các ngoại lệ
VD
Continue & break
Return
Try/catch
37
Lệnh continue & break
Lệnh continue sẽ kết thúc vịng lặp hiện hành và
chuyển đến vịng lặp tiếp theo
Khi gặp lệnh này, các câu lệnh cịn lại trong thân
của vịng lặp sẽ được bỏ qua
VD
38
Lệnh continue & break (tt)
Lệnh break để thốt khỏi các cấu trúc lặp hoặc switch
39
Lệnh return
40
Lệnh continue và break (Java)
block1:
while (XXX) {
...
while (XXX) {
...
if (XXX) break block1;
}
}
loop1:
while (XXX) {
...
while (XXX) {
...
if (XXX) continue loop1;
}
}
41
Try/catch
Cú pháp
try{
// đoạn mã cĩ khả năng gây ra ngoại lệ
}
catch(Exception e1){
// Nếu các lệnh trong khối ‘try’ tạo ra ngoại lệ cĩ loại e1
}
catch(Exception eN){
}
Finally {
// khối lệnh nay luơn được thực hiện cho dù ngoại lệ cĩ xảy ra hay
khơng
}
42
Try/catch
VD
try {
x = f(x,y);
}
catch (ArithmeticException) {
System.out.println(”An arithmetic error
occurred!”);
System.exit(0);
}
Nếu hàm f(x,y) khơng cĩ lỗi, tiến trình vẫn tiếp tục
Nếu hàm f(x,y) lỗi, ArithmeticException được
chuyển tới JVM
File đính kèm:
bai_giang_nguyen_ly_ngon_ngu_lap_trinh_chuong_3_cau_truc_die.pdf



