Ch−ơng 2 Các câu lệnh cơ bản của Fortran
2.4 Rẽ nhánh với cấu trúc SELECT CASE
Một trong những ph−ơng pháp hữu hiệu để chuyển điều khiển trong ch−ơng trình là sử dụng cấu trúc rẽ nhánh SELECT CASE. Dạng tổng quát của cấu trúc này nh− sau.
57 CASE (Chon1) Các_câu_lệnh_1 CASE (Chon2) Các_câu_lệnh_2 ... CASE DEFAULT Các_câu_lệnh_n END SELECT
Trong đó BThuc_Chon, Chon1, Chon2,… phải có cùng kiểu dữ liệu số nguyên, lôgic hoặc CHARACTER*1. BThuc_Chon là biểu thức đ−ợc tính tốn, nó cịn đ−ợc gọi là chỉ
số chọn. Chon1, Chon2,… là các giá trị hoặc khoảng giá trị có thể có của BThuc_Chon.
Nếu có nhiều giá trị rời rạc, chúng phải đ−ợc liệt kê cách nhau bởi các dấu phẩy; nếu là khoảng giá trị liên tiếp, chúng phải đ−ợc biểu diễn bởi hai giá trị đầu và cuối khoảng, phân cách nhau bằng dấu hai chấm (:). Các_câu_lệnh_1, Các_câu_lệnh_2,… là tập các câu lệnh thực hiện. Nếu biểu diễn sơ đồ khối cấu trúc này nó sẽ gần giống với hình 2.4, trong đó các BThuc_Logic_1,… đ−ợc thay bởi mệnh đề nếu BThuc_Chon thuộc tập
Chon1,…
Tác động của cấu trúc này có thể mơ tả nh− sau.
Bắt đầu: Xác định giá trị của (Bieu_Thuc_Chon)
Nếu giá trị của Bieu_Thuc_Chon thuộc tập (Chon1) thì Thực hiện Các_câu_lệnh_1
Nếu giá trị của Bieu_Thuc_Chon thuộc tập (Chon2) thì Thực hiện Các_câu_lệnh_2
...
Nếu Bieu_Thuc_Chon nhận các giá trị khác thì Thực hiện Các_câu_lệnh_n
Kết thúc
Ví dụ 2.11. Viết ch−ơng trình xem số ngày của một tháng nào đó trong năm.
INTEGER Month, Year
Print'(A\)',' Xem so ngay cua thang nao?' Read*, Month
SELECT CASE (Month)
CASE (1,3,5,7,8,10,12) ! Các tháng có 31 ngày Print*,' Thang ', Month,' co 31 ngay' CASE (4,6,9,11) ! Các tháng có 30 ngày
Print*,' Thang ', Month,' co 30 ngay' CASE (2) ! Có 28 hoặc 29 ngày
Print'(A\)',' Nam nao?'
Read*, Year
IF (Mod(Year,4).EQ.0.AND. & & Mod(Year,100).NE.0.OR. &
& Mod(Year,400).EQ.0) then ! Năm nhuận Print*,' Thang ', Month,' Nam ',& Year, ' co 29 ngay'
Else ! Năm bình th−ờng
Print*,' Thang ', Month,' Nam ',& Year, ' co 28 ngay'
End IF CASE DEFAULT
Print*,' Khong co thang ', Month END SELECT
END
Trong ví dụ 2.11, giá trị của Bieu_Thuc_Chon đ−ợc xác định bởi lệnh READ*,
Month, tức Month là Bieu_Thuc_Chon. Vì Chon1, Chon2 nhận các tập giá trị rời rạc (các tháng không liên tục) nên chúng đ−ợc liệt kê cách nhau bởi các dấu phẩy.
Ví dụ 2.12. Gõ một ký tự và cho biết đó là chữ cái hay chữ số.
CHARACTER*1 char
Print*,' Hay go mot ky tu:' Read*, Char
SELECT CASE (char)
CASE ('0':'9')
WRITE (*, *) "Day la chu so ", Char CASE ('A':'Z','a':'z')
WRITE (*, *) "Day la chu cai ",Char CASE DEFAULT
WRITE (*, *) "Day khong phai chu so, & &cung khong phai chu cai." WRITE (*, *) "Day la ky tu ", Char END SELECT
END
ở đây, tập các giá trị của Chon1, Chon2 là những dãy giá trị liên tục trong các khoảng nên chúng đ−ợc liệt kê bằng cách nối các giá trị đầu khoảng và cuối khoảng bởi dấu hai chấm (:).