4.1. Các kiểu dữ liệu (Data Types)
Biến là tên gọi cho một vùng nhớ, dùng để lưu trữ dữ liệu. Mọi biến trong C# phải được khai báo kiểu dữ liệu.
| Kiểu dữ liệu | Tên .NET | Ý nghĩa | Ví dụ |
int | Int32 | Số nguyên (4 byte) | int tuoi = 30; |
double | Double | Số thực (8 byte) | double diem = 8.5; |
string | String | Chuỗi ký tự | string ten = "Văn An"; |
char | Char | Một ký tự (Unicode) | char x = 'A'; |
bool | Boolean | Logic (Đúng/Sai) | bool daKetHon = false; |
decimal | Decimal | Số thực (chính xác cao, dùng cho tài chính) | decimal luong = 1500.50m; |
Phép toán:
Số học:
+,-,*,/(chia),%(chia lấy dư).So sánh:
==(bằng),!=(không bằng),>,<,>=,<=.Logic:
&&(VÀ),||(HOẶC),!(Phủ định).Gán:
=,+=,-=,*=,/=.
4.2. Kiểu dữ liệu mảng (Array) và ArrayList
Mảng (Array):
Khái niệm: Dùng để lưu trữ một tập hợp cố định các phần tử cùng kiểu dữ liệu.
Khai báo:
kieu_du_lieu[] ten_mang = new kieu_du_lieu[so_phan_tu];Ví dụ:
C#
// Tạo mảng 5 số nguyên int[] diemSo = new int[5]; // Gán giá trị diemSo[0] = 8; diemSo[1] = 10; // ... // Lấy giá trị Console.WriteLine(diemSo[1]); // In ra 10Ưu điểm: Tốc độ truy xuất nhanh.
Nhược điểm: Kích thước cố định, không thể thêm/xóa sau khi tạo.
ArrayList: (Nằm trong
System.Collections)Khái niệm: Dùng để lưu trữ một tập hợp các phần tử (đối tượng) có kích thước linh động.
Khai báo:
ArrayList list = new ArrayList();Ví dụ:
C#
using System.Collections; // ... ArrayList myList = new ArrayList(); myList.Add(10); // Thêm số nguyên myList.Add("Xin chào"); // Thêm chuỗi myList.Add(true); // Thêm bool myList.RemoveAt(0); // Xóa phần tử ở vị trí 0 Console.WriteLine(myList[0]); // In ra "Xin chào"Ưu điểm: Kích thước linh động (thêm/xóa thoải mái).
- Nhược điểm: Chậm hơn Array, không an toàn về kiểu (có thể chứa nhiều kiểu dữ liệu lẫn lộn).
Ghi chú: Trong C# 2.0+ (VS 2008 hỗ trợ), người ta thường dùng
List<T>(Generic) thay choArrayListđể đảm bảo an toàn kiểu. Ví dụ:List<int> numbers = new List<int>();
4.3. Phát biểu rẽ nhánh (Conditional Statements)
Phát biểu
if…else: Dùng để kiểm tra một điều kiện và thực thi các khối lệnh tương ứng.C#
int tuoi = 18; if (tuoi >= 18) { Console.WriteLine("Bạn là người trưởng thành."); } else if (tuoi >= 13) { Console.WriteLine("Bạn là thanh thiếu niên."); } else { Console.WriteLine("Bạn là trẻ em."); }Phát biểu
switch…case: Dùng khi có nhiều trường hợp cần so sánh với một biến duy nhất.C#int ngayTrongTuan = 2; // Giả sử 2 là Thứ Hai switch (ngayTrongTuan) { case 2: Console.WriteLine("Thứ Hai"); break; // Bắt buộc phải có break case 3: Console.WriteLine("Thứ Ba"); break; // ... case 8: // Chủ Nhật Console.WriteLine("Chủ Nhật"); break; default: // Trường hợp còn lại Console.WriteLine("Không hợp lệ"); break; }
4.4. Phát biểu vòng lặp (Loop Statements)
Vòng lặp
for: Dùng khi biết trước số lần lặp.C#// In ra các số từ 0 đến 9 (lặp 10 lần) for (int i = 0; i < 10; i++) { Console.WriteLine(i); }Vòng lặp
while: Dùng khi lặp cho đến khi một điều kiện còn đúng (có thể không chạy lần nào).C#
int n = 0; while (n < 5) { Console.WriteLine(n); n++; // Phải có lệnh thay đổi điều kiện, nếu không sẽ lặp vô hạn }Vòng lặp
do…while: Giốngwhile, nhưng đảm bảo khối lệnh chạy ít nhất 1 lần.C#
int pass; do { Console.Write("Nhap mat khau: "); pass = int.Parse(Console.ReadLine()); } while (pass != 123); // Lặp lại nếu nhập sai Console.WriteLine("Mat khau dung!");
4.5. Xử lý lỗi (Try…Catch)
Khái niệm: Khi một lỗi nghiêm trọng xảy ra lúc chạy (ví dụ:
int.Parse("abc"), chia cho 0, không tìm thấy tệp), chương trình sẽ ném ra một Ngoại lệ (Exception) và bị “crash” (dừng đột ngột).Công dụng:
try...catchdùng để “bắt” các ngoại lệ này lại, xử lý chúng một cách an toàn để chương trình không bị dừng.Cú pháp:
C#
try { // Đặt mã lệnh CÓ NGUY CƠ gây lỗi vào đây Console.Write("Nhap so a = "); int a = int.Parse(Console.ReadLine()); Console.Write("Nhap so b = "); int b = int.Parse(Console.ReadLine()); double thuong = (double)a / b; Console.WriteLine("Thuong = " + thuong); } catch (FormatException) // Bắt lỗi nhập sai định dạng (ví dụ: nhập chữ) { Console.WriteLine("Lỗi: Bạn phải nhập số!"); } catch (DivideByZeroException) // Bắt lỗi chia cho 0 { Console.WriteLine("Lỗi: Không thể chia cho 0!"); } catch (Exception ex) // Bắt tất cả các lỗi khác { Console.WriteLine("Có lỗi không xác định: " + ex.Message); } finally { // Khối này LUÔN LUÔN được thực thi (dù có lỗi hay không) Console.WriteLine("Kết thúc chương trình tính toán."); }
4.6. Sử dụng Debugger (Trình gỡ lỗi)
Đây là kỹ năng quan trọng nhất của lập trình viên.
Breakpoint (Điểm dừng): Nhấp vào lề trái của dòng code (hoặc nhấn
F9). Khi chạy ở chế độ Debug (F5), chương trình sẽ dừng lại ngay trước khi thực thi dòng đó.Các phím điều khiển khi dừng:
F10 (Step Over):Chạy dòng lệnh hiện tại và đi tới dòng tiếp theo. Nếu dòng hiện tại là một lời gọi hàm, nó sẽ chạy cả hàm đó và dừng ở dòng sau.F11 (Step Into):Nếu dòng hiện tại là một lời gọi hàm, nó sẽ đi vào bên trong hàm đó và dừng ở dòng đầu tiên của hàm.Shift + F11 (Step Out):Chạy nốt phần còn lại của hàm hiện tại và dừng ở dòng lệnh đã gọi nó.
Cửa sổ theo dõi (Watch/Locals/Autos): Khi dừng tại Breakpoint, bạn có thể xem giá trị của tất cả các biến tại thời điểm đó.
Bài tập 4.1: Kiểm tra chẵn lẻ (Dùng if và %)
Viết chương trình Console cho phép người dùng nhập 1 số nguyên.
Sử dụng
try...catchđể bắt lỗi nếu người dùng nhập không phải là số.Sử dụng
ifvà toán tử%(chia lấy dư) để kiểm tra xem số đó là chẵn hay lẻ và in ra màn hình.
Hướng dẫn
Bước 1: Tạo dự án
Mở Visual Studio 2008.
Tạo một dự án Console Application mới (File -> New -> Project…).
Đặt tên (Name) là:
BaiTap4_ChanLe.Nhấn OK.
Bước 2: Viết mã nguồn (Chi tiết từng bước)
Mở tệp Program.cs. Chúng ta sẽ xây dựng code từng phần:
2.1. Chuẩn bị “bộ khung”
gõ “bộ khung” cơ bản:
C#using System; namespace BaiTap4_ChanLe { class Program { static void Main(string[] args) { // Chúng ta sẽ viết code vào đây } } }
2.2. Xây dựng khối try...catch...finally
Mục tiêu: Lệnh
int.Parse()sẽ bị “crash” nếu người dùng nhập chữ. Chúng ta phải bọc code trongtry...catchđể bắt lỗi này.Viết vào bên trong
Main:C#try { // 1. Đặt code có nguy cơ gây lỗi vào đây } catch (FormatException) // Chỉ bắt lỗi sai định dạng (nhập chữ thay vì số) { // 2. Xử lý nếu có lỗi } finally { // 3. Code này LUÔN LUÔN chạy, dù có lỗi hay không // Dùng để dừng màn hình }
2.3. Viết code trong khối try (Phần xử lý chính)
Viết vào bên trong
try { ... }:C#// Yêu cầu người dùng nhập số Console.Write("Vui long nhap mot so nguyen: "); // Đọc chuỗi và chuyển (parse) sang số nguyên int so = int.Parse(Console.ReadLine()); // --- PHẦN LOGIC QUAN TRỌNG --- // Toán tử % (chia lấy dư) // Nếu so % 2 == 0 (một số chia 2 dư 0) thì đó là số chẵn if (so % 2 == 0) { // In kết quả Console.WriteLine("So {0} la SO CHAN.", so); } else // Ngược lại (chia 2 dư 1) { // In kết quả Console.WriteLine("So {0} la SO LE.", so); }
2.4. Viết code trong khối catch (Xử lý lỗi)
Viết vào bên trong
catch (FormatException) { ... }:C#Console.WriteLine("Loi: Ban da nhap khong phai la so nguyen!");
2.5. Viết code trong khối finally (Dừng màn hình)
Viết vào bên trong
finally { ... }:C#Console.WriteLine("\nNhan phim bat ky de thoat."); Console.ReadKey();
Nhấn F5 để chạy.
Trường hợp 1 (Chẵn): Gõ
10-> Nhấn Enter. Kết quả phải làSo 10 la SO CHAN.Trường hợp 2 (Lẻ): Chạy lại (F5). Gõ
7-> Nhấn Enter. Kết quả phải làSo 7 la SO LE.Trường hợp 3 (Lỗi): Chạy lại (F5). Gõ
abc-> Nhấn Enter. Kết quả phải làLoi: Ban da nhap khong phai la so nguyen!
Bài tập 4.2: Tính điểm trung bình (Dùng for và Array)
Mục tiêu: Sử dụng Mảng (Array) để lưu trữ một danh sách giá trị và dùng vòng lặp for để duyệt mảng đó.
Viết chương trình cho phép nhập điểm của 5 môn học (lưu vào một mảng
int[] diem = new int[5];).Dùng vòng lặp
forđể yêu cầu người dùng nhập 5 lần.Dùng một vòng lặp
for(hoặcforeach) khác để tính tổng điểm.In ra điểm trung bình.
Hướng dẫn
Bước 1: Tạo dự án
Tạo một dự án Console Application mới.
Đặt tên (Name) là:
BaiTap4_DiemTrungBinh.Nhấn OK.
Bước 2: Viết mã nguồn (Chi tiết từng bước)
Mở tệp Program.cs. Chúng ta sẽ viết code từng phần.
2.1. Chuẩn bị “bộ khung”
Gõ “bộ khung” cơ bản:
C#using System; namespace BaiTap4_DiemTrungBinh { class Program { static void Main(string[] args) { // Code sẽ được viết vào đây } } }
2.2. Khai báo mảng (Array)
Mục tiêu: Tạo 5 “ô nhớ” để lưu 5 điểm số.
Viết vào bên trong
Main:C#// 1. Khai báo mảng tên 'diemSo' có 5 phần tử kiểu số nguyên int[] diemSo = new int[5];
2.3. Vòng lặp for thứ nhất (Nhập điểm)
Mục tiêu: Lặp lại hành động “hỏi điểm” 5 lần và lưu vào 5 ô nhớ.
Viết ngay bên dưới dòng trên:
C#// 2. Dùng vòng lặp for để nhập dữ liệu Console.WriteLine("--- NHAP DIEM 5 MON HOC ---"); // i = 0: Bắt đầu đếm từ 0 // i < 5: Lặp lại chừng nào i còn nhỏ hơn 5 (tức là 0, 1, 2, 3, 4 -> đủ 5 lần) // i++: Tăng i lên 1 sau mỗi lần lặp for (int i = 0; i < 5; i++) { // i bắt đầu từ 0, nên ta +1 để hiển thị (Môn 1, Môn 2...) Console.Write("Nhap diem mon thu {0}: ", i + 1); // Lưu điểm vào mảng tại vị trí i (ví dụ: diemSo[0], diemSo[1]...) diemSo[i] = int.Parse(Console.ReadLine()); }
2.4. Vòng lặp for thứ hai (Tính tổng)
Mục tiêu: Duyệt lại 5 ô nhớ đã lưu, cộng dồn giá trị của chúng.
Viết ngay bên dưới vòng lặp
forở trên:C#// 3. Tính tổng // Khai báo biến tổng, bắt đầu bằng 0 // Dùng 'double' để tí nữa chia cho ra số lẻ (ví dụ 8.5) double tong = 0; // Dùng vòng lặp for để duyệt qua mảng // 'diemSo.Length' là một thuộc tính, nó tự biết mảng này có 5 phần tử for (int i = 0; i < diemSo.Length; i++) { // Cộng dồn: Lấy giá trị cũ của 'tong', cộng thêm điểm ở vị trí i tong = tong + diemSo[i]; // Dòng trên có thể viết tắt là: tong += diemSo[i]; }
2.5. Tính trung bình và Xuất kết quả
Mục tiêu: Lấy tổng chia cho 5 và in ra màn hình.
Viết ngay bên dưới vòng lặp
forở trên:C#// 4. Tính điểm trung bình và In kết quả double diemTrungBinh = tong / 5; // Hoặc: tong / diemSo.Length Console.WriteLine("\n--- KET QUA ---"); // \n để xuống dòng Console.WriteLine("Tong diem 5 mon la: " + tong); Console.WriteLine("Diem trung binh la: " + diemTrungBinh);
2.6. Dừng màn hình
Viết làm dòng cuối cùng (trước dấu
}củaMain):C#Console.ReadKey();
Bài tập 4.3: Menu đơn giản (Dùng do...while và switch)
Mục tiêu: Kết hợp vòng lặp do...while (để lặp lại menu) và cấu trúc switch...case (để xử lý lựa chọn). Đây là cấu trúc rất phổ biến.
Viết chương trình hiển thị 1 menu:
--- MENU --- 1. Tính tổng 2 số 2. Tính hiệu 2 số 3. Thoát Chọn chức năng:Sử dụng vòng lặp
do...whileđể lặp lại menu cho đến khi người dùng chọn 3.Sử dụng
switch...caseđể xử lý lựa chọn của người dùng.Sử dụng
try...catchkhi người dùng nhập lựa chọn (đề phòng nhập chữ).
Hướng dẫn
Bước 1: Tạo dự án
Tạo một dự án Console Application mới.
Đặt tên (Name) là:
BaiTap4_Menu.Nhấn OK.
Bước 2: Viết mã nguồn (Chi tiết từng bước)
Mở tệp Program.cs. Chúng ta sẽ tổ chức code thành nhiều hàm (phương thức) cho khoa học.
2.1. Chuẩn bị “bộ khung”
Xóa mã cũ và gõ “bộ khung” (lần này chúng ta sẽ tạo thêm hàm bên ngoài
Main):C#using System; namespace BaiTap4_Menu { class Program { // === HÀM CHÍNH (MAIN) === static void Main(string[] args) { // Code điều hướng menu sẽ ở đây } // === CÁC HÀM CHỨC NĂNG PHỤ === // Hàm này chỉ để in Menu static void InMenu() { // Code in menu sẽ ở đây } // Hàm chức năng cho Case 1 static void TinhTong() { // Code tính tổng sẽ ở đây } // Hàm chức năng cho Case 2 static void TinhHieu() { // Code tính hiệu sẽ ở đây } } }
2.2. Viết code cho các hàm phụ (Hàm chức năng)
Mục tiêu: Hoàn thành các hàm
InMenu,TinhTong,TinhHieutrước.Viết code cho
InMenu:C#static void InMenu() { Console.Clear(); // Xóa màn hình cho sạch Console.WriteLine("--- MENU CHUONG TRINH ---"); Console.WriteLine("1. Tinh Tong 2 so"); Console.WriteLine("2. Tinh Hieu 2 so"); Console.WriteLine("3. Thoat chuong trinh"); Console.Write("Vui long chon chuc nang (1-3): "); }Viết code cho
TinhTongvàTinhHieu(cótry...catchriêng):C#static void TinhTong() { try { Console.WriteLine("\n--- Chuc nang 1: Tinh Tong ---"); Console.Write("Nhap so a = "); int a = int.Parse(Console.ReadLine()); Console.Write("Nhap so b = "); int b = int.Parse(Console.ReadLine()); Console.WriteLine("=> KET QUA: {0} + {1} = {2}", a, b, (a + b)); } catch (FormatException) { Console.WriteLine("Loi: Ban phai nhap so nguyen!"); } } static void TinhHieu() { try { Console.WriteLine("\n--- Chuc nang 2: Tinh Hieu ---"); Console.Write("Nhap so a = "); int a = int.Parse(Console.ReadLine()); Console.Write("Nhap so b = "); int b = int.Parse(Console.ReadLine()); Console.WriteLine("=> KET QUA: {0} - {1} = {2}", a, b, (a - b)); } catch (FormatException) { Console.WriteLine("Loi: Ban phai nhap so nguyen!"); } }
2.3. Viết code cho Main (Phần điều hướng)
Mục tiêu: Tạo vòng lặp
do...whileđể gọi các hàm trên.Viết vào bên trong
static void Main(string[] args) { ... }:C#int luaChon = 0; // Biến lưu lựa chọn, đặt bên ngoài vòng lặp // Vòng lặp do...while // Luôn chạy 1 lần (in menu), sau đó kiểm tra điều kiện (while) do { // 1. In menu ra màn hình (gọi hàm InMenu) InMenu(); // 2. Lấy lựa chọn của người dùng (có bẫy lỗi) try { luaChon = int.Parse(Console.ReadLine()); } catch { Console.WriteLine("Loi! Phai nhap mot so (1-3)."); luaChon = 0; // Gán bằng 0 để nó tiếp tục lặp continue; // Bỏ qua switch, quay lại đầu vòng lặp } // 3. Xử lý lựa chọn bằng switch...case switch (luaChon) { case 1: TinhTong(); // Gọi hàm tính tổng break; // Ngắt case 1 case 2: TinhHieu(); // Gọi hàm tính hiệu break; // Ngắt case 2 case 3: Console.WriteLine("Tam biet! Hen gap lai."); break; // Ngắt case 3 default: // Bất kỳ số nào khác 1, 2, 3 Console.WriteLine("Lua chon khong hop le. Vui long chon lai."); break; } // Yêu cầu nhấn phím để quay lại menu (cho dễ nhìn) if (luaChon != 3) // Nếu chưa thoát { Console.WriteLine("\nNhan phim bat ky de quay ve Menu..."); Console.ReadKey(); } } while (luaChon != 3); // Lặp lại nếu người dùng CHƯA chọn số 3 (Thoát) // Dừng lần cuối trước khi tắt hẳn Console.WriteLine("Nhan phim bat ky de ket thuc."); Console.ReadKey();
Bước 3: Chạy và kiểm thử
Nhấn F5 để chạy.
Thử Chức năng 1: Gõ
1-> Enter. Nhập10và5. Kết quả phải là15. Sau đó quay lại menu.Thử Lỗi nhập chữ: Tại menu, gõ
abc-> Enter. Phải báo lỗiPhai nhap mot sovà quay lại menu.Thử Lỗi sai số: Tại menu, gõ
5-> Enter. Phải báoLua chon khong hop levà quay lại menu.Thử Thoát: Gõ
3-> Enter. Chương trình phải in “Tam biet!” và kết thúc.
Bài tập 4.4: Sử dụng Debugger
Mục tiêu: Đây là kỹ năng quan trọng nhất của lập trình viên. Bạn không viết code mới, mà học cách “theo dõi” chương trình chạy để tìm lỗi. Chúng ta sẽ dùng lại Bài tập 4.2 (Tính điểm trung bình) để thực hành.
- Thực hiện Bài tập 4.2.
- Đặt một Breakpoint (F9) ngay tại dòng bắt đầu vòng lặp for tính tổng.
- Chạy chương trình (F5) và nhập 5 điểm số.
- Khi chương trình dừng lại, quan sát giá trị của các biến (biến i, biến tong, mảng diem) thay đổi như thế nào sau mỗi lần nhấn F10.
Hướng dẫn
Bước 1: Mở dự án BaiTap4_DiemTrungBinh
Đóng dự án Menu hiện tại.
Mở lại dự án
BaiTap4_DiemTrungBinh(từ Bài tập 4.2).Mở tệp
Program.cs.
Bước 2: Đặt Breakpoint (Điểm dừng) (Chi tiết)
Tìm đến dòng code bắt đầu vòng lặp
forthứ hai (vòng lặp dùng để tính tổng). Dòng đó là:for (int i = 0; i < diemSo.Length; i++)Di chuột đến lề màu xám (Margin) ở phía bên trái của dòng code đó.
Nhấp chuột 1 cái. Một chấm tròn màu đỏ (Breakpoint) sẽ xuất hiện.
(Hoặc) Bạn có thể đặt con trỏ vào dòng đó và nhấn phím F9.
Ý nghĩa: Bạn vừa ra lệnh cho Visual Studio: “Khi chạy, hãy ‘đóng băng’ chương trình ngay tại vị trí này để tôi kiểm tra.”
Bước 3: Chạy ở chế độ Debug
Nhấn phím F5 (hoặc nút Start Debugging <img>).
Chương trình sẽ chạy. Cửa sổ Console hiện ra, yêu cầu bạn nhập 5 điểm.
Hãy nhập 5 điểm số (ví dụ:
10,8,9,7,5).Ngay sau khi bạn nhập điểm thứ 5 và nhấn Enter, cửa sổ Console sẽ “treo”, và Visual Studio sẽ sáng lên.
Bạn sẽ thấy một mũi tên màu vàng <img> chỉ ngay vào dòng code màu đỏ (nơi bạn đặt Breakpoint). Chương trình đã “đóng băng” tại đây.
Bước 4: “Bước” qua code (Step Over) (Chi tiết)
Mở cửa sổ Locals:
Hãy nhìn xuống cửa sổ Locals (Thường ở góc dưới bên trái).
Nếu không thấy, vào menu Debug -> Windows -> Locals.
Cửa sổ này hiển thị giá trị của tất cả các biến hiện tại.
Quan sát: Bạn sẽ thấy mảng
diemSo(nhấp vào dấu+để xem 5 giá trị bạn vừa nhập). Bạn thấytongđang bằng0. Biếni(của vòng lặp tính tổng) chưa tồn tại.
“Bước” đầu tiên (F10):
Nhấn phím F10 (tên là Step Over – Bước qua).
Quan sát: Mũi tên vàng di chuyển xuống dòng
tong += diemSo[i];. Trong cửa sổ Locals,igiờ đã có giá trị là0.
“Bước” thứ hai (F10):
Nhấn phím F10 một lần nữa.
Quan sát: Mũi tên vàng quay lại dòng
for. Trong cửa sổ Locals,tongbây giờ đã có giá trị là10(lấy từdiemSo[0]).
“Bước” thứ ba (F10):
Nhấn phím F10 một lần nữa.
Quan sát: Mũi tên vàng vào dòng
tong.... Biếnigiờ bằng1.
“Bước” thứ tư (F10):
Nhấn phím F10 một lần nữa.
Quan sát: Mũi tên vàng quay lại
for. Biếntonggiờ là18(vì10 + 8).
Tiếp tục “bước”:
Tiếp tục nhấn
F10… Bạn đang “đi bộ” qua từng bước của vòng lặp và tận mắt thấy cách biếnităng lên và biếntongđược cộng dồn.
Bước 5: Tiếp tục chạy (Resume)
Sau khi bạn đã hiểu cách vòng lặp chạy, bạn không cần nhấn F10 nữa.
Hãy nhấn phím F5 (lần nữa).
Chương trình sẽ “hết đóng băng” và chạy nốt phần còn lại.
Cửa sổ Console sẽ hiển thị kết quả cuối cùng.
