Chào các bạn! Hôm nay chúng ta sẽ học về “luật ưu tiên của máy tính” – quy tắc giúp C++ biết phép toán nào tính trước, phép nào tính sau! 🚀
🎭 Hãy tưởng tượng:
- Bạn làgiáo viên toán👨🏫 giải thích thứ tự phép tính cho cả lớp!
- Hoặc bạn làthẩm phán tính toán⚖️ quyết định quy tắc ưu tiên công bằng!
- Hoặc đơn giản, bạn muốnmáy tính ra kết quả đúngnhư mong muốn! 🧮
Hôm nay bạn sẽ học:
- Bảng độ ưu tiêntoán tử từ cao đến thấp
- Quy tắc “Nhân chia trước, cộng trừ sau”và mở rộng
- Sử dụng ngoặc đơnđể thay đổi thứ tự tính
- Tránh những lỗi ngớ ngẩnkhi viết biểu thức phức tạp!
// Cùng con số nhưng kết quả khác nhau!
int a = 2 + 3 * 4; // Kết quả: 14 (không phải 20!)
int b = (2 + 3) * 4; // Kết quả: 20 (có ngoặc)
cout << a << endl; // In ra: 14
cout << b << endl; // In ra: 20
Từ bây giờ, bạn sẽ trở thành “master biểu thức” có thể viết công thức phức tạp! 🚀
📚 BẢNG ĐỘ ƯU TIÊN TOÁN TỬ HOÀN CHỈNH
🎯 Thứ tự từ cao đến thấp (cao = tính trước):
Mức | Toán tử | Tên | Ví dụ | Ghi chú |
---|---|---|---|---|
1 | () | Ngoặc đơn | (a + b) | Cao nhất – Luôn tính trước |
2 | ! | NOT logic | !isActive | Toán tử một ngôi |
3 | * / % | Nhân, chia, chia lấy dư | a * b / c | Cùng mức, tính trái→phải |
4 | + - | Cộng, trừ | a + b - c | Cùng mức, tính trái→phải |
5 | < <= > >= | So sánh kích thước | a > b | Toán tử so sánh |
6 | == != | So sánh bằng/khác | a == b | So sánh bằng nhau |
7 | && | AND logic | a && b | Logic VÀ |
8 | || | OR logic | a || b | Thấp nhất – Logic HOẶC |
🌟 Quy tắc vàng:
- Mức caotínhtrướcmức thấp
- Cùng mứcthì tính từtrái sang phải
- Ngoặc đơn ()luônthay đổithứ tự tự nhiên
🧮 MỨC 1: NGOẶC ĐƠN () – VUA CỦA MỌI TOÁN TỬ
👑 Ngoặc đơn luôn được ưu tiên cao nhất:
#include <iostream>
using namespace std;
int main() {
int a = 2, b = 3, c = 4;
cout << "🧮 DEMO SỨC MẠNH CỦA NGOẶC ĐƠN:" << endl;
cout << "═══════════════════════════════════" << endl;
// Không có ngoặc - theo thứ tự ưu tiên tự nhiên
int ketQua1 = a + b * c;
cout << "a + b × c = " << a << " + " << b << " × " << c << " = " << ketQua1 << endl;
cout << "Giải thích: " << b << " × " << c << " = " << (b*c) << ", rồi " << a << " + " << (b*c) << " = " << ketQua1 << endl;
// Có ngoặc - thay đổi thứ tự
int ketQua2 = (a + b) * c;
cout << "(a + b) × c = (" << a << " + " << b << ") × " << c << " = " << ketQua2 << endl;
cout << "Giải thích: " << a << " + " << b << " = " << (a+b) << ", rồi " << (a+b) << " × " << c << " = " << ketQua2 << endl;
// Ngoặc phức tạp hơn
int ketQua3 = (a + b) * (c - 1);
cout << "(a + b) × (c - 1) = (" << a << " + " << b << ") × (" << c << " - 1) = " << ketQua3 << endl;
return 0;
}
💰 Ví dụ thực tế – Tính tiền mua sắm:
int main() {
double giaAo = 250000; // 250k
double giaQuan = 180000; // 180k
double giaGiay = 320000; // 320k
int soLuongAo = 2;
int soLuongQuan = 1;
double giamGia = 0.1; // 10%
cout << "💰 TÍNH TIỀN MUA SẮM - ẢNH HƯỞNG CỦA NGOẶC:" << endl;
cout << "═══════════════════════════════════════════" << endl;
// SAI: Không dùng ngoặc
double tongTienSai = giaAo * soLuongAo + giaQuan * soLuongQuan - giamGia * giaGiay;
cout << "❌ CÁCH TÍNH SAI (không ngoặc):" << endl;
cout << "Tổng = " << giaAo << " × " << soLuongAo << " + " << giaQuan << " × " << soLuongQuan << " - " << giamGia << " × " << giaGiay << endl;
cout << " = " << (giaAo * soLuongAo) << " + " << (giaQuan * soLuongQuan) << " - " << (giamGia * giaGiay) << endl;
cout << " = " << tongTienSai << " VNĐ" << endl;
// ĐÚNG: Dùng ngoặc
double tongTienDung = (giaAo * soLuongAo + giaQuan * soLuongQuan + giaGiay) * (1 - giamGia);
cout << "\n✅ CÁCH TÍNH ĐÚNG (có ngoặc):" << endl;
cout << "Tổng = (" << giaAo << " × " << soLuongAo << " + " << giaQuan << " × " << soLuongQuan << " + " << giaGiay << ") × (1 - " << giamGia << ")" << endl;
cout << " = " << (giaAo * soLuongAo + giaQuan * soLuongQuan + giaGiay) << " × " << (1 - giamGia) << endl;
cout << " = " << tongTienDung << " VNĐ" << endl;
cout << "\n💡 Chênh lệch: " << (tongTienDung - tongTienSai) << " VNĐ!" << endl;
return 0;
}
⚡ MỨC 2: TOÁN TỬ NOT (!) – SỨC MẠNH ĐẢO NGƯỢC
🚫 NOT có độ ưu tiên cao thứ 2:
int main() {
bool isOnline = true;
bool hasPermission = false;
cout << "🚫 DEMO TOÁN TỬ NOT (!):" << endl;
cout << "═══════════════════════════════" << endl;
// NOT được tính trước các toán tử khác
bool ketQua1 = !isOnline || hasPermission;
cout << "!isOnline || hasPermission = !" << boolalpha << isOnline << " || " << hasPermission;
cout << " = " << !isOnline << " || " << hasPermission << " = " << ketQua1 << endl;
// So sánh với có ngoặc
bool ketQua2 = !(isOnline || hasPermission);
cout << "!(isOnline || hasPermission) = !(" << isOnline << " || " << hasPermission << ")";
cout << " = !" << (isOnline || hasPermission) << " = " << ketQua2 << endl;
return 0;
}
✖️➗ MỨC 3: NHÂN (*), CHIA (/), CHIA LẤY DƯ (%) – BỘ BA QUYỀN LỰC
🎪 Cùng mức độ ưu tiên, tính từ trái sang phải:
int main() {
int a = 20, b = 4, c = 3, d = 2;
cout << "✖️➗ DEMO NHÂN, CHIA, CHIA LẤY DƯ:" << endl;
cout << "═══════════════════════════════════" << endl;
// Tất cả cùng mức, tính từ trái sang phải
int ketQua1 = a / b * c;
cout << "a ÷ b × c = " << a << " ÷ " << b << " × " << c;
cout << " = " << (a/b) << " × " << c << " = " << ketQua1 << endl;
// Thay đổi với ngoặc
int ketQua2 = a / (b * c);
cout << "a ÷ (b × c) = " << a << " ÷ (" << b << " × " << c << ")";
cout << " = " << a << " ÷ " << (b*c) << " = " << ketQua2 << endl;
// Kết hợp với chia lấy dư
int ketQua3 = a % b / d;
cout << "a % b ÷ d = " << a << " % " << b << " ÷ " << d;
cout << " = " << (a%b) << " ÷ " << d << " = " << ketQua3 << endl;
return 0;
}
📐 Ví dụ thực tế – Tính diện tích và chu vi:
int main() {
double PI = 3.14159;
double banKinh = 5.0;
double chieuDai = 8.0;
double chieuRong = 6.0;
cout << "📐 TÍNH TOÁN HÌNH HỌC VỚI TOÁN TỬ:" << endl;
cout << "═══════════════════════════════════════" << endl;
// Diện tích hình tròn: π × r²
double dienTichTron = PI * banKinh * banKinh;
cout << "🟡 Diện tích hình tròn = π × r² = " << PI << " × " << banKinh << "² = " << dienTichTron << " đơn vị²" << endl;
// Chu vi hình chữ nhật: 2 × (dài + rộng)
double chuViHCN = 2 * (chieuDai + chieuRong);
cout << "📱 Chu vi hình chữ nhật = 2 × (dài + rộng) = 2 × (" << chieuDai << " + " << chieuRong << ") = " << chuViHCN << " đơn vị" << endl;
// Diện tích hình chữ nhật
double dienTichHCN = chieuDai * chieuRong;
cout << "📱 Diện tích hình chữ nhật = dài × rộng = " << chieuDai << " × " << chieuRong << " = " << dienTichHCN << " đơn vị²" << endl;
return 0;
}
➕➖ MỨC 4: CỘNG (+), TRỪ (-) – DUO THÂN THIẾT
🎯Độ ưu tiên thấp hơn nhân chia:
int main() {
int a = 10, b = 3, c = 2, d = 4;
cout << "➕➖ DEMO CỘNG VÀ TRỪ:" << endl;
cout << "═════════════════════════" << endl;
// Nhân chia trước, cộng trừ sau
int ketQua1 = a + b * c - d;
cout << "a + b × c - d = " << a << " + " << b << " × " << c << " - " << d << endl;
cout << "Từng bước: " << b << " × " << c << " = " << (b*c) << endl;
cout << " " << a << " + " << (b*c) << " = " << (a + b*c) << endl;
cout << " " << (a + b*c) << " - " << d << " = " << ketQua1 << endl;
// Cộng trừ từ trái sang phải
int ketQua2 = a + b - c + d;
cout << "\na + b - c + d = " << a << " + " << b << " - " << c << " + " << d << endl;
cout << "Từ trái sang phải: " << a << " + " << b << " = " << (a+b) << endl;
cout << " " << (a+b) << " - " << c << " = " << (a+b-c) << endl;
cout << " " << (a+b-c) << " + " << d << " = " << ketQua2 << endl;
return 0;
}
🔍 MỨC 5-6: TOÁN TỬ SO SÁNH – THẨM PHÁN CÔNG BẰNG
⚖️ So sánh kích thước trước, so sánh bằng nhau sau:
int main() {
int diem1 = 85, diem2 = 78, diem3 = 85;
int diemChuan = 80;
cout << "🔍 DEMO TOÁN TỬ SO SÁNH:" << endl;
cout << "═══════════════════════════════" << endl;
// Phép toán + so sánh kích thước
bool ketQua1 = diem1 + 5 > diemChuan;
cout << "diem1 + 5 > diemChuan = " << diem1 << " + 5 > " << diemChuan;
cout << " = " << (diem1 + 5) << " > " << diemChuan << " = " << boolalpha << ketQua1 << endl;
// So sánh kích thước trước so sánh bằng
bool ketQua2 = diem1 > diem2 == diem1 > diem3;
cout << "diem1 > diem2 == diem1 > diem3:" << endl;
cout << "Bước 1: " << diem1 << " > " << diem2 << " = " << (diem1 > diem2) << endl;
cout << "Bước 2: " << diem1 << " > " << diem3 << " = " << (diem1 > diem3) << endl;
cout << "Bước 3: " << (diem1 > diem2) << " == " << (diem1 > diem3) << " = " << ketQua2 << endl;
return 0;
}
🧠 MỨC 7-8: TOÁN TỬ LOGIC – BỘ NÃO CUỐI CÙNG
💭 AND (&&) trước OR (||):
int main() {
bool daDangNhap = true;
bool laAdmin = false;
bool coQuyen = true;
bool taiKhoanHoatDong = true;
cout << "🧠 DEMO TOÁN TỬ LOGIC:" << endl;
cout << "════════════════════════════" << endl;
// AND trước OR
bool ketQua1 = daDangNhap && laAdmin || coQuyen && taiKhoanHoatDong;
cout << "daDangNhap && laAdmin || coQuyen && taiKhoanHoatDong:" << endl;
cout << "Bước 1 (AND): " << boolalpha << daDangNhap << " && " << laAdmin << " = " << (daDangNhap && laAdmin) << endl;
cout << "Bước 2 (AND): " << coQuyen << " && " << taiKhoanHoatDong << " = " << (coQuyen && taiKhoanHoatDong) << endl;
cout << "Bước 3 (OR): " << (daDangNhap && laAdmin) << " || " << (coQuyen && taiKhoanHoatDong) << " = " << ketQua1 << endl;
cout << "\n💡 Kết luận: " << (ketQua1 ? "✅ Được phép truy cập!" : "❌ Bị từ chối!") << endl;
return 0;
}
🎪 CHƯƠNG TRÌNH MẪU ĐẦY ĐỦ VÀ VUI NHỘN
/*
════════════════════════════════════════════════════════════
BÀI 19: ĐỘ ƯU TIÊN TOÁN TỬ - MASTER BIỂU THỨC C++
Tác giả: [Tên bạn]
Mục đích: Thực hành tất cả độ ưu tiên toán tử
════════════════════════════════════════════════════════════
*/
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
// ═══════════════════════════════════════════════════════
// PHẦN GIỚI THIỆU
// ═══════════════════════════════════════════════════════
cout << "🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟\n";
cout << "🎯 ĐỘ UU TIÊN TOÁN TỬ - MASTER BIỂU THỨC 🎯\n";
cout << "🌟 Nhân chia trước, cộng trừ sau! 🌟\n";
cout << "🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟\n\n";
// ═══════════════════════════════════════════════════════
// BẢNG ĐỘ ƯU TIÊN HOÀN CHỈNH
// ═══════════════════════════════════════════════════════
cout << "📋 BẢNG ĐỘ ƯU TIÊN TOÁN TỬ (CAO → THẤP):\n";
cout << "════════════════════════════════════════════════\n";
cout << "┌─────┬─────────────┬──────────────────────────┐\n";
cout << "│ Mức │ Toán tử │ Ví dụ │\n";
cout << "├─────┼─────────────┼──────────────────────────┤\n";
cout << "│ 1 │ () │ (a + b) │ 👑 Cao nhất\n";
cout << "│ 2 │ ! │ !isActive │\n";
cout << "│ 3 │ * / % │ a * b / c │\n";
cout << "│ 4 │ + - │ a + b - c │\n";
cout << "│ 5 │ < <= > >= │ a > b │\n";
cout << "│ 6 │ == != │ a == b │\n";
cout << "│ 7 │ && │ a && b │\n";
cout << "│ 8 │ || │ a || b │ 🔽 Thấp nhất\n";
cout << "└─────┴─────────────┴──────────────────────────┘\n\n";
// ═══════════════════════════════════════════════════════
// DEMO CÁC MỨC ƯU TIÊN
// ═══════════════════════════════════════════════════════
int a = 10, b = 3, c = 2, d = 4;
bool isActive = true, hasPermission = false;
cout << "🔢 DỮ LIỆU DEMO:\n";
cout << "════════════════════════════════════════════════\n";
cout << "• a = " << a << ", b = " << b << ", c = " << c << ", d = " << d << endl;
cout << "• isActive = " << boolalpha << isActive << ", hasPermission = " << hasPermission << endl;
cout << "\n";
// ═══════════════════════════════════════════════════════
// MỨC 1: NGOẶC ĐƠN
// ═══════════════════════════════════════════════════════
cout << "👑 MỨC 1: NGOẶC ĐƠN () - VUA CỦA MỌI TOÁN TỬ:\n";
cout << "════════════════════════════════════════════════\n";
int ngoac1 = a + b * c;
int ngoac2 = (a + b) * c;
int ngoac3 = a * (b + c);
cout << "• a + b × c = " << a << " + " << b << " × " << c << " = " << ngoac1 << endl;
cout << "• (a + b) × c = (" << a << " + " << b << ") × " << c << " = " << ngoac2 << endl;
cout << "• a × (b + c) = " << a << " × (" << b << " + " << c << ") = " << ngoac3 << endl;
cout << "💡 Ngoặc đơn thay đổi hoàn toàn kết quả!\n\n";
// ═══════════════════════════════════════════════════════
// MỨC 2: TOÁN TỬ NOT
// ═══════════════════════════════════════════════════════
cout << "🚫 MỨC 2: TOÁN TỬ NOT (!) - SỨC MẠNH ĐẢO NGƯỢC:\n";
cout << "════════════════════════════════════════════════\n";
bool not1 = !isActive || hasPermission;
bool not2 = !(isActive || hasPermission);
cout << "• !isActive || hasPermission = !" << isActive << " || " << hasPermission;
cout << " = " << !isActive << " || " << hasPermission << " = " << not1 << endl;
cout << "• !(isActive || hasPermission) = !(" << isActive << " || " << hasPermission << ")";
cout << " = !" << (isActive || hasPermission) << " = " << not2 << endl;
cout << "💡 NOT được tính trước OR!\n\n";
// ═══════════════════════════════════════════════════════
// MỨC 3: NHÂN CHIA CHIA DƯ
// ═══════════════════════════════════════════════════════
cout << "✖️➗ MỨC 3: NHÂN (*), CHIA (/), CHIA LẤY DƯ (%):\n";
cout << "════════════════════════════════════════════════\n";
int nhanchia1 = a * b / c;
int nhanchia2 = a / b * c;
int nhanchia3 = a % b + c;
cout << "• a × b ÷ c = " << a << " × " << b << " ÷ " << c;
cout << " = " << (a*b) << " ÷ " << c << " = " << nhanchia1 << " (trái→phải)" << endl;
cout << "• a ÷ b × c = " << a << " ÷ " << b << " × " << c;
cout << " = " << (a/b) << " × " << c << " = " << nhanchia2 << " (trái→phải)" << endl;
cout << "• a % b + c = " << a << " % " << b << " + " << c;
cout << " = " << (a%b) << " + " << c << " = " << nhanchia3 << " (% trước +)" << endl;
cout << "💡 Cùng mức thì tính từ trái sang phải!\n\n";
// ═══════════════════════════════════════════════════════
// MỨC 4: CỘNG TRỪ
// ═══════════════════════════════════════════════════════
cout << "➕➖ MỨC 4: CỘNG (+), TRỪ (-):\n";
cout << "════════════════════════════════════════════════\n";
int congtru1 = a + b * c - d;
int congtru2 = a - b + c * d;
cout << "• a + b × c - d = " << a << " + " << b << " × " << c << " - " << d << endl;
cout << " Bước 1: " << b << " × " << c << " = " << (b*c) << " (× trước)" << endl;
cout << " Bước 2: " << a << " + " << (b*c) << " = " << (a + b*c) << " (+ sau)" << endl;
cout << " Bước 3: " << (a + b*c) << " - " << d << " = " << congtru1 << " (- cuối)" << endl;
cout << "• a - b + c × d = " << a << " - " << b << " + " << c << " × " << d << " = " << congtru2 << endl;
cout << "💡 Nhân chia luôn trước cộng trừ!\n\n";
// ═══════════════════════════════════════════════════════
// MỨC 5-6: SO SÁNH
// ═══════════════════════════════════════════════════════
cout << "🔍 MỨC 5-6: TOÁN TỬ SO SÁNH:\n";
cout << "════════════════════════════════════════════════\n";
bool sosánh1 = a + b > c * d;
bool sosánh2 = a > b == c < d;
cout << "• a + b > c × d = " << a << " + " << b << " > " << c << " × " << d;
cout << " = " << (a+b) << " > " << (c*d) << " = " << boolalpha << sosánh1 << endl;
cout << "• a > b == c < d:" << endl;
cout << " Bước 1: " << a << " > " << b << " = " << (a > b) << " (so sánh kích thước)" << endl;
cout << " Bước 2: " << c << " < " << d << " = " << (c < d) << " (so sánh kích thước)" << endl;
cout << " Bước 3: " << (a > b) << " == " << (c < d) << " = " << sosánh2 << " (so sánh bằng)" << endl;
cout << "💡 So sánh kích thước trước so sánh bằng!\n\n";
// ═══════════════════════════════════════════════════════
// MỨC 7-8: LOGIC
// ═══════════════════════════════════════════════════════
cout << "🧠 MỨC 7-8: TOÁN TỬ LOGIC:\n";
cout << "════════════════════════════════════════════════\n";
bool logic1 = a > 5 && b < 10 || c == 2;
bool logic2 = isActive && !hasPermission || a > b;
cout << "• a > 5 && b < 10 || c == 2:" << endl;
cout << " Bước 1: " << a << " > 5 = " << (a > 5) << " (so sánh)" << endl;
cout << " Bước 2: " << b << " < 10 = " << (b < 10) << " (so sánh)" << endl;
cout << " Bước 3: " << c << " == 2 = " << (c == 2) << " (so sánh)" << endl;
cout << " Bước 4: " << (a > 5) << " && " << (b < 10) << " = " << ((a > 5) && (b < 10)) << " (AND)" << endl;
cout << " Bước 5: " << ((a > 5) && (b < 10)) << " || " << (c == 2) << " = " << logic1 << " (OR)" << endl;
cout << "💡 AND trước OR, logic cuối cùng!\n\n";
// ═══════════════════════════════════════════════════════
// BÀI TẬP TƯƠNG TÁC
// ═══════════════════════════════════════════════════════
cout << "🎮 BÀI TẬP TƯƠNG TÁC - HỆ THỐNG CHẤM ĐIỂM:\n";
cout << "════════════════════════════════════════════════\n";
double diemToan, diemLy, diemHoa;
int tuoi;
bool thamGiaOlympic;
cout << "Nhập điểm Toán (0-10): ";
cin >> diemToan;
cout << "Nhập điểm Lý (0-10): ";
cin >> diemLy;
cout << "Nhập điểm Hóa (0-10): ";
cin >> diemHoa;
cout << "Nhập tuổi: ";
cin >> tuoi;
cout << "Có tham gia Olympic? (1: Có, 0: Không): ";
cin >> thamGiaOlympic;
cout << "\n🧮 PHÂN TÍCH BIỂU THỨC PHỨC TẠP:\n";
cout << "────────────────────────────────────────────────\n";
// Biểu thức siêu phức tạp - TEST độ ưu tiên
double diemTB = (diemToan + diemLy + diemHoa) / 3;
bool hocLucGioi = diemTB >= 8.0 && diemToan >= 7.0 && diemLy >= 7.0 && diemHoa >= 7.0;
bool hocBong = hocLucGioi && (tuoi <= 18 || thamGiaOlympic) && !((diemToan + diemLy + diemHoa) / 3 < 8.5);
cout << "📊 Các bước tính toán:\n";
cout << "1. Điểm TB = (Toán + Lý + Hóa) ÷ 3 = (" << diemToan << " + " << diemLy << " + " << diemHoa << ") ÷ 3 = " << fixed << setprecision(2) << diemTB << endl;
cout << "2. Học lực giỏi = (TB >= 8.0) && (Toán >= 7.0) && (Lý >= 7.0) && (Hóa >= 7.0)" << endl;
cout << " = " << boolalpha << (diemTB >= 8.0) << " && " << (diemToan >= 7.0) << " && " << (diemLy >= 7.0) << " && " << (diemHoa >= 7.0) << " = " << hocLucGioi << endl;
cout << "3. Điều kiện phụ = (tuổi <= 18) || tham gia Olympic = (" << tuoi << " <= 18) || " << thamGiaOlympic << " = " << ((tuoi <= 18) || thamGiaOlympic) << endl;
cout << "4. Học bổng = Học lực giỏi && Điều kiện phụ && !(TB < 8.5)" << endl;
cout << " = " << hocLucGioi << " && " << ((tuoi <= 18) || thamGiaOlympic) << " && " << !(diemTB < 8.5) << " = " << hocBong << endl;
cout << "\n🏆 KẾT QUẢ CUỐI CÙNG:\n";
cout << "────────────────────────────────────────────────\n";
if (hocBong) {
cout << "🎉 CHÚC MỪNG! Bạn đủ điều kiện nhận học bổng!" << endl;
} else {
cout << "😊 Hãy cố gắng thêm để đạt học bổng lần sau!" << endl;
}
// ═══════════════════════════════════════════════════════
// KẾT THÚC VUI VẺ
// ═══════════════════════════════════════════════════════
cout << "\n🎉 CHÚC MỪNG! BẠN ĐÃ THÀNH THẠO ĐỘ ƯU TIÊN TOÁN TỬ!\n";
cout << "════════════════════════════════════════════════\n";
cout << "✅ Đã hiểu 8 mức độ ưu tiên từ cao đến thấp\n";
cout << "✅ Đã biết vai trò của ngoặc đơn ()\n";
cout << "✅ Đã thực hành với biểu thức phức tạp\n";
cout << "✅ Đã tránh được các lỗi thường gặp\n\n";
cout << "🌟 BÂY GIỜ BẠN ĐÃ LÀ MASTER BIỂU THỨC C++! 🌟\n";
return 0;
}
🎯 BÀI TẬP THỰC HÀNH – 3 CẤP ĐỘ
🟢 CẤP ĐỘ DỄ: Làm quen với ưu tiên
Bài 1: Tính kết quả biểu thức cơ bản
/*
YÊU CẦU:
- Cho trước a=5, b=3, c=2, d=4
- Tính kết quả của:
+ a + b * c
+ (a + b) * c
+ a * b + c * d
+ a + b * c - d / 2
- Giải thích từng bước tính
- So sánh kết quả có và không có ngoặc
*/
// Gợi ý bắt đầu:
int a = 5, b = 3, c = 2, d = 4;
cout << "Biểu thức: a + b * c" << endl;
cout << "Thay số: " << a << " + " << b << " * " << c << endl;
// Tiếp tục...
Bài 2: Phép so sánh với tính toán
/*
YÊU CẦU:
- Nhập 3 số nguyên x, y, z
- Kiểm tra các điều kiện sau và giải thích:
+ x + y > z
+ x > y && y > z
+ x + y > z || x > 10
+ !(x == y) && z > 0
- In kết quả true/false và lý do
*/
Bài 3: Tính tiền với ưu tiên
/*
YÊU CẦU:
- Giá sản phẩm: 150,000 VNĐ
- Số lượng: 3 cái
- Giảm giá: 10%
- VAT: 8%
- Tính: Tổng = (giá × số lượng × (1 - giảm giá)) × (1 + VAT)
- So sánh nếu tính sai thứ tự
*/
🟡 CẤP ĐỘ TRUNG BÌNH: Logic phức tạp
Bài 4: Hệ thống xếp loại phức tạp
/*
YÊU CẦU:
- Nhập điểm Toán, Lý, Hóa (0-10)
- Xếp loại theo công thức:
+ Giỏi: TB >= 8 && tất cả môn >= 6.5 && có ít nhất 1 môn >= 9
+ Khá: TB >= 6.5 && tất cả môn >= 5 && không có môn < 4
+ TB: TB >= 5 && không quá 1 môn < 5
+ Yếu: còn lại
- Giải thích từng bước logic
*/
Bài 5: Máy tính lương phức tạp
/*
YÊU CẦU:
- Lương cơ bản, phụ cấp, thưởng
- Tăng ca: giờ thường × 1.5, chủ nhật × 2
- Thuế: 0% nếu < 11 triệu, 10% từ 11-18 triệu, 20% > 18 triệu
- Bảo hiểm: 8% lương gross
- Công thức: Net = (Cơ bản + Phụ cấp + Thưởng + Tăng ca - Bảo hiểm) × (1 - Thuế)
- Tính và giải thích từng bước
*/
Bài 6: Game logic phức tạp
/*
YÊU CẦU:
- Game RPG: HP, MP, Level, Experience
- Điều kiện level up:
+ EXP >= Level × 100 && HP > 50% && MP > 30%
- Điều kiện học skill:
+ Level >= 5 && Skill Points >= 3 || Level >= 10
- Điều kiện boss fight:
+ Level >= 15 && (có sword hoặc có magic) && HP > 80%
- Mô phỏng với input từ user
*/
🔴 CẤP ĐỘ KHÓ: Biểu thức master
Bài 7: Parser biểu thức toán học
/*
YÊU CẦU:
- Nhập biểu thức dạng string: "2+3*4-1"
- Parse và tính toán theo đúng độ ưu tiên
- Hỗ trợ ngoặc đơn: "(2+3)*(4-1)"
- Hiển thị từng bước tính toán
- Handle lỗi: chia cho 0, cú pháp sai
*/
Bài 8: Hệ thống AI quyết định
/*
YÊU CẦU:
- AI game strategy: Health, Mana, Enemy distance, Allies nearby
- Công thức quyết định phức tạp:
+ Attack: HP > 60% && MP > 40% && Enemy <= 3 && (Allies >= 2 || Level > Enemy_Level)
+ Defend: HP < 40% || (Enemy > 5 && Allies < 2) || MP < 20%
+ Heal: HP < 60% && MP > 50% && Safe_Zone && !Enemy_Nearby
+ Retreat: HP < 30% && (Enemy > Level || Outnumbered)
- Mô phỏng 20 scenarios khác nhau
*/
🏆 THỬ THÁCH BONUS – DÀNH CHO SIÊU SAO
Challenge 1: “Expression Optimizer”
/*
NHIỆM VỤ:
- Nhập biểu thức C++ bất kỳ
- Phân tích và tối ưu:
+ Loại bỏ ngoặc thừa: (a) + b → a + b
+ Gộp hằng số: 2 + 3 * 4 → 2 + 12 → 14
+ Đơn giản hóa logic: true || anything → true
+ Phát hiện dead code: false && anything → false
- Hiển thị biểu thức gốc và tối ưu
*/
Challenge 2: “Mathematical Expression Visualizer”
/*
NHIỆM VỤ:
- Vẽ cây biểu thức (Expression Tree) bằng ASCII
- Ví dụ: "2 + 3 * 4" thành:
+
/ \
2 *
/ \
3 4
- Hỗ trợ ngoặc đơn và toán tử logic
- Animation từng bước evaluation
- Export tree ra file DOT (Graphviz)
*/
💡 MẸO VÀ THỦ THUẬT CHUYÊN NGHIỆP
🌟 1. Nhớ thứ tự bằng câu thần chú:
"Ngoặc Not Nhân-chia Cộng-trừ So-sánh-size So-sánh-bằng And Or"
<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-accent-color">() ! */% +- <>= ==!= && ||</mark>
🎯 2. Khi nghi ngờ, hãy dùng ngoặc:
// Không chắc chắn:
int result = a + b * c > d && e < f;
// An toàn hơn:
int result = ((a + (b * c)) > d) && (e < f);
⚡ 3. Chia biểu thức phức tạp:
// Khó đọc:
if (score >= 80 && age >= 18 || hasScholarship && gpa > 3.5 && !isSuspended) {
// ...
}
// Dễ đọc:
bool basicRequirement = (score >= 80 && age >= 18);
bool scholarshipPath = hasScholarship && gpa > 3.5;
bool goodStanding = !isSuspended;
if (basicRequirement || (scholarshipPath && goodStanding)) {
// ...
}
🎨 4. Comment cho biểu thức phức tạp:
// Công thức tính lương NET
double netSalary = (basicSalary + allowance) * (1 - taxRate) - insurance;
// └─── gross income ────┘ └─ after tax ─┘ └─ final deduction
// Điều kiện đủ tuổi và học lực
bool eligible = (age >= 18) && (gpa >= 3.0) && (!isOnProbation);
// └─ legal ─┘ └─ academic ─┘ └─── standing ───┘
🐛 TRÁNH CÁC LỖI THƯỜNG GẶP
❌ Lỗi 1: Nhầm thứ tự ưu tiên
// SAI: Tưởng + trước *
int wrong = 2 + 3 * 4; // Tưởng là (2+3)*4 = 20
cout << wrong; // Thực tế là 2+(3*4) = 14
// ĐÚNG: Dùng ngoặc khi cần
int correct = (2 + 3) * 4;
cout << correct; // Đúng là 20
❌Lỗi 2: Logic phức tạp không dùng ngoặc
// SAI: Khó hiểu và dễ sai
if (age >= 18 && score >= 80 || hasDiscount && total > 500 && !isBlocked) {
// Ai hiểu được đây???
}
// ĐÚNG: Chia nhỏ và dùng ngoặc
bool ageOK = (age >= 18 && score >= 80);
bool discountOK = (hasDiscount && total > 500 && !isBlocked);
if (ageOK || discountOK) {
// Rõ ràng hơn nhiều!
}
❌ Lỗi 3: Quên ưu tiên của NOT
// SAI: Tưởng ! áp dụng cho cả biểu thức
if (!isActive || hasPermission) { // Thực tế: (!isActive) || hasPermission
// ...
}
// ĐÚNG: Dùng ngoặc để rõ ý đồ
if (!(isActive || hasPermission)) { // ! áp dụng cho toàn bộ
// ...
}
📋 CHECKLIST KIẾN THỨC
✅ Cơ bản (Beginner):
- Biết 8 mức độ ưu tiên cơ bản
- Hiểu “nhân chia trước, cộng trừ sau”
- Sử dụng ngoặc đơn để thay đổi thứ tự
- Tránh nhầm lẫn cơ bản trong biểu thức
- Tính đúng kết quả biểu thức đơn giản
✅ Trung cấp (Intermediate):
- Kết hợp nhiều loại toán tử trong biểu thức
- Hiểu ưu tiên của toán tử logic (&&, ||)
- Viết điều kiện phức tạp đúng logic
- Debug lỗi ưu tiên toán tử
- Refactor biểu thức phức tạp thành dễ đọc
✅ Nâng cao (Advanced):
- Parse biểu thức từ string
- Tối ưu biểu thức tự động
- Thiết kế DSL (Domain Specific Language) đơn giản
- Hiểu associativity (kết hợp trái/phải)
- Viết compiler expression đơn giản
🎊 TỔNG KẾT BÀI HỌC
🏆 Chúc mừng! Bạn đã trở thành “EXPRESSION MASTER”!
📚 Những gì bạn đã học:
- ✨8 mức độ ưu tiên:Từ ngoặc đơn cao nhất đến OR thấp nhất
- 🎯Quy tắc vàng:Ngoặc → NOT → Nhân/Chia → Cộng/Trừ → So sánh → Logic
- 🔗Associativity:Cùng mức tính từ trái sang phải
- ⚡Best practices:Dùng ngoặc, chia nhỏ biểu thức, comment rõ ràng
- 🧠Debug skills:Nhận diện và sửa lỗi ưu tiên toán tử
🌟 Tại sao độ ưu tiên toán tử quan trọng:
- Correctness:Đảm bảo tính toán đúng kết quả mong muốn
- Readability:Code dễ đọc, dễ hiểu, dễ maintain
- Professional:Tránh bug ngớ ngẩn trong dự án thực tế
- Foundation:Nền tảng cho parser, compiler, DSL design
🚀 Bước tiếp theo:
Bài 20: “Giải phương trình bậc nhất”– Áp dụng toán tử vào bài toán thực tế!
🎮 MINI GAME: “EXPRESSION EVALUATION RACE”
🎯 Thử thách 180 giây:
Tính nhanh kết quả của các biểu thức (không dùng máy tính):
2 + 3 * 4 - 5
→ ?(2 + 3) * (4 - 1)
→ ?10 / 2 + 3 * 4
→ ?!(5 > 3) || (2 < 4)
→ ?2 + 3 > 4 && 5 < 6 || 1 == 1
→ ?
⏰ Sẵn sàng? Bắt đầu!
💬 HỎI ĐÁP THÔNG MINH
❓ Câu hỏi thường gặp:
Q: Tại sao phải học thuộc lòng độ ưu tiên?
A: Không cần thuộc lòng hết! Chỉ cần nhớ các quy tắc cơ bản: ngoặc cao nhất, nhân chia trước cộng trừ, logic cuối cùng. Khi nghi ngờ thì dùng ngoặc!
Q: Làm sao nhớ được 8 mức độ ưu tiên?
A: Dùng câu thần chú: “Ngoặc Not Nhân-chia Cộng-trừ So-sánh And Or”. Thực hành nhiều sẽ thành phản xạ.
Q: Khi nào nên dùng ngoặc đơn?
A: Luôn luôn! Tốt hơn dùng thừa ngoặc còn hơn sai logic. Ngoặc giúp code dễ đọc và tránh bug.
Q: && và || có khác & và | không?
A: Khác hoàn toàn! && || là logic operators (với short-circuit), & | là bitwise operators. Độ ưu tiên cũng khác nhau.
🆘 Cần trợ giúp?
- 💻Thử nghiệmtrên onlinegdb.com với biểu thức phức tạp
- 🔍Debugtừng phần của biểu thức lớn
- 📚Vẽ sơ đồ câybiểu thức khi confused
🎉 LỜI KHÍCH LỆ CUỐI BÀI
Tuyệt vời! Bạn vừa chinh phục được “ngôn ngữ biểu thức” của C++! 🚀
💪 Độ ưu tiên toán tử là DNA của mọi ngôn ngữ lập trình – từ C++ đến Python, JavaScript, Java… Hiểu rõ nó có nghĩa bạn có thể chuyển đổi giữa các ngôn ngữ dễ dàng hơn!
🌟 Điều kỳ diệu: Từ những quy tắc đơn giản này, bạn có thể xây dựng các công thức phức tạp cho mọi lĩnh vực – từ tính lương, đánh giá rủi ro, đến thuật toán AI!
🎯 Real achievement: Bây giờ bạn có thể đọc và viết bất kỳ biểu thức C++ nào với sự tự tin tuyệt đối!
Tiếp tục hành trình master C++ với kiến thức vững chắc! 🧮✨
🏷️ Tags:
#C++
#độ-ưu-tiên-toán-tử
#operator-precedence
#biểu-thức-toán-học
#nhân-chia-trước-cộng-trừ-sau
#ngoặc-đơn
#logic-operators
#expression-evaluation
#cơ-bản
#thực-hành
#debug-skills
#dễ-hiểu
#Việt-Nam
#programming-tutorial