Đặt ra trường hợp là so sánh bằng thì khi nào sử dụng if bậc thang khi nào sử dụng switch case

Cấu trúc rẽ nhánh if, else là gì

Trong cuộc sống có nhiều lúc chúng ta phải ra quyết định khi có 2 hoặc nhiều hướng khác nhau. Lúc đấy chúng ta tường sử dụng câu NếuThì

VD:

Nếu bạn đọc Blog của mình thì bạn sẽ học được nhiều thứ.

Nếu crush thích mình thì mình sẽ tỏ tình với bạn ấy

Nếu hôm nay trời nắng thì mình sẽ đi chơi hoặc nếu không nắng thì mình ở nhà

Khi đó những thứ sau từ Nếu chính là điều kiện và sau từ Thì chính là lệnh thực thi.

Tương tự trong máy tính chúng ta có if (điều kiện) thì thực thi gì đó, hoặc nếu không else (điều kiện) thì thực thi một cái gì đó.

Cú pháp như sau:

if(bieu_thuc_boolean) { /* cac lenh se duoc thuc thi neu bieu thuc boolean la true */ } else { /* cac lenh se duoc thuc thi neu bieu thuc boolean la false */ }

Nếu biểu thức logic được ước lượng làtrue, thì khi đókhối ifsẽ được thực thi, nếu không thìkhối elsesẽ được thực thi.

Lập trình C: Bài 5 – if else, switch case trong C

Tháng Một 19, 2018 nguyenvanquan7826 TUT C cơ bản 29 responses

Trong cuộc sống có rất nhiêu điều chúng ta phải lựa chọn, ví như lựa chọn giữa người ta yêu và người yêu ta, chọn nghe theo con tim hay là lý trí,… Nếu hôm nay được nghỉ thì sẽ ở nhà học hay là đi chơi, nếu có người yêu thì ngồi code hay đi mua kem cùng ăn ngoài cổng trường, vân vân và mây mây. Và lập trình là đi từ cuộc sống, phục vụ cuộc sống nên nó cũng phải có những thứ như vậy. Bài này chúng ta sẽ tìm hiểu về các lệnh để phục vụ những lựa chọn như vậy, các lệnh này gọi là lệnh rẽ nhánh.

Nội dung

  • 1. Lệnh và khối lệnh
  • 2. Lệnh if và if else
    • 2.1 Lệnh if
    • 2.2 Lệnh if – else
    • 2.3 Lệnh if else lồng nhau và if-else-if
    • 2.4 Toán tử điều kiện – If else rút gọn
  • 2. Lệnh switch case
  • 3. Khi nào dùng if-else, khi nào dùng switch-case

Trước khi tìm hiểu về cấu trúc các lệnh rẽ nhánh, chúng ta nên tìm hiểu một chút về lệnh đơn và khối lệnh.

2.3 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\n2: BLUE\n3: GREEN\n4: YELLOW\n5: 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\n2: BLUE\n3: GREEN\n4: YELLOW\n5: 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 << '\n'; // skipped case 2: // Match! std::cout << 2 << '\n'; // Execution begins here case 3: std::cout << 3 << '\n'; // This is also executed case 4: std::cout << 4 << '\n'; // This is also executed default: std::cout << 5 << '\n'; // 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 << '\n'; // skipped break; case 2: // Match! std::cout << 2 << '\n'; // Execution begins here break; case 3: std::cout << 3 << '\n'; // This is also executed break; case 4: std::cout << 4 << '\n'; // This is also executed break; default: std::cout << 5 << '\n'; // 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:

Đặt ra trường hợp là so sánh bằng thì khi nào sử dụng if bậc thang khi nào sử dụng switch case

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


https://www.udemy.com/c-co-ban-danh-cho-nguoi-moi-hoc-lap-trinh/learn/v4/overview

1. Mô tả cấu trúc rẽ nhánh switch - case.

Cấu trúc rẽ nhánh switch - case cho phép bạn lựa chọn một trong nhiều phương án có khả năng xảy ra, nó có thể dùng dể thay thế cho cấu trúc điều khiển if - else if - else mà tôi đã trình bày trong bài cấu trúc điều khiển if - else trong Java.

Vậy khi nào chúng ta nên sử dụng cấu trúc rẽ nhánhswitch - case thay thế chocấu trúc điều khiển if - else if - else? Khi mà chúng ta có số trường hợp cần xử lý lớn hơn 3 thì khi đó chúng ta nên sử dụng switch - case để dễ dàng kiểm tra và xử lý, giúp cho chương trình dễ quan sát hơn.

Cú pháp.
switch (biểu_thức) { case giá_trị_1: Lệnh 1; break; case giá_trị_2: Lệnh 2; break; ... case giá_trị_n: Lệnh n; break; [default: Lệnh 0;] }
trong đó:

  • Biểu_thức phải trả về kết quả là một số nguyên, chuỗihoặc một ký tự.
  • Giá_trị_1, giá_trị_2,..., giá_trị_nlà các biểu thức hằng, nguyên hoặc ký tự và chúng phải khác nhau.
  • Lệnh 1, Lệnh 2, ..., Lệnh n, Lệnh 0 là các lệnh trong thân của switch. Các bạn thấy sau mỗi lệnh này chúng ta có từ khóa break;, từ khóa này có thể có hoặc không có tùy theo từng trường hợp.

Cách thức hoạt động của switch - case như sau:

Đầu tiên, chương trình sẽ so sánh giá trịcủa biểu_thức với các giá trị từ giá_trị_1, giá_trị_2,..., giá_trị_n. Nếu trong các giá trị từgiá_trị_1, giá_trị_2,..., giá_trị_ncó giá trị nào bằng với giá trị của biểu_thức thì chương trình sẽ bắt đầu thực hiện các lệnh tương ứng nằm trongcase củagiá trị đócho đến khi gặp một lệnh break đầu tiên thì thoát ngay khỏi switch, bỏ qua các case (trường hợp)còn lại và thực hiện lệnh đầu tiên nằm ngay sau cấu trúc này. Nếu giá trị của biểu_thức không bằng với bất kỳ giá trị nào trong danh sách giá_trị_1, giá_trị_2... giá_trị_nthì Lệnh 0 sẽ được thực hiện nếu có thành phần default.

Lưu đồ hoạt động:

Đặt ra trường hợp là so sánh bằng thì khi nào sử dụng if bậc thang khi nào sử dụng switch case

Dạng 1 là cấu trúc switch có sử dụng từ khóa default, còn dạng 2 là cấu trúc switch không sử dụng từ khóa default.

Lưu ý:

  • Lệnh break là để nhảy ra khỏi lệnh switch, nếu không có lệnh này cấu trúc switch sẽ duyệt cả các trường hợp phía dưới cho đến khi gặp dấu đóng switch (dấu }) (vì chưa gặp break coi như chưa ra khỏi lệnh switch).
  • Khi sử dụng lệnh switch có thể xảy ra nhiều giá trị trả về cho một trường hợp (một khả năng xảy ra của biểu thức).

4. Cấu trúc điều kiện if-else

Câu lệnh if

Câu lệnh if được sử dụng để xem xét việc thực thi một thao tác nào đó dựa trên điều kiện hiện tại.

Cú pháp:

1. if (biểu_thức_điều_kiện) { 2. khối mã được thực thi nếu điều kiện là đúng 3. }

Câu lệnh if bao gồm một biểu thức điều kiện và một khối lệnh ở trong phần thân của nó. Tại thời điểm thực thi, nếu biểu thức điều kiện trả về kết quả true thì khối lệnh trong phần thân sẽ được thực thi, còn nếu biểu thức điều kiện trả về false thì khối lệnh trong phần thân sẽ được bỏ qua.

Ví dụ:

1. if(score > 9) { 2. classification = "Xuất sắc"; 3. }

Trong đoạn mã này biểu thức điều kiện là score > 9, còn phần thân là classification = “Xuất sắc”. Khi thực thi chương trình nếu biến score có giá trị lớn hơn 9 thì biến classification sẽ được gán giá trị là “Xuất sắc”, còn nếu biến score có giá trị bằng hoặc nhỏ hơn 9 thì biến classification sẽ không được gán giá trị mới.

Lưu ý: Nếu phần thân chỉ có một câu lệnh duy nhất thì chúng ta có thể không cần viết dấu mở và đóng ngoặc, còn nếu trong trường hợp phần thân có nhiều hơn 1 câu lệnh thì chúng ta bắt buộc phải mở và đóng ngoặc.

Câu lệnh if-else

Câu lệnh if-else là dạng đầy đủ của câu lệnh if.

Cú pháp:

1. if (biểu_thức_điều_kiện) { 2. khối mã được thực thi nếu điều kiện là đúng 3. } else { 4. khối mã được thực thi nếu điều kiện trên là sai 5. }

Câu lệnh if-else cũng bao gồm một biểu thức điều kiện, nhưng lại có hai phần thân khác nhau. Một phần thân gắn với phần if và một phần thân gắn với phần else.

Nếu biểu thức điều kiện trả về true thì phần thân gắn với if được thực thi, còn nếu biểu thức điều kiện trả về false thì phần thân gắn với phần else được thực thi. Luồng thực thi của câu lệnh if-else có thể được mô tả như lưu đồ dưới đây:

Đặt ra trường hợp là so sánh bằng thì khi nào sử dụng if bậc thang khi nào sử dụng switch case



Hình: Luồng thực thi của câu lệnh if-else

Ví dụ 1:

1. if(hour < 18){ 2. greeting = "Good day"; 3. }else{ 4. greeting = "Good evening"; 5. }

Trong đoạn mã trên, biểu thức điều kiện là hour < 18, còn phần thân của if là greeting = “Good day” và phần thân của else là greeting = “Good evening”.

Khi thực thi, nếu biến hour có giá trị nhỏ hơn 18 thì biến greeting sẽ được gán giá trị là “Good day”, còn nếu biến hour có giá trị lớn hơn hoặc bằng 18 thì biến greeting sẽ được gán giá trị là “Good evening”.

Ví dụ 2:

1. if(number % 2 == 0){ 2. alert(number + " is even."); 3. }else{ 4. alert(number + " is odd.") 5. }

Trong ví dụ trên, chúng ta đánh giá một số nguyên và phân loại số đó là số chẵn hay là số lẻ.

Trong trường hợp này, biểu thức điều kiện là để đánh giá xem số hiện tại có chia hết cho 2 hay không, còn hai phần thân là hiển thị thông báo tương ứng.

Việc đánh giá chia hết cho 2 hay không được thực hiện thông qua phép chia lấy phần dư và sau đó so sánh với giá trị 0. Nếu phần dư bằng không thì chứng tỏ đây là số chẵn, còn nếu phần dư khác 0 thì số đó là số lẻ.

Chẳng hạn, nếu number có giá trị là 4 thì kết quả phép chia cho 2 lấy phần dư là 0, do vậy biểu thức điều kiện sẽ trả về đúng, và phần thân của if được thực thi.

Nếu number có giá trị là 5 thì kết quả phép chia cho 2 lấy phần dư là 1, do vậy biểu thức điều kiện trả về sai, phần thân của else được thực thi.

if-else với một dòng lệnh bên trong

Trong trường hợp chỉ có một dòng lệnh bên trong if hoặc else thì có thể bỏ dấu ngoặc.

Ví dụ:

1. if(number % 2 == 0) 2. alert(number + " is even."); 3. else 4. alert(number + " is odd.")