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...

pdf42 trang | Chia sẻ: havih72 | Lượt xem: 243 | Lượt tải: 0download
Nội dung tài liệu 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ải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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:

  • pdfbai_giang_nguyen_ly_ngon_ngu_lap_trinh_chuong_3_cau_truc_die.pdf