L2. Các Toán Tử và Biểu Thức trong C++

5. Các Phép Toán

5.1. Toán Tử Gán (Assignment Operator)

Toán tử gán = dùng để gán giá trị cho một biến.

int x = 10;        // Gán 10 cho biến x
int y = 10;
int x = y;         // Gán giá trị của y cho biến x

Truy vết thực thi:

int a, b; 
a = 10;            // a = 10, b = ?
b = 4;             // a = 10, b = 4
a = b;             // a = 4, b = 4
b = 7;             // a = 4, b = 7

Gán nhiều biến:

int x, y;
y = 2 + (x = 5);   // Tương đương: x = 5; y = 2 + x;

int x = y = z = 5; // Gán giá trị 5 cho 3 biến z, y, x

5.2. Toán Tử Toán Học (Arithmetic Operators)

Phép toánÝ nghĩaVí dụKết quả
+Cộngx = 11 + 314
-Trừx = 11 - 38
*Nhânx = 11 * 333
/Chiax = 11 / 3.03.666…
/Lấy phần nguyênx = 11 / 33
%Lấy phần dưx = 11 % 32
float a = 5 / 2;       // a = 2 (chia nguyên, sau đó chuyển sang float)
float b = 5 / 2.;      // b = 2.5 (chia thực)
float c = 5. / 2;      // c = 2.5 (chia thực)
float d = (float)5/2;  // d = 2.5 (ép kiểu, sau đó chia thực)

5.3. Toán Tử Tăng/Giảm (++/–)

Dùng để tăng hoặc giảm 1 đơn vị:

int a;
a = a + 1;   // Cách 1
a += 1;      // Cách 2
a++;         // Cách 3 (khuyến nghị)

5.4. Toán Tử Phẩy (Comma Operator)

Các biểu thức cách nhau bằng dấu , được tính từ trái sang phải, kết quả là giá trị của biểu thức cuối cùng.

int x = 0;
int y = 2;
int z = (++x, ++y);

// Thực hiện:
// 1. ++x    → x = 1
// 2. ++y    → y = 3
// 3. z = y  → z = 3
// Kết quả: x = 1, y = 3, z = 3

5.5. Toán Tử Toán Học & Gán (Compound Assignment)

Toán tửVí dụTương đươngÝ nghĩa
+=x += 5x = x + 5Cộng
-=x -= 5x = x - 5Trừ
*=x *= 5x = x * 5Nhân
/=x /= 5x = x / 5Chia/Lấy phần nguyên
%=x %= 5x = x % 5Lấy phần dư
<<=x <<= 5x = x << 5Dịch trái
>>=x >>= 5x = x >> 5Dịch phải
&=x &= 5x = x & 5AND
^=x ^= 5x = x ^ 5XOR
`=``x= 5`

5.6. Toán Tử Bit (Bitwise Operators)

Bảng chân trị:

pqp & q (AND)p ^ q (XOR)p | q (OR)~p (NOT)
000001
010111
100110
111010

Toán tử dịch bit:

// Dịch trái (<<)
3 = 0011
3 << 1 = 0110 = 6
3 << 2 = 1100 = 12
3 << 3 = 1000 = 8

// Dịch phải (>>)
12 = 1100
12 >> 1 = 0110 = 6
12 >> 2 = 0011 = 3
12 >> 3 = 0001 = 1

Ví dụ toán tử trên bit:

int main() {
    int a = 5;    // 0000 0000 0000 0101
    int b = 6;    // 0000 0000 0000 0110
    
    int z1 = a & b;   // 0000 0000 0000 0100 = 4
    int z2 = a | b;   // 0000 0000 0000 0111 = 7
    int z3 = a ^ b;   // 0000 0000 0000 0011 = 3
    int z4 = ~a;      // 1111 1111 1111 1010 = -6
    int z5 = a >> 2;  // 0000 0000 0000 0001 = 1
    int z6 = a << 2;  // 0000 0000 0001 0100 = 20
    
    return 0;
}

Ứng dụng của toán tử bit:

1. Kiểm tra chia hết cho 2:

int number = 5;
if (number & 1 == true)
    std::cout << "So le\n";
else
    std::cout << "So chan\n";

// Tổng quát:
// a & 1  → a % 2
// a & 3  → a % 4
// a & 7  → a % 8

2. Tích và thương cho 2ⁿ:

int a = 2 << 1;   // a = 2 * 2¹ → a = 4
int b = 2 << 2;   // b = 2 * 2² → b = 8
int c = 8 >> 1;   // c = 8 / 2¹ → c = 4
int d = 8 >> 2;   // d = 8 / 2² → d = 2

5.7. Toán Tử Điều Kiện (Ternary Operator)

Cú pháp:

<điều_kiện> ? <biểu_thức_1> : <biểu_thức_2>

Ý nghĩa: Nếu điều kiện đúng thì thực hiện biểu_thức_1, ngược lại thực hiện biểu_thức_2.

// Ví dụ 1: Tìm số lớn hơn
int a = 1;
int b = 2;
int c = (a > b) ? a : b;  // c = 2

// Ví dụ 2: Định nghĩa hằng có điều kiện
int so_sinh_vien = 55;
const int so_lop = (so_sinh_vien > 50) ? 2 : 1;  // so_lop = 2

5.8. Toán Tử Quan Hệ (Relational Operators)

Toán tửKý hiệuVí dụGiải thích
Lớn hơn>x > yNếu x lớn hơn y → true (1), ngược lại → false (0)
Nhỏ hơn<x < yNếu x nhỏ hơn y → true (1), ngược lại → false (0)
Lớn hơn hoặc bằng>=x >= yNếu x ≥ y → true (1), ngược lại → false (0)
Nhỏ hơn hoặc bằng<=x <= yNếu x ≤ y → true (1), ngược lại → false (0)
Bằng==x == yNếu x = y → true (1), ngược lại → false (0)
Khác!=x != yNếu x ≠ y → true (1), ngược lại → false (0)

5.9. Toán Tử Luận Lý (Logical Operators)

Toán tửKý hiệuVí dụ
NOT!!x
AND&&x && y
OR`

Bảng chân trị:

| Giá trị 1 | Giá trị 2 | OR (||) | AND (&&) | |———–|———–|———–|————| | false | false | false | false | | false | true | true | false | | true | false | true | false | | true | true | true | true |

Bài tập:

1. (true && true) || false              // true
2. (false && true) || true              // true
3. (false && true) || false || true     // true
4. (5 > 6 || 4 > 3) && (7 > 8)         // false
5. !(7 > 6 || 3 > 4)                   // false

5.10. Độ Ưu Tiên Toán Tử (Operator Precedence)

Mức độToán tửNhóm ưu tiên
1::Trái → Phải
2++ -- () [] . ->Trái → Phải
3++ -- ~ ! + - & * new delete sizeof (type)Phải → Trái
4.* ->*Trái → Phải
5* / %Trái → Phải
6+ -Trái → Phải
7<< >>Trái → Phải
8< > <= >=Trái → Phải
9== !=Trái → Phải
10&Trái → Phải
11^Trái → Phải
12``
13&&Trái → Phải
14`
15`= *= /= %= += -= »= «= &= ^== ?:`
16,Trái → Phải

Bài tập:

1. x = 3 + 4 + 5;
   // Giải: x = ((3 + 4) + 5);

2. x = y = z;
   // Giải: x = (y = z);

3. z *= ++y + 5;
   // Giải: z *= (++y) + 5;

4. a || b && c || d;
   // Giải: (a || (b && c)) || d;

6. Biểu Thức (Expression)

Định nghĩa: Biểu thức được tạo thành từ các toán tử (Operator) và các toán hạng (Operand).

  • Toán tử: Tác động lên các giá trị của toán hạng và cho giá trị có kiểu nhất định
  • Toán hạng: Hằng, biến, lời gọi hàm…

Ví dụ:

int a = 2 + 3;
int b = a / 5;
int c = (a + b) * 5;
int d = (x >= 3);

Biểu thức kiểm tra điều kiện:

// Biểu thức này kiểm tra gì?
(x >= 0) ^ (y < 0)
// Kiểm tra x và y có dấu khác nhau (một dương một âm)
int year = 2000;
int month = 29;
if ((year % 4 != 0) || (year % 400 != 0)) 
    return 28;
// Kiểm tra năm nhuận

7. Nhập Xuất Dữ Liệu

7.1. Câu Lệnh Xuất

Có 2 cách xuất dữ liệu trong C++:

  • Cách 1: Sử dụng cout (C++)
  • Cách 2: Sử dụng printf (C)

Lựa chọn tùy thuộc vào lập trình viên.

7.2. Câu Lệnh Xuất cout (C++)

Thư viện:

#include <iostream>

Cú pháp:

std::cout << Tham_số_1 << Tham_số_2 << ... << Tham_số_k;

Tham số có thể là:

  • Văn bản thường (literal text)
  • Ký tự điều khiển (escape sequence)
  • Biến, hằng số, biểu thức, hàm

Ví dụ:

int i = 10;
std::cout << "Chuong trinh xuat gia tri i\n";
std::cout << "gia tri la " << i;

Output:

Chuong trinh xuat gia tri i
gia tri la 10

7.2.1. Xuất văn bản thường

Cú pháp:

std::cout << "Chuoi can in";

Ví dụ:

#include <iostream>

int main() {
    std::cout << "Chao ban! Toi co the giup gi khong?";
    std::cin.get();
    return 0;
}

Output:

Chao ban! Toi co the giup gi khong?

7.2.2. Ký tự điều khiển (Escape Sequence)

Ký tựÝ nghĩa
\nXuống dòng
\aPhát ra thông báo (beep)
\bLùi con trỏ 1 vị trí
\tDấu tab
\"In ký tự "
\\In ký tự \

Ví dụ:

#include <iostream>

int main() {
    std::cout << "Chao ban!\nToi co the giup gi khong?";
    std::cin.get();
    return 0;
}

Output:

Chao ban!
Toi co the giup gi khong?

7.2.3. Thiết lập độ rộng khi xuất

Cú pháp:

cout.width(n);  // n là độ rộng mới

Ví dụ:

#include <iostream>

int main() {
    int a = 1706;
    std::cout << a << "\n";
    std::cout.width(10);
    std::cout << a;
    std::cin.get();
    return 0;
}

Output:

1706
      1706

7.2.4. Độ chính xác khi xuất

Cú pháp:

cout.precision(n);  // n là độ chính xác áp dụng

Ví dụ:

#include <iostream>

int main() {
    float x = 176.859;
    std::cout << x << "\n";
    std::cout.precision(5);
    std::cout << x << "\n";
    std::cin.get();
    return 0;
}

Output:

176.859
176.86

7.3. Câu Lệnh Xuất printf (C)

Thư viện:

#include <stdio.h>  // standard input/output

Cú pháp:

printf(<chuỗi định dạng>[, <đs1>, <đs2>, ...]);

Chuỗi định dạng gồm:

  • Văn bản thường (literal text)
  • Ký tự điều khiển (escape sequence)
  • Đặc tả (conversion specifier)

7.3.1. Đặc tả (Conversion Specifier)

Đặc tảÝ nghĩaKiểu dữ liệu
%cKý tựchar
%d, %ldSố nguyên có dấuint, short, long
%f, %lfSố thựcfloat, double
%sChuỗi ký tựchar[], char*
%uSố nguyên không dấuunsigned int/short/long

Ví dụ:

int a = 10, b = 20;
printf("%d", a);           // Xuất ra 10
printf("%d", b);           // Xuất ra 20
printf("%d %d", a, b);     // Xuất ra 10 20

float x = 15.06;
printf("%f", x);           // Xuất ra 15.060000
printf("%f", 1.0/3);       // Xuất ra 0.333333

7.3.2. Định dạng xuất (printf)

Cú pháp:

  • Định dạng xuất số nguyên: %nd
  • Định dạng xuất số thực: %n.kf

Ví dụ:

int a = 1706;
float x = 176.85;

printf("%10d", a);         //       1706
printf("\n");
printf("%10.2f", x);       //     176.85
printf("\n");
printf("%.2f", x);         // 176.85

Phối hợp các thành phần:

int a = 1, b = 2;

// Cách dài dòng:
printf("%d", a);           // Xuất giá trị của a
printf(" cong ");          // Xuất chuỗi " cong "
printf("%d", b);           // Xuất giá trị của b
printf(" bang ");          // Xuất chuỗi " bang "
printf("%d", a + b);       // Xuất giá trị của a + b
printf("\n");              // Xuống dòng

// Cách ngắn gọn (khuyến nghị):
printf("%d cong %d bang %d\n", a, b, a + b);

7.4. Câu Lệnh Nhập

Có 2 cách nhập dữ liệu:

  • Cách 1: Sử dụng cin (C++)
  • Cách 2: Sử dụng scanf (C)

7.5. Câu Lệnh Nhập std::cin» (C++)

Thư viện:

#include <iostream>

Cú pháp:

std::cin >> Tham_số_1 >> Tham_số_2 >> ... >> Tham_số_k;

Ví dụ:

#include <iostream>

int main() {
    int nam_sinh = 0;  // Bước 1: Khai báo biến
    
    std::cout << "Nam sinh: ";  // Bước 2: Thông báo
    std::cin >> nam_sinh;       // Bước 3: Nhập giá trị
    
    std::cin.get();
    return 0;
}

Chương trình cộng 2 số nguyên:

#include <iostream>

int main() {
    int a = 0, b = 0;
    
    std::cout << "Chuong trinh cong 2 so a, b" << "\n";
    std::cout << "a: ";
    std::cin >> a;
    std::cout << "b: ";
    std::cin >> b;
    std::cout << "a + b = " << a + b << "\n";
    
    std::cin.get();
    return 0;
}

Output:

Chuong trinh cong 2 so a, b
a: 5
b: 6
a + b = 11

7.6. Câu Lệnh Nhập scanf (C)

Thư viện:

#include <stdio.h>  // standard input/output

Cú pháp:

scanf(<chuỗi định dạng>[, <&đs1>, <&đs2>, ...]);
  • <chuỗi định dạng>: Giống định dạng xuất nhưng chỉ có các đặc tả
  • Các đối số là tên các biến và bắt buộc đặt trước dấu &

Ví dụ:

int a, b;

// Cách 1: Nhập từng biến
scanf("%d", &a);   // Nhập giá trị cho biến a
scanf("%d", &b);   // Nhập giá trị cho biến b

// Cách 2: Nhập nhiều biến (khuyến nghị)
scanf("%d%d", &a, &b);

8. Một Số Hàm Hữu Ích

Các Hàm Trong Thư Viện Toán Học

Thư viện:

#include <math.h>

Hàm với 1 đối số đầu vào (double) và trả về double:

HàmÝ nghĩa
acos, asin, atanHàm lượng giác ngược
cos, sin, tanHàm lượng giác
expe mũ x
logLogarit tự nhiên
log10Logarit cơ số 10
sqrtCăn bậc 2
ceilLàm tròn lên
floorLàm tròn xuống
abs, fabsGiá trị tuyệt đối

Hàm với 2 đối số đầu vào (double) và trả về double:

  • double pow(double x, double y): x mũ y

Ví dụ:

#include <iostream>
#include <math.h>

int main() {
    float x = 2;
    
    std::cout << cos(x) << "\n";      // Hàm cos: -0.416147
    std::cout << sin(x) << "\n";      // Hàm sin: 0.909297
    std::cout << tan(x) << "\n";      // Hàm tan: -2.18504
    std::cout << acos(x) << "\n";     // Hàm arc cos: nan
    std::cout << asin(x) << "\n";     // Hàm arc sin: nan
    std::cout << atan(x) << "\n";     // Hàm arc tan: 1.10715
    std::cout << log(x) << "\n";      // Hàm log: 0.693147
    std::cout << log10(x) << "\n";    // Hàm log10: 0.30103
    std::cout << sqrt(x) << "\n";     // Căn bậc 2: 1.41421
    std::cout << fabs(-x) << "\n";    // Giá trị tuyệt đối: 2
    std::cout << pow(x, 2);           // Hàm mũ: 4
    
    std::cin.get();
    return 0;
}

9. Bài Tập Minh Họa

Bài 1: Nhập năm sinh và tính tuổi

#include <iostream>

int main() {
    int nam_sinh = 0;
    
    std::cout << "Vui long nhap nam sinh: ";
    std::cin >> nam_sinh;
    std::cout << "Ban " << 2024 - nam_sinh << " tuoi" << "\n";
    
    std::cin.get();
    return 0;
}

Bài 2: Tính tổng, hiệu, tích, thương

#include <iostream>

int main() {
    int a, b;
    
    std::cout << "Nhap a = ";
    std::cin >> a;
    std::cout << "Nhap b = ";
    std::cin >> b;
    
    std::cout << "a + b = " << a + b << "\n";
    std::cout << "a - b = " << a - b << "\n";
    std::cout << "a * b = " << (long long)a * b << "\n";
    std::cout << "a / b = " << (double)a / b << "\n";
    
    std::cin.get();
    return 0;
}

Bài 3: Tính tiền và thuế VAT

#include <iostream>

int main() {
    int so_luong = 0, don_gia = 0;
    
    std::cout << "Vui long nhap so luong: ";
    std::cin >> so_luong;
    std::cout << "Vui long nhap don gia: ";
    std::cin >> don_gia;
    
    std::cout << "Tien: " << so_luong * don_gia << "\n";
    std::cout << "VAT: " << so_luong * don_gia * 0.1 << "\n";
    
    std::cin.get();
    return 0;
}

Bài 4: Tính chu vi và diện tích hình tròn

#include <iostream>
#define PI 3.14

int main() {
    float r = 0;
    
    std::cout << "Nhap ban kinh duong tron: ";
    std::cin >> r;
    std::cout << "Chu vi: " << 2 * PI * r << "\n";
    std::cout << "Dien tich: " << PI * r * r << "\n";
    
    return 0;
}

10. Bài Tập Về Nhà