📦 Biến và Hằng số trong C++
📖 Giới thiệu
Biến và hằng số là những khái niệm cơ bản nhất trong lập trình. Chúng giống như những chiếc hộp để chứa dữ liệu mà chương trình cần sử dụng. Biến có thể thay đổi giá trị trong quá trình chạy chương trình, còn hằng số thì không.
Trong bài này, chúng ta sẽ học cách khai báo, khởi tạo và sử dụng biến và hằng số. Đây là nền tảng để bạn có thể lưu trữ và xử lý dữ liệu trong các chương trình C++.
Việc hiểu rõ về biến và hằng số sẽ giúp bạn quản lý dữ liệu hiệu quả và viết code dễ hiểu, dễ bảo trì.
🔧 Cú pháp
Ví dụ đơn giản để bắt đầu
Trước khi tìm hiểu chi tiết, hãy xem một ví dụ đơn giản về cách sử dụng biến:
#include <iostream>
using namespace std;
int main() {
// Tạo biến đơn giản
int so = 5;
string ten = "An";
// Sử dụng biến
cout << "Tên: " << ten << endl;
cout << "Số: " << so << endl;
// Thay đổi giá trị
so = 10;
cout << "Số mới: " << so << endl;
return 0;
}Kết quả:
Tên: An
Số: 5
Số mới: 10Cú pháp chi tiết
Khai báo biến
// Cú pháp cơ bản
kiểu_dữ_liệu tên_biến; // Khai báo
kiểu_dữ_liệu tên_biến = giá_trị; // Khai báo và khởi tạo
// Ví dụ cụ thể
int age; // Khai báo biến age kiểu int
int height = 175; // Khai báo và khởi tạo ngayKhởi tạo biến
// Các cách khởi tạo
int a = 10; // Copy initialization
int b(20); // Direct initialization
int c{30}; // Uniform initialization (C++11)
int d = {40}; // Uniform initialization với =Khai báo hằng số
const kiểu_dữ_liệu TÊN_HẰNG = giá_trị;
// Ví dụ
const double PI = 3.14159; // Hằng số PI
const int MAX_STUDENTS = 50; // Số học sinh tối đa
const string SCHOOL_NAME = "THPT ABC"; // Tên trườngQuy tắc đặt tên
// Hợp lệ
int age; // Tên ngắn gọn, có nghĩa
int student_count; // Snake case
int studentCount; // Camel case
int _privateVar; // Bắt đầu bằng underscore
int value123; // Có chứa số
// Không hợp lệ
int 123value; // Bắt đầu bằng số
int my-var; // Chứa dấu gạch ngang
int class; // Từ khóa của C++
int my var; // Chứa khoảng trắng🔬 Phân tích & Giải thích chi tiết
Tại sao cần biến?
Biến giống như những chiếc nhãn dán trên các hộp chứa dữ liệu trong bộ nhớ máy tính. Khi bạn muốn lưu trữ một thông tin nào đó (như tuổi của một người), bạn cần một "chiếc hộp" để chứa nó.
// Thay vì viết số trực tiếp
cout << "Tuổi của bạn là: " << 25 << endl;
// Ta có thể dùng biến để code linh hoạt hơn
int age = 25;
cout << "Tuổi của bạn là: " << age << endl;Phân biệt biến và hằng số
| Khía cạnh | Biến | Hằng số |
|---|---|---|
| Thay đổi giá trị | Có thể thay đổi | Không thể thay đổi |
| Cú pháp | int x = 10; | const int X = 10; |
| Quy tắc đặt tên | camelCase, snake_case | UPPER_CASE |
| Sử dụng | Dữ liệu tạm thời | Giá trị cố định |
Khởi tạo vs Gán giá trị
// Khởi tạo - cho giá trị lúc khai báo
int x = 10; // Khởi tạo x với giá trị 10
// Gán giá trị - thay đổi giá trị sau khi đã khai báo
int y; // Khai báo y (chưa có giá trị xác định)
y = 20; // Gán giá trị 20 cho yScope (Phạm vi) của biến
int global_var = 100; // Biến toàn cục - truy cập được ở mọi nơi
int main() {
int local_var = 200; // Biến cục bộ - chỉ trong hàm main
{
int block_var = 300; // Biến trong block - chỉ trong { }
cout << global_var; // OK
cout << local_var; // OK
cout << block_var; // OK
}
// cout << block_var; // Lỗi! block_var không tồn tại
return 0;
}Tại sao nên dùng hằng số?
- An toàn: Không thể vô tình thay đổi giá trị
- Dễ đọc: Tên hằng có ý nghĩa thay vì số "ma thuật"
- Dễ bảo trì: Chỉ cần sửa ở một chỗ
- Tối ưu hóa: Compiler có thể tối ưu tốt hơn
💻 Ví dụ minh họa
Chương trình đơn giản với biến và hằng số
#include <iostream>
#include <string>
using namespace std;
int main() {
// Khai báo và khởi tạo biến
string name = "Nguyễn Văn An";
int age = 20;
double height = 1.75;
bool isStudent = true;
// Khai báo hằng số
const string SCHOOL = "Đại học Bách Khoa";
const int BIRTH_YEAR = 2004;
cout << "=== THÔNG TIN CÁ NHÂN ===" << endl;
cout << "Tên: " << name << endl;
cout << "Tuổi: " << age << " tuổi" << endl;
cout << "Chiều cao: " << height << " m" << endl;
cout << "Năm sinh: " << BIRTH_YEAR << endl;
cout << "Trường: " << SCHOOL << endl;
if (isStudent) {
cout << "Tình trạng: Đang là sinh viên" << endl;
} else {
cout << "Tình trạng: Đã tốt nghiệp" << endl;
}
// Thay đổi giá trị biến
age = 21;
height = 1.76;
cout << "\n=== CẬP NHẬT THÔNG TIN ===" << endl;
cout << "Tuổi mới: " << age << " tuổi" << endl;
cout << "Chiều cao mới: " << height << " m" << endl;
// Tính toán với biến
int currentYear = 2024;
int realAge = currentYear - BIRTH_YEAR;
cout << "Tuổi thực tế (tính từ năm sinh): " << realAge << " tuổi" << endl;
return 0;
}Kết quả chạy:
=== THÔNG TIN CÁ NHÂN ===
Tên: Nguyễn Văn An
Tuổi: 20 tuổi
Chiều cao: 1.75 m
Năm sinh: 2004
Trường: Đại học Bách Khoa
Tình trạng: Đang là sinh viên
=== CẬP NHẬT THÔNG TIN ===
Tuổi mới: 21 tuổi
Chiều cao mới: 1.76 m
Tuổi thực tế (tính từ năm sinh): 20 tuổiChương trình quản lý thông tin cá nhân
#include <iostream>
#include <string>
using namespace std;
int main() {
// Khai báo hằng số
const string PROGRAM_NAME = "QUẢN LÝ THÔNG TIN CÁ NHÂN";
const int CURRENT_YEAR = 2024;
// Khai báo biến
string fullName;
int birthYear;
double height;
double weight;
// Nhập thông tin
cout << "=== " << PROGRAM_NAME << " ===" << endl;
cout << "Nhập họ tên: ";
getline(cin, fullName);
cout << "Nhập năm sinh: ";
cin >> birthYear;
cout << "Nhập chiều cao (cm): ";
cin >> height;
cout << "Nhập cân nặng (kg): ";
cin >> weight;
// Tính toán
int age = CURRENT_YEAR - birthYear;
double bmi = weight / ((height/100) * (height/100));
// Hiển thị kết quả
cout << "\n=== THÔNG TIN CỦA BẠN ===" << endl;
cout << "Họ tên: " << fullName << endl;
cout << "Tuổi: " << age << " tuổi" << endl;
cout << "Chiều cao: " << height << " cm" << endl;
cout << "Cân nặng: " << weight << " kg" << endl;
cout << "BMI: " << bmi << endl;
return 0;
}Kết quả chạy:
=== QUẢN LÝ THÔNG TIN CÁ NHÂN ===
Nhập họ tên: Nguyễn Văn A
Nhập năm sinh: 2000
Nhập chiều cao (cm): 170
Nhập cân nặng (kg): 65
=== THÔNG TIN CỦA BẠN ===
Họ tên: Nguyễn Văn A
Tuổi: 24 tuổi
Chiều cao: 170 cm
Cân nặng: 65 kg
BMI: 22.491Chương trình tính diện tích hình học
#include <iostream>
using namespace std;
int main() {
// Hằng số toán học
const double PI = 3.14159;
const string SEPARATOR = "========================";
// Biến cho hình chữ nhật
double length, width;
// Biến cho hình tròn
double radius;
cout << SEPARATOR << endl;
cout << "CHƯƠNG TRÌNH TÍNH DIỆN TÍCH" << endl;
cout << SEPARATOR << endl;
// Tính diện tích hình chữ nhật
cout << "\n1. HÌNH CHỮ NHẬT" << endl;
cout << "Nhập chiều dài: ";
cin >> length;
cout << "Nhập chiều rộng: ";
cin >> width;
double rectangleArea = length * width;
cout << "Diện tích hình chữ nhật: " << rectangleArea << " cm²" << endl;
// Tính diện tích hình tròn
cout << "\n2. HÌNH TRÒN" << endl;
cout << "Nhập bán kính: ";
cin >> radius;
double circleArea = PI * radius * radius;
cout << "Diện tích hình tròn: " << circleArea << " cm²" << endl;
// So sánh diện tích
cout << "\n3. SO SÁNH" << endl;
if (rectangleArea > circleArea) {
cout << "Hình chữ nhật có diện tích lớn hơn" << endl;
} else if (circleArea > rectangleArea) {
cout << "Hình tròn có diện tích lớn hơn" << endl;
} else {
cout << "Hai hình có diện tích bằng nhau" << endl;
}
return 0;
}Chương trình demo scope biến
#include <iostream>
using namespace std;
// Biến toàn cục
int globalCounter = 0;
const string GLOBAL_MESSAGE = "Đây là thông báo toàn cục";
int main() {
cout << "=== DEMO SCOPE BIẾN ===" << endl;
// Biến cục bộ trong main
int localVar = 100;
cout << "Biến cục bộ trong main: " << localVar << endl;
cout << "Biến toàn cục: " << globalCounter << endl;
cout << "Hằng toàn cục: " << GLOBAL_MESSAGE << endl;
// Block 1
{
int blockVar1 = 200;
globalCounter++; // Có thể sửa biến toàn cục
cout << "\nTrong Block 1:" << endl;
cout << "Block var 1: " << blockVar1 << endl;
cout << "Local var từ main: " << localVar << endl;
cout << "Global counter: " << globalCounter << endl;
// Block lồng nhau
{
int blockVar2 = 300;
cout << "\nTrong Block lồng nhau:" << endl;
cout << "Block var 2: " << blockVar2 << endl;
cout << "Block var 1: " << blockVar1 << endl;
cout << "Local var từ main: " << localVar << endl;
}
// cout << blockVar2; // Lỗi! Không truy cập được
}
// cout << blockVar1; // Lỗi! Không truy cập được
cout << "\nQuay lại main:" << endl;
cout << "Local var: " << localVar << endl;
cout << "Global counter: " << globalCounter << endl;
return 0;
}🏋️ Thực hành
Bài tập 1: Khai báo biến và hằng
Khai báo biến và hằng phù hợp cho chương trình quản lý sinh viên:
- Tên sinh viên (có thể thay đổi)
- Tuổi sinh viên (có thể thay đổi)
- Số lượng sinh viên tối đa trong lớp (không đổi)
- Tên trường (không đổi)
Bài tập 2: Tính toán với biến
Viết chương trình:
- Nhập bán kính hình tròn
- Tính chu vi và diện tích
- Sử dụng hằng số PI = 3.14159
Bài tập 3: Swap hai biến
Viết chương trình hoán đổi giá trị của hai biến:
int a = 10;
int b = 20;
// Sau khi swap: a = 20, b = 10Bài tập 4: Scope và lifetime
Phân tích đoạn code sau và cho biết biến nào có thể truy cập được ở từng vị trí:
int x = 1;
int main() {
int y = 2;
{
int z = 3;
// Vị trí A: có thể truy cập biến nào?
}
// Vị trí B: có thể truy cập biến nào?
return 0;
}
// Vị trí C: có thể truy cập biến nào?Lời giải chi tiết
Bài tập 1:
#include <iostream>
#include <string>
using namespace std;
int main() {
// Hằng số (không thay đổi)
const int MAX_STUDENTS = 40;
const string SCHOOL_NAME = "THPT Lê Quý Đôn";
// Biến (có thể thay đổi)
string studentName;
int studentAge;
int currentStudentCount;
cout << "Trường: " << SCHOOL_NAME << endl;
cout << "Sĩ số tối đa: " << MAX_STUDENTS << " học sinh" << endl;
return 0;
}Bài tập 2:
#include <iostream>
using namespace std;
int main() {
const double PI = 3.14159;
double radius;
cout << "Nhập bán kính hình tròn: ";
cin >> radius;
double circumference = 2 * PI * radius;
double area = PI * radius * radius;
cout << "Chu vi: " << circumference << endl;
cout << "Diện tích: " << area << endl;
return 0;
}Bài tập 3:
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 20;
cout << "Trước swap: a=" << a << ", b=" << b << endl;
// Phương pháp dùng biến tạm
int temp = a;
a = b;
b = temp;
cout << "Sau swap: a=" << a << ", b=" << b << endl;
return 0;
}Bài tập 4:
- Vị trí A: Có thể truy cập x, y, z
- Vị trí B: Có thể truy cập x, y (z đã bị hủy)
- Vị trí C: Chỉ có thể truy cập x (y đã bị hủy)
📋 Tóm tắt
🎯 Những gì đã học
- Biến: Khai báo
int x;, khởi tạoint x = 10;, có thể thay đổi giá trị - Hằng số: Khai báo
const int X = 10;, không thể thay đổi giá trị - Scope: Phạm vi tồn tại của biến (global, local, block)
- Quy tắc đặt tên: Bắt đầu bằng chữ cái hoặc
_, không dùng keyword
🔧 Best Practices
- Đặt tên biến có ý nghĩa:
studentAgethay vìx - Sử dụng hằng số cho giá trị không đổi:
const double PI = 3.14159; - Khởi tạo biến ngay khi khai báo:
int count = 0; - Dùng UPPER_CASE cho hằng số:
const int MAX_SIZE = 100;
🚀 Chuẩn bị cho bước tiếp theo
Bài học tiếp theo sẽ tìm hiểu về các kiểu dữ liệu cơ bản trong C++. Đảm bảo bạn đã:
- [x] Hiểu cách khai báo và khởi tạo biến
- [x] Phân biệt được biến và hằng số
- [x] Nắm được khái niệm scope của biến
- [x] Áp dụng được quy tắc đặt tên
💡 Lời khuyên
"Biến và hằng số giống như từ vựng trong ngôn ngữ. Hãy đặt tên chúng rõ ràng để 'câu chuyện' code của bạn dễ hiểu!"
Chuyển sang: Kiểu dữ liệu để học về int, float, char, bool và cách sử dụng chúng!