Bài 12.2: Bài tập thực hành xử lý mảng 1 chiều cơ bản trong C++

Chào mừng trở lại với chuỗi bài viết về C++ của FullhouseDev! Hôm nay, chúng ta sẽ không chỉ học lý thuyết mà còn cùng nhau xắn tay áo lên để thực hành những kỹ năng xử lý mảng 1 chiều - một cấu trúc dữ liệu không thể thiếu trong bất kỳ ngôn ngữ lập trình nào, đặc biệt là C++. Nếu bạn đã nắm được khái niệm về mảng, thì đây chính là lúc để biến lý thuyết thành hành động!

Bài viết này tập trung vào các thao tác cực kỳ cơ bản nhưng cũng cực kỳ quan trọng: từ việc khai báo, nhập xuất dữ liệu cho mảng, cho đến những phép xử lý đơn giản như tính tổng, tìm kiếm phần tử lớn nhất/nhỏ nhất, hay đếm số lần xuất hiện của một giá trị nào đó. Hãy cùng bắt đầu hành trình làm quen với mảng 1 chiều một cách thực tế nhất trong C++ nhé!

1. Khai báo và Khởi tạo Mảng 1 Chiều

Trước khi làm bất cứ điều gì với mảng, chúng ta cần khai báo nó. Mảng 1 chiều trong C++ có kích thước cố định tại thời điểm khai báo (trừ khi dùng mảng động, nhưng đó là chủ đề sau này).

Đây là cách bạn khai báo một mảng:

#include <iostream>

int main() {
    int arr[5];
    int a[] = {10, 20, 30, 40, 50};
    int b[100] = {0};
    const int N = 7;
    double nhiet_do[N];

    using namespace std;

    cout << "Mang a co kich thuoc la: " << sizeof(a) / sizeof(a[0]) << endl;
    cout << "Phan tu dau tien cua a: " << a[0] << endl;

    return 0;
}

Output:

Mang a co kich thuoc la: 5
Phan tu dau tien cua a: 10

Giải thích code:

  • int arr[5];: Khai báo một mảng tên là arr có thể chứa 5 số nguyên. Các giá trị ban đầu của các phần tử này là không xác định (rác).
  • int numbers[] = {10, 20, 30, 40, 50};: Khai báo và khởi tạo ngay mảng numbers với các giá trị đã cho. C++ sẽ tự động tính kích thước mảng là 5 dựa trên số lượng phần tử bạn cung cấp.
  • int data[100] = {0};: Khai báo mảng data 100 phần tử và khởi tạo tất cả chúng bằng 0. Nếu bạn chỉ để {} thì chỉ phần tử đầu tiên là 0, còn lại không xác định. Với {0} thì tất cả là 0.
  • const int SIZE = 7; double temperatures[SIZE];: Sử dụng một hằng số để xác định kích thước mảng là một cách làm tốt, giúp code dễ đọc và dễ thay đổi kích thước sau này. Mảng này chứa các số thực (double).
  • sizeof(numbers) / sizeof(numbers[0]): Đây là một "mẹo" nhỏ để tính kích thước (số lượng phần tử) của mảng khi nó được khai báo và khởi tạo ngay lập tức. sizeof(numbers) trả về tổng kích thước của mảng tính bằng byte, sizeof(numbers[0]) trả về kích thước của một phần tử. Chia hai giá trị này ta được số lượng phần tử. Lưu ý: Cách này chỉ hoạt động với mảng được khai báo như biến cục bộ hoặc biến toàn cục.
  • numbers[0]: Để truy cập một phần tử trong mảng, ta dùng tên mảng và chỉ số (index) của phần tử đặt trong cặp ngoặc vuông []. Chỉ số của phần tử đầu tiên luôn là 0.

2. Nhập dữ liệu từ người dùng vào Mảng

Một trong những thao tác phổ biến là cho phép người dùng nhập dữ liệu vào mảng. Chúng ta thường sử dụng vòng lặp for và đối tượng cin.

Ví dụ: Nhập 3 số nguyên vào một mảng:

#include <iostream>

int main() {
    const int N = 3;
    int a[N];

    using namespace std;

    cout << "Hay nhap " << N << " so nguyen vao mang:" << endl;
    for (int i = 0; i < N; ++i) {
        cout << "Nhap phan tu thu " << i << ": ";
        cin >> a[i];
    }
    cout << "\nBan vua nhap xong." << endl;

    return 0;
}

Output (ví dụ):

Hay nhap 3 so nguyen vao mang:
Nhap phan tu thu 0: 10
Nhap phan tu thu 1: 20
Nhap phan tu thu 2: 30

Ban vua nhap xong.

Giải thích code:

  • Chúng ta dùng hằng số SIZE để dễ dàng quản lý kích thước mảng.
  • Vòng lặp for (int i = 0; i < SIZE; ++i) sẽ chạy từ i = 0 đến i = SIZE - 1, tương ứng với các chỉ số hợp lệ của mảng.
  • Trong mỗi lần lặp, cout thông báo cho người dùng biết họ đang nhập phần tử thứ mấy (theo index).
  • cin >> my_array[i]; đọc giá trị người dùng nhập từ bàn phím và lưu vào phần tử tại vị trí i của mảng my_array.

3. Xuất (In) dữ liệu từ Mảng

Để xem nội dung của mảng, chúng ta cũng sử dụng vòng lặp for, nhưng lần này là với đối tượng cout.

Ví dụ: In tất cả các phần tử của một mảng:

#include <iostream>

int main() {
    int diem[] = {85, 90, 78, 95, 88};
    const int N = sizeof(diem) / sizeof(diem[0]);

    using namespace std;

    cout << "Cac diem trong mang la:" << endl;
    for (int i = 0; i < N; ++i) {
        cout << diem[i] << " ";
    }
    cout << endl;

    return 0;
}

Output:

Cac diem trong mang la:
85 90 78 95 88

Giải thích code:

  • Chúng ta xác định kích thước mảng bằng cách chia sizeof(scores) cho sizeof(scores[0]).
  • Vòng lặp for duyệt qua tất cả các chỉ số từ 0 đến SIZE - 1.
  • cout << scores[i] << " "; in giá trị của phần tử tại chỉ số i, theo sau là một khoảng trắng để phân tách các số.
  • cout << endl; in ký tự xuống dòng sau khi in hết mảng, giúp output gọn gàng hơn.

4. Thực hành Xử lý Dữ liệu Cơ bản trên Mảng

Giờ là lúc thực sự "xử lý"! Chúng ta sẽ xem xét một vài bài tập cơ bản thường gặp.

4.1. Tính Tổng các Phần tử trong Mảng

Bài tập này giúp bạn làm quen với việc duyệt mảng và tích lũy giá trị.

#include <iostream>

int main() {
    int a[] = {10, 25, 5, 30, 15};
    const int N = sizeof(a) / sizeof(a[0]);

    int tong = 0;

    using namespace std;

    for (int i = 0; i < N; ++i) {
        tong += a[i];
    }
    cout << "Tong cac phan tu trong mang la: " << tong << endl;

    return 0;
}

Output:

Tong cac phan tu trong mang la: 85

Giải thích code:

  • Chúng ta khởi tạo một biến sum bằng 0. Biến này sẽ "gom góp" tổng giá trị của các phần tử.
  • Vòng lặp for duyệt qua từng phần tử của mảng.
  • Trong mỗi lần lặp, sum += numbers[i]; cộng giá trị của phần tử hiện tại (numbers[i]) vào biến sum.
4.2. Tìm Phần tử Lớn nhất và Nhỏ nhất trong Mảng

Để tìm giá trị lớn nhất và nhỏ nhất, chúng ta thường giả định phần tử đầu tiên là max/min ban đầu, sau đó duyệt các phần tử còn lại và cập nhật nếu tìm thấy giá trị "cực đoan" hơn.

#include <iostream>

int main() {
    int a[] = {-5, 10, -2, 15, 8, 0, 20};
    const int N = sizeof(a) / sizeof(a[0]);

    using namespace std;

    if (N == 0) {
        cout << "Mang rong, khong the tim max/min." << endl;
        return 1;
    }

    int max = a[0];
    int min = a[0];

    for (int i = 1; i < N; ++i) {
        if (a[i] > max) {
            max = a[i];
        }
        if (a[i] < min) {
            min = a[i];
        }
    }

    cout << "Phan tu lon nhat trong mang la: " << max << endl;
    cout << "Phan tu nho nhat trong mang la: " << min << endl;

    return 0;
}

Output:

Phan tu lon nhat trong mang la: 20
Phan tu nho nhat trong mang la: -5

Giải thích code:

  • Chúng ta kiểm tra xem mảng có rỗng không để tránh lỗi.
  • Khởi tạo max_valmin_val bằng temperatures[0]. Việc này là cần thiết vì max/min chắc chắn nằm trong mảng.
  • Vòng lặp bắt đầu từ i = 1 (phần tử thứ hai), vì phần tử đầu tiên đã được xét làm giá trị khởi tạo.
  • Trong vòng lặp, chúng ta so sánh temperatures[i] với max_valmin_val hiện tại để cập nhật chúng nếu cần.
4.3. Tìm kiếm một Phần tử trong Mảng

Bạn muốn biết liệu một giá trị cụ thể có tồn tại trong mảng hay không? Vòng lặp lại là người bạn đồng hành!

#include <iostream>

int main() {
    int a[] = {101, 105, 110, 108, 112};
    const int N = sizeof(a) / sizeof(a[0]);
    int x = 108;

    bool tim_thay = false;
    int vi_tri = -1;

    using namespace std;

    for (int i = 0; i < N; ++i) {
        if (a[i] == x) {
            tim_thay = true;
            vi_tri = i;
            break;
        }
    }

    if (tim_thay) {
        cout << "Da tim thay ID " << x << " trong mang tai vi tri (index): " << vi_tri << endl;
    } else {
        cout << "Khong tim thay ID " << x << " trong mang." << endl;
    }

    return 0;
}

Output:

Da tim thay ID 108 trong mang tai vi tri (index): 3

Giải thích code:

  • Biến found là một cờ (flag) kiểu boolean, ban đầu là false. Nó sẽ chuyển thành true nếu tìm thấy phần tử.
  • Biến found_index lưu lại vị trí (index) của phần tử được tìm thấy.
  • Vòng lặp duyệt qua mảng. Nếu student_ids[i] bằng với target_id, chúng ta đặt found thành true, lưu lại i vào found_index, và dùng lệnh break; để thoát ngay khỏi vòng lặp. Điều này rất hiệu quả khi mảng lớn và bạn chỉ cần biết phần tử đó có tồn tại hay không, hoặc vị trí đầu tiên của nó.
  • Cuối cùng, chúng ta kiểm tra giá trị của found để thông báo kết quả.
4.4. Đếm số lần xuất hiện của một Phần tử

Thay vì chỉ kiểm tra sự tồn tại, đôi khi bạn cần biết một giá trị xuất hiện bao nhiêu lần trong mảng.

#include <iostream>

int main() {
    int a[] = {1, 2, 3, 2, 4, 2, 5, 1};
    const int N = sizeof(a) / sizeof(a[0]);
    int x = 2;

    int dem = 0;

    using namespace std;

    for (int i = 0; i < N; ++i) {
        if (a[i] == x) {
            dem++;
        }
    }

    cout << "Gia tri " << x << " xuat hien " << dem << " lan trong mang." << endl;

    return 0;
}

Output:

Gia tri 2 xuat hien 3 lan trong mang.

Giải thích code:

  • Chúng ta khởi tạo biến count bằng 0.
  • Vòng lặp duyệt qua tất cả các phần tử của mảng.
  • Nếu data[i] bằng với target_value, chúng ta tăng biến count lên 1.
  • Sau khi vòng lặp kết thúc, count sẽ chứa tổng số lần target_value xuất hiện trong mảng.

Comments

There are no comments at the moment.