C# sử dụng hai cấu trúc điều kiện: cấu trúc if-else và cấu trúc switch-case.
Cấu trúc rẽ nhánh if else
Cấu trúc if-else của C# hoàn toàn thừa kế từ C/C++. Cú pháp của cấu trúc if-else
như sau:
if (condition)
{
statements 1
}
else
{
statements 2
}
Trong đó, condition là biểu thức logic – biểu thức mà giá trị trả về là true hoặc false. Đây là kết quả thực hiện các phép so sánh, hoặc kết quả trả về của một số phương thức.
Các phép toán so sánh trong C# bao gồm == (so sánh bằng), > (lớn hơn), < (nhỏ hơn), >= (lớn hơn hoặc bằng), <= (nhỏ hơn hoặc bằng), != (khác). Các biểu thức hoặc giá trị logic có thể được kết hợp với nhau bởi các phép toán logic: && (và), || (hoặc), ! (phủ định).
Statements 1 là danh sách các lệnh sẽ thực thi nếu condition có giá trị true; Statement 2 là danh sách lệnh sẽ thực thi nếu condition có giá trị false.
Có một số lưu ý sau khi dùng if-else:
- Nếu statements 1 hoặc statements 2 chỉ có một lệnh duy nhất thì có thể không cần dùng cặp dấu {}.
- Nhánh else{} là không bắt buộc; if thì bắt buộc phải có.
- Bình thường bạn chỉ có thể tạo ra 2 nhánh rẽ: 1 nhánh if, 1 nhánh else.
- Để tạo thêm nhiều nhánh rẽ nữa bạn có thể kết hợp thêm các nhánh else if vào cấu trúc trên. Số lượng nhánh else if không giới hạn.
- Bạn có thể lồng nhiều if-else với nhau.
Hãy cùng thực hiện ví dụ sau để hiểu rõ hơn cách sử dụng if-else
- Tạo solution rỗng đặt tên là S03_FlowControls.
- Trong solution này tạo thêm một project kiểu Console App đặt tên là P01_IfElse.
Viết code cho file Program.cs như sau:
using System;
using System.Text;
namespace P01_IfElse
{
class Program
{
static void Main(string[] args)
{
Console.OutputEncoding = Encoding.UTF8;
Console.Write("Nhập nhiệt độ (oC): ");
var input = Console.ReadLine();
var temperature = int.Parse(input);
if(temperature <= 5)
{
Console.WriteLine("Lạnh quá!");
}
else
{
if(temperature <= 15)
{
Console.WriteLine("Mát mẻ, dễ chịu!");
}
else
{
if(temperature <= 25)
{
Console.WriteLine("Ấm áp!");
}
else
{
Console.WriteLine("Nóng quá!");
}
}
}
Console.ReadKey();
}
}
}
Đoạn code trên phân chia việc thực hiện code vào nhiều nhánh với các cấu trúc if-else lồng nhau. Các nhánh bao gồm: dưới 5 độ, từ 5 đến 15 độ, từ 15 đến 25 độ, trên 25 độ.
Nếu bạn không thích sử dụng các khối if-else lồng nhau, bạn có thể mở nhánh bằng cụm else if. Khối if-else bên trên hoàn toàn tương đương với cách viết dưới đây:
if(temperature < 5)
{
Console.WriteLine("Lạnh quá!");
}
else if(temperature <= 15)
{
Console.WriteLine("Mát mẻ, dễ chịu!");
}
else if(temperature <= 15)
{
Console.WriteLine("Ấm áp!");
}
else
{
Console.WriteLine("Nóng quá!");
}
Có thể thấy, các nhánh else if thực chất chỉ là dạng viết khác của các cấu trúc if else lồng nhau để tránh rối rắm (vì nguyên tắc if-else chỉ có hai nhánh). Việc lựa chọn cách viết nào hoàn toàn mang tính cá nhân.
Tuy nhiên, lưu ý rằng, sau if và else NÊN sử dụng code block ngay cả khi có 1 lệnh duy nhất.
Cấu trúc rẽ nhiều nhánh switch-case
Ở bên trên bạn đã gặp cấu trúc rẽ nhánh if-else. Cấu trúc này chỉ cho phép rẽ tới 2 nhánh. Nếu muốn rẽ nhiều nhánh, bạn phải lồng ghép các nhánh else if khiến code trở nên khó đọc.
C# cung cấp một cấu trúc khác để thực hiện rẽ nhiều nhánh thay cho việc lồng ghép nhiều if-else: cấu trúc switch-case. Cú pháp như sau:
switch(expression)
{
case <value1>
// code block
break;
case <value2>
// code block
break;
case <valueN>
// code block
break;
default
// code block
break;
}
Cấu trúc này yêu cầu phải cung cấp một biểu thức “expression” (lệnh tính toán). Giá trị của expression sẽ được tính ra và lần lượt so sánh với value1, value2, .., valueN. Các value này bắt buộc phải là các hằng số hoặc biểu thức tính ra hằng số, KHÔNG được sử dụng biến.
Nếu trùng với value nào, khối lệnh tương ứng sẽ được thực hiện, sau đó sẽ bỏ qua tất cả các kiểm tra còn lại. Vì lý do này, C# bắt buộc mỗi “case” phải được kết thúc bằng lệnh “break” hoặc “return”. Quy định này khiến cấu trúc switch-case của C# an toàn hơn một chút so với trong C/C++ (vốn không bắt buộc dùng break).
Khi một case được thực hiện, bạn có thể tiếp tục nhảy sang một case khác bằng lệnh nhảy goto case
. Cách sử dụng switch-case mà thực hiện được nhiều case cùng lúc như vậy có tên gọi là fall-through.
Nếu giá trị của biểu thức tính ra không trùng với bất kỳ “case” nào, khối lệnh default sẽ được thực hiện. Khối “default” không bắt buộc. Trong trường hợp không có khối default và giá trị của expression không trùng với bất kỳ case nào, cấu trúc switch đơn giản là không thực hiện bất kỳ khối lệnh nào.
Các lệnh đi sau mỗi case không cần viết trong cặp {}, kể cả khi có nhiều lệnh.
Hãy cùng thực hiện một ví dụ để hiểu rõ cú pháp của cấu trúc này.
Thêm project P02_SwitchCase vào solution. Viết code cho file Program.cs như sau:
using System;
using System.Text;
namespace P02_SwitchCase
{
class Program
{
static void Main(string[] args)
{
Console.OutputEncoding = Encoding.UTF8;
Console.Write("Nhập một số từ 1 đến 8: ");
var day = Console.ReadLine();
switch (day)
{
case "2":
Console.WriteLine("Thứ hai");
break;
case "3":
Console.WriteLine("Thứ ba");
break;
case "4":
Console.WriteLine("Thứ tư");
break;
case "5":
Console.WriteLine("Thứ năm");
break;
case "6":
Console.WriteLine("Thứ sáu");
break;
case "7":
Console.WriteLine("Thứ bảy");
break;
// nhập 1 và 8 sẽ đều thực hiện chung lệnh viết ra "Chủ nhật", rồi quay về case "2"
case "1":
case "8":
Console.WriteLine("Chủ nhật");
goto case "2";
// nếu nhập bất kỳ giá trị nào khác sẽ thực hiện lệnh ở nhóm này
default:
Console.WriteLine("Bạn nhập sai rồi");
break;
}
Console.ReadKey();
}
}
}
Các cấu trúc lặp trong C#
C# cung cấp 4 cấu trúc lặp khác nhau: do-while, while, for, foreach.