BÀI 5: CẤU TRÚC ĐIỀU KHIỂN TRONG C#

5.1. Khái niệm về Luồng điều khiển (Control Flow)

Mặc định, máy tính đọc mã lệnh của bạn theo thứ tự Tuần tự (Sequential): từ trên xuống dưới, từ dòng 1 đến dòng 10.

  • Vấn đề: Nếu ta muốn “Nếu trời mưa thì nghỉ học, nếu không mưa thì đi học”? Hoặc muốn “Chép phạt 100 lần”? Chạy tuần tự không làm được.

  • Giải pháp: Cấu trúc điều khiển giúp bẻ lái dòng chảy của chương trình.

5.2. Cấu trúc Rẽ nhánh (Selection Statements)

Cấu trúc này cho phép chương trình “Ra quyết định”.

Tham khảo Shutterstock

5.2.1. Cấu trúc if...else (Nếu… thì…)

  • Bản chất: Kiểm tra một điều kiện True (Đúng) hoặc False (Sai).

  • Cú pháp C#:

    if (điều_kiện)
    {
        // Chạy nếu điều kiện ĐÚNG
    }
    else
    {
        // Chạy nếu điều kiện SAI
    }
    
  • Giải thích :

    1. Máy tính kiểm tra điều_kiện trong ngoặc ().

    2. Nếu đúng (True), nó nhảy vào khối { } ngay sau if.

    3. Nếu sai (False), nó bỏ qua if và nhảy vào khối { } sau else (nếu có).

  • Ứng dụng thực tế (Khi nào dùng?):

    • Dùng khi kiểm tra điều kiện đúng/sai.

    • Dùng khi so sánh trong một khoảng giá trị (ví dụ: điểm > 5 và điểm < 8).

    • Ví dụ: Kiểm tra đăng nhập (Đúng pass thì vào, sai thì báo lỗi).

5.2.2. Cấu trúc if...else if...else (Rẽ nhiều nhánh)

  • Khi nào dùng: Khi có nhiều hơn 2 trường hợp xảy ra.

  • Ví dụ: Xếp loại học lực

    double diem = 7.5;
    if (diem >= 9.0)
        Console.WriteLine("Xuất sắc");
    else if (diem >= 8.0) // Nếu không xuất sắc, thì kiểm tra tiếp có Giỏi không
        Console.WriteLine("Giỏi");
    else if (diem >= 6.5) // Nếu không Giỏi, kiểm tra Khá
        Console.WriteLine("Khá");
    else
        Console.WriteLine("Trung bình/Yếu");

5.2.3. Cấu trúc switch...case (Lựa chọn danh sách)

  • Bản chất: So sánh một biến với một danh sách các giá trị cụ thể.

  • Cú pháp switch…case trong C#

    switch (biểu_thức)
    {
        case giá_trị_1:
            // Khối lệnh khi biểu_thức == giá_trị_1
            break;
    
        case giá_trị_2:
            // Khối lệnh khi biểu_thức == giá_trị_2
            break;
    
        ...
    
        default:
            // Khối lệnh khi không khớp case nào
            break;
    }
  • switch(biến): Lấy giá trị của biến này đem đi so sánh.
  • case giá_trị:: Nếu biến bằng giá trị này thì thực hiện lệnh.
  • break: “Phanh” lại và thoát khỏi cấu trúc switch. Nếu quên break, C# sẽ báo lỗi (khác với C++ là nó chạy tuột xuống dưới).
  • Ứng dụng thực tế (Khi nào dùng?):

    • Dùng khi biết trước các giá trị cụ thể (rời rạc), không phải khoảng giá trị.

    • Ví dụ điển hình: Làm Menu (Chọn 1, 2, 3), Chọn ngày trong tuần (2, 3… CN), Chọn phép tính (+, -, *, /).

So sánhif…elseswitch…case
Điều kiệnBiểu thức Logic (>, <, ==, &&, ` 
Phạm viKiểm tra khoảng giá trị (VD: lương > 10 triệu)Giá trị rời rạc (VD: chức vụ = “GD”, “TP”)
Độ rõ ràngTốt cho điều kiện phức tạpTốt cho danh sách lựa chọn dài, Menu

Ví dụ 1: Chọn ngày trong tuần bằng switch case

using System;
using System.Text;

class Program
{
    static void Main()
    {
        Console.OutputEncoding = Encoding.UTF8; // Hiển thị tiếng Việt
        Console.InputEncoding = Encoding.UTF8;  // Nhập tiếng Việt

        Console.Write("Nhập số từ 1 đến 7 để chọn ngày trong tuần: ");
        int day = int.Parse(Console.ReadLine());

        switch (day)
        {
            case 1:
                Console.WriteLine("Thứ Hai");
                break;
            case 2:
                Console.WriteLine("Thứ Ba");
                break;
            case 3:
                Console.WriteLine("Thứ Tư");
                break;
            case 4:
                Console.WriteLine("Thứ Năm");
                break;
            case 5:
                Console.WriteLine("Thứ Sáu");
                break;
            case 6:
                Console.WriteLine("Thứ Bảy");
                break;
            case 7:
                Console.WriteLine("Chủ Nhật");
                break;
            default:
                Console.WriteLine("Giá trị không hợp lệ! Vui lòng nhập từ 1 đến 7.");
                break;
        }

        Console.WriteLine("\nNhấn phím bất kỳ để thoát...");
        Console.ReadKey();
    }
}

Giải thích

  • switch(day) sẽ kiểm tra giá trị của biến day.

  • Nếu day = 3, chương trình sẽ chạy vào case 3: và in ra “Thứ Tư”.

  • default chạy khi không có case nào khớp.

Ví dụ 2: Menu chức năng trong ứng dụng bán hàng

Giả sử bạn đang viết một chương trình console cho nhân viên bán hàng. Họ chọn số để thực hiện chức năng tương ứng.

using System;

class Program
{
    static void Main()
    {
        Console.WriteLine("=== MENU QUẢN LÝ BÁN HÀNG ===");
        Console.WriteLine("1. Thêm sản phẩm");
        Console.WriteLine("2. Xóa sản phẩm");
        Console.WriteLine("3. Xem danh sách sản phẩm");
        Console.WriteLine("4. Thanh toán");
        Console.WriteLine("5. Thoát");
        Console.Write("Chọn chức năng: ");

        int choice = int.Parse(Console.ReadLine());

        switch (choice)
        {
            case 1:
                Console.WriteLine("Bạn đã chọn: Thêm sản phẩm");
                // Gọi hàm AddProduct();
                break;

            case 2:
                Console.WriteLine("Bạn đã chọn: Xóa sản phẩm");
                // Gọi hàm DeleteProduct();
                break;

            case 3:
                Console.WriteLine("Bạn đã chọn: Xem danh sách sản phẩm");
                // Gọi hàm ShowProducts();
                break;

            case 4:
                Console.WriteLine("Bạn đã chọn: Thanh toán");
                // Gọi hàm Checkout();
                break;

            case 5:
                Console.WriteLine("Thoát chương trình...");
                break;

            default:
                Console.WriteLine("Lựa chọn không hợp lệ!");
                break;
        }
    }
}
5.3. Cấu trúc Lặp (Iteration Statements)

Cấu trúc này giúp “Tự động hóa” các công việc lặp đi lặp lại.

5.3.1. Vòng lặp for (Lặp với số lần biết trước)

Tham khảo Shutterstock
  • Bản chất: Gom 3 bước quản lý vòng lặp vào một dòng duy nhất: Khởi tạo -> Kiểm tra -> Tăng/Giảm.

  • Cú pháp vòng lặp for trong C#

  • for (khởi_tạo; điều_kiện_lặp; bước_nhảy)
    {
        // Khối lệnh được lặp
    }
    

    🔍 Giải thích từng phần

    Thành phầnÝ nghĩa
    khởi_tạoTạo biến đếm, chạy 1 lần duy nhất
    điều_kiện_lặpKiểm tra trước mỗi vòng lặp. Nếu true → chạy, nếu false → dừng
    bước_nhảyTăng/giảm biến đếm sau mỗi vòng lặp
Ví dụ 1: In ra các số từ 0 đến 9
// Cấu trúc: for (Khởi_tạo ; Điều_kiện_dừng ; Bước_nhảy)
for (int i = 0; i < 10; i++)
{
    Console.WriteLine("Lần lặp thứ: " + i);
}

Cấu trúc tổng quát:

for (Khởi_tạo; Điều_kiện_dừng; Bước_nhảy)
{
    // Khối lệnh lặp lại
}

Áp dụng vào bài ví dụ 1:

  • Khởi_tạo: int i = 0

  • Điều_kiện_dừng: i < 10

  • Bước_nhảy: i++

  • Khối lệnh: Console.WriteLine("Lần lặp thứ: " + i);

Giải thích từng phần trong ngoặc for

a. Khởi_tạo: int i = 0

  • int: khai báo biến kiểu số nguyên.

  • i: tên biến, thường dùng làm biến đếm trong vòng lặp.

  • = 0: gán giá trị ban đầu cho i0.

Thời điểm chạy:

  • Lệnh int i = 0 chỉ chạy một lần duy nhất khi vòng lặp bắt đầu, trước khi kiểm tra điều kiện.

Sau bước này:

  • Biến i tồn tại và đang có giá trị 0.

b. Điều_kiện_dừng: i < 10

  • Mỗi lần vòng lặp chuẩn bị chạy (trước mỗi lần vào thân { ... }), chương trình sẽ kiểm tra:

    • Nếu i < 10 là true → chạy đoạn code trong { ... }.

    • Nếu i < 10 là false → dừng vòng lặp, thoát ra ngoài.

c. Bước_nhảy: i++

  • i++ nghĩa là: tăng i lên 1 đơn vị sau mỗi lần lặp.

  • Thời điểm chạy:

    • Bước này chỉ chạy sau khi khối lệnh bên trong { ... } hoàn thành.

  • Ví dụ: nếu hiện tại i = 3, sau i++ thì i = 4.

Diễn biến cụ thể từng vòng lặp

Mô phỏng từng bước như máy tính chạy:

Trước khi vào vòng lặp

  1. Khởi_tạo: int i = 0;i = 0

Vòng lặp 1

  1. Kiểm tra điều kiện: i < 100 < 10 đúng → vào thân vòng lặp.

  2. Chạy thân vòng lặp:

    Console.WriteLine("Lần lặp thứ: " + i);
    
    • Chuỗi "Lần lặp thứ: " nối với giá trị i (lúc này là 0).

    • In ra màn hình:

      Lần lặp thứ: 0
      
  3. Bước_nhảy: i++i tăng từ 0 lên 1.

Vòng lặp 2

  1. Kiểm tra điều kiện: i < 101 < 10 đúng → vào thân.

  2. Chạy thân vòng lặp:

    In ra:

    Lần lặp thứ: 1
    
  3. Bước_nhảy: i++i từ 1 lên 2.

Vòng lặp 3

  1. Kiểm tra điều kiện: i < 102 < 10 đúng.

  2. In ra:

    Lần lặp thứ: 2
    
  3. Bước_nhảy: i++i = 3.

Cứ thế tiếp tục…

Chương trình lặp lại quy trình:

  • Kiểm tra i < 10

  • Nếu đúng → in, rồi tăng i++

Ta sẽ có:

  • Vòng 4: in Lần lặp thứ: 3, rồi i = 4

  • Vòng 5: in Lần lặp thứ: 4, rồi i = 5

  • Vòng 6: in Lần lặp thứ: 5, rồi i = 6

  • Vòng 7: in Lần lặp thứ: 6, rồi i = 7

  • Vòng 8: in Lần lặp thứ: 7, rồi i = 8

  • Vòng 9: in Lần lặp thứ: 8, rồi i = 9

  • Vòng 10: in Lần lặp thứ: 9, rồi i = 10

Thời điểm dừng vòng lặp

Sau vòng lặp 10:

  • i đã được tăng lên 10.

Lần kế tiếp:

  1. Kiểm tra điều kiện: i < 1010 < 10sai.

    • Điều kiện sai → vòng lặp không chạy thân nữa.

    • Chương trình thoát khỏi vòng for và chạy tiếp các lệnh phía sau (nếu có).

  • Ứng dụng thực tế (Khi nào dùng?):

    • Dùng khi biết chính xác số lần lặp.

    • Ví dụ: Duyệt qua một danh sách sinh viên (Mảng), In bảng cửu chương, Chạy một tác vụ 100 lần.

Ví dụ 2: In ra các số từ 1 đến 10

using System;

class Program
{
    static void Main()
    {
        for (int i = 1; i <= 10; i++)
        {
            Console.WriteLine("Số: " + i);
        }
    }
}

🔍 Giải thích

  • int i = 1; → bắt đầu từ 1

  • i <= 10; → lặp đến khi i = 10

  • i++ → mỗi vòng tăng thêm 1

Kết quả sẽ in ra: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

5.3.2. Vòng lặp while (Lặp khi điều kiện còn đúng)

  • Bản chất: Kiểm tra trước, làm sau. Nếu sai ngay từ đầu thì không làm gì cả.

  • Cú pháp vòng lặp while trong C#

while (điều_kiện)
{
    // Khối lệnh được lặp
}

🔍 Giải thích

  • điều_kiện được kiểm tra trước mỗi lần lặp.

  • Nếu điều kiện true → chạy khối lệnh.

  • Nếu điều kiện false → dừng vòng lặp.

  • Ứng dụng thực tế (Khi nào dùng?):
    • Dùng khi không biết trước số lần lặp, chỉ biết điều kiện dừng.

    • Ví dụ: Đọc dữ liệu từ file (đọc cho đến khi hết file), Đợi kết nối từ server.

📌 Ví dụ 1

int i = 1;

while (i <= 5)
{
    Console.WriteLine("Lần lặp: " + i);
    i++; // tăng i để tránh lặp vô hạn
}

Giải thích từng bước, đúng kiểu “máy tính đang làm gì”

int i = 1;
while (i <= 5)
{
    Console.WriteLine("Lần lặp: " + i);
    i++; // tăng i để tránh lặp vô hạn
}

1. Khai báo và khởi tạo biến

int i = 1;
  • int: kiểu số nguyên.

  • i: tên biến, dùng làm biến đếm.

  • = 1: gán giá trị ban đầu cho i1.

Sau dòng này, trong bộ nhớ có biến i và giá trị của nó là 1.

2. Cấu trúc vòng lặp while

while (i <= 5)
{
    Console.WriteLine("Lần lặp: " + i);
    i++;
}
  • while (i <= 5) nghĩa là:

    • Chừng nào điều kiện i <= 5 còn đúng, thì khối lệnh trong { ... } vẫn tiếp tục chạy.

    • Khi điều kiện sai, vòng lặp dừng.

Khác với do...while, vòng while kiểm tra điều kiện trước, nếu ngay từ đầu điều kiện sai thì thân vòng lặp không chạy lần nào.

3. Mô phỏng từng vòng lặp

Lần kiểm tra 1 (trước vòng lặp 1)

  • Giá trị hiện tại: i = 1.

  • Điều kiện: i <= 51 <= 5đúng → vào thân vòng lặp.

Vòng lặp 1
  1. Chạy lệnh:

    Console.WriteLine("Lần lặp: " + i);
    
    • Ghép chuỗi "Lần lặp: " với giá trị i (đang là 1).

    • In ra màn hình:

      Lần lặp: 1
      
  2. Chạy lệnh:

    i++;
    
    • i++ nghĩa là: i = i + 1.

    • i từ 12.

  3. Kết thúc vòng 1, quay lại kiểm tra điều kiện while.

Lần kiểm tra 2 (trước vòng lặp 2)

  • Giá trị hiện tại: i = 2.

  • Điều kiện: i <= 52 <= 5đúng → vào thân.

Vòng lặp 2
  1. In ra:

    Lần lặp: 2
    
  2. Tăng i++:

    • i từ 23.

Lần kiểm tra 3 (trước vòng lặp 3)

  • i = 3.

  • 3 <= 5đúng.

Vòng lặp 3
  1. In:

    Lần lặp: 3
    
  2. i++:

    • i từ 34.

Lần kiểm tra 4 (trước vòng lặp 4)

  • i = 4.

  • 4 <= 5đúng.

Vòng lặp 4
  1. In:

    Lần lặp: 4
    
  2. i++:

    • i từ 45.

Lần kiểm tra 5 (trước vòng lặp 5)

  • i = 5.

  • 5 <= 5đúng.

Vòng lặp 5
  1. In:

    Lần lặp: 5
    
  2. i++:

    • i từ 56.

Lần kiểm tra 6 (sau vòng 5)

  • i = 6.

  • Kiểm tra: i <= 56 <= 5sai.

Khi điều kiện sai, vòng while dừng lại, không vào thân nữa. Chương trình thoát khỏi vòng lặp và tiếp tục các lệnh phía sau (nếu có).

4. Kết quả in ra cuối cùng

Chương trình in lần lượt:

Lần lặp: 1
Lần lặp: 2
Lần lặp: 3
Lần lặp: 4
Lần lặp: 5

5. Vì sao cần i++?

Nếu trong code không có dòng:

i++;

thì:

  • i luôn giữ nguyên giá trị (lúc đầu là 1).

  • Điều kiện i <= 5 tức là 1 <= 5 luôn đúng.

  • Vòng lặp sẽ chạy vô hạn, in Lần lặp: 1 mãi mãi → gọi là vòng lặp vô hạn.

Nên i++ là bước làm cho i tiến dần đến lúc điều kiện sai, để vòng lặp kết thúc an toàn.

Ví dụ 2: Nhập mật khẩu cho đến khi đúng
using System;

class Program
{
    static void Main()
    {
        string correctPassword = "123456";
        string input = "";

        while (input != correctPassword)
        {
            Console.Write("Nhập mật khẩu: ");
            input = Console.ReadLine();

            if (input != correctPassword)
            {
                Console.WriteLine("Sai mật khẩu, vui lòng thử lại!\n");
            }
        }

        Console.WriteLine("Đăng nhập thành công!");
    }
}

🔍 Giải thích

  • input != correctPassword → vòng lặp tiếp tục chạy khi mật khẩu nhập sai.

  • Khi người dùng nhập đúng, điều kiện sai → vòng lặp dừng.

  • Đây là mô hình phổ biến trong:

    • Đăng nhập hệ thống

    • Xác thực mã PIN

    • Nhập mã OTP

5.3.3. Vòng lặp do...while (Làm trước, kiểm tra sau)

  • Bản chất: Làm ít nhất 1 lần rồi mới kiểm tra.

  • Cú pháp vòng lặp do…while trong C#

do
{
    // Khối lệnh được thực hiện ít nhất 1 lần
}
while (điều_kiện);

🔍 Giải thích

  • Khối lệnh luôn chạy ít nhất 1 lần, dù điều kiện đúng hay sai.

  • Sau khi chạy xong, chương trình mới kiểm tra điều_kiện.

  • Nếu điều kiện true → lặp tiếp.

  • Nếu điều kiện false → dừng vòng lặp.

  • Ứng dụng thực tế (Khi nào dùng?):

    • Dùng khi bắt buộc đoạn mã phải chạy ít nhất 1 lần.

    • Ví dụ điển hình: Kiểm tra nhập liệu (Validation). Yêu cầu người dùng nhập mật khẩu, nhập sai thì bắt nhập lại cho đến khi đúng. Menu chương trình (hiện menu rồi mới chọn thoát).

Ví dụ 1: Nhập số cho đến khi nhập số > 0

🧩 Giải thích từng phần của code

1️⃣ Khai báo biến

int number;
  • Tạo biến number kiểu số nguyên.

  • Chưa gán giá trị ngay.

2️⃣ Cấu trúc do…while

do
{
    Console.Write("Nhập một số dương: ");
    number = int.Parse(Console.ReadLine());
}
while (number <= 0);

✔ do { … } while hoạt động như sau:

  • Khối lệnh bên trong do { } luôn chạy ít nhất 1 lần, dù điều kiện đúng hay sai.

  • Sau khi chạy xong, nó mới kiểm tra điều kiện trong while.

🔄 Diễn biến từng bước

🔸 Bước 1: Chạy khối do

Chương trình in ra:

Nhập một số dương:

Người dùng nhập một số → ví dụ nhập -5.

Lệnh:

number = int.Parse(Console.ReadLine());

→ chuyển chuỗi nhập vào thành số nguyên và gán vào number.

🔸 Bước 2: Kiểm tra điều kiện

Điều kiện:

number <= 0
  • Nếu người dùng nhập -5 → điều kiện đúng → lặp lại từ đầu.

  • Nếu nhập 0 → điều kiện đúng → lặp lại.

  • Nếu nhập 10 → điều kiện sai → thoát vòng lặp.

3️⃣ Sau khi thoát vòng lặp

Console.WriteLine("Bạn đã nhập số hợp lệ: " + number);

Ví dụ người dùng nhập 7, chương trình in:

Bạn đã nhập số hợp lệ: 7

📌 Tóm tắt hoạt động

  • Chương trình yêu cầu nhập số.

  • Nếu số <= 0, yêu cầu nhập lại.

  • Khi nhập số > 0, vòng lặp dừng.

  • In ra số hợp lệ.

5.4. Tổng kết: Khi nào dùng cái gì? (Bảng vàng ghi nhớ)

Tình huốngNên dùng cấu trúc nào?Tại sao?
Kiểm tra Đúng/Sai (Pass/Fail)if...elseĐơn giản, trực quan.
Phân loại theo khoảng (Điểm số, Thuế)if...else if...elseXử lý được các phép so sánh lớn hơn/nhỏ hơn.
Menu chức năng (Chọn 1, 2, 3)switch...caseCode gọn gàng, dễ đọc hơn if nhiều lần.
Duyệt danh sách/Mảng (Biết số lượng)forQuản lý biến đếm i gọn gàng.
Đọc File/CSDL (Không biết số lượng)whileAn toàn, kiểm tra trước khi đọc.
Bắt nhập lại dữ liệudo...whileĐảm bảo người dùng được nhập ít nhất 1 lần.

Bài tập thực hành

Bài 5.1: Kiểm tra Số Âm/Dương

  • Đề bài: Nhập vào một số nguyên n. Kiểm tra và in ra màn hình xem đó là “Số Dương”, “Số Âm” hay “Số Không”.

  • Gợi ý: Sử dụng if (n > 0), else if (n < 0)else.

  • Phân tích: Có 3 trường hợp xảy ra với một số nguyên n: lớn hơn 0 (Dương), nhỏ hơn 0 (Âm), và bằng 0.

  • Hướng dẫn:

    1. Dùng int.Parse(Console.ReadLine()) để nhập n.

    2. Viết if (n > 0): In “Số Dương”.

    3. Viết else if (n < 0): In “Số Âm”.

    4. Viết else: In “Số Không”.

Bài làm tham khảo.

Bài 5.2: Tìm số lớn nhất trong 3 số

  • Đề bài: Nhập vào 3 số thực a, b, c. Tìm và in ra số lớn nhất (Max).

  • Gợi ý: Giả sử max = a. So sánh max với b, nếu b > max thì max = b. Tiếp tục so sánh max với c.

  • Phân tích: Chúng ta cần tìm “vua” trong 3 số a, b, c. Cách dễ nhất là giả định a là vua, sau đó cho bc thách đấu.

  • Hướng dẫn:

    1. Nhập 3 số a, b, c.

    2. Khai báo double max = a; (Giả sử a lớn nhất).

    3. if (b > max) thì cập nhật max = b;.

    4. if (c > max) thì cập nhật max = c;.

    5. In biến max ra màn hình.

Bài làm tham khảo.

Bài 5.3: Xếp loại Học lực (Thang điểm 10)

  • Đề bài: Nhập điểm trung bình (ĐTB). Xếp loại như sau:

    • ĐTB >= 9.0: Xuất sắc

    • 8.0 <= ĐTB < 9.0: Giỏi

    • 6.5 <= ĐTB < 8.0: Khá

    • 5.0 <= ĐTB < 6.5: Trung bình

    • ĐTB < 5.0: Yếu

  • Phân tích: Đây là bài toán kiểm tra khoảng giá trị. Cần sắp xếp điều kiện từ cao xuống thấp (hoặc thấp lên cao) để tránh lỗi logic.

  • Hướng dẫn:

    1. Nhập diemTB (kiểu double).

    2. Dùng chuỗi if...else if theo thứ tự giảm dần:

      • if (diemTB >= 9.0) -> Xuất sắc.

      • else if (diemTB >= 8.0) -> Giỏi (Không cần kiểm tra < 9.0 nữa vì điều kiện trên đã lọc rồi).

      • else if (diemTB >= 6.5) -> Khá.

      • else if (diemTB >= 5.0) -> Trung bình.

      • else -> Yếu.

Bài làm tham khảo

Bài 5.4: Tính cước Taxi (Bài toán thực tế)

  • Đề bài: Tính tiền cước taxi dựa trên số km nhập vào:

    • 1 km đầu tiên: 15.000đ.

    • Từ km thứ 2 đến km thứ 5: 13.500đ/km.

    • Từ km thứ 6 trở đi: 11.000đ/km.

    • Nếu đi hơn 120km, giảm 10% tổng tiền.

  • Logic:

    • if (km <= 1) tien = 15000;

    • else if (km <= 5) tien = 15000 + (km - 1) * 13500;

    • else tien = 15000 + 4 * 13500 + (km - 5) * 11000;

    • Sau đó kiểm tra if (km > 120) để giảm giá.

  • Phân tích: Đây là bài khó nhất phần này. Tiền cước được tính cộng dồn (lũy tiến), không phải lấy tổng km nhân với giá rẻ nhất.

    • Ví dụ: Đi 10km.

    • 1km đầu: 15k.

    • 4km tiếp (từ km2->km5): 4 * 13.5k.

    • 5km cuối (từ km6->km10): 5 * 11k.

  • Hướng dẫn:

    1. Nhập soKm (double). Khai báo tien = 0.

    2. Mức 1: if (soKm <= 1) -> tien = 15000;

    3. Mức 2: else if (soKm <= 5) -> tien = 15000 + (soKm - 1) * 13500; (Trừ 1km đầu đã tính giá 15k).

    4. Mức 3: else -> tien = 15000 + 4 * 13500 + (soKm - 5) * 11000; (Trừ 5km đầu đã tính ở mức 1 và 2).

    5. Giảm giá: Sau khi tính xong tien, kiểm tra if (soKm > 120) -> tien = tien * 0.9; (Giảm 10%).

Bài làm tham khảo

Bài 5.5: Đọc số thành chữ (0-9)

  • Đề bài: Nhập vào một số nguyên từ 0 đến 9. In ra cách đọc tiếng Việt (Ví dụ: 1 -> “Một”, 5 -> “Năm”). Nếu nhập ngoài 0-9 thì báo “Không biết đọc”.

  • Gợi ý: switch(so) { case 0: ... break; case 1: ... break; ... default: ... }

  • Phân tích: Ánh xạ 1-1 từ một số nguyên sang chuỗi ký tự.

  • Hướng dẫn:

    1. Nhập so (int).

    2. switch(so)

    3. Viết các case 0: in “Không”, case 1: in “Một”… đến case 9.

    4. default: in “Không biết đọc” (xử lý số âm hoặc >9).

Bài 5.6: Máy tính Mini (Cộng, Trừ, Nhân, Chia)

  • Đề bài: Nhập vào một số nguyên (2-8). In ra thứ tương ứng (2 -> Thứ Hai, … 8 -> Chủ Nhật).

  • Gợi ý: Dùng default để báo lỗi nếu nhập số khác (ví dụ số 9).

  • Phân tích: Người dùng nhập toán tử dạng ký tự (+, -, *, /). Cần xử lý lỗi chia cho 0.

  • Hướng dẫn:

    1. Nhập a, b. Nhập pheptinh (string hoặc char).

    2. switch(pheptinh)

    3. case "+": in a + b. break;

    4. case "-": in a - b. break;

    5. case "*": in a * b. break;

    6. case "/":

      • Bên trong case này, viết if (b == 0) báo lỗi.

      • else in a / b.

      • break;

Bài 5.7: Tra cứu ngày trong tuần

  • Đề bài: Nhập vào một số nguyên (2-8). In ra thứ tương ứng (2 -> Thứ Hai, … 8 -> Chủ Nhật).

  • Gợi ý: Dùng default để báo lỗi nếu nhập số khác (ví dụ số 9).

  • Phân tích: Tương tự bài 5.1. Nhập số 2-8, in Thứ Hai – Chủ Nhật.

  • Hướng dẫn: Dùng switch với các case 2 đến case 8. Dùng default để báo lỗi nếu nhập số ngoài phạm vi.

Bài 5.8: Số ngày trong tháng (Kết hợp Switch và If)

  • Đề bài: Nhập vào ThángNăm. Cho biết tháng đó có bao nhiêu ngày.

  • Logic:

    • case 1, 3, 5, 7, 8, 10, 12: 31 ngày.

    • case 4, 6, 9, 11: 30 ngày.

    • case 2: Kiểm tra năm nhuận (nam % 400 == 0 || (nam % 4 == 0 && nam % 100 != 0)) để in ra 28 hoặc 29 ngày.

  • Phân tích: Có 3 nhóm tháng: nhóm 31 ngày, nhóm 30 ngày, và tháng 2 đặc biệt.

  • Hướng dẫn:

    1. Nhập thang, nam.

    2. switch(thang)

    3. Nhóm 1: case 1: case 3: case 5: case 7: case 8: case 10: case 12: -> songay = 31; break; (Kỹ thuật dồn case – Fall through).

    4. Nhóm 2: case 4: case 6: case 9: case 11: -> songay = 30; break;

    5. Nhóm 3: case 2:

      • Kiểm tra năm nhuận: if ((nam % 400 == 0) || (nam % 4 == 0 && nam % 100 != 0)) -> songay = 29;

      • else -> songay = 28;

      • break;

    6. In kết quả songay.

Bài 5.9: In dãy số chẵn

  • Đề bài: Nhập số nguyên n. In ra tất cả các số chẵn từ 0 đến n.

  • Tìm hiểu đề bài

    • Nhập vào: một số nguyên n.

    • Yêu cầu: in ra tất cả các số chẵn từ 0 đến n (nếu n là lẻ thì dừng ở số chẵn gần nhất nhỏ hơn n).

    Ví dụ:

    • Nếu n = 10 → in: 0 2 4 6 8 10

    • Nếu n = 9 → in: 0 2 4 6 8

  • Xác định thuật toán (cách làm)

    Ý tưởng:

    1. Nhập n từ bàn phím.

    2. Dùng vòng lặp for với biến đếm i chạy:

      • bắt đầu từ 0 (vì 0 là số chẵn đầu tiên),

      • điều kiện dừng: i <= n,

      • bước nhảy: tăng i lên 2 sau mỗi lần lặp (vì đi cách 2 đơn vị thì luôn nhảy từ số chẵn này sang số chẵn tiếp theo).

    3. Trong mỗi vòng lặp, in ra i.

Hướng dẫn làm bài: Bài làm tham khảo

1. Phân tích vòng lặp for

Cú pháp cơ bản:

for (khởi_tạo; điều_kiện; bước_nhảy) {
    // thân vòng lặp
}

Áp dụng vào bài:

  • Khởi tạo: int i = 0; → bắt đầu từ 0.

  • Điều kiện: i <= n; → còn nhỏ hơn hoặc bằng n thì còn lặp.

  • Bước nhảy: i += 2; → sau mỗi vòng, cộng thêm 2.

2. Mô phỏng một ví dụ để hiểu rõ

Giả sử n = 7.

  • Lần 1: i = 00 <= 7 đúng → in 0 → tăng i thành 2.

  • Lần 2: i = 22 <= 7 đúng → in 2 → tăng i thành 4.

  • Lần 3: i = 44 <= 7 đúng → in 4 → tăng i thành 6.

  • Lần 4: i = 66 <= 7 đúng → in 6 → tăng i thành 8.

  • Lần 5: i = 88 <= 7 sai → dừng.

Kết quả in: 0 2 4 6.

Bài 5.10: Hãy in tất cả các số lẻ từ 1 đến n. Số n được nhập từ bàn phím.

  1. Hiểu đề bài
  • Nhập vào: một số nguyên nn từ bàn phím.

  • Yêu cầu: in ra tất cả các số lẻ từ 1 đến n.

  • Nếu n là lẻ thì in đến n, nếu n là chẵn thì dừng ở số lẻ gần nhất nhỏ hơn n.

Ví dụ:

  • n = 10 → in: 1 3 5 7 9

  • n = 7 → in: 1 3 5 7

2. Ý tưởng giải

Có hai cách phổ biến:

  1. Cách 1 – Dùng bước nhảy 2:

    • Bắt đầu từ 1

    • Mỗi lần cộng thêm 2 → luôn ra số lẻ: 1, 3, 5, 7, ...

  2. Cách 2 – Duyệt hết rồi kiểm tra số lẻ:

    • Cho i chạy từ 1 đến n

    • Nếu i % 2 != 0 thì i là số lẻ → in ra

Bài làm tham khảo

Bài 5.11: Tính Tổng dãy số

  • Đề bài: Nhập n. Tính tổng S = 1 + 2 + 3 + ... + n.

  • Gợi ý: Dùng biến tích lũy long tong = 0;. Trong vòng lặp: tong += i;.

Hướng dẫn làm bài

🔍 Giải thích từng bước

1️⃣ Cho phép nhập/xuất tiếng Việt

Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.InputEncoding = System.Text.Encoding.UTF8;
  • Giúp console hiển thị và nhận tiếng Việt không bị lỗi font.

2️⃣ Nhập số nguyên n

Console.Write("Nhập số nguyên n: ");
int n = int.Parse(Console.ReadLine());
  • Người dùng nhập n.

  • int.Parse chuyển chuỗi thành số nguyên.

3️⃣ Khởi tạo biến tổng

long tong = 0;
  • Dùng kiểu long để tránh tràn số.

4️⃣ Vòng lặp tính tổng

for (int i = 1; i <= n; i++)
{
    tong += i;
}
  • Lặp từ 1 đến n.

  • Cộng dồn vào biến tong.

5️⃣ In kết quả

Console.WriteLine("Tổng S = " + tong);

6️⃣ Dừng màn hình để xem kết quả

Console.WriteLine("\nNhấn Enter để kết thúc...");
Console.ReadLine();
  • Chương trình chờ người dùng nhấn Enter mới thoát.

Bài 5.12: Hãy viết phần mềm in 1 bảng cửu chương theo yêu cầu:

Ví dụ: Bạn muốn in bảng cửu chương mấy (1–9): 8

=== BẢNG CỬU CHƯƠNG 8 ===

8 x 1 = 8
8 x 2 = 16
8 x 3 = 24
8 x 4 = 32
8 x 5 = 40
8 x 6 = 48
8 x 7 = 56
8 x 8 = 64
8 x 9 = 72
8 x 10 = 80

Nhấn Enter để kết thúc…

Hướng dẫn và giải thích

3. Giải thích từng phần của code

a. Khai báo thư viện

using System;
  • System chứa các lớp cơ bản, trong đó có Console.

  • Nhờ có dòng này, ta dùng được Console.WriteLine, Console.ReadLine, v.v.

b. Khai báo lớp và hàm Main

class Program
{
    static void Main(string[] args)
    {
        ...
    }
}
  • class Program: khai báo một lớp tên Program, đây là nơi chứa code chính.

  • static void Main(string[] args):

    • Main là điểm bắt đầu chương trình.

    • Khi chạy, chương trình sẽ bắt đầu thực thi từ hàm Main.

c. Cho phép hiển thị tiếng Việt

Console.OutputEncoding = System.Text.Encoding.UTF8;
  • Thiết lập bảng mã cho console.

  • UTF8 giúp hiển thị tiếng Việt không bị lỗi dấu (nếu console hỗ trợ).

d. Hỏi người dùng muốn in bảng cửu chương mấy

Console.Write("Bạn muốn in bảng cửu chương mấy (1–9): ");
int n = int.Parse(Console.ReadLine());
  • Console.Write: in câu hỏi ra màn hình, không xuống dòng.

  • Console.ReadLine(): chờ người dùng nhập từ bàn phím và nhấn Enter → lấy chuỗi đó.

  • int.Parse(...): chuyển chuỗi đó thành số nguyên.

  • Gán giá trị cho biến n.

Ví dụ: nếu người dùng nhập 7, thì sau dòng này n = 7.

e. In tiêu đề cho đẹp

Console.WriteLine();
Console.WriteLine("=== BẢNG CỬU CHƯƠNG " + n + " ===");
Console.WriteLine();
  • Console.WriteLine(); (không tham số) → in một dòng trống.

  • Dòng giữa in ra tiêu đề, ví dụ: === BẢNG CỬU CHƯƠNG 7 ===.

f. Vòng lặp in bảng cửu chương

for (int i = 1; i <= 10; i++)
{
    Console.WriteLine(n + " x " + i + " = " + (n * i));
}
  • for (int i = 1; i <= 10; i++):

    • Khởi tạo: int i = 1 → bắt đầu từ 1.

    • Điều kiện: i <= 10 → vòng lặp chạy khi i từ 1 đến 10.

    • Bước nhảy: i++ → sau mỗi vòng, i tăng lên 1.

  • Trong thân vòng lặp:

    Console.WriteLine(n + " x " + i + " = " + (n * i));
    
    • Ghép chuỗi để in phép nhân.

    • Ví dụ với n = 7, lần lượt in:

      • 7 x 1 = 7

      • 7 x 2 = 14

      • 7 x 10 = 70

g. Dừng màn hình để xem kết quả

Console.WriteLine();
Console.WriteLine("Nhấn Enter để kết thúc...");
Console.ReadLine();
  • In thông báo.

  • Console.ReadLine(); chờ người dùng nhấn Enter → nhờ vậy cửa sổ console không tắt ngay, bạn có thời gian xem kết quả.

4. Chạy thử chương trình

  1. Nhấn F5 hoặc vào Debug → Start Debugging.

  2. Màn hình console xuất hiện, hiển thị:

    Bạn muốn in bảng cửu chương mấy (1–9):
    
  3. Nhập, ví dụ: 5 rồi nhấn Enter.

  4. Kết quả:

    === BẢNG CỬU CHƯƠNG 5 ===
    
    5 x 1 = 5
    5 x 2 = 10
    5 x 3 = 15
    5 x 4 = 20
    5 x 5 = 25
    5 x 6 = 30
    5 x 7 = 35
    5 x 8 = 40
    5 x 9 = 45
    5 x 10 = 50
    
    Nhấn Enter để kết thúc...
    
  5. Nhấn Enter để đóng cửa sổ.

Bài 5.13: Hãy viết phần mềm in 1 hay hết bảng cửu chương theo yêu cầu:

Hướng dẫn

Bước 1: Mở Visual Studio và tạo Project mới

  1. Mở Visual Studio.

  2. Chọn File → New → Project…

  3. Trong cửa sổ hiện ra:

    • Chọn Visual C# (hoặc C#).

    • Chọn Console Application.

    • Đặt tên, ví dụ: BangCuuChuongMenu.

    • Chọn nơi lưu nếu muốn.

    • Bấm OK.

Visual Studio sẽ tạo sẵn một project với file Program.cs.

Bước 2: Mở file Program.cs

  1. Trong Solution Explorer (thường ở bên phải), bấm vào Program.cs.

  2. Bạn sẽ thấy cấu trúc sơ bộ giống như:

using System;

class Program
{
    static void Main(string[] args)
    {
        // code sẽ viết ở đây
    }
}

Nếu khác một chút cũng không sao, miễn là có hàm Main.

Bước 3: Viết toàn bộ code vào hàm Main

Xóa nội dung cũ bên trong Main và thay bằng đoạn code dưới đây (giữ lại using System;class Program):

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.OutputEncoding = System.Text.Encoding.UTF8;

        string tiepTuc = "y";

        while (tiepTuc == "y" || tiepTuc == "Y")
        {
            Console.WriteLine("=== CHƯƠNG TRÌNH IN BẢNG CỬU CHƯƠNG ===");
            Console.WriteLine("1. In một bảng cửu chương");
            Console.WriteLine("2. In tất cả bảng từ 1 đến 9");
            Console.Write("Mời bạn chọn (1 hoặc 2): ");

            int choice = int.Parse(Console.ReadLine());
            Console.WriteLine();

            if (choice == 1)
            {
                Console.Write("Bạn muốn in bảng cửu chương mấy (1–9): ");
                int n = int.Parse(Console.ReadLine());

                Console.WriteLine("\n=== BẢNG CỬU CHƯƠNG " + n + " ===\n");

                for (int i = 1; i <= 10; i++)
                {
                    Console.WriteLine(n + " x " + i + " = " + (n * i));
                }
            }
            else if (choice == 2)
            {
                Console.WriteLine("=== TẤT CẢ BẢNG CỬU CHƯƠNG 1–9 ===\n");

                for (int n = 1; n <= 9; n++)
                {
                    Console.WriteLine("Bảng " + n);

                    for (int i = 1; i <= 10; i++)
                    {
                        Console.WriteLine(n + " x " + i + " = " + (n * i));
                    }

                    Console.WriteLine();
                }
            }
            else
            {
                Console.WriteLine("Lựa chọn không hợp lệ!");
            }

            Console.WriteLine();
            Console.Write("Bạn có muốn tiếp tục không (y/n): ");
            tiepTuc = Console.ReadLine();
            Console.WriteLine();
        }

        Console.WriteLine("Cảm ơn bạn đã sử dụng chương trình!");
        Console.WriteLine("Nhấn Enter để thoát...");
        Console.ReadLine();
    }
}

Bước 4: Hiểu từng phần trong chương trình

4.1. Dòng thiết lập tiếng Việt

Console.OutputEncoding = System.Text.Encoding.UTF8;
  • Giúp console hiển thị tiếng Việt đúng dấu.

4.2. Biến điều khiển lặp

string tiepTuc = "y";
  • Ban đầu gán "y" để chắc chắn vòng lặp chạy lần đầu.

4.3. Vòng lặp while bao quanh menu

while (tiepTuc == "y" || tiepTuc == "Y")
{
    // toàn bộ menu và xử lý in bảng nằm trong đây
}
  • Chừng nào tiepTuc"y" hoặc "Y" thì chương trình còn chạy tiếp.

  • Khi bạn nhập "n" thì điều kiện sai → thoát vòng lặp.

4.4. In menu lựa chọn

Console.WriteLine("=== CHƯƠNG TRÌNH IN BẢNG CỬU CHƯƠNG ===");
Console.WriteLine("1. In một bảng cửu chương");
Console.WriteLine("2. In tất cả bảng từ 1 đến 9");
Console.Write("Mời bạn chọn (1 hoặc 2): ");

int choice = int.Parse(Console.ReadLine());
Console.WriteLine();
  • In ra hai lựa chọn.

  • choice nhận giá trị 1 hoặc 2 (do người dùng nhập).

4.5. Trường hợp 1: In một bảng

if (choice == 1)
{
    Console.Write("Bạn muốn in bảng cửu chương mấy (1–9): ");
    int n = int.Parse(Console.ReadLine());

    Console.WriteLine("\n=== BẢNG CỬU CHƯƠNG " + n + " ===\n");

    for (int i = 1; i <= 10; i++)
    {
        Console.WriteLine(n + " x " + i + " = " + (n * i));
    }
}
  • Hỏi thêm người dùng muốn in bảng nào (n từ 1 đến 9).

  • Vòng for in từ n x 1 đến n x 10.

4.6. Trường hợp 2: In tất cả bảng

else if (choice == 2)
{
    Console.WriteLine("=== TẤT CẢ BẢNG CỬU CHƯƠNG 1–9 ===\n");

    for (int n = 1; n <= 9; n++)
    {
        Console.WriteLine("Bảng " + n);

        for (int i = 1; i <= 10; i++)
        {
            Console.WriteLine(n + " x " + i + " = " + (n * i));
        }

        Console.WriteLine();
    }
}
  • Vòng for ngoài: n chạy từ 1 đến 9 → từng bảng cửu chương.

  • Vòng for trong: i chạy từ 1 đến 10 → từng dòng trong bảng đó.

4.7. Trường hợp nhập sai

else
{
    Console.WriteLine("Lựa chọn không hợp lệ!");
}
  • Nếu choice không phải 1 hoặc 2.

4.8. Hỏi có tiếp tục không

Console.WriteLine();
Console.Write("Bạn có muốn tiếp tục không (y/n): ");
tiepTuc = Console.ReadLine();
Console.WriteLine();
  • Người dùng nhập y → quay lại vòng lặp, hiện lại menu.

  • Nhập n → thoát vòng lặp.

4.9. Thoát chương trình

Console.WriteLine("Cảm ơn bạn đã sử dụng chương trình!");
Console.WriteLine("Nhấn Enter để thoát...");
Console.ReadLine();
  • In lời chào.

  • Chờ Enter để cửa sổ không tắt ngay.

Bước 5: Chạy chương trình

  1. Nhấn F5 (hoặc vào menu Debug → Start Debugging).

  2. Console hiện lên:

    • Chọn 1 → in một bảng.

    • Chọn 2 → in tất cả.

  3. Sau khi in xong, nó hỏi:

    Bạn có muốn tiếp tục không (y/n):
    
    • Nhập y → quay lại menu.

    • Nhập n → kết thúc chương trình.

Bài 5.14: Tính tổng các số chẵn từ 1 đến n. Dùng vòng lặp while

  • Gợi ý: Có 2 cách:

    • Cách 1: Dùng i chạy từ 1 đến n, nhưng chỉ cộng khi i % 2 == 0.

    • Cách 2: Khởi tạo i = 2, tăng i = i + 2 mỗi vòng.

Hướng dẫn làm bài

Bài 5.15: Nhập và tính tổng cho đến khi người dùng nhập 0. Dùng vòng lặp while

Yêu cầu

  • Viết chương trình:

    • Liên tục yêu cầu người dùng nhập một số nguyên.

    • Nếu nhập 0 → dừng lại.

    • Nếu khác 0 → cộng vào tổng.

  • Sau khi dừng, in ra tổng các số đã nhập (không tính 0).

Hướng dẫn làm bài

Gợi ý thuật toán

  • Bước 1: Khai báo int sum = 0;.

  • Bước 2: Khai báo int x; để lưu số vừa nhập.

  • Bước 3: Dùng while (true) hoặc while (x != 0):

    • Hỏi người dùng “Nhập số (0 để dừng): ”.

    • Đọc và chuyển sang int.

    • Nếu x == 0 → thoát vòng lặp (break hoặc điều kiện sai).

    • Ngược lại → cộng x vào sum.

  • Bước 4: In ra sum.

Bài 5.16:Tìm số lớn nhất trong dãy số nhập vào. Dùng vòng lặp while

🎯 Mục tiêu

  • Luyện vòng lặp while

  • Luyện xử lý nhập nhiều lần

  • Luyện tìm giá trị lớn nhất

📝 Yêu cầu

  • Người dùng nhập liên tục các số nguyên

  • Nhập 0 để dừng

  • In ra số lớn nhất đã nhập (không tính 0)

💡 Gợi ý

  • Dùng biến max

  • Gán max = int.MinValue để đảm bảo mọi số nhập vào đều lớn hơn

Hướng dẫn làm bài

Ý tưởng thuật toán (nghĩ trước khi code)

  1. Chuẩn bị biến lưu số lớn nhất: gọi là max.

  2. Lặp:

    • Hỏi người dùng: “Nhập số (0 để dừng)”.

    • Đọc số vừa nhập vào, gán vào x.

    • Nếu x == 0 → dừng nhập (thoát vòng lặp).

    • Ngược lại:

      • Nếu x > max thì cập nhật lại max = x.

  3. Sau khi dừng vòng lặp → in ra max.

Vấn đề: ban đầu gán max bằng gì?

  • Nếu gán max = 0; thì:

    • Trường hợp người dùng toàn nhập số âm, ví dụ: -5, -2, -10, rồi nhập 0 dừng → max vẫn là 0 (sai).

  • Cách an toàn: gán max = int.MinValue;

    • Đây là giá trị nhỏ nhất mà kiểu int có thể chứa.

    • Bất kỳ số nhập nào (trừ khi lỗi kiểu dữ liệu) cũng sẽ lớn hơn hoặc bằng nó.

Bài 5.17: Hãy viết phần mềm phân biệt số do người dùng nhập vào

Bài làm tham khảo

📝 Yêu cầu bài toán

Viết chương trình:

  1. Người dùng nhập liên tục các số nguyên.

  2. Nếu nhập 0 → dừng chương trình.

  3. Với mỗi số nhập vào:

    • Nếu số > 0 → in: “Số dương”

    • Nếu số < 0 → in: “Số âm”

  4. Sau khi dừng, in ra:

    • Tổng số dương

    • Tổng số âm

Phân tích Đề bài :

  • Người dùng sẽ nhập nhiều số nguyên.

  • Mỗi lần nhập:

    • Nếu số đó > 0 → báo: “Số dương”.

    • Nếu số đó < 0 → báo: “Số âm”.

  • Nếu người dùng nhập số 0dừng nhập, kết thúc chương trình.

  • Sau khi dừng:

    • In ra tổng số lượng số dương đã nhập.

    • In ra tổng số lượng số âm đã nhập.

Ràng buộc quan trọng:

  • Phải dùng vòng lặp while.

  • Phải dùng if…else để phân loại số âm / dương.

Các bước làm bài:

B1. Chuẩn bị khung chương trình C# cơ bản

Bước này để có “bộ khung” trước, rồi mới thêm logic.

using System;
using System.Text;

class Program
{
    static void Main()
    {
        Console.OutputEncoding = Encoding.UTF8;

        // TODO: Viết code xử lý ở đây

        Console.WriteLine("Nhấn phím bất kỳ để thoát...");
        Console.ReadKey();
    }
}

Giải thích:

  • using System;class Program… là cấu trúc chuẩn của chương trình C#.

  • Console.OutputEncoding = Encoding.UTF8; giúp in tiếng Việt đúng.

  • Console.ReadKey(); để dừng màn hình, tránh console tắt quá nhanh.

B2. Khai báo các biến cần thiết

Theo ý tưởng ở mục 2, ta cần:

  • Một biến để lưu số người dùng nhập mỗi lầnx

  • Hai biến để đếm:

    • countPositive → đếm số dương

    • countNegative → đếm số âm

Thêm vào trong Main():

int x; // số người dùng nhập
int countPositive = 0; // đếm số dương
int countNegative = 0; // đếm số âm

Đặt ngay sau dòng Console.OutputEncoding = Encoding.UTF8;.

B3. Thiết kế vòng lặp while

Ta cần cho phép người dùng nhập nhiều lần, và chưa biết trước sẽ nhập bao nhiêu số, nên dùng:

while (true)
{
    // nhập số và xử lý
}

Giải thích:

  • while (true) nghĩa là vòng lặp chạy mãi mãi.

  • Muốn dừng, ta sẽ dùng break; bên trong khi gặp điều kiện dừng (x == 0).

Thêm vào trong Main():

while (true)
{
    // Bước 1: yêu cầu nhập
    // Bước 2: đọc số
    // Bước 3: nếu 0 thì dừng
    // Bước 4: if else phân loại
}

B4. Nhập số từ bàn phím trong vòng lặp

Bên trong while (true), thêm đoạn nhập:

Console.Write("Nhập số (0 để dừng): ");
x = int.Parse(Console.ReadLine());

Giải thích:

  • Console.Write(...) in lời nhắc trên cùng một dòng.

  • Console.ReadLine() đọc chuỗi người dùng nhập.

  • int.Parse(...) chuyển chuỗi đó thành số nguyên, gán vào x.

B5. Điều kiện dừng bằng if và break

Sau khi đọc x, ta kiểm tra:

  • Nếu x == 0 → thoát vòng lặp.

Thêm ngay dưới phần nhập:

if (x == 0)
{
    break; // thoát khỏi vòng lặp while
}

Giải thích:

  • break; làm chương trình nhảy ra khỏi while, đi tiếp xuống phần in kết quả.

B6. Phân loại số bằng if…else

Nếu x không phải 0 (đã loại ở trên), nó chỉ có thể là:

  • Số dương (x > 0)

  • Hoặc số âm (x < 0)

Ta dùng if…else:

if (x > 0)
{
    Console.WriteLine("→ Đây là số dương");
    countPositive++; // tăng số lượng số dương
}
else
{
    Console.WriteLine("→ Đây là số âm");
    countNegative++; // tăng số lượng số âm
}

Giải thích:

  • countPositive++ là viết tắt của countPositive = countPositive + 1;

  • Tương tự cho countNegative++.

B7. In kết quả sau khi thoát vòng lặp

Sau khi break; chạy, chương trình đi ra khỏi while và tiếp tục các dòng phía sau nó.

Ta in kết quả:

Console.WriteLine("\nKẾT QUẢ:");
Console.WriteLine("Tổng số dương: " + countPositive);
Console.WriteLine("Tổng số âm: " + countNegative);

Giải thích:

  • "\n" xuống dòng cho đẹp.

  • Dùng nối chuỗi "..." + biến.

Đặt các dòng này trước:

Console.WriteLine("Nhấn phím bất kỳ để thoát...");
Console.ReadKey();

Bài 5.18: Hãy viết phần mềm Trò chơi đoán số có giới hạn lượt.

Yêu cầu: Máy tính chọn số bí mật (ví dụ 1–100). Người dùng có tối đa 7 lần đoán.

  • Nếu đoán sai, báo “Cao quá” hoặc “Thấp quá”.

  • Nếu đoán đúng, kết thúc ngay.

  • Nếu hết lượt mà chưa đoán đúng → báo thua.

Bài 5.19: Hãy viết phần mềm Phân tích số nguyên tố

  • Yêu cầu: Người dùng nhập liên tục số nguyên dương.

    • Nếu số đó là nguyên tố, cộng vào tổng nguyên tố.

    • Nếu không phải nguyên tố, bỏ qua.

    • Nếu nhập 0 thì kết thúc.

    • In ra tổng các số nguyên tố đã nhập.

Bài 5.20: Hãy viết phần mềm Quản lý danh sách điểm số. Trong bài phải sử dụng vòng lặp do…while

  • Yêu cầu: Người dùng nhập liên tục điểm số (0–100).

    • Nếu nhập ngoài khoảng thì báo lỗi và bỏ qua.

    • Nếu nhập -1 thì kết thúc.

    • Trong quá trình nhập, chương trình phải:

      • Đếm số lượng điểm hợp lệ.

      • Tính điểm trung bình.

      • Xác định điểm cao nhất và thấp nhất.

    • Sau khi kết thúc, in ra toàn bộ kết quả.