25/05/2018, 09:20

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: ?

0