Khối lệnh sử dụng: while, switch-case
Chào các bạn! Hôm nay chúng ta sẽ cùng tạo một“lịch thông minh”có thể biết hôm nay là thứ mấy và nói tên ngày bằng tiếng Việt! 📆✨
🎭 Hãy tưởng tượng:
- Bạn là mộtrobot lịchthông minh, có thể nói tên bất kỳ ngày nào trong tuần 🤖
- Hoặc bạn làthư ký cá nhângiúp mọi người nhớ hôm nay là thứ mấy 📋
- Hoặc đơn giản, bạn muốn tạotrò chơi đoán ngàyvui nhộn cho bạn bè! 🎮
Nhiệm vụ hôm nay: Viết chương trình có thể:
- Nhập sốtừ 1-7 (đại diện cho các ngày trong tuần)
- Lặp lạiviệc này nhiều lần theo ý muốn
- Kiểm trasố nhập có hợp lệ không (phải từ 1-7)
- Chuyển đổisố thành tên ngày bằng tiếng Việt!
Ví dụ vui nhộn:
Nhập số 1 → "Thứ Hai" 😊
Nhập số 7 → "Chủ Nhật" 🎉
Nhập số 15 → "Số không hợp lệ!" ❌
📚 KIẾN THỨC CẦN NHỚ
🎯 Quy ước về ngày trong tuần:
1 = Thứ Hai (Monday)
2 = Thứ Ba (Tuesday)
3 = Thứ Tư (Wednesday)
4 = Thứ Năm (Thursday)
5 = Thứ Sáu (Friday)
6 = Thứ Bảy (Saturday)
7 = Chủ Nhật (Sunday)
🔧 Công cụ chúng ta sẽ dùng:
- while:Để lặp lại việc nhập và xử lý nhiều lần
- switch-case:Để phân loại và chuyển đổi số thành tên ngày
- Validation:Kiểm tra số nhập có nằm trong khoảng 1-7 không
💡 Ý tưởng thuật toán:
1. Nhập số lần muốn thực hiện (repeat)
2. Dùng while để lặp repeat lần:
- Nhập số day (1-7)
- Kiểm tra day có hợp lệ không
- Nếu sai, yêu cầu nhập lại
- Dùng switch-case để chuyển số thành tên ngày
- In kết quả ra màn hình
3. Kết thúc sau khi hoàn thành tất cả lần lặp
🎯 PHÂN TÍCH ĐỀ BÀI
📋 Yêu cầu của đề:
- Nhập:2 số nguyên day (1-7) và repeat (số lần lặp)
- Xử lý:Dùng while lặp repeat lần, mỗi lần nhập day hợp lệ
- Phân loại:Dùng switch-case chuyển số thành tên ngày
- Kiểm tra:Đảm bảo day trong khoảng 1-7, nếu sai thì nhập lại
🗺️ Lược đồ giải quyết:
1. Nhập số lần lặp (repeat)
2. Khởi tạo biến đếm = 0
3. while (đếm < repeat):
- Nhập day
- Kiểm tra day có hợp lệ (1-7) không
- Nếu không hợp lệ, yêu cầu nhập lại
- Dùng switch(day) để in tên ngày
- Tăng biến đếm
4. Kết thúc chương trình
🛠️ GIẢI THÍCH TỪNG BƯỚC
Bước 1: Nhập số lần lặp
int repeat;
cout << "Nhập số lần muốn kiểm tra ngày: ";
cin >> repeat;
Giải thích: Cho phép người dùng quyết định muốn kiểm tra bao nhiều ngày.
Bước 2: Khởi tạo vòng lặp while
int count = 0; // Biến đếm số lần đã thực hiện
while (count < repeat) {
// Nội dung xử lý ở đây
count++; // Tăng biến đếm sau mỗi lần lặp
}
Giải thích: Sử dụng while như đề yêu cầu, đếm từ 0 đến repeat-1.
Bước 3: Nhập và validation day
int day = 0;
while (day < 1 || day > 7) {
cout << "Nhập số ngày (1-7): ";
cin >> day;
if (day < 1 || day > 7) {
cout << "❌ Số phải từ 1 đến 7! Vui lòng nhập lại." << endl;
day = 0;
}
}
Giải thích:Dùng while để bắt buộc nhập đúng, chỉ thoát khi day hợp lệ.
Bước 4: Switch-case phân loại
switch (day) {
case 1:
cout << "🔵 Thứ Hai (Monday)" << endl;
break;
case 2:
cout << "🟢 Thứ Ba (Tuesday)" << endl;
break;
case 3:
cout << "🟡 Thứ Tư (Wednesday)" << endl;
break;
case 4:
cout << "🟠 Thứ Năm (Thursday)" << endl;
break;
case 5:
cout << "🔴 Thứ Sáu (Friday)" << endl;
break;
case 6:
cout << "🟣 Thứ Bảy (Saturday)" << endl;
break;
case 7:
cout << "🎉 Chủ Nhật (Sunday)" << endl;
break;
default:
cout << "❌ Lỗi không xác định!" << endl;
break;
}
Giải thích:
- Mỗi case tương ứng với một ngày
- break để thoát khỏi switch sau khi thực hiện
- default phòng trường hợp bất ngờ (tuy nhiên đã có validation)
🎮 TEST CHƯƠNG TRÌNH
📝 Test case 1: Chương trình hoạt động bình thường
Input: repeat = 3
day = 1 → "Thứ Hai"
day = 5 → "Thứ Sáu"
day = 7 → "Chủ Nhật"
Expected: Hiển thị đúng 3 lần với tên ngày tương ứng
📝 Test case 2: Input sai cần validation
Input: repeat = 2
day = 8 (sai) → nhập lại: 6 → "Thứ Bảy"
day = 0 (sai) → nhập lại: 3 → "Thứ Tư"
Expected: Chương trình yêu cầu nhập lại và hiển thị đúng
📝 Test case 3: Kiểm tra tất cả các ngày
Input: repeat = 7
day = 1,2,3,4,5,6,7
Expected: Hiển thị đầy đủ từ Thứ Hai đến Chủ Nhật
🎯 BÀI TẬP THỰC HÀNH
🟢 Cấp độ dễ:
Bài 1: Version đơn giản
/*
YÊU CẦU:
- Chỉ lặp 3 lần cố định (không cần nhập repeat)
- Nhập day và hiển thị tên ngày
- Có validation cơ bản cho day (1-7)
- Sử dụng while và switch-case như đề gốc
*/
Bài 2: Thêm thông tin ngày
/*
YÊU CẦU:
- Giống bài gốc nhưng thêm thông tin:
- Weekday hay Weekend
- Màu sắc đại diện cho ngày
- Emoji vui nhộn
- Hiển thị bảng đẹp mắt
*/
🟡 Cấp độ trung bình:
Bài 3: Chế độ ngược
/*
YÊU CẦU:
- Menu chọn: 1.Số→Tên 2.Tên→Số
- Chế độ 1: Nhập số, hiển thị tên (như đề gốc)
- Chế độ 2: Hiển thị menu tên ngày, nhập tên, hiển thị số
- Dùng switch-case cho cả hai chế độ
- Loop menu cho đến khi chọn thoát
*/
Bài 4: Tính toán ngày
/*
YÊU CẦU:
- Nhập ngày hiện tại (1-7)
- Nhập số ngày muốn cộng thêm
- Tính ngày kết quả (xử lý khi > 7 thì quay lại 1)
- Ví dụ: Thứ Sáu (5) + 3 ngày = Thứ Hai (1)
- Hiển thị quá trình tính toán chi tiết
*/
🔴 Cấp độ khó:
Bài 5: Lịch tháng mini
/*
YÊU CẦU:
- Nhập tháng và năm
- Tính toán ngày đầu tháng là thứ mấy
- Vẽ lịch tháng hoàn chỉnh bằng ASCII
- Highlight ngày hiện tại
- Thêm thông tin: ngày lễ, cuối tuần
- Sử dụng algorithm tính toán ngày trong tuần
*/
Bài 6: Hệ thống reminder
/*
YÊU CẦU:
- Quản lý công việc theo ngày trong tuần
- Menu: Thêm/Xóa/Xem công việc theo ngày
- Mỗi ngày có thể có nhiều công việc
- Reminder tự động cho công việc quan trọng
- Export lịch làm việc tuần ra text file
- Statistics: ngày bận nhất, ngày rảnh nhất
*/
🏆 THỬ THÁCH BONUS:
Challenge 1: “Lịch vạn niên”
/*
NHIỆM VỤ:
- Nhập ngày/tháng/năm bất kỳ
- Tính toán chính xác thứ mấy trong tuần
- Xử lý năm nhuận, các tháng có số ngày khác nhau
- Algorithm: Zeller's congruence hoặc Doomsday
- Interface đẹp với ASCII calendar
- Bonus: Hiển thị cung hoàng đạo, năm âm lịch
*/
Challenge 2: “Time Zone Converter”
/*
NHIỆM VỤ:
- Chuyển đổi giờ giữa các múi giờ
- Tính toán ngày thay đổi khi cross midnight
- Database múi giờ các nước
- DST (Daylight Saving Time) handling
- World clock với update real-time simulation
- Meeting scheduler across time zones
*/
💡 MẸO VÀ THỦ THUẬT
🌟 Validation input thông minh:
// Thay vì:
if (day < 1 || day > 7) {
cout << "Lỗi!";
}
// Dùng:
if (day < 1 || day > 7) {
cout << "❌ Lỗi: Số " << day << " không hợp lệ!";
cout << "\n💡 Hãy nhập số từ 1 đến 7.";
cout << "\n📅 1=Thứ Hai, 2=Thứ Ba, ..., 7=Chủ Nhật\n";
}
🎯 Switch-case với style:
// Thêm thông tin phong phú:
switch (day) {
case 1:
cout << "🔵 Thứ Hai (Monday)" << endl;
cout << "💼 Blue Monday - Bắt đầu tuần mới!" << endl;
cout << "🎯 Hôm nay nên lập kế hoạch cho cả tuần!" << endl;
break;
// ... các case khác
}
⚡ Optimize với lookup table:
// Cách nâng cao (cho tham khảo):
string dayNames[] = {"", "Thứ Hai", "Thứ Ba", "Thứ Tư",
"Thứ Năm", "Thứ Sáu", "Thứ Bảy", "Chủ Nhật"};
string dayEmojis[] = {"", "🔵", "🟢", "🟡", "🟠", "🔴", "🟣", "🎊"};
// Thay switch bằng:
if (day >= 1 && day <= 7) {
cout << dayEmojis[day] << " " << dayNames[day] << endl;
}
🐛 TRÁNH CÁC LỖI THƯỜNG GẶP
❌ Lỗi 1: Quên break trong switch
// SAI: Sẽ chạy tiếp các case bên dưới
switch (day) {
case 1:
cout << "Thứ Hai";
// Thiếu break!
case 2:
cout << "Thứ Ba"; // Sẽ in cả này nếu day = 1
break;
}
// ĐÚNG: Luôn có break
switch (day) {
case 1:
cout << "Thứ Hai";
break; // Có break
case 2:
cout << "Thứ Ba";
break;
}
❌ Lỗi 2: Điều kiện while sai
// SAI: Có thể infinite loop hoặc không chạy
while (count <= repeat) { // Sẽ chạy repeat+1 lần!
// ...
count++;
}
// ĐÚNG: Chạy đúng repeat lần
while (count < repeat) { // Chạy từ 0 đến repeat-1
// ...
count++;
}
❌ Lỗi 3: Validation không đầy đủ
// SAI: Không handle input type mismatch
int day;
cin >> day; // Nếu user nhập chữ thì lỗi
// ĐÚNG: Handle mọi trường hợp
int day;
while (!(cin >> day) || day < 1 || day > 7) {
cout << "Lỗi! Vui lòng nhập số từ 1-7: ";
cin.clear();
cin.ignore(10000, '\n');
}
📋 CHECKLIST HOÀN THÀNH
✅ Yêu cầu bắt buộc:
- Sử dụng while để lặp repeat lần
- Sử dụng switch-case để phân loại day thành tên ngày
- Nhập day (1-7) và repeat (số lần lặp)
- Validation đầy đủ cho day (1-7)
- Yêu cầu nhập lại nếu day không hợp lệ
- Hiển thị đúng tên ngày tiếng Việt
- Code chạy đúng với mọi test case
✅ Điểm cộng nếu có:
- Giao diện đẹp mắt với emoji và màu sắc
- Thông tin bổ sung về từng ngày
- Phân biệt weekday và weekend
- Bảng tóm tắt lịch tuần
- Comments giải thích chi tiết
- Error handling toàn diện
🎊 TỔNG KẾT
🏆 Bạn đã học được:
- ✨Kết hợp while và switch-casehiệu quả trong một chương trình
- 🎯Input validationvới vòng lặp do-while
- 🔢Switch-caseđể phân loại và xử lý nhiều trường hợp
- 💪Structured programmingvới logic rõ ràng từng bước
🌟 Tại sao bài này quan trọng:
- Control flow:Thành thạo cách điều khiển luồng chương trình
- Data mapping:Hiểu cách chuyển đổi giữa các dạng dữ liệu
- User experience:Tạo chương trình thân thiện với người dùng
- Real application:Áp dụng vào bài toán thực tế (calendar, scheduler)
🚀 Level up achieved:
Từ “người viết if-else đơn giản” → “chuyên gia switch-case và validation” 📅✨
💬 HỎI ĐÁP THÔNG MINH
❓ Câu hỏi thường gặp:
Q: Khi nào dùng switch-case thay vì if-else?
A: Khi có nhiều giá trị cụ thể cần kiểm tra (như 1,2,3…), switch-case rõ ràng và hiệu quả hơn. If-else tốt hơn cho điều kiện phức tạp (>, <, &&, ||).
Q: Tại sao cần break trong switch-case?
A: Không có break, chương trình sẽ “fall through” – chạy tiếp các case bên dưới. Đây là tính năng có thể hữu ích nhưng thường gây lỗi nếu không cẩn thận.
Q: Có thể dùng string trong switch-case không?
A: Trong C++ truyền thống không được, chỉ dùng int, char. Nhưng có thể dùng enum hoặc hash string thành số.
Q: Default case có bắt buộc không?
A: Không bắt buộc, nhưng nên có để xử lý trường hợp bất ngờ, giúp chương trình robust hơn.
🆘 Cần trợ giúp?
- 💻Test online:onlinegdb.com
- 🎯Debug:In ra giá trị biến count và day để kiểm tra logic
- 📚Tham khảo:Search “C++ switch case examples” để xem thêm ví dụ
🌟 CODE HOÀN CHỈNH
Đây là bài giải mẫu. Chúng ta nên tự giải bài tập dựa theo hướng dẫn của Admin trước hãy xem bài giải nhé. (Vui lòng đăng nhập để xem).
🎉 LỜI KHÍCH LỆ CUỐI BÀI
Tuyệt vời! Bạn vừa hoàn thành một bài tập rất hay về việc kết hợp nhiều cấu trúc điều khiển! 🚀
💪 Switch-case là một công cụ cực kỳ mạnh mẽ trong lập trình – từ menu ứng dụng, game logic, đến state machine trong robotics và AI. Bạn đã bắt đầu thành thạo nó!
🌟 Điều đặc biệt: Bạn đã học cách validate input chuyên nghiệp – một kỹ năng cực kỳ quan trọng để tạo ra những ứng dụng robust và user-friendly.
🎯 From here: Kiến thức về vòng lặp và rẽ nhánh sẽ giúp bạn giải quyết được 80% các bài toán lập trình cơ bản!
Tiếp tục hành trình chinh phục C++ với sự tự tin! 📅🎊
🏷️ Tags:
#C++
#switch-case
#while-loop
#input-validation
#ngày-trong-tuần
#phân-loại-dữ-liệu
#bài-tập-thực-hành
#control-flow
#dễ-hiểu
#calendar-programming
#Việt-Nam
#programming-tutorial