C++ cơ bản · Interactive Lesson

Mảng trong lập trình

Bài học này giúp em hiểu vì sao cần dùng mảng, cách khai báo mảng 1 chiều, cách duyệt mảng để tính tổng, tìm giá trị lớn nhất/nhỏ nhất và bước đầu làm quen với mảng 2 chiều.

Mảng 1 chiều Tổng · Min · Max Mảng 2 chiều C++ và Python
Tiến trình bài học 0%

Mục tiêu bài học

Sau bài này, em cần nắm được các ý nền tảng trước khi học sâu hơn về thuật toán xử lý dãy số.

Hiểu mảng là gì và tại sao phải dùng mảng thay vì dùng từng biến lẻ tẻ.

Biết cách khai báo mảng 1 chiều và truy cập phần tử theo chỉ số.

Biết cách tính tổng, tìm min/max trong mảng.

Làm quen với mảng 2 chiều để lưu bảng điểm, ma trận pixel, bàn cờ.

So sánh cách làm trong C++ và Python để hiểu điểm giống và khác nhau.

Khởi động: Vì sao cần có mảng?

Hãy tưởng tượng em cần lưu điểm của 5 môn học cho bạn Nam. Nếu chỉ có 5 môn, ta còn có thể dùng nhiều biến riêng lẻ. Nhưng nếu là 45 học sinh, 200 học sinh hoặc 10 000 số trong một bài thi lập trình, cách dùng từng biến sẽ rất khó quản lý.

Cách tệ nhất: đặt rất nhiều biến rời rạc rồi nhập từng biến một.
C++
// C++
int d1, d2, d3, d4, d5;
cin >> d1 >> d2 >> d3 >> d4 >> d5;
Thử suy nghĩ nhanh

Nếu cần lưu điểm của 45 học sinh, mỗi học sinh có 5 môn, cách nào hợp lý hơn?

1. Mảng là gì?

Mảng là một dãy các ô nhớ đứng cạnh nhau, đều cùng kiểu dữ liệu, và có thể truy cập bằng chỉ số.
Minh họa mảng điểm 5 môn

Mỗi ô trong mảng giống như một ngăn tủ. Muốn lấy dữ liệu ở ngăn nào, ta gọi đúng chỉ số của ngăn đó.

8a[0]
7a[1]
9a[2]
6a[3]
10a[4]
Ghi nhớ: Trong C++ và Python, chỉ số mảng bắt đầu từ 0, không phải từ 1.
C++: khai báo mảng tĩnh 5 phần tử
int a[5];           // khai báo mảng 5 phần tử
for (int i = 0; i < 5; i++) {
    cin >> a[i];    // nhập từng điểm
}
Python: dùng list và append
a = []                       # danh sách rỗng
for i in range(5):
    x = int(input())
    a.append(x)              # thêm vào cuối danh sách
Ghi nhớ quan trọng:
C++: chỉ số mảng bắt đầu từ 0.
Python: cũng bắt đầu từ 0.

2. Duyệt mảng và tính toán cơ bản

Duyệt mảng nghĩa là dùng vòng lặp đi qua từng phần tử trong mảng. Khi duyệt, ta có thể cộng dồn để tính tổng, đếm số chẵn, tìm số lớn nhất hoặc nhỏ nhất.

Ví dụ: Tính tổng các phần tử trong mảng
C++: dùng vector và vòng lặp cộng dồn
#include 
using namespace std;

int main() {
    int n;
    cin >> n;           // số lượng phần tử
    vector a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    long long sum = 0;
    for (int i = 0; i < n; i++) {
        sum += a[i];
    }

    cout << sum;
    return 0;
}
Python: dùng list và cộng dồn từng phần tử
n = int(input())
a = list(map(int, input().split()))  # nhập n số trên 1 dòng

total = 0
for x in a:
    total += x

print(total)
Mô phỏng vòng lặp cộng tổng

Mảng ví dụ: [3, 5, 2, 4]

3i = 0
5i = 1
2i = 2
4i = 3
Ban đầu: sum = 0. Bấm “Bước tiếp” để xem vòng lặp hoạt động.
Thực hành nhanh: nhập mảng và xem kết quả

Nhập các số cách nhau bởi dấu cách. Ví dụ: 4 7 2 10 6

3. Tìm giá trị lớn nhất / nhỏ nhất trong mảng

Ý tưởng rất tự nhiên: giả sử phần tử đầu tiên là lớn nhất, sau đó đi qua các phần tử còn lại. Nếu gặp số lớn hơn, ta cập nhật lại kết quả.

Bước 1: Gán mx = a[0].
Bước 2: Duyệt từ vị trí i = 1 đến n - 1.
Bước 3: Nếu a[i] > mx, cập nhật mx = a[i].
Bước 4: Sau khi duyệt xong, mx là giá trị lớn nhất.
Lỗi học sinh hay gặp: khởi tạo mx = 0. Nếu mảng toàn số âm, cách này sẽ cho kết quả sai. Nên khởi tạo bằng a[0].
C++: tìm giá trị lớn nhất
int mx = a[0];
for (int i = 1; i < n; i++) {
    if (a[i] > mx) mx = a[i];
}
cout << mx;
Python: tìm giá trị lớn nhất
mx = a[0]
for x in a[1:]:
    if x > mx:
        mx = x
print(mx)

Trong Python có sẵn max(a)min(a), nhưng tự viết vòng lặp giúp em hiểu thuật toán.

4. Mảng 2 chiều: dữ liệu dạng hàng - cột

Mảng 2 chiều dùng khi dữ liệu có dạng hàng-cột như bảng điểm nhiều bạn với nhiều môn, ma trận ảnh, bàn cờ, sơ đồ chỗ ngồi, bảng nhiệt độ theo ngày và giờ.

Ma trận 3 hàng, 4 cột
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[2][0]
a[2][1]
a[2][2]
a[2][3]
Truy cập phần tử hàng i, cột j:
C++: a[i][j]
Python: a[i][j]
C++: mảng 2 chiều 3 hàng, 4 cột
int a[3][4]; // ma trận 3 hàng, 4 cột

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        cin >> a[i][j];
    }
}
Python: list 2 chiều
rows = 3
cols = 4
a = []

for i in range(rows):
    row = list(map(int, input().split()))
    a.append(row)
Ví dụ đời sống: Bảng điểm có 3 học sinh và 4 môn học. Mỗi hàng là một học sinh, mỗi cột là một môn. Khi muốn lấy điểm Toán của học sinh thứ 2, ta truy cập đúng hàng và đúng cột tương ứng.

Kiểm tra nhanh sau bài học

Câu 1

Mảng C++ int a[5] có các chỉ số hợp lệ nào?

Câu 2

Để tính tổng các phần tử, ta thường dùng kỹ thuật nào?

Câu 3

Mảng 2 chiều phù hợp để lưu dữ liệu nào?

Bài tập tự luyện

1 Tổng và giá trị lớn nhất

Nhập n và một mảng n số nguyên. In ra tổng và giá trị lớn nhất.

2 Tổng từng hàng

Nhập ma trận kích thước R x C. In tổng từng hàng.

3 Đếm số chẵn

Đếm có bao nhiêu số chẵn trong mảng.

#include 
using namespace std;

int main() {
    int n;
    cin >> n;
    vector a(n);
    for (int i = 0; i < n; i++) cin >> a[i];

    long long sum = 0;
    int mx = a[0];
    int even_count = 0;

    for (int x : a) {
        sum += x;
        if (x > mx) mx = x;
        if (x % 2 == 0) even_count++;
    }

    cout << "Tong = " << sum << "
"; cout << "Max = " << mx << "
"; cout << "So chan = " << even_count << "
"; return 0; }

n = int(input())
a = list(map(int, input().split()))

total = sum(a)
mx = max(a)
even_count = sum(1 for x in a if x % 2 == 0)

print("Tong =", total)
print("Max =", mx)
print("So chan =", even_count)

Tổng kết

1. Mảng giúp lưu nhiều giá trị cùng kiểu

Thay vì tạo nhiều biến rời rạc, ta dùng mảng để quản lý dữ liệu có cấu trúc.

2. Chỉ số bắt đầu từ 0

Phần tử đầu tiên là a[0], phần tử cuối cùng là a[n - 1].

3. Duyệt mảng là thao tác nền tảng

Tính tổng, tìm min/max, đếm phần tử đều bắt đầu từ việc duyệt từng phần tử.

Tiếp theo: Chuỗi ký tự — xử lý text, tên học sinh, câu tiếng Việt có dấu.