30/09/2018, 22:05

Switch case statements

####Xin chào các bạn học viên đang theo dõi khóa học lập trình trực tuyến ngôn ngữ C++.

Trong bài học này, chúng ta cùng nhau tìm hiểu câu lệnh được xây dựng sẵn trong ngôn ngữ lập trình C++ cũng được đưa vào dạng cấu trúc rẽ nhánh có điều kiện. Đó là câu lệnh được tạo nên bởi từ khóa switchcase, còn gọi là switch case statement.

switch case statement thường được dùng để thay thế cho if statement trong trường hợp số lượng trường hợp cần so sánh quá dài. Mặc dù chúng ta có thể sử dụng kỹ thuật chaining if statement để nối các trường hợp cần kiểm tra lại với nhau, nhưng nó khiến chương trình khó đọc. Ví dụ:

int main()
{
	cout << "1: BLACK
2: BLUE
3: GREEN
4: YELLOW
5: WHITE" << endl;
	cout << "Enter your favorite color: ";
	int color;
	cin >> color;

	if (color == 1)
		cout << "You like BLACK color" << endl;
	else if (color == 2)
		cout << "You like BLUE color" << endl;
	else if (color == 3)
		cout << "You like GREEN color" << endl;
	else if (color == 4)
		cout << "You like YELLOW color" << endl;
	else if (color == 5)
		cout << "You like WHITE color" << endl;
	else
		cout << "Unknown" << endl;

	system("pause");
	return 0;
}

Cũng với ví dụ mẫu này, mình sẽ chuyển nó về cấu trúc switch … case để các bạn có cái nhìn đầu tiên về switch case statement:

int main()	
{
	cout << "1: BLACK
2: BLUE
3: GREEN
4: YELLOW
5: WHITE" << endl;
	cout << "Enter your favorite color: ";
	int color;
	cin >> color;

	switch (color)
	{
		case 1:
			cout << "You like BLACK color" << endl;
			break;
		case 2:
			cout << "You like BLUE color" << endl;
			break;
		case 3:
			cout << "You like GREEN color" << endl;
			break;
		case 4:
			cout << "You like YELLOW color" << endl;
			break;
		case 5:
			cout << "You like WHITE color" << endl;
			break;
		default:
			cout << "Unknown" << endl;
			break;
	}

	system("pause");
	return 0;
}

Các bạn có thể hiểu cấu trúc rẽ nhánh với switch case statement như sau: switch nhận vào 1 biến hoặc 1 biểu thức có giá trị kiểu số nguyên, mỗi nhãn case sẽ gắn kèm với 1 số nguyên cụ thể và chúng sẽ được lần lượt so sánh bằng (equality) với giá trị của biến (hoặc biểu thức) trong switch. Nếu nhãn case nào có giá trị tương xứng với biến hoặc biểu thức trong switch, những câu lệnh đứng sau nhãn đó sẽ được thực thi. Nếu không có nhãn nào có giá trị tương xứng, các câu lệnh đứng sau nhãn default sẽ được thực thi.

Như vậy, chúng ta có thể đưa ra khuôn dạng của switch case statement như sau:

switch ( <variable> ) 
{
case this-value:
	//Code to execute if <variable> == this-value
	break;
case that-value:
	Code to execute if <variable> == that-value
	break;
//.......................
default:
	//Code to execute if <variable> does not equal the value following any of the cases
	break;
}
  • switch statement được bắt đầu bởi từ khóa switch, theo sau đó là một giá trị số nguyên (thường là một biến đơn), có thể là một biểu thức (ví dụ 3 * 2 + 5). Một hạn chế của switch statement là biểu thức điều kiện chỉ có thể thuộc 1 trong số các kiểu số nguyên (char, short, int, long, int32_t, enum, …).

  • case label được định nghĩa thông qua từ khóa case, theo sau từ khóa case là một hằng số, một giá trị cụ thể. Lưu ý: Các nhãn case khác nhau phải được theo sau bởi các giá trị khác nhau. Ví dụ:

      switch (x)
      {
      	case 1:
      	case 1: //illegal
      }
    
  • default label được định nghĩa thông qua từ khóa default. Những câu lệnh đứng sau nhãn này chỉ được thực thi nếu không có nhãn case nào có giá trị tương ứng với biểu thức điều kiện của switch. Lưu ý: cấu trúc switch … case có thể không cần sử dụng nhãn default.

  • break là một từ khóa trong ngôn ngữ C/C++, khi sử dụng trong switch case statement sẽ khiến chương trình thoát ra khỏi khối lệnh của cấu trúc switch. Chúng ta cần đặt từ khóa break tại cuối các câu lệnh của mỗi nhãn case để ngăn cách các case riêng biệt. Chúng ta cùng nhìn vào ví dụ sau khi không sử dụng từ khóa break thì điều gì sẽ xảy ra:

      switch (2)
      {
         case 1: // Does not match
             std::cout << 1 << '
    '; // skipped
         case 2: // Match!
             std::cout << 2 << '
    '; // Execution begins here
         case 3:
             std::cout << 3 << '
    '; // This is also executed
         case 4:
             std::cout << 4 << '
    '; // This is also executed
         default:
             std::cout << 5 << '
    '; // This is also executed
      }
    

    Với ví dụ này, kết quả in ra sẽ là:

      2
      3
      4
      5
    

    Đây là kết quả ngoài ý muốn, trường hợp này được gọi là fall-through. Để khắc phục trường hợp này, chúng ta cần sử dụng thêm từ khóa break đặt tại cuối mỗi nhãn case:

      switch (2)
      {
         case 1: // Does not match
             std::cout << 1 << '
    '; // skipped
      	   break;
         case 2: // Match!
             std::cout << 2 << '
    '; // Execution begins here
         	   break;
         case 3:
             std::cout << 3 << '
    '; // This is also executed
      	   break;
         case 4:
             std::cout << 4 << '
    '; // This is also executed
      	   break;
         default:
             std::cout << 5 << '
    '; // This is also executed
      }
    

#####Khai báo và khởi tạo biến trong case statement

Chúng ta có thể khai báo biến bên trong mỗi case statement, nhưng chúng ta không thể khởi tạo giá trị cho chúng.

switch (x)
{
    case 1:
        int y; // declaration is allowed
        y = 4; // this is an assignment
        break;
 
    case 2:
        y = 5; // y was declared above, so we can use it here too
        break;
 
    case 3:
        int z = 4; // illegal, you can't initialize new variables in the case statements
        break;
 
    default:
        std::cout << "default case" << std::endl;
        break;
}

Nhưng chúng ta nên tránh khai báo biến bên trong case statement, nó sẽ khiến chương trình chúng ta khó đọc hơn. Chúng ta có nhiều giải pháp thay thế dễ hiểu hơn, nếu có dịp mình sẽ hướng dẫn cho các bạn.


###Tổng kết

Vậy là chúng ta đã làm quen thêm một dạng cấu trúc rẽ nhánh có điều kiện khác. If statement được sử dụng khi muốn kiểm tra tính đúng sai của một hoặc một số mệnh đề. Switch case statement được sử dụng khi muốn kiểm tra một giá trị số nguyên. Đối với trường hợp số lượng biểu thức điều kiện cần so sánh là quá nhiều, chúng ta ưu tiên sử dụng switch case statement hơn vì cú pháp rõ ràng hơn.

Chúng ta có thể biểu diễn cấu trúc của switch case statement dưới dạng sơ đồ khối như sau:

###Bài tập cơ bản

Viết chương trình nhập vào tháng, in ra tháng đó có bao nhiêu ngày.

Gợi ý: Nhập vào tháng

  • Nếu là tháng 1, 3, 5, 7, 8, 10, 12 thì có 31 ngày.
  • Nếu là tháng 4, 6, 9, 11 thì có 30 ngày.
  • Nếu là tháng 2 thì có 28 ngày (vì chúng ta chưa xét đến năm).

Lợi dụng trường hợp fall-through để tổ chức chương trình ngắn gọn hơn.


P/s: Hẹn gặp lại các bạn trong bài học tiếp theo trong khóa học lập trình C++ hướng thực hành.

Mọi ý kiến đóng góp hoặc thắc mắc có thể đặt câu hỏi trực tiếp tại diễn đàn

www.daynhauhoc.com


Link Videos khóa học

Udemy

C++ Cơ bản dành cho người mới học lập trình | Udemy

Bắt đầu học lâp trình bằng ngôn ngữ C++

Doanh Văn Lương viết 00:18 ngày 01/10/2018

cái phần bài tập cơ bản sai tháng rồi bạn ơi
1, 3, 5, 7, 8, 10, 12 có 31 ngày chứ
4, 6, 9, 11 có 30 ngày

... viết 00:15 ngày 01/10/2018

mình có vấn đề với xác định thứ, ngày, tháng

Einstein Albert viết 00:18 ngày 01/10/2018

Sao em phải bôi đen mới thấy code nhỉ ??

Einstein Albert viết 00:06 ngày 01/10/2018

Lợi dụng trường hợp fall-through để tổ chức chương trình ngắn gọn hơn.

Lợi dụng kiểu gì hả anh ? Em tưởng đấy là lỗi nên tránh khi lập trình chứ ??

Nguyễn Tấn Khoa viết 00:07 ngày 01/10/2018

Đại loại là như thế này :

switch (x)
{
     case 4:
     case 6:
     case 9:
     case 11:
          std::cout << "Co 30 ngay" << std::endl;
}
Thược Nguyễn viết 00:14 ngày 01/10/2018

cout << "Co 30 ngay " << endl; đang C++ mà

Nguyễn Tấn Khoa viết 00:13 ngày 01/10/2018

Cảm ơn bạn đã nhắc nhở, mình quên mất

Thu Nguyen viết 00:09 ngày 01/10/2018

Giải bài tập :

#include <iostream>
using namespace std;

int main()
{
    int thang;
    cout << "Nhap vao thang: "; cin >> thang;
    switch (thang)
     {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                    cout << "Thang co 31 ngay" << endl;
                    break;
            case 2: 
                    cout << "Thang co 28 ngay" << endl;
                    break;
           case 4:
           case 6:
           case 9:
           case 11:
                   cout << "thang co 30 ngay" << endl;
                   break;
          default:
                 cout << "Ban khong nhap dung roi" << endl;
                 break;

}
system(“pause”);
return 0;
}

P/s : Nhờ @nguyenchiemminhvu chấm bài giúp a. Có sai sót thì chỉ em với a. Tks

lê văn hòa viết 00:18 ngày 01/10/2018

/Viết chương trình nhập vào tháng, in ra tháng đó có bao nhiêu ngày./

#include<iostream>

int main()
{
	int thang;
tieptuc:
	std::cout << "nhap vao thang" << std::endl;
	std::cin >> thang;
	if (thang > 12)
	{
		std::cout << " ban da nhap sai,nhap 1 de tiep tuc va 0 de ket thuc";
		int kt;
		std::cin >> kt;
		if (kt)
			goto tieptuc;
	}
	switch (thang)
	{
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		std::cout << "co 31 ngay" << std::endl;
		break;
	case 2:
		std::cout << "co 28 ngay" << std::endl;
		break;
	case 4:
	case 6:
	case 9:
	case 11:
		std::cout << "co 30 ngay" << std::endl;
		break;
	}
	return 0;
}
Thanh viết 00:12 ngày 01/10/2018

Cho em hỏi thêm là.
Đầu tiên. Trong trường hợp mình không muốn nhập vào tháng theo số mà mình muốn nhận được kết quả dù là viết bằng số và chữ thì nên viết như thế nào.
VD như là nhập Jan hay 1 đều ra kết quả là tháng có 31 ngày ấy.
Thứ hai là em thử nhập số là 12.1 thì vẫn hiện ra là tháng có 31 ngày. Vậy thì có cách nào kiểm tra để loại các cách nhập số thập phân như vậy

HK boy viết 00:16 ngày 01/10/2018

@thanh47:

  • Câu hỏi 1: Biến nhập là string, sau đó switch case trên string
  • Câu hỏi 2: Có phần default trong switch case mà. Kiểu như
switch (s) { //s là string, là biến nhập
    case "Jan": case "January": case "1":
        cout << 31 << endl;
        break;
    case "Apr": case "April": case "4":
        cout << 30 << endl;
        break;
    ...
    default: //các trường hợp khác
        cout << "error\n";
        break;
}

Mà chả ai nhập số thập phân nếu biến nhập của bạn có kiểu int cả. Có chăng dùng biến nhập có kiểu string để loại bớt các trường hợp linh tinh.

... viết 00:19 ngày 01/10/2018

Đáp án bài tập để các bạn tham khảo.

 #include <iostream>

    int main()
    {
    	// Khai bao bien "month".
    	int month;

    	// Huong dan nguoi dung cach thuc nhap.
    	std::cout << "Type one of these choices:\n" 
    		<< "[1] for 31-day months.\n" 
    		<< "[2] for 28-day months.\n" 
    		<< "[4] for 30-day months.\n" 
    		<< std::endl;
    	std::cout << "Please type months that have 31 days or 30 days or else 28 days: " << std::endl;

    	// Nhap vao "month".
    	std::cin >> month;
    	std::cout << "\n";

    	/* switch-case statements */

    	// (!!!) LUU Y: Bat buoc su dung truong hop FALL-THROUGH trong bai tap nay.

    	switch (month)
    	{
    		// Nhung thang co 31 ngay.
    	case 1:
    		std::cout << "January has 31 days." << std::endl;
    	case 3:
    		std::cout << "March has 31 days." << std::endl;
    	case 5:
    		std::cout << "May has 31 days." << std::endl;
    	case 7:
    		std::cout << "July has 31 days." << std::endl;
    	case 8:
    		std::cout << "August has 31 days." << std::endl;
    	case 10:
    		std::cout << "October has 31 days." << std::endl;
    	case 12:
    		std::cout << "December has 31 days." << std::endl;
    		break;
    		// Nhung thang co 30 ngay.
    	case 4:
    		std::cout << "April has 30 days." << std::endl;
    	case 6:
    		std::cout << "June has 30 days." << std::endl;
    	case 9:
    		std::cout << "September has 30 days." << std::endl;
    	case 11:
    		std::cout << "November has 30 days." << std::endl;
    		break;
    		// Thang duy nhat co 28 ngay.
    	case 2:
    		std::cout << "February has 28 days." << std::endl;
    		break;
    	}

    	std::cout << "-----------------------------------" << std::endl;
    	system("pause");
    	return 0;

    }
Kejetthue viết 00:05 ngày 01/10/2018

#include
using namespace std;
int main()
{
int month;
cout<<"Nhap thang ban muon kiem tra : ";
cin>>month;
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
cout<<“thang “<<month<<” co 31 ngay”<<endl;
break;
case 4:
case 6:
case 9:
case 11:
cout<<“thang “<<month<<” co 30 ngay”<<endl;
break;
case 2:
cout<<“thang “<<month<<” co 28 ngay”<<endl;
break;
default:
cout<<“thang ban nhap khong hop le”<<endl;
break;
}
}

Bài liên quan
0