Dec
19
2010

Bài 6 – Câu lệnh điều kiện

(Bài học lên mạng ngày 19/12/2010) Câu tuyên bố “Nếu cho tôi một điểm tựa, tôi sẽ nhấc bổng trái đất lên!” của nhà khoa học Ác-xi-mét là một câu điều kiện, và nó có thể biểu diễn được trong PHP bằng lệnh IF.Cấu trúc của câu lệnh IF trong PHP có thể viết như sau:

IF(biểu-thức-điều-kiện)
{
câu-lệnh-1;
}
ELSE
{
câu-lệnh-2;
}

Nếu biểu-thức-điều-kiện (BTDK) có một giá trị khác rỗng thì câu-lệnh-1 được thực thi. Nếu BTDK trả về một giá trị rỗng thì câu-lệnh-2 được thực thi.

Giá trị rỗng có thể hiểu nôm na là những giá trị mà bản thân nó… vô giá trị! Ví dụ như 0 (số 0), false (giá trị sai trong kiểu dữ liệu logic đúng/sai, true/false), null (không có giá trị), ” (chuỗi rỗng).

diem_tua

Ví dụ diem_tua.php

Các bạn chú ý những chỗ tôi tô màu.

  • Dòng 4: Hàm trim(…) giúp các bạn cắt đi những khoảng trắng dư ra ở kết quả nhập liệu vào từ bàn phím. Đây là kiến thức đã nhắc tới trong các bài học cũ.
  • Dòng 6: Dấu || là ký hiệu thay thế cho toán tử OR, được hiểu là “hoặc”. Toàn bộ câu lệnh ở dòng 6 có thể diễn dịch ra thành “Nếu biến $co1diemtua mang giá trị C (c lớn, viết hoa) hoặc mang giá c (c nhỏ, viết thường) thì thực thi lệnh dưới đây”. Mục đích của việc này là để “vét” các trường hợp người dùng khi nhập liệu có thể viết chữ hoa hoặc chữ thường. Do toán tử logic OR ( || ) có thứ tự ưu tiên cao hơn khi tính toán nên tôi phải đưa $co1diemtua == ‘c’ và $co1diemtua == ‘C’ vào trong ngoặc đơn để tăng giá trị ưu tiên cho nó.
  • Trong ví dụ kết quả khi chạy chương trình, tôi thử nhập vào 4 giá trị khác nhau là k/K/c và C thì đều ra kết quả “như mong muốn”.
Bài 6.1: Chương trình diem_tua.php sẽ có kết quả thế nào nếu ta nhập vào chữ “Co the” khi được hỏi? Hãy giải thích tại sao.

Bài 6.2: Không dùng lệnh trim hay bất cứ lệnh nào khác (như ltrim, rtrim, chop, substr… v.v…) để cắt khoảng trắng sau khi nhập liệu. Với chuỗi thô nhập vào từ bàn phím, hãy sửa lại biểu thức điều kiện để nó vẫn cho ra kết quả đúng.

Bài 6.3: Hãy sửa lại biểu thức điều kiện để chương trình in ra dòng chữ “Ong Ac-xi-met KHONG THE nhac bong duoc trai dat len.” khi và chi khi người dùng nhập vào ký tự k hoặc K. Ngược lại, in ra màn hình dòng chữ “Ong Ac-xi-met se nhac bong duoc trai dat len!”.

Một ví dụ đơn giản hơn, là tìm số lớn hơn trong 2 số:

tim_so_lon_hon

Ví dụ tim_so_lon_hon.php

Bài 6.4 (*): Sửa lại ví dụ tìm số lớn hơn thành chương trình hoàn chỉnh cho phép người dùng nhập liệu từ bàn phím. Hãy đảm bảo dữ liệu nhập vào PHẢI LÀ 2 số nguyên dương lớn hơn 0. Nếu người dùng nhập sai, hãy nói cho họ biết họ đã nhập sai và kết thúc chương trình. Ngược lại, so sánh 2 số và đưa ra kết quả. Hãy chạy thử chương trình với nhiều giá trị nhập liệu khác nhau.

Điều gì sẽ xảy ra nếu ta sửa lại ví dụ trên với dữ liệu $a = 3 và $b = 3? Tất nhiên chương trình sẽ sai về mặt logic khi in ra màn hình dòng chữ “3 là so lon hon”. Lẽ ra nó phải thông báo 2 số này có giá trị bằng nhau mới đúng.

Ta sửa lại chương trình như sau:

tim_so_lon_hon_2

Ví dụ tim_so_lon_hon_2.php

Để các bạn dễ hình dung, tôi tô màu và gom nhóm lại như sau:

  • Khối màu vàng là biểu thức điều kiện của câu lệnh IF thứ nhất (BTĐK 1)
  • Khối màu xanh lá cây là câu lệnh 1 (nếu BTĐK 1 đúng)
  • Khối màu xanh da trời là câu lệnh 2 (nếu BTĐK 1 sai)
  • Bản thân câu lệnh 2 này lại là một câu lệnh IF với:
  • Khung màu đỏ là biểu thức điều kiện của câu lệnh IF thứ hai (BTĐK 2)
  • Khung màu đen là câu lệnh 1 (nếu BTĐK 2 đúng)
  • Khung màu trắng là câu lệnh 2 (nếu BTĐK 2 sai)

Đây được gọi là các câu lệnh IF lồng nhau. Và cấp độ lồng nhau của các câu lệnh trong PHP (If, switch, for, do…) là không giới hạn. Khi viết code, các bạn có thể dùng dấu tag để đẩy cách dòng các dấu ngoặc nhọn mở và đóng ra cùng một vị trí thẳng hàng với nhau để chúng ta dễ đọc code khi chương trình trở nên quá lớn.

Từ bây giờ, phần mềm notepad đã trở nên lỗi thời. Các bạn có thể tải phần mềm Notepad++ về để soạn thảo mã nguồn PHP. Notepad++ là phần mềm khá tốt lại hoàn toàn miễn phí.

image

Ví dụ notepad_plus_plus.php. Notepad++ giúp chúng ta gióng hàng các dấu ngoặc nhọn bằng một gạch thẳng “chấm chấm”, đồng thời khi đưa con nháy vào một dấu ngoặc mở hoặc đóng thì nó cũng làm nổi bật dấu ngoặc tương ứng còn lại.

Có một lỗi mà chúng ta thường mắc phải là trong biểu thức điều kiện khi so sánh một biến với một giá trị nào đó (ví dụ xét xem $co1diemtua có bằng C hay c) là bỏ quên mất một dấu = . Nên nhớ $co1diemtua = ‘C’ sẽ là phép gán (1 dấu =), trong khi $co1diemtua == ‘C’ mới là phép so sánh giá trị giống nhau (2 dấu =).

Vì vậy, nếu thay vì viết

if( $co1diemtua == ‘c’ || $co1diemtua == ‘C’ )

Bạn lại viết thành

if( $co1diemtua = ‘c’ || $co1diemtua = ‘C’ )

thì chương trình không báo lỗi cú pháp, nhưng kết quả chạy sẽ có lỗi về logic. Để tránh việc xảy ra lỗi logic kiểu này, một số lập trình viên cho rằng nên tập thói quen viết hằng lên trước biến trong biểu thức so sánh, như sau:

if( ‘c’ == $co1diemtua || ‘C’ == $co1diemtua )

Ưu điểm của cách làm này là nếu khi chúng ta quên mất một dấu = thì PHP sẽ báo sai cú pháp và khi ấy chúng ta có thể dễ dàng sửa chữa. Tuy nhiên, tôi chỉ đưa ra như một sự chia sẻ để các bạn tham khảo, còn cá nhân tôi thì đã quen với việc viết code “thuận chiều” nên cũng không áp dụng cách này.

Ở bài sau, chúng ta sẽ nghiên cứu tiếp về cấu trúc của câu lệnh điều kiện rút gọn ( … ? … : … ) và câu lệnh điều kiện phức hợp (elseif). Còn bây giờ, các bạn cần làm thật nhiều bài tập để… quen tay!

Bài 6.5: Nhập một số bất kì, hiển thị ra màn hình số đó có phải là số chính phương hay không? Số chính phương là số có giá trị bằng bình phương một số nguyên, ví dụ 0 là chính phương của 0, 4 là CP của 2, 9 là CP của 3…

Bài 6.6: Nhập vào 3 số bất kì, tìm số lớn nhất trong 3 số

Bài 6.7: Nhập vào một số thể hiện điểm tổng kết trung bình học tập của học sinh (có giá trị trong khoảng từ 0 đến 10). Hãy hiển thị xếp loại học tập của em học sinh này theo quy ước: Dưới 3.5 là kém; từ 3.5 đến 5 là trung bình; từ trên 5 đến dưới 8 là khá; từ 8 đến dưới 9 là giỏi; từ 9 trở lên là siêu nhân.

Bài 6.8: Nhập vào một số bất kì, hiển thị số đó là chẵn hay lẻ

Bài 6.9: Nhập vào một số bất kì trong khoảng từ 2 đến 8, và ghi ra nghĩa tiếng Anh của ngày tương ứng trong tuần. Ví dụ số 2 thì ghi ra “Monday”, số 8 thì ghi ra “Sunday”.

Bài 6.10 (*): Nhập vào một số bất kì trong khoảng từ 1 đến 30. Ghi ra màn hình nghĩa tiếng Anh tương ứng của số đếm đó và dùng ít số câu lệnh nhất có thể. Chú ý, các bạn chỉ được dùng những kiến thức đã học + giải pháp do các bạn suy nghĩ để giải quyết vấn đề. Gợi ý: có thể dùng biến biến (Bài 5).

Bạn nào làm tốt nhất các bài tập số 6 này sẽ có quà là một cuốn sách do tôi gửi tặng. Đây là cuốn sách đặc biệt vì có chữ ký của cô Tôn Nữ Thị NinhTiến sĩ Đinh Lê Đạt. Chúc các bạn học tốt, và đừng quên gửi bài tập trước 12h trưa thứ 5, ngày 23/12/2010.

Các ví dụ trong bài: http://hocphponline.com/blog/wp-content/uploads/2010/12/Bai_6.zip

About the Author:

7 Comments + Add Comment

  • Làm bài ngay thôi :)

  • Anh Mèo Mun cho em hỏi bài tập 6.2 và 6.3 mình chỉ tác động (thay đổi) vào biểu thức điều kiện còn mấy cái khác vẫn để nguyên si phải không ạ?

    • Đúng em

  • hix, kho hieu qua anh oi, em moi tham gia

  • Gửi bài 6 thế nào đây các bạn? có thể giử như bài 5,4,3,2,1 được không?

Leave a comment