Cấu trúc lựa chọn
cho phép lựa chọn một trong nhiều trường hợp. Trong C, đó là câu lệnh switch. Cú pháp : switch (< Biểu thức > ) { ...
cho phép lựa chọn một trong nhiều trường hợp. Trong C, đó là câu lệnh switch.
Cú pháp:
switch (< Biểu thức > )
{
case giá trị 1 :
Khối lệnh thực hiện công việc 1;
break;
…
case giá trị n:
Khối lệnh thực hiện công việc n;
break;
[ default :
Khối lệnh thực hiện công việc mặc định;
break; ]
}
Lưu đồ:
Giải thích:
- Tính giá trị của biểu thức trước.
- Nếu giá trị của biểu thức bằng giá trị 1 thì thực hiện công việc 1 rồi thoát.
- Nếu giá trị của biểu thức khác giá trị 1 thì so sánh với giá trị 2, nếu bằng giá trị 2 thì thực hiện công việc 2 rồi thoát.
- Cứ như thế, so sánh tới giá trị n.
- Nếu tất cả các phép so sánh trên đều sai thì thực hiện công việc mặc định của trường hợp default.
Lưu ý:
- Biểu thức trong switch() phải có kết quả là giá trị kiểu số nguyên (int, char, long, …).
- Các giá trị sau case cũng phải là kiểu số nguyên.
- Không bắt buộc phải có default.
Ví dụ 1: Nhập vào một số nguyên, chia số nguyên này cho 2 lấy phần dư. Kiểm tra nếu phần dư bằng 0 thì in ra thông báo “số chẵn”, nếu số dư bằng 1 thì in thông báo “số lẻ”.
#include <stdio.h>
#include<conio.h>
int main ()
{ int songuyen, phandu;
clrscr();
printf(" Nhap vao so nguyen ");
scanf("%d",&songuyen);
phandu=(songuyen % 2);
switch(phandu)
{
case 0: printf("%d la so chan ",songuyen);
break;
case 1: printf("%d la so le ",songuyen);
break;
}
getch();
return 0;
}
Ví dụ 2: Nhập vào 2 số nguyên và 1 phép toán.
- Nếu phép toán là ‘+’, ‘-‘, ‘*’ thì in ra kết qua là tổng, hiệu, tích của 2 số.
- Nếu phép toán là ‘/’ thì kiểm tra xem số thứ 2 có khác không hay không? Nếu khác không thì in ra thương của chúng, ngược lại thì in ra thông báo “khong chia cho 0”.
#include <stdio.h>
#include<conio.h>
int main ()
{ int so1, so2;
float thuong;
char pheptoan;
clrscr();
printf(" Nhap vao 2 so nguyen ");
scanf("%d%d",&so1,&so2);
fflush(stdin);
/*Xóa ký tự enter trong vùng đệm trước khi nhập phép toán */
printf(" Nhap vao phep toan ");
scanf("%c",&pheptoan);
switch(pheptoan)
{
case '+':
printf(" %d + %d =%d",so1, so2, so1+so2);
break;
case '-':
printf(" %d - %d =%d",so1, so2, so1-so2);
break;
case '*':
printf(" %d * %d =%d",so1, so2, so1*so2);
break;
case '/':
if (so2!=0)
{ thuong=float(so1)/float(so2);
printf(" %d / %d =%f", so1, so2, thuong);
}
else printf("Khong chia duoc cho 0");
break;
default :
printf(" Chua ho tro phep toan %c", pheptoan); break;
}
getch();
return 0;
}
Trong ví dụ trên, tại sao phải xóa ký tự trong vùng đệm trước khi nhập phép toán?
Ví dụ 3: Yêu cầu người thực hiện chương trình nhập vào một số nguyên dương là tháng trong năm và in ra số ngày của tháng đó.
- Tháng có 31 ngày: 1, 3, 5, 7, 8, 10, 12
- Tháng có 30 ngày: 4, 6, 9, 10
- Tháng có 28 hoặc 29 ngày : 2
- Nếu nhập vào số <1 hoặc >12 thì in ra câu thông báo “không có tháng này “.
#include <stdio.h>
#include<conio.h>
int main ()
{ int thang;
clrscr();
printf(" Nhap vao thangs trong nam ");
scanf("%d",&thang);
switch(thang)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf(" Thang %d co 31 ngay ",thang);
break;
case 4:
case 6:
case 9:
case 11:
printf(" Thang %d co 30 ngay ",thang);
break;
case 2:
printf (" Thang 2 co 28 hoac 29 ngay");
break;
default :
printf(" Khong co thang %d", thang);
break;
}
getch();
return 0;
}
Trong ví dụ trên, tại sao phải sử dụng case 1:, case 3:, …case 12: ?