switch case trong C | Laptrinhcanban.com

switch case trong C

Hướng dẫn cách sử dụng lệnh switch case trong C. Bạn sẽ biết switch trong C dùng để làm gì, cú pháp lệnh switch case trong C, cũng như lý do vì sao lại cần viết lệnh break trong switch case sau bài học này.

switch case trong C

Khái niệm và cú pháp switch case trong C

switch case là một trong câu lệnh sử dụng dùng để rẽ nhánh chương trình trong C. Câu lệnh switch có thể tách quá trình xử lý bằng cách kiểm tra xem giá trị của biến hoặc biểu thức đang xét có khớp với một trong các giá trị được chỉ định hay không. Và trong từng trường hợp khớp với mỗi giá trị chỉ định sẽ có các xử lý riêng cho trường hợp đó.

Chúng ta sử dụng lệnh switch case trong C với cú pháp như sau:

switch (expression){
    case value1:
        //Xử lý nếu expression === value1
        …
        break;
    case value2:
        //Xử lý nếu expression === value2
        …
        break;
    case value3:
        //Xử lý nếu expression === value3
        …
        break;
    default:
        //Xử lý nếu giá trị của expression không khớp với một trong các giá trị chỉ định
        …
}

Trong đó

  • expression phải là một giá trị thuộc kiểu số, một biểu thức tính toán mà kết quả là kiểu số, hoặc là một kiểu giá trị có thể chuyển đổi về dạng số, và giá trị của nó sẽ được dùng để so sánh xem có khớp với giá trị trong các case hay không.
  • case là từ khoá bắt đầu các xử lý trong trường hợp giá trị của expression khớp với giá trị chỉ định đằng sau case.
  • break là lệnh dùng để dừng switch sau khi hoàn thành các xử lý ở case tìm thấy. Chúng ta cũng có thể lược bỏ lệnh break.
  • default là từ khoá bắt đầu các xử lý trong trường hợp giá trị của expression không khớp với bất kỳ giá trị nào được chỉ định.

Một lưu ý là khác với các ngôn ngữ lập trình khác như Java hay JavaScript có thể tự do chỉ định kiểu giá trị cho expression , thì chúng ta chỉ có thể chỉ định expression của switch case trong C phải là một giá trị thuộc kiểu số, một biểu thức tính toán trả về kết quả thuộc kiểu só, hoặc là một kiểu class có thể chuyển đổi về dạng số.

Bởi vậy, chúng ta có thể dùng kiểu số như int, double, một biểu thức tính toán với số, hoặc là kiểu giá trị có thể chuyển đổi về dạng số như enum cho expression, nhưng lại không thể dùng trực tiếp kiểu chữ như char hay string cho expression.

Tuy nhiên chúng ta cũng có thể sử dụng enum để chỉ định gián tiếp kiểu chữ cho expression, hãy cùng xem nó ở phần ví dụ ở phía dưới.

Quy trình xử lý switch case trong C

Quy trình xử lý switch case trong C như sau:

  1. Đánh giá giá trị của expression trong () sau khi chuyển đổi để xem liệu giá trị của nó có khớp với bất kỳ giá trị nào được chỉ định hay không.

  2. Nếu tìm thấy giá trị khớp với giá trị chỉ định, chương trình sẽ xử lý tất cả các lệnh bắt đầu từ thời điểm đó cho tới cuối lệnh switch, hoặc là khi gặp lệnh break.

  3. Nếu không có giá trị nào khớp, các xử lý được mô tả sau khi từ khoá default (xử lý mặc định) được thực thi. Mệnh đề mặc định có thể được lược bỏ khi viết switch case nếu nó không cần thiết.

Đặc biệt lưu ý là chương trình sẽ xử lý tất cả các lệnh bắt đầu từ thời điểm đó cho tới cuối lệnh switch, hoặc là khi gặp lệnh break. Điều đó có nghĩa không phải chỉ có các lệnh được miêu tả trong case tìm thấy được chạy, mà là tất cả các lệnh từ đó cho tới cuối switch sẽ được chạy. Đó là lý do mà chúng ta cần thêm lệnh break ở từng case như ở trên để dừng lệnh switch ngay sau khi hoàn thành các xử lý trong case.

Tất nhiên chúng ta cũng có thể lược bỏ đi lệnh break và xử lý khi đó thế nào, hãy xem thêm ở phần dưới bài.

Sử dụng switch case trong C

Như đã nói ở trên thì chúng ta chỉ có thể dùng kiểu số như int, double, một biểu thức tính toán với số, hoặc là kiểu enum cho expression trong switch case của C. Hãy cùng xem một số ví dụ như sau:

switch case trong C với kiểu số

#include <stdio.h>

int main(void) {
int day = 5;
switch (day) {
case 1:
printf("Thứ 2\n");
break;
case 2:
printf("Thứ 3\n");
break;
case 3:
printf("Thứ 4\n");
break;
case 4:
printf("Thứ 5\n");
break;
case 5:
printf("Thứ 6\n");
break;
case 6:
printf("Thứ 7\n");
break;
case 7:
printf("Chủ Nhật\n");
break;
}
return 0;
}
//> Thứ 6

Ở ví dụ này thì do giá chỉ chỉ định của biến day khớp với trường hợp case 5 nên xử lý trong case này đã được thực thi.

switch case trong C với biểu thức tính toán

#include <stdio.h>

int main(void) {
switch ( 1 + 2 + 5){
case 2:
printf("Tổng bằng 2\n");
break;
case 8:
printf("Tổng bằng 8\n");
break;
default:
printf("Tổng bằng số khác\n");
}
return 0;
}
//Tổng bằng 8

Ở ví dụ này thì do kết quả của biểu thức 1 + 2 + 5 bằng 8 khớp với trường hợp case 8, do đó xử lý trong case này đã được thực thi.

switch case trong C với kiểu enum

Như đã nói ở trên thì chúng ta có thể dùng enum và gián tiếp chỉ định kiểu chữ cho expression trong switch case của C. Ví dụ cụ thể, chúng ta tạo ra enum chứa các ngày trong tuần, rồi chỉ định giá trị case bằng kiểu chữ như sau:

#include <stdio.h>

enum week {
Mon,
Tue,
Wed,
Thu,
Fri,
Sat,
Sun
};

int main(void) {
enum week day;
day = Fri;
switch (day) {
case Mon:
printf("Thứ 2\n");
break;
case Tue:
printf("Thứ 3\n");
break;
case Wed:
printf("Thứ 4\n");
break;
case Thu:
printf("Thứ 5\n");
break;
case Fri:
printf("Thứ 6\n");
break;
case Sat:
printf("Thứ 7\n");
break;
case Sun:
printf("Chủ Nhật\n");
break;
}
return 0;
}
//> Thứ 6

Ở ví dụ này thì do giá chỉ chỉ định của biến day khớp với trường hợp case Fri nên xử lý trong case này đã được thực thi.

switch case trong C với xử lý mặc định

Trong trường hợp giá trị của expression không khớp với bất kỳ giá trị nào được chỉ định thì các xử lý mặc định mô tả trong khối defalt sẽ được thực thi.

Ví dụ cụ thể.

#include <stdio.h>

int main(void) {
switch ( 1 + 2 + 5 + 10){
case 2:
printf("Tổng bằng 2\n");
break;
case 8:
printf("Tổng bằng 8\n");
break;
default:
printf("Tổng bằng số khác\n");
}
return 0;
}
//Tổng bằng số khác

Ở ví dụ này thì do kết quả của biểu thức 1 + 2 + 5 + 10 không khớp với bất kỳ case chỉ định nào cả, nên xử lý mặc định ghi trong defautl đã được thực thi.

Chuyển đổi switch case và if trong C

Do switch case và if đều là các lệnh dùng để rẽ nhanh chương trình trong C nên chúng ta hoàn toàn có thể chuyển đổi giữa chúng với nhau.

Lấy ví dụ, với lệnh switch case sau:

#include <stdio.h>

int main(void) {
int sum = 8;
switch (sum){
case 2:
printf("Tổng bằng 2\n");
break;
case 8:
printf("Tổng bằng 8\n");
break;
case 10:
printf("Tổng bằng 10\n");
break;
default:
printf("Tổng bằng số khác\n");
}
return 0;
}
//Tổng bằng 8

Chúng ta hoàn toàn có thể viết lại bằng lệnh if như sau:

#include <stdio.h>

int main(void) {
int sum = 8;
if(sum == 2){
printf("Tổng bằng 2\n");
}else if(sum == 8){
printf("Tổng bằng 8\n");
}else if(sum == 10){
printf("Tổng bằng 10\n");
}else{
printf("Tổng bằng số khác\n");
}
return 0;
}

Tuy nhiên trong các trường hợp có nhiều trường hợp cần xét, thì so với lệnh if thì Kiyoshi nghĩ lệnh switch case sẽ giúp câu lệnh rõ ràng và dễ sửa hơn.

switch case không chứa break trong C

Lệnh switch case trong C chứa các xử lý riêng biệt được ghi sau từ khoá case trong các trường hợp riêng biệt. Và nếu tìm thấy giá trị khớp với giá trị chỉ định, chương trình sẽ xử lý tất cả các lệnh bắt đầu từ thời điểm đó cho tới cuối lệnh switch, hoặc là khi gặp lệnh break.

Bởi vậy thông thường chúng ta sẽ ghi lệnh break ở vị trí cuối cùng trong các xử lý sau khoá case để kết thúc switch ngay tại case tìm thấy.

Tuy nhiên thì chúng ta cũng hoàn toàn có thể bỏ đi không ghi break, và khi đó đơn giản là tất cả các xử lý sẽ được chạy cho tới cuối lệnh switch case mà thôi.

Lấy ví dụ:

#include <stdio.h>

int main(void) {
int sum = 8;
switch (sum){
case 2:
printf("Tổng bằng 2\n");
case 8:
printf("Tổng bằng 8\n");
case 10:
printf("Tổng bằng 10\n");
default:
printf("Tổng bằng số khác\n");
}
return 0;
}

Khi chạy lệnh, khác với khi có break thì rất nhiều dòng kết quả sẽ được in ra như sau:

Tổng bằng 8
Tổng bằng 10
Tổng bằng số khác

Lý do là vì, sau khi tìm thấy case 8 thì do không tìm thấy lệnh break nên tất cả các xử lý sau đó cho tới cuối switch đều được chạy, do đó tất cả các lệnh cout đều đã được thực thi.

Thông thường, chúng ta sẽ không muốn chạy lệnh kiểu này, nên đó là lý do mà cần phải thêm lệnh break ở đằng sau tất cả các xử lý của case được miêu tả trong switch case.

Ứng dụng switch case không chứa break để thực hiện cùng một xử lý cho nhiều giá trị

Trong câu lệnh switch, chúng ta sẽ kiểm tra xem giá trị được xét có khớp với giá trị được mô tả sau khoá case hay không, nhưng bằng cách cố ý không viết câu lệnh break, chúng ta có thể thực hiện một quá trình xử lý giống nhau cho nhiều giá trị.

Ví dụ cụ thể với chương trình kiểm tra được ngày đã cho có phải ngày trong tuần hay không sau đây.

#include <stdio.h>

enum week {
Mon,
Tue,
Wed,
Thu,
Fri,
Sat,
Sun
};

int main(void) {
enum week day;
day = Mon;
switch (day) {
case Mon:
case Tue:
case Wed:
case Thu:
case Fri:
printf("Ngày trong tuần\n");
break;
case Sat:
case Sun:
printf("Ngày lễ\n");
break;
default:
printf("Không tồn tại\n");
}
return 0;
}
//>Ngày trong tuần

Ở ví dụ này, lệnh printf("Ngày trong tuần" chỉ được thực thi khi giá trị của biến day khớp với Fri, tuy nhiên thì do cố ý không viết break nên lệnh xuất dữ liệu này này được chạy cả trong các trường hợp từ thứ 2 đến thứ 6 và kiểm tra được ngày đã cho có phải ngày trong tuần hay không.

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về cách sử dụng lệnh switch case trong C rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.