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