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();
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.
Bài tập 4.5: GIẢI PHƯƠNG TRÌNH BẬC 2
Mục tiêu:
Vận dụng biểu thức điều kiện phức tạp.
Sử dụng thư viện
Mathđể tính căn bậc hai (Math.Sqrt) và lũy thừa (Math.Pow).Giải quyết bài toán biện luận đầy đủ các trường hợp (a=0 và các trường hợp của Delta).
Đề bài:
Viết chương trình cho người dùng nhập vào 3 hệ số a, b, c. Giải và biện luận phương trình bậc hai: ax^2 + bx + c = 0.
Bài tập 4.6: TÍNH TỔNG VÀ TÍCH DÃY SỐ (VÒNG LẶP FOR)
Mục tiêu:
Sử dụng vòng lặp
forđể duyệt qua một dãy số.Hiểu cách sử dụng biến tích lũy (
tong +=vàtich *=).Phân biệt và lựa chọn kiểu dữ liệu phù hợp (
longthay vìintcho kết quả lớn).
Đề bài:
Viết chương trình yêu cầu người dùng nhập vào một số nguyên dương n.
- Tính Tổng S = 1 + 2 + 3 + … + n.
- Tính Tích P = 1 x 2 x 3 x … x n (Giai thừa).
- In kết quả ra màn hình.
🏧 BÀI TẬP 4.7: MÔ PHỎNG CÂY ATM (SỬ DỤNG SWITCH-CASE)
Mục tiêu:
Giải thích được khi nào nên dùng
switch...casethay vìif...else.Trình bày được ý nghĩa các từ khóa:
case,break,default.Kết hợp vòng lặp để duy trì trạng thái ứng dụng (cập nhật số dư liên tục).
Đề bài: Viết chương trình mô phỏng một cây ATM.
Ban đầu, tài khoản có số dư mặc định là 5,000,000 VND.
Chương trình hiển thị Menu cho phép người dùng chọn:
Kiểm tra số dư.
Rút tiền (Giảm số dư, kiểm tra nếu rút quá số dư thì báo lỗi).
Gửi tiền (Tăng số dư).
Thoát.
Sử dụng
switch...caseđể xử lý các chức năng.
Hướng dẫn làm bài:
Bước 1: Tạo dự án
Mở Visual Studio 2008.
Tạo dự án Console Application mới.
Đặt tên là:
BaiTap4_ATM.Nhấn OK.
Bước 2: Viết mã nguồn (Chi tiết)
Mở tệp Program.cs. Chúng ta sẽ viết code theo luồng hoạt động của cây ATM.
2.1. Khai báo biến và Vòng lặp chính
Chúng ta cần một biến
soDulưu tiền và biếnluaChonđể lưu phím người dùng bấm.Dùng
do...whileđể Menu luôn hiện lại sau khi thực hiện xong một giao dịch.
using System;
using System.Text; // Để dùng UTF8Encoding nếu cần tiếng Việt
namespace BaiTap4_ATM
{
class Program
{
static void Main(string[] args)
{
// Để hiển thị tiếng Việt có dấu trong Console (tùy chọn)
Console.OutputEncoding = Encoding.UTF8;
// 1. Khởi tạo số dư ban đầu
int soDu = 5000000;
int luaChon = 0;
// 2. Vòng lặp Menu
do
{
Console.Clear(); // Xóa màn hình cho sạch sẽ
Console.WriteLine("=== NGAN HANG ABC - ATM ===");
Console.WriteLine("1. Kiem tra so du");
Console.WriteLine("2. Rut tien");
Console.WriteLine("3. Gui tien");
Console.WriteLine("4. Thoat");
Console.WriteLine("===========================");
Console.Write("Moi ban chon chuc nang (1-4): ");
try
{
luaChon = int.Parse(Console.ReadLine());
}
catch
{
luaChon = 0; // Nếu nhập sai chữ, gán = 0 để vào default
}
// --- PHẦN SWITCH-CASE SẼ NẰM Ở ĐÂY (Bước 2.2) ---
// Dừng màn hình để người dùng đọc kết quả trước khi xóa
if (luaChon != 4)
{
Console.WriteLine("\nNhan Enter de tiep tuc giao dich...");
Console.ReadLine();
}
} while (luaChon != 4); // Lặp lại nếu chưa chọn 4
}
}
}
2.2. Viết cấu trúc switch...case
Đây là phần trọng tâm. Bạn hãy chèn đoạn code này vào vị trí “PHẦN SWITCH-CASE SẼ NẰM Ở ĐÂY” ở trên.
// Xử lý lựa chọn
switch (luaChon)
{
case 1: // Kiểm tra số dư
Console.WriteLine("\n>> So du hien tai cua ban la: {0:N0} VND", soDu);
break; // BẮT BUỘC PHẢI CÓ BREAK
case 2: // Rút tiền
Console.Write("\nNhập số tiền muốn rút: ");
int tienRut = 0;
try
{
tienRut = int.Parse(Console.ReadLine());
}
catch { } // Bỏ qua lỗi nhập chữ
if (tienRut <= 0)
{
Console.WriteLine("Lỗi: Số tiền rút không hợp lệ.");
}
else if (tienRut > soDu)
{
Console.WriteLine("Lỗi: Số dư không đủ để thực hiện giao dịch.");
}
else
{
soDu = soDu - tienRut; // Trừ tiền
Console.WriteLine(">> Rút tiền thành công. Vui lòng nhận tiền.");
Console.WriteLine(">> Số dư mới: {0:N0} VND", soDu);
}
break;
case 3: // Gửi tiền
Console.Write("\nNhập số tiền muốn gửi: ");
int tienGui = 0;
try
{
tienGui = int.Parse(Console.ReadLine());
}
catch { }
if (tienGui <= 0)
{
Console.WriteLine("Lỗi: Số tiền gửi phải lớn hơn 0.");
}
else
{
soDu = soDu + tienGui; // Cộng tiền
Console.WriteLine(">> Gửi tiền thành công.");
Console.WriteLine(">> Số dư mới: {0:N0} VND", soDu);
}
break;
case 4: // Thoát
Console.WriteLine("\nCam on quy khach da su dung dich vu!");
break;
default: // Nhập số khác 1,2,3,4
Console.WriteLine("\nLỗi: Chức năng không tồn tại. Vui lòng chọn lại.");
break;
}
Bước 3: Chạy và Kiểm thử (Test Cases)
Hãy chạy thử (F5) các trường hợp sau để đảm bảo ATM hoạt động đúng:
Kiểm tra số dư: Chọn
1-> Kết quả:5,000,000 VND.Rút tiền thành công: Chọn
2-> Nhập1000000-> Kết quả: Số dư còn4,000,000 VND.Rút quá số dư: Chọn
2-> Nhập9000000-> Kết quả: Báo lỗi “Số dư không đủ”.Gửi tiền: Chọn
3-> Nhập2000000-> Kết quả: Số dư tăng lên6,000,000 VND(nếu đang là 4tr).Nhập sai Menu: Chọn
5hoặcabc-> Báo lỗi và hiện lại Menu.
BÀI TẬP 4.8: TÍNH SỐ NGÀY VÀ NĂM NHUẬN
Mục tiêu:
Sử dụng
switch...caseđể gom nhóm các trường hợp giống nhau (các tháng có 31 ngày, các tháng có 30 ngày).Sử dụng
if...elselồng bên trongcaseđể xử lý logic phức tạp.Hiểu thuật toán xác định năm nhuận.
Đề bài: Viết chương trình yêu cầu người dùng nhập vào Tháng và Năm. Hãy tính và in ra số ngày của tháng đó.
Quy tắc:
Các tháng 1, 3, 5, 7, 8, 10, 12: Có 31 ngày.
Các tháng 4, 6, 9, 11: Có 30 ngày.
Tháng 2:
Nếu là năm nhuận: 29 ngày.
Nếu là năm thường: 28 ngày.
Điều kiện năm nhuận: Năm chia hết cho 400 HOẶC (chia hết cho 4 nhưng KHÔNG chia hết cho 100).
