BÀI 3: CHƯƠNG TRÌNH C# 2008

3.1. Biên dịch và thực thi chương trình

Trong Visual Studio, quá trình này được tự động hóa cao:

  • Biên dịch (Build): Là quá trình dịch mã nguồn C# (dễ đọc, .cs) sang mã Ngôn ngữ Trung gian (MSIL) và tạo ra tệp thực thi (.exe hoặc .dll).

    • Cách làm: Menu Build -> Build Solution (hoặc nhấn Shift + Ctrl + B).

  • Thực thi (Run/Debug): Là quá trình chạy tệp .exe vừa biên dịch.

    • Cách làm: Menu Debug -> Start Debugging (Nhấn F5). Visual Studio sẽ tự động Build (nếu cần) rồi mới chạy, đồng thời kích hoạt trình gỡ lỗi (debugger).

    • Menu Debug -> Start Without Debugging (Nhấn Ctrl + F5). Chương trình chạy nhanh hơn và tự động dừng (pause) khi kết thúc (đối với Console App).

3.2. Giải thích các không gian tên (Namespaces)

  • Khái niệm: Namespace là một cách để tổ chức và nhóm các lớp (class) có liên quan lại với nhau, tránh xung đột tên. Hãy coi nó như “họ” (ví dụ: Nguyễn Văn A, Trần Văn A).

  • Từ khóa using: Dùng để “nhập khẩu” một namespace vào tệp mã nguồn, cho phép bạn sử dụng tên các lớp trong namespace đó mà không cần gõ tên đầy đủ.

  • Ví dụ:

    C#
    // Không dùng 'using', phải gõ tên đầy đủ
    System.Console.WriteLine("Hello");
    
    //-----------------------------------------------
    
    // Dùng 'using'
    using System;
    
    // ...
    // Có thể gọi trực tiếp
    Console.WriteLine("Hello");
    
  • Các namespace thường dùng:

    • System: Chứa các lớp cơ bản nhất (ví dụ: Console, String, Int32).

    • System.Windows.Forms: Chứa các lớp cho ứng dụng Windows Forms (ví dụ: Form, Button, TextBox).

    • System.Data: Chứa các lớp chung để truy cập dữ liệu.

    • System.Data.SqlClient: Chứa các lớp chuyên dụng để làm việc với SQL Server.

3.3. Các dạng của phương thức Main

Phương thức Main là điểm khởi đầu của ứng dụng Console. Nó có thể có một số dạng:

  1. Không tham số, không trả về: static void Main()

  2. Có tham số, không trả về: static void Main(string[] args)

  3. Không tham số, có trả về (int): static int Main()

  4. Có tham số, có trả về (int): static int Main(string[] args)

  • Tham số string[] args: Là một mảng (array) các chuỗi, dùng để nhận các tham số (arguments) được truyền vào khi chạy chương trình từ dòng lệnh.

  • Giá trị trả về int: Dùng để trả về một mã trạng thái cho hệ điều hành (quy ước: 0 là chạy thành công, số khác 0 là có lỗi).

  • Ví dụ (Dạng 2):

    C#
    using System;
    
    namespace ConsoleArgs
    {
        class Program
        {
            static void Main(string[] args)
            {
                if (args.Length == 0)
                {
                    Console.WriteLine("Không có tham số nào được truyền vào.");
                }
                else
                {
                    Console.WriteLine("Các tham số đã truyền vào:");
                    foreach (string s in args)
                    {
                        Console.WriteLine(s);
                    }
                }
            }
        }
    }
    // Nếu chạy từ cmd: C:\> MyProgram.exe admin 123
    // Kết quả 'args' sẽ là mảng ["admin", "123"]
    

3.4. Định dạng kết quả của cửa sổ màn hình

Trong ứng dụng Console, ta dùng lớp Console để tương tác:

  • Console.WriteLine(noidung): In noidung ra màn hình, sau đó tự động xuống dòng.

  • Console.Write(noidung): In noidung ra màn hình, nhưng con trỏ vẫn ở cuối dòng.

  • Định dạng chuỗi (String Formatting):

    C#
    string ten = "An";
    int tuoi = 20;
    
    // Cách 1: Nối chuỗi
    Console.WriteLine("Tên: " + ten + ", Tuổi: " + tuoi);
    
    // Cách 2: Định dạng (giống C)
    Console.WriteLine("Tên: {0}, Tuổi: {1}", ten, tuoi);
    
    // Cách 3: Nội suy chuỗi (String Interpolation - C# 6.0+, nên biết)
    // Console.WriteLine($"Tên: {ten}, Tuổi: {tuoi}");
    

3.5. Chú thích trong chương trình C#

Chú thích (Comment) là các dòng chữ bị trình biên dịch bỏ qua, dùng để giải thích mã nguồn.

  • Chú thích một dòng: Bắt đầu bằng //

    C#
    // Đây là chú thích một dòng
    int x = 10; // Gán giá trị 10 cho x
    
  • Chú thích nhiều dòng: Bắt đầu bằng /* và kết thúc bằng */

    C#
    /*
      Đây là một khối chú thích
      Có thể viết trên nhiều dòng.
    */
    

3.6. Khai báo chỉ thị Region

  • Công dụng: Dùng để nhóm các đoạn mã lệnh lại với nhau và thu gọn (collapse) chúng trong Visual Studio, giúp mã nguồn trông gọn gàng hơn, dễ điều hướng hơn.

  • Cú pháp:

    C#
     
    using System;
    
    namespace MyRegion
    {
        class MyClass
        {
            #region Các biến thành viên (Fields)
            // Khối này có thể thu gọn lại
            private int _id;
            private string _name;
            #endregion
    
            #region Các phương thức (Methods)
            public void Method1()
            {
                // ...
            }
    
            public void Method2()
            {
                // ...
            }
            #endregion
        }
    }

Bài tập 3.1: Viết chương trình Console TinhToan.

  1. Tạo dự án Console Application tên BaiTap3_TinhToan.
  2. Chương trình yêu cầu người dùng nhập vào 2 số nguyên (dùng ReadLine() và int.Parse()).
  3. Tính và in ra màn hình Tổng, Hiệu, Tích, Thương của 2 số đó.
  4. Sử dụng Write và Console.WriteLine để định dạng output cho đẹp.
  5. Sử dụng chú thích để giải thích các bước.

Hướng dẫn

Bước 1: Tạo dự án

Phần này tương tự Bài tập 1.2, nhưng với tên dự án mới.

  1. Mở Visual Studio 2008.

  2. Đi tới menu File -> New -> Project….

  3. Trong cửa sổ “New Project”:

    • Bên trái, chọn Visual C#.

    • Bên phải (Templates), chọn Console Application.

  4. Ở ô Name: (Tên) bên dưới, gõ chính xác BaiTap3_TinhToan.

  5. Nhấn OK.

Visual Studio sẽ tạo dự án và mở tệp Program.cs cho bạn.

Bước 2: Viết mã nguồn

Bây giờ, bạn hãy thay thế toàn bộ mã nguồn trong tệp Program.cs bằng đoạn mã dưới đây. Đoạn mã này đã bao gồm tất cả các yêu cầu: nhập liệu, tính toán, in kết quả đẹp và có chú thích.

C#

 
using System;

namespace BaiTap3_TinhToan
{
    class Program
    {
        static void Main(string[] args)
        {
             --- PHẦN 1: NHẬP LIỆU ---
             Yêu cầu nhập số thứ nhất
             Console.Write: In ra màn hình và KHÔNG xuống dòng
            Console.Write("Nhap so thu nhat a = ");
            
             Console.ReadLine(): Đọc 1 dòng người dùng nhập (kết quả là chuỗi string)
             int.Parse(): Chuyển chuỗi vừa đọc sang kiểu số nguyên (int)
            int a = int.Parse(Console.ReadLine());
            
             Yêu cầu nhập số thứ hai
            Console.Write("Nhap so thu hai b = ");
            int b = int.Parse(Console.ReadLine()); // Viết gộp 2 lệnh
            
             --- PHẦN 2: TÍNH TOÁN ---
             Tính toán các phép toán cơ bản
            int tong = a + b;
            int hieu = a - b;
            int tich = a * b;
            
             Lưu ý: Phải ép kiểu (double) cho 1 trong 2 số
             để phép chia ra kết quả số thực (ví dụ: 5 / 2 = 2.5)
             Nếu không ép kiểu (5 / 2), kết quả sẽ là 2 (chia lấy phần nguyên)
            double thuong = (double)a / b;
            
             --- PHẦN 3: XUẤT KẾT QUẢ ---
             Console.WriteLine: In ra màn hình và TỰ ĐỘNG xuống dòng
             \n là ký tự đặc biệt để xuống thêm 1 dòng, cho đẹp
            Console.WriteLine("\n--- KET QUA ---");
            
             Sử dụng định dạng {0}, {1}, {2}
             {0} sẽ được thay bằng biến đầu tiên (a)
             {1} sẽ được thay bằng biến thứ hai (b)
             {2} sẽ được thay bằng biến thứ ba (tong)
            Console.WriteLine("{0} + {1} = {2}", a, b, tong);
            Console.WriteLine("{0} - {1} = {2}", a, b, hieu);
            Console.WriteLine("{0} * {1} = {2}", a, b, tich);
            Console.WriteLine("{0} / {1} = {2}", a, b, thuong);
            
             Dừng màn hình để xem kết quả (giống Bài 1.3)
            Console.ReadKey();
        }
    }
}

Bước 3: Chạy và kiểm thử chương trình

  1. Sau khi đã gõ (hoặc dán) mã nguồn, nhấn phím F5 để biên dịch và chạy.

  2. Một cửa sổ Console (màu đen) sẽ hiện ra và hiển thị: Nhap so thu nhat a =

  3. Bạn hãy gõ một số (ví dụ: 10) rồi nhấn Enter.

  4. Chương trình sẽ tiếp tục hiển thị: Nhap so thu hai b =

  5. Bạn hãy gõ số thứ hai (ví dụ: 4) rồi nhấn Enter.

  6. Chương trình sẽ tính toán và in ra toàn bộ kết quả:

    --- KET QUA ---
    10 + 4 = 14
    10 - 4 = 6
    10 * 4 = 40
    10 / 4 = 2.5
    
  7. Chương trình sẽ dừng lại (do Console.ReadKey()). Bạn nhấn phím bất kỳ để đóng lại.

Bài tập 3.2: Thêm #region cho bài 3.1.

    • Bọc phần nhập dữ liệu trong một #region Nhap lieu.
    • Bọc phần tính toán trong một #region Tinh toan.
    • Bọc phần xuất kết quả trong một #region Xuat ket qua.
    • Thử thu gọn các region này lại.

Hướng dẫn

Bước 1: Mở lại dự án BaiTap3_TinhToan

  1. Mở Visual Studio 2008.

  2. Mở tệp Program.cs của dự án BaiTap3_TinhToan mà bạn vừa làm ở Bài 3.1.

Bước 2: Thêm các chỉ thị #region#endregion

Bạn hãy sửa lại tệp Program.cs của mình, thêm các dòng #region [Tên vùng]#endregion vào đúng vị trí như sau:

C#

 
using System;

namespace BaiTap3_TinhToan
{
    class Program
    {
        static void Main(string[] args)
        {
            #region Nhap lieu
            // --- PHẦN 1: NHẬP LIỆU ---
            // Yêu cầu nhập số thứ nhất
            Console.Write("Nhap so thu nhat a = ");
            int a = int.Parse(Console.ReadLine());
            
            // Yêu cầu nhập số thứ hai
            Console.Write("Nhap so thu hai b = ");
            int b = int.Parse(Console.ReadLine()); 
            #endregion // Kết thúc vùng Nhap lieu

            #region Tinh toan
            // --- PHẦN 2: TÍNH TOÁN ---
            int tong = a + b;
            int hieu = a - b;
            int tich = a * b;
            
            double thuong = (double)a / b;
            #endregion // Kết thúc vùng Tinh toan

            #region Xuat ket qua
            // --- PHẦN 3: XUẤT KẾT QUẢ ---
            Console.WriteLine("\n--- KET QUA ---");
            
            Console.WriteLine("{0} + {1} = {2}", a, b, tong);
            Console.WriteLine("{0} - {1} = {2}", a, b, hieu);
            Console.WriteLine("{0} * {1} = {2}", a, b, tich);
            Console.WriteLine("{0} / {1} = {2}", a, b, thuong);
            
            Console.ReadKey();
            #endregion // Kết thúc vùng Xuat ket qua
        }
    }
}

Bước 3: Thử thu gọn các region

Bây giờ là phần thú vị nhất:

  1. Sau khi gõ xong, bạn hãy nhìn sang lề trái của cửa sổ soạn thảo mã (code editor).

  2. Bạn sẽ thấy các dấu trừ (-) nhỏ xuất hiện ngay bên cạnh các dòng #region mà bạn vừa gõ.

  3. Nhấp chuột vào dấu - bên cạnh dòng #region Nhap lieu.

  4. Kết quả: Toàn bộ khối mã nhập liệu sẽ được “thu gọn” (collapse) lại, chỉ hiển thị dòng tiêu đề #region Nhap lieu ... và dấu - sẽ biến thành dấu cộng (+).

  5. Làm tương tự để thu gọn vùng Tinh toanXuat ket qua.

  6. Nhấp lại vào dấu + để “mở rộng” (expand) khối mã đó ra như cũ.

Bài tập 3.3: Nâng cấp bài TinhToan (sử dụng tham số args)

Mục tiêu: Bài tập này giúp bạn hiểu rõ mục tiêu 3.3 (Các dạng của phương thức Main). Thay vì để chương trình hỏi người dùng (dùng Console.ReadLine()), chúng ta sẽ “truyền” 2 con số vào chương trình ngay lúc nó khởi động, thông qua tham số string[] args.

Hướng dẫn thực hiện

Bước 1: Mở dự án và tệp Program.cs

  1. Mở Visual Studio 2008.

  2. Mở lại dự án BaiTap3_TinhToan (từ Bài tập 3.1).

  3. Trong cửa sổ Solution Explorer (bên phải), nhấp đúp vào tệp Program.cs để mở cửa sổ soạn thảo mã.


Bước 2: Viết mã nguồn (Chi tiết từng bước)

Chúng ta sẽ sửa lại nội dung bên trong phương thức static void Main(string[] args).

2.1. Thêm khối kiểm tra tham số (Quan trọng)

  • Mục tiêu: Trước khi làm bất cứ điều gì, chúng ta phải kiểm tra xem người dùng có truyền đủ 2 tham số (2 con số) vào hay không.

  • Hành động: Gõ đoạn mã này ngay bên dưới dòng static void Main(string[] args) {

    C#
     
    // Kiểm tra xem số lượng tham số truyền vào (args.Length) có ít hơn 2 không
    if (args.Length < 2)
    {
        // Nếu không đủ, in thông báo lỗi
        Console.WriteLine("Loi: Ban phai truyen vao 2 con so.");
        Console.WriteLine("Vi du cach dung: BaiTap3_TinhToan.exe 10 5");
    
        // Dừng màn hình để người dùng đọc lỗi
        Console.ReadKey(); 
    
        // Thoát khỏi chương trình (thoát khỏi hàm Main)
        return; 
    }
    

2.2. Xóa phần nhập liệu cũ (Xóa Console.ReadLine)

  • Mục tiêu: Chúng ta không cần hỏi người dùng nữa, nên phải xóa code cũ.

  • Hành động: Tìm và xóa 4 dòng code dùng để hỏi và đọc số a, b:

    C#
     
    // XÓA NHỮNG DÒNG NÀY:
    // Console.Write("Nhap so thu nhat a = ");
    // int a = int.Parse(Console.ReadLine());
    // Console.Write("Nhap so thu hai b = ");
    // int b = int.Parse(Console.ReadLine());
    

2.3. Thêm phần lấy dữ liệu từ args

  • Mục tiêu: Thay thế code vừa xóa bằng code mới, lấy dữ liệu từ mảng args.

  • Hành động: Gõ đoạn mã này vào vị trí bạn vừa xóa (ngay bên dưới khối if bạn gõ ở 2.1).

    C#
     
    // Lấy 2 tham số đầu tiên và chuyển sang kiểu số
    // args[0] là tham số thứ nhất (dưới dạng chuỗi)
    // args[1] là tham số thứ hai (dưới dạng chuỗi)
    Console.WriteLine("Dang lay tham so tu dong lenh...");
    int a = int.Parse(args[0]);
    int b = int.Parse(args[1]);
    

2.4. (Tùy chọn) Sửa lại phần xuất kết quả (cho rõ ràng)

  • Mục tiêu: Sửa lại lời dẫn của kết quả để biết rằng đây là dữ liệu tự động.

  • Hành động: Tìm đến phần “XUẤT KẾT QUẢ” và sửa lại như sau:

    C#
     
    // --- PHẦN 3: XUẤT KẾT QUẢ ---
    Console.WriteLine("\n--- KET QUA (Tu dong) ---");
    Console.WriteLine("Tham so 1 (a) = " + a);
    Console.WriteLine("Tham so 2 (b) = " + b);
    
    // Phần tính toán và in kết quả {0} + {1} ... giữ nguyên
    Console.WriteLine("\n--- TINH TOAN ---");
    Console.WriteLine("{0} + {1} = {2}", a, b, tong);
    // ... (các dòng in Hiệu, Tích, Thương giữ nguyên) ...
    

2.5. Mã nguồn hoàn chỉnh (Để đối chiếu)

Sau khi hoàn thành các bước trên, toàn bộ tệp Program.cs của bạn sẽ trông như thế này:

C#
 
using System;

namespace BaiTap3_TinhToan
{
    class Program
    {
        // args là một mảng chuỗi, chứa các tham số được truyền từ bên ngoài
        static void Main(string[] args)
        {
            #region Kiem tra dieu kien
            // Kiểm tra xem người dùng có truyền đủ 2 tham số không
            if (args.Length < 2)
            {
                Console.WriteLine("Loi: Ban phai truyen vao 2 con so.");
                Console.WriteLine("Vi du: BaiTap3_TinhToan.exe 10 5");
                Console.ReadKey(); // Dừng lại để đọc lỗi
                return; // Thoát chương trình
            }
            #endregion

            #region Nhap lieu (Tu dong tu args)
            // Lấy 2 tham số đầu tiên và chuyển sang kiểu số
            // Không cần Console.ReadLine() nữa
            int a = int.Parse(args[0]);
            int b = int.Parse(args[1]);
            #endregion

            #region Tinh toan
            // --- PHẦN 2: TÍNH TOÁN ---
            int tong = a + b;
            int hieu = a - b;
            int tich = a * b;
            double thuong = (double)a / b;
            #endregion

            #region Xuat ket qua
            // --- PHẦN 3: XUẤT KẾT QUẢ ---
            Console.WriteLine("--- KET QUA (Tu dong) ---");
            Console.WriteLine("Tham so 1 (a) = " + a);
            Console.WriteLine("Tham so 2 (b) = " + b);
            Console.WriteLine("\n--- TINH TOAN ---");
            Console.WriteLine("{0} + {1} = {2}", a, b, tong);
            Console.WriteLine("{0} - {1} = {2}", a, b, hieu);
            Console.WriteLine("{0} * {1} = {2}", a, b, tich);
            Console.WriteLine("{0} / {1} = {2}", a, b, thuong);
            
            Console.ReadKey();
            #endregion
        }
    }
}

Bước 3: Cấu hình “Command line arguments” (Quan trọng)

Bây giờ, chúng ta phải “truyền” 2 con số vào mảng args để chương trình chạy thử.

  1. Trong cửa sổ Solution Explorer (bên phải), nhấp chuột phải vào dự án BaiTap3_TinhToan (dòng chữ in đậm).

  2. Chọn Properties (dòng cuối cùng).

  3. Một cửa sổ mới mở ra. Hãy tìm và nhấp vào tab Debug (Gỡ lỗi) ở bên trái.

  4. Bạn sẽ thấy một ô tên là Command line arguments: (Tham số dòng lệnh).

  5. Gõ 2 con số bạn muốn tính vào ô này, cách nhau bằng một khoảng trắng. Ví dụ: 10 4

  6. Nhấn Ctrl + S để lưu lại (hoặc nhấn nút Save trên thanh công cụ) rồi đóng cửa sổ Properties.


Bước 4: Chạy và Quan sát

  1. Bây giờ, hãy nhấn phím F5.

  2. Chương trình sẽ chạy mà không hỏi bạn nhập bất cứ thứ gì.

  3. Nó sẽ lấy 2 số 104 bạn vừa gõ trong Properties để tính toán và in kết quả ra ngay lập tức:

    --- KET QUA (Tu dong) ---
    Tham so 1 (a) = 10
    Tham so 2 (b) = 4
    
    --- TINH TOAN ---
    10 + 4 = 14
    10 - 4 = 6
    10 * 4 = 40
    10 / 4 = 2.5

Thêm một đoạn văn bản ở đây. Nhấp vào ô văn bản để tùy chỉnh nội dung, phong cách phông chữ và màu sắc của đoạn văn của bạn.

Bài tập 3.4: In hoá đơn

Mục tiêu: Bài tập này giúp bạn hiểu rõ mục tiêu 3.4 (Định dạng kết quả của cửa sổ màn hình). Bạn sẽ học cách định dạng căn lề (trái, phải) bằng Console.WriteLine để tạo ra một bảng thông tin ngay ngắn, thay vì chỉ in nối tiếp.

Hướng dẫn thực hiện

Bước 1: Tạo dự án

Trước tiên, chúng ta cần một dự án Console mới.

  1. Mở Visual Studio 2008.

  2. Chọn File -> New -> Project….

  3. Chọn Visual C# (bên trái) và Console Application (bên phải).

  4. Đặt tên (Name) là: BaiTap3_HoaDon

  5. Nhấn OK.

Bước 2: Viết mã nguồn (Chi tiết từng bước)

Bây giờ, chúng ta sẽ xây dựng tệp Program.cs từng phần một.

2.1. Mở tệp Program.cs và Chuẩn bị “Bộ khung”

  1. Trong cửa sổ Solution Explorer (bên phải), hãy nhấp đúp vào tệp Program.cs.

  2. Xóa toàn bộ mã lệnh có sẵn.

  3. Gõ (hoặc dán) cấu trúc cơ bản của một chương trình. Đây là “bộ khung” của chúng ta:

    C#

     
    using System;
    
    namespace BaiTap3_HoaDon
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Chúng ta sẽ viết code vào ĐÂY
            }
        }
    }
    

2.2. Khai báo Dữ liệu mẫu (Bên trong Main)

  • Mục tiêu: Tạo một số dữ liệu (biến) để chúng ta có thứ để in ra.

  • Viết vào bên trong Main:

    C#

     
    // --- DỮ LIỆU MẪU ---
    string sp1 = "Ban phim co";
    int sl1 = 2;
    double gia1 = 750000;
    
    string sp2 = "Chuot quang";
    int sl2 = 3;
    double gia2 = 120000;
    
    string sp3 = "Man hinh LCD";
    int sl3 = 1;
    double gia3 = 3500000;
    

2.3. In Tiêu đề Hóa đơn và Dấu gạch ngang

  • Mục tiêu: In ra các dòng chữ đơn giản để trang trí.

  • Viết ngay bên dưới Dữ liệu mẫu:

    C#

     
    // --- IN HÓA ĐƠN ---
    Console.WriteLine("--- HOA DON BAN LE ---");
    Console.WriteLine("====================================================");
    

2.4. In Tiêu đề Bảng (Phần quan trọng nhất)

  • Mục tiêu: In ra dòng “Tên Sản Phẩm”, “Số Lượng”, “Đơn Giá” được căn lề thẳng hàng.

  • Viết ngay bên dưới:

    C#

     
    // --- TIÊU ĐỀ BẢNG ---
    // Cú pháp: {Index, Alignment}
    // {0, -20}: Lấy biến index 0, căn lề TRÁI (dấu âm), 20 ký tự.
    // {1, 10}: Lấy biến index 1, căn lề PHẢI (dấu dương), 10 ký tự.
    // {2, 15}: Lấy biến index 2, căn lề PHẢI (dấu dương), 15 ký tự.
    
    Console.WriteLine("{0, -20} {1, 10} {2, 15}", "Ten San Pham", "So Luong", "Don Gia");
    Console.WriteLine("----------------------------------------------------");
    
  • Giải thích:

    • {0, -20}: Lấy biến đầu tiên ("Ten San Pham") và căn trái (dấu -) trong một khu vực rộng 20 ký tự.

    • {1, 10}: Lấy biến thứ hai ("So Luong") và căn phải trong một khu vực rộng 10 ký tự.

    • {2, 15}: Lấy biến thứ ba ("Don Gia") và căn phải trong một khu vực rộng 15 ký tự.

2.5. In Dòng dữ liệu sản phẩm (Áp dụng định dạng)

  • Mục tiêu: In dữ liệu của 3 sản phẩm, áp dụng đúng định dạng căn lề như Tiêu đề Bảng.

  • Viết ngay bên dưới:

    C#

     
    // --- IN DỮ LIỆU SẢN PHẨM (Áp dụng định dạng tương tự) ---
    
    // :N0 (hoặc :n0) là định dạng số, thêm dấu phẩy ngăn cách (ví dụ: 750,000)
    Console.WriteLine("{0, -20} {1, 10} {2, 15:N0}", sp1, sl1, gia1);
    Console.WriteLine("{0, -20} {1, 10} {2, 15:N0}", sp2, sl2, gia2);
    Console.WriteLine("{0, -20} {1, 10} {2, 15:N0}", sp3, sl3, gia3);
    
  • Giải thích {2, 15:N0}:

    • {2, 15}: Vẫn là căn lề phải 15 ký tự.

    • :N0: Đây là cú pháp “định dạng số” (Number Format), N là có dấu phẩy ngăn cách, 0 là không lấy số thập phân (ví dụ: 750000 sẽ thành 750,000).

2.6. In Phần tổng cộng (Tính toán và định dạng)

  • Mục tiêu: Tính tổng tiền và in ra, cũng phải căn lề.

  • Viết ngay bên dưới:

    C#

     
    Console.WriteLine("====================================================");
    
    // Tính tổng (đơn giản)
    double tongTien = (sl1 * gia1) + (sl2 * gia2) + (sl3 * gia3);
    
    // {0, 36:N0}: Căn phải 36 ký tự (20 + 10 + 15 = 45, trừ đi "Tong cong: " 11 ký tự)
    // Bạn có thể phải tinh chỉnh số 36 một chút
    Console.WriteLine("Tong cong: {0, 36:N0} VND", tongTien);
    

2.7. Dừng màn hình

  • Mục tiêu: Ngăn cửa sổ console tắt ngay lập tức.

  • Viết làm dòng cuối cùng (trước dấu } của Main):

    C#

     
    Console.ReadKey();
    

Mã nguồn hoàn chỉnh (Để đối chiếu)

Sau khi ghép tất cả các bước nhỏ ở trên lại, tệp Program.cs của bạn sẽ trông như thế này:

C#

 
using System;

namespace BaiTap3_HoaDon
{
    class Program
    {
        static void Main(string[] args)
        {
            // --- DỮ LIỆU MẪU ---
            string sp1 = "Ban phim co";
            int sl1 = 2;
            double gia1 = 750000;

            string sp2 = "Chuot quang";
            int sl2 = 3;
            double gia2 = 120000;

            string sp3 = "Man hinh LCD";
            int sl3 = 1;
            double gia3 = 3500000;

            // --- IN HÓA ĐƠN ---
            Console.WriteLine("--- HOA DON BAN LE ---");
            Console.WriteLine("====================================================");

            // --- TIÊU ĐỀ BẢNG ---
            // Cú pháp: {Index, Alignment}
            // {0, -20}: Lấy biến index 0 (Ten SP), căn lề TRÁI (dấu âm), 20 ký tự.
            // {1, 10}: Lấy biến index 1 (So Luong), căn lề PHẢI (dấu dương), 10 ký tự.
            // {2, 15}: Lấy biến index 2 (Don Gia), căn lề PHẢI (dấu dương), 15 ký tự.
            
            Console.WriteLine("{0, -20} {1, 10} {2, 15}", "Ten San Pham", "So Luong", "Don Gia");
            Console.WriteLine("----------------------------------------------------");

            // --- IN DỮ LIỆU SẢN PHẨM (Áp dụng định dạng tương tự) ---
            
            // :N0 (hoặc :n0) là định dạng số, thêm dấu phẩy ngăn cách (ví dụ: 750,000)
            Console.WriteLine("{0, -20} {1, 10} {2, 15:N0}", sp1, sl1, gia1);
            Console.WriteLine("{0, -20} {1, 10} {2, 15:N0}", sp2, sl2, gia2);
            Console.WriteLine("{0, -20} {1, 10} {2, 15:N0}", sp3, sl3, gia3);
            
            Console.WriteLine("====================================================");
            
            // Tính tổng (đơn giản)
            double tongTien = (sl1 * gia1) + (sl2 * gia2) + (sl3 * gia3);
            Console.WriteLine("Tong cong: {0, 36:N0} VND", tongTien);

            // Dừng màn hình
            Console.ReadKey();
        }
    }
}

Bước 3: Chạy và Quan sát kết quả

  1. Nhấn phím F5.

  2. Chương trình sẽ chạy và hiển thị một bảng hóa đơn được căn lề thẳng hàng và các con số được định dạng dấu phẩy rất đẹp mắt.

    --- HOA DON BAN LE ---
    ====================================================
    Ten San Pham         So Luong         Don Gia
    ----------------------------------------------------
    Ban phim co                 2         750,000
    Chuot quang                 3         120,000
    Man hinh LCD                1       3,500,000
    ====================================================
    Tong cong:                                5,360,000 VND