Các cấu trúc if lồng nhau

Một phần của tài liệu Tài liệu lập trình C căn bản (Trang 66 - 70)

5.2. Các câu lệnh lựa chọn

5.2.4 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ì lệnh else trong cấu trúc if-else là không bắt buộc, nên khi có lệnh else nào đó không được đưa vào trong chuỗi cấu trúc if lồng nhau chương trình sẽ trông không rõ ràng. Một lệnh else luôn được gắn với lệnh if gần nó nhất mà lệnh if này chưa được kết hợp với một lệnh else nào.

Ví dụ :

if (n >0)

if ( a > b) z = a;

else

z = b;

Lệnh else đi với lệnh if bên trong. Việc viết lùi vào trong dòng là một cách thể hiện mối quan hệ đó. Tuy nhiên canh lề không có chức năng gắn else với lệnh if. Cặp dấu ngoặc nhọn {} giúp chúng ta thực hiện chức năng đó một cách chính xác.

if (n > 0)

{ if ( a > b) z = a;

}else

z = b;

Hình bên dưới biểu diễn sự kết hợp giữa ifelse trong một chuỗi các lệnh if lồng nhau.

if (n >0)

if ( a > b) z = a;

else

z = b;

else kết hợp với if gần nhất

if (n > 0) {

if ( a > b) z = a;

}else

z = b;

else kết hợp với if đầu tiên, bởi vì cặp dấu ngoặc nhọn đã đặt lệnh if bên trong.

Theo chuẩn ANSI, có thể lồng nhau đến 15 mức. Tuy nhiên, hầu hết trình biên dịch cho phép nhiều hơn thế.

Một ví dụ về if lồng nhau được cho bên dưới:

Ví dụ 5.7:

#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”.

Chương trình dưới đây đưa ra cách sử dụng của if lồng nhau.

Ví dụ 5.8:

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

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á.

Ví dụ 5.9:

#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.

Một phần của tài liệu Tài liệu lập trình C căn bản (Trang 66 - 70)

Tải bản đầy đủ (DOC)

(197 trang)
w