Câu lệnh
if cho phép ta lựa chọn thực hiện một hành động nào đó hay không. Câu lệnh
if – else cho phép ta lựa chọn thực hiện giữa hai hành động. C cho phép
ta có thể đưa ra nhiều lựa chọn hơn. Chúng ta mở rộng cấu trúc if – else
bằng cách thêm vào cấu trúc else – if để thực hiện điều đó. Nghĩa là mệnh
đề else trong một câu lệnh if – else lại chứa một câu lệnh if
– else khác. Do đó nhiều điều kiện hơn được kiểm tra và tạo ra nhiều lựa chọn
hơn.
Cú pháp
tổng quát trong trường hợp này như sau:
if (biểu
thức) câu_lệnh;
else
if (biểu thức) câu_lệnh;
……
else câu_lệnh;
Cấu
trúc này gọi là if–else–if ladder hay if-else-if staircase.
Cách canh lề (lùi
vào trong) như trên giúp ta nhìn chương trình một cách dễ dàng khi có một hoặc
hai lệnh if. Tuy nhiên khi có nhiều lệnh if hơn cách viết đó dễ gây ra nhầm lẫn
vì nhiều câu lệnh sẽ phải lùi vào quá sâu. Vì vậy, lệnh if-else-if thường được
canh lề theo dạng:
if (biểu thức)
câu_lệnh;
else if (biểu thức)
câu_lệnh;
else if (biểu thức)
câu_lệnh;
……….
else
câu_lệnh;
Các điều kiện được kiểm tra từ trên xuống dưới. Khi
có một điều kiện nào đó là true, các câu lệnh gắn với nó sẽ được thực hiện và
các lệnh còn lại sẽ được bỏ qua. Nếu không có điều kiện nào là true, các câu lệnh
gắn với else cuối cùng sẽ được thực hiện. Nếu mệnh đề else đó không tồn tại, sẽ
không có lệnh nào được thực hiện do tất cả các điều kiện đều false.
Ví dụ dưới đây nhận một số từ người dùng. Nếu số đó
có giá trị từ 1 đến 3, chương trình sẽ in ra số đó, ngược lại chương trình in
ra thông báo “Invalid choice”.
Ví dụ:
#include
<stdio.h>
int main()
{
int x;
x = 0;
clrscr();
printf(“Enter Choice (1 - 3): “);
scanf(“%d”, &x);
if (x == 1)
printf(“\nChoice is 1”);
else if ( x == 2)
printf(“\nChoice is 2”);
else if ( x == 3)
printf(“\nChoice is 3”);
else
printf(“\nInvalid Choice: Invalid
Choice”);
}
Trong
chương trình trên,
Nếu x =
1, hiển thị dòng chữ “Choice is 1”.
Nếu x =
2, hiển thị dòng chữ “Choice is 2”.
Nếu x =
3, hiển thị dòng chữ “Choice is 3” được hiển thị.
Nếu x
là bất kỳ một số nào khác 1, 2, hoặc 3, “Invalid Choice” được hiển thị.
Nếu chúng ta muốn thực hiện nhiều hơn một lệnh sau mỗi
câu lệnh if hay else, ta phải đặt các câu lệnh đó vào trong cặp dấu ngoặc nhọn
{}. Các câu lệnh đó tạo thành một nhóm gọi là lệnh phức hay một khối lệnh.
if
(result >= 45) {
printf("Passed\n");
printf("Congratulations\n");
} else {
printf("Failed\n");
printf("Good luck next time\n");
}
Các
cấu trúc if lồng nhau
Một cấu trúc if lồng nhau là một lệnh if được đặt
bên trong một lệnh if hoặc else khác. Trong C, lệnh else luôn gắn với lệnh if không
có else gần nó nhất, và nằm trong cùng một khối lệnh với nó. Ví dụ:
if (biểu thức–1)
{
if (biểu thức–2)
câu_lệnh1;
if (biểu thức–3)
câu_lệnh2;
else
câu_lệnh3; /* với if (biểu thức–3) */
}
else
câu_lệnh4; /* với if (biểu thức–1) */
Trong đoạn lệnh minh họa ở trên, nếu giá trị của biểu
thức-1 là true thì lệnh if thứ hai sẽ được kiểm tra. Nếu biểu thức-2 là true
thì lệnh câu_lệnh1 sẽ được thực hiện. Nếu biểu thứu-3 là true, câu_lệnh2 sẽ được
thực hiện nếu không câu_lệnh3 được thực hiện. Nếu biểu thức-1 là false thì
câu_lệnh4 được thực hiện.
Vì lệnh else trong cấu trúc else-if là không bắt buộc,
nên có thể có một cấu trúc khác như dạng dưới đây:
if (điều kiện-1)
if (điều kiện-2)
câu_lệnh1;
else
câu_lệnh2;
câu lệnh kế tiếp;
Trong đoạn mã trên, nếu điều kiện-1 là true, chương
trình sẽ chuyển đến thực hiện lệnh if thứ hai và điều kiện-2 được kiểm tra. Nếu
điều kiện đó là true, câu_lệnh1 được thực hiện, nếu không câu_lệnh2 được thực
hiện, sau đó chương trình thực hiện những lệnh trong câu lệnh kế tiếp. Nếu điều
kiện-1 là false, chương trình sẽ chuyển đến thực hiện những lệnh trong câu lệnh
kế tiếp.
Ví dụ, marks1 và marks2 là điểm hai môn học của một
sinh viên. Điểm marks2 sẽ được cộng thêm 5 điểm nếu nó nhỏ hơn 50 và marks1 lớn
hơn 50. Nếu marks2 lớn hơn hoặc bằng 50 thì sinh viên đạt loại ‘A’. Điều này có
thể được biểu diễn bởi đoạn if có cấu trúc như sau:
if (marks1 > 50 && marks2
< 50)
marks2 = marks2 + 5;
if (marks2 >= 50)
grade = ‘A’;
Một số
người đưa ra đoạn code như sau:
if (marks1 > 50)
if (marks2 < 50)
marks2 = marks2 + 5;
else
grade = ‘A’;
Trong
đoạn lệnh này, ‘A’ được gán cho biến grace chỉ khi marks1 lớn hơn 50 và marks2
lớn hơn hoặc bằng 50. Nhưng theo như yêu cầu của bài toán, bíến grace được gán
giá trị ‘A’ sau khi thưc hiện việc kiểm tra để cộng điểm và kiểm tra giá trị của
marks2. Hơn nữa, giá trị của biến grace không phụ thuộc vào marks1.
Ví dụ:
#include
<stdio.h>
void
main() {
int x, y;
x = y = 0;
clrscr();
printf(“Enter Choice (1 - 3): ” );
scanf(“%d”, &x);
if(x == 1) {
printf(“\nEnter value for y
(1 - 5): ”);
scanf (“%d”, &y);
if (y <= 5)
printf(“\nThe value
for y is: %d”, y);
else
printf(“\nThe value
of y exceeds 5”);
} else
printf (“\nChoice entered was
not 1”);
}
Trong
chương trình trên, nếu giá trị của x được nhập là 1, người dùng được yêu
cầu nhập tiếp giá trị của y. Ngược lại, dòng chữ “Choice entered was
not 1” được hiển thị. Lệnh if đầu tiên có lồng một if trong đó để hiển thị giá trị của y nếu
người dùng nhập vào một giá trị nhỏ hơn 5 cho y, hoặc ngược lại sẽ hiển thị
dòng chữ “The value of y exceeds 5”.
Ví dụ: Minh hoa if lồng nhau
Một
công ty sản xuất 3 loại sản phẩm có tên gọi: văn phòng phẩm cho máy tính
(computer stationery), đĩa cứng (fixed disks) và máy tính (computer).
Sản
phẩm Mã
Computer
Stationery 1
Fixed
Disks 2
Computers 3
Công ty
có chính sách giảm giá như sau:
Sản
phẩm Giá
trị đặt hàng Tỷ
lệ giảm giá
Computer
Stationery $500/- hoặc
hơn 12%
Computer
Stationery $300/- hoặc hơn 8%
Computer
Stationery dưới $300/- 2%
Fixed
Disks $2000/-
hoặc hơn 10%
Fixed
Disks $1500/-
hoặc hơn 5%
Computers $5000/- hoặc
hơn 10%
Computer $2500/- hoặc hơn 5%
Dưới
đây là chương trình tính giảm giá.
#include
<stdio.h>
void
main() {
int productcode;
float orderamount, rate = 0.0;
printf(“\nPlease enter the product
code: ” );
scanf(“%d”, &productcode);
printf(“Please enter the order amount:
”);
scanf(“%f”, &orderamount);
if (productcode == 1) {
if (orderamount >= 500) rate = 0.12;
else if
(orderamount >= 300) rate = 0.08;
else rate = 0.02;
} else if (productcode == 2) {
if (orderamount >= 2000) rate
= 0.10;
else if
(orderamount >= 1500) rate = 0.05;
} else if (productcode == 3) {
if (orderamount >= 5000) rate
= 0.10;
else if
(orderamount >= 2500) rate = 0.05;
}
orderamount -= orderamount * rate;
printf( “The net order amount is % .2f
\n”, orderamount);
}
Kết
quả của chương trình được minh hoạ như sau:
Please enter the product code: 3
Please enter the order amount: 6000
The net order amount is 5400
Ở trên,
else sau cùng trong chuỗi các else-if không cần kiểm tra bất kỳ
điều kiện nào. Ví dụ, nếu mã sản phẩm được nhập vào là 1 và giá trị đặt hàng nhỏ
hơn $300, thì không cần phải kiểm tra điều kiện, vì tất cả các khả năng đã được
kiểm soát.
Kết quả
thực thi chương trình với mã sản phẩm là 3 và giá trị đặt hàng là $6000 được
trình bày ở trên.
Sửa đổi
chương trình trên để chú ý đến trường hợp dữ liệu nhập là một mã sản phẩm không
hợp lệ. Điều này có thể dễ dàng đạt được bằng cách thêm một lệnh else
vào chuỗi lệnh if dùng kiểm tra mã sản phẩm. Nếu gặp một mã sản phẩm
không hợp lệ, chương trình phải kết thúc mà không cần tính giá trị thực của đơn
đặt hàng.
Đăng nhận xét