Cấu trúc rẽ nhánh trong Pascal


Cau truc re nhanh trong Pascal - Wiki Pascal
Cấu trúc rẽ nhánh trong Pascal - Wiki Pascal

I – Cấu trúc If…Then…Else…

Hai mẫu câu lệnh như sau :

Code :
 IF  THEN  ;

IF  THEN  ELSE  ; 

Theo lệnh này, nếu  nhận giá trị True thì máy sẽ thực hiện , còn nếu không thì hoặc kết thúc ( tức không làm gì cả ) đối với mẫu câu thứ nhất, hoặc máy sẽ đi thực hiện lệnh khác tức làtrong mẫu câu lệnh thứ 2. Như vậy mẫu thứ nhất thực ra là mẫu thứ hai thu gọn với  là rỗng.​


Ví dụ 1: để thực hiện phép chia hai số a, b với điều kiện b < > 0, ta viết :
Code:
 If b < > 0 Then t := a / b

Else Writeln (' Mẫu số bằng 0 ! Không chia được ! ') ;

Ví dụ 2: tìm giá trị min và max của hai số a, b.
Code:
 If a < b Then

Begin

  Max := b ;

  Min := a ;

End

Else

Begin

  Max := a ;

  Min := b ;

End ;

Chú ý : trước Else không bao giờ có dấu chấm phẩy.

Trong ví dụ này, ta thấy luôn vai trò của lệnh hợp thành ( lệnh ghép ). Giả sử ta viết một lệnh như sau :
Code:
If a < b Then

Begin

  Max := b ;

  Min := a ;

End ;

Nghĩa là nếu a < b ta phải thực hiện lần lượt hai lệnh là Max := b và Min := a ( được đặt giữa Begin và End ). Nếu không có Begin và End như sau :
Code:
If a < b Then

  Max := b ;

  Min := a ;

thì ta phải hiểu là lệnh max := b được thực hiện chỉ khi a < b còn lệnh min := a được thực hiện trong mọi trường hợp.

Cũng trong ví dụ này ta thấy cách viết có cấu trúc nhô ra nhô vào để bố trí chương trình Pascal cho đẹp và thể hiện đươcï thuật toán của chương trình. Đây là một tiêu chuẩn cần phải có cho một chương trình viết bằng Pascal. Chữ Begin và End tương ứng bao giờ cũng cùng ở một cột. Tất nhiên ta có thể viết tùy ý như sau nhưng không đẹp:​
Code:
If a < b Then Begin max := b ;

Min := a ;

End Else Begin

Max := a ;

Min := b ;

  End ;

Lưu ý : cách viết lệnh If như sau là hoàn toàn đúng :
Code:
If  Then If  Then  Else  ; 

song rất dễ dẫn đến nhầm lẫn không biết tương ứng với Else của If nào. Vì vậy nên sửa lại cho rõ ràng như sau :
Code:
 If  Then

  Begin

  If < Bieu_thuc_Boolean_2 > Then < viec_1> Else < viec_2 > End ;


II – Cấu trúc Case…Of…


Hai mẫu câu lệnh If ở bài trước chỉ thực hiện rẽ hai nhánh tương ứng với 2 giá trị của biểu thức Boolean. Việc thử và chọn một trong nhiều nhánh sẽ được thực hiện với câu lệnh Case như sau :


Mẫu 1 : 


Code:
Case  Of 

Gia_tri_1 :  ;

Gia_tri_2 :  ;

..................

Gia_tri_n :  ;

End ; 

Mẫu 2 :

Code:
Case  Of  

Gia_tri_1 : < viec_1> ;

Gia_tri_2 : < viec_2> ;

..................

Gia_tri_n : 

Else  ;

End ; 



Trong đó  không còn chỉ là biểu thức Boolean như trong lệnh If …

Nó có thể là có các kiểu vô hướng đếm được (kể cả kiểu liệt kê, kiểu khoảng con sẽ học sau nhưng không được là kiểu Real ) nên nó có thể có nhiều giá trị khác nhau. Mẫu 2 sẽ thực hiện  ( được viết sau từ khóa Else ) nếu như < Bieu_thuc> không rơi vào các giá trị 1, giá trị 2,… giá trị n kể trên.​

Cần chú ý rằng câu lệnh Case bao giờ cũng kết thúc bằng từ khóa End.


Ví dụ 1 : Với I là một biến nguyên


Code:
Case I + 1 Of

  1 : writeln (' So 1 ') ;

  2 : writeln (' So 2 ') ;

  3 : writeln (' So 3 ') ;

  4 : writeln (' So 4 ') ;

End ;



Ví dụ 2 :Tính số ngày của một tháng ;


Code:
 Var so_ngay, thang, nam : integer ;

BEGIN

  Write ('Thang : ') ; readln ( thang) ;

  Write ('Nam : ') ; readln ( nam) ;

  Case thang Of

  4, 6, 9, 11 : so_ngay := 30 ;

  2 : case nam of

  0 : so_ngay := 29 ;

  1, 2, 3 : songay := 28 ;

  end

  Else so_ngay := 31 ;

  End ;

  Writeln (' So ngay cua thang ', thang,' nam ', nam,' la ', so_ngay) ;

  END.


Đến đây các bạn có thể hỏi liệu bài toán Giải phương trình bậc 2 có thể dùng Case cho ba trường hợp của biến Delta không ? Điều này không thể được vì biến Delta thuộc kiểu Real, kiểu không đếm được.

Bài tập:

1. Viết chương trình giải phương trình bậc 2. Đưa nghiệm ra màn hình với 3 số phần thập phân. Gợi ý hàm lấy căn bậc hai là sqrt();.
2. Biết chương trình kiểm tra số nhập vào là số lẻ hay số chẵn.

Nhận xét

Bài đăng phổ biến từ blog này