Chương 5 CÁC LỆNH ĐIỀU KHIỂN
5.1. Các lệnh lựa chọn
5.1.1. Cấu trúc rẽ nhánh if
Cấu trúc rẽ nhánh là một cấu trúc được dùng rất phổ biến trong các ngôn ngữ lập trình nói chung. Câu lệnh if cho phép lựa chọn một trong hai nhánh tùy thuộc vào giá trị của biểu thức điều kiện là đúng (true) hay sai (false) hoặc khác không hay bằng không. Trong C, có hai dạng: dạng không đầy đủ và dạng đầy đủ.
a. Dạng không đầy đủ Cú pháp:
if (<Biểu thức điều kiện>)
<Công việc>
Lưu đồ cú pháp:
Hình 5-1. Lưu đồ cú pháp câu lệnh if dạng không đầy đủ <Công việc> có thể là 1 câu lệnh hay 1 khối lệnh.
Máy tính thực hiện kiểm tra Biểu thức điều kiện trước. Nếu điều kiện đúng (!= 0) thì thực hiện câu lệnh hoặc khối lệnh liền sau điều kiện. Nếu điều kiện sai thì bỏ qua lệnh hoặc khối lệnh liền sau điều.
Đúng
Sai
Thoát BT điều
Công việc
Thí dụ: Yêu cầu người dùng nhập vào giá trị của 2 số a và b, nếu a lớn hơn b thì in ra thông báo “Gia trị của a lớn hơn giá trị của b”, sau đó hiển thị giá trị cụ thể của 2 số lên màn hình.
#include <stdio.h>
#include<conio.h>
int main () {
int a,b;
printf("Nhap vao gia tri cua 2 so a, b!");
scanf("%d%d",&a,&b);
if (a>b) {
printf("\n Gia tri cua a lon hon gia tri cua b");
printf("\n a=%d, b=%d",a,b);
} getch();
return 0;
} Giải thích:
Nếu người dùng nhập vào giá trị của a lớn hơn giá trị của b thì khối lệnh:
{
printf("\n Gia tri cua a lon hon gia tri cua b");
printf("\n a=%d, b=%d",a,b);
}
sẽ được thực hiện, ngược lại khối lệnh này không được thực hiện.
b. Dạng đầy đủ Cú pháp:
if (<Biểu thức điều kiện>) <Công việc 1>
else
<Công việc 2>
Lưu đồ cú pháp:
Hình 5-2. Lưu đồ cú pháp câu lệnh if dạng đầy đủ
Công việc 1, công việc 2 được thể hiện là 1 câu lệnh hay 1 khối lệnh.
Trước tiên Biểu thức điều kiện được kiểm tra trước. Nếu điều kiện đúng thì thực hiện công việc 1. Nếu điều kiện sai thì thực hiện công việc 2.
Các lệnh phía sau công việc 2 không phụ thuộc vào điều kiện.
Thí dụ: Yêu cầu người thực hiện chương trình nhập vào một số thực a. In ra màn hình kết quả nghịch đảo của a khi a ≠ 0, khi a =0 in ra thông báo “Khong the tim duoc nghich dao cua a”
#include <stdio.h>
#include <conio.h>
int main () {
float a;
printf("Nhap a = "); scanf("%f",&a);
if (a !=0 )
printf("Nghich dao cua %f la %f",a,1/a);
else
printf("Khong the tim duoc nghich dao cua a");
getch();
Đúng
Sai
Thoát BT điều
Công việc 2 Công việc 1
return 0;
} Giải thích:
- Nếu chúng ta nhập vào a ≠ 0 thì câu lệnh printf("Nghich dao cua %f là
%f",a,1/a)được thực hiện, ngược lại câu lệnh printf(“Khong the tim duoc nghich dao cua a”) được thực hiện.
- Lệnh getch() luôn luôn được thực hiện.
c. Một số thí dụ về câu lệnh if
Thí dụ 5.1: Viết chương trình biến đổi một số nguyên dạng thập phân sang dạng nhị phân 8 bít không dấu. Một kỹ thuật được gọi là che bit được sử dụng để nhận biết các bit riêng lẻ bằng cách đặt các bit khac, khác với bit được quan tâm; bằng 0. Kỹ thuất này sử dụng toán tử xử lý bit &, dẫn đến kết quả bằng 0 đối với một bit nếu như một trong những toán hạng bit bằng 0; Nói cách khác, nếu như một trong các toán hạng bit bằng 1 nõ sẽ dấn đến giá trị của bit toán hạng khác. Hình 5.1 là một thí dụ về việc che bit nhỏ thứ 3 (b2). Trong trường hợp này mặt nạ được sử dụng là 0x04; mặt nạ này sau đó được liên kết AND theo từng bit. Chỉ co hai kết quả khả dĩ từ phép tính này: là 0 (nếu b2=0) hoặc 4 (nếu b2=1). Dấu x có nghĩa là không cần quan tâm đến trạng thái, trong đó một bit có thể nhận giá trị nhị phân bất kỳ (nghĩa là 0 hoặc 1).
Chương trình sử dụng lệnh if với các giá trị che bit 0x80 (1000 0000), 0x04 (0100 0000)… để xác định xem bit nào trong 8 bit thấp hơn của số nguyên thập phân được đặt. Lệnh printf() hiển thị từng bit trên một dòng khi ở đó không có kí tự dòng mới (‘\n’) ở cuối mỗi xâu định dạng cho hàm printf(). Bit có giá trị cao nhất được hiển thị trước tiên khi xuất hiện ở phía bên trái màn hình.
#include<stdio.h>
#include<conio.h>
int main(void) {
int i;
clrscr();
printf("Nhap vao mot so he thap phan (0->255): ");
scanf("%d", &i);
if (i>=0 && i<=255){
printf("Dang nhi phan cua so vua nhap:" );
if (i & 0x80) printf("1"); else printf("0");
if (i & 0x40) printf("1"); else printf("0");
if (i & 0x20) printf("1"); else printf("0");
if (i & 0x10) printf("1"); else printf("0");
if (i & 0x08) printf("1"); else printf("0");
if (i & 0x04) printf("1"); else printf("0");
if (i & 0x02) printf("1"); else printf("0");
if (i & 0x01) printf("1"); else printf("0");
} else
printf("so khong hop le");
getch();
return(0);
}
Kết quả:
Nhap vao mot so he thap phan (0->255):255 Dang nhi phan cua so vua nhap:11111111
Thí dụ 5.2. Viết chương trình nhập vào hai số ở hệ hexa rồi thực hiện các phép toán xử lý bít trên hai số đó.
#include<stdio.h>
#define OR 1
#define AND 2
#define EX-OR 3
#define NOR 4
#define NAND 5 int main(void) {
int value1, value2,option;
puts(“Nhap vao hai so he hex: “);
scanf(“%x, %x” value1,value2);
puts(“Nhap vao phep toan can thao tac“);
printf(“1-OR\n2-AND\n3-EXOR\n4-NOR\n5-NAND”);
scanf(“%d”, &option);
if (option= = OR)
printf(“ Ket qua: %x (hex):”,value1 | value2);
else if (option = = AND)
printf(“ Ket qua: %x (hex):”,value1 & value2);
else if (option = = EX-OR)
printf(“ Ket qua: %x (hex):”,value1 ^ value2);
else if (option = = NOR)
printf(“ Ket qua: %x (hex):”,~(value1 | value2));
else if (option = = NAND)
printf(“ Ket qua: %x (hex):”,~(value1 & value2));
return(0);
}