Bài 3.5: Bài tập thực hành kiểu dữ liệu nâng cao trong C++

Chào mừng bạn quay trở lại với chuỗi bài viết về C++ của FullhouseDev! Sau khi đã nắm vững các kiến thức cơ bản về biến, kiểu dữ liệu nguyên thủy và câu lệnh điều khiển, đã đến lúc chúng ta lặn sâu hơn vào thế giới của các kiểu dữ liệu mạnh mẽlinh hoạt hơn trong C++. Lý thuyết là quan trọng, nhưng thực hành mới là chìa khóa để biến kiến thức thành kỹ năng.

Bài viết này sẽ tập trung vào việc thực hành với một số kiểu dữ liệu "nâng cao" (so với kiểu nguyên thủy) thường gặp: mảng (arrays), chuỗi ký tự (string), cấu trúc (struct) và một giới thiệu ngắn gọn về vector (vector). Chúng ta sẽ đi qua từng phần với các ví dụ code C++ ngắn gọn, dễ hiểucó giải thích để bạn có thể bắt tay vào code ngay lập tức!


1. Làm Quen Với Mảng (Arrays) - Tập Hợp Cùng Loại

Mảng là một tập hợp các phần tử có cùng kiểu dữ liệu, được lưu trữ liền kề trong bộ nhớ. Chúng ta sử dụng mảng khi muốn xử lý một nhóm dữ liệu cùng loại một cách có tổ chức. Kích thước của mảng thường được xác định tại thời điểm biên dịch.

Hãy tưởng tượng bạn muốn lưu trữ điểm của 5 môn học. Thay vì tạo 5 biến riêng lẻ (diemMon1, diemMon2, ...), bạn có thể dùng một mảng:

#include <iostream>

int main() {
    using namespace std;

    int d[5];
    d[0] = 90;
    d[1] = 85;
    d[2] = 92;
    d[3] = 78;
    d[4] = 95;

    cout << "Diem mon thu 3 (vi tri 2): " << d[2] << endl;

    int t = 0;
    for (int i = 0; i < 5; ++i) {
        t += d[i];
    }

    cout << "Tong diem cua 5 mon: " << t << endl;

    return 0;
}

Output:

Diem mon thu 3 (vi tri 2): 92
Tong diem cua 5 mon: 440

Giải thích:

  • int diem[5];: Khai báo một mảng tên diem có 5 phần tử, mỗi phần tử là kiểu int. Các vị trí (chỉ số) của mảng bắt đầu từ 0.
  • diem[0] = 90;: Gán giá trị 90 cho phần tử đầu tiên của mảng (ở vị trí chỉ số 0).
  • cout << diem[2];: Truy cập và in giá trị của phần tử ở vị trí chỉ số 2 (là môn thứ 3).
  • Vòng lặp for: Duyệt qua tất cả các phần tử của mảng từ chỉ số 0 đến 4 để tính tổng.

Bài tập cho bạn: Thử thay đổi kích thước mảng, tính điểm trung bình, hoặc tìm điểm cao nhất/thấp nhất trong mảng điểm này nhé!


2. Sức Mạnh Của Chuỗi Ký Tự (string)

Trong C++, khi nói đến xử lý văn bản, string là lựa chọn hiện đại và linh hoạt hơn nhiều so với mảng ký tự kiểu C (như char[]). string là một lớp (class) trong Thư viện Chuẩn C++ (Standard Library), cung cấp nhiều phương thức tiện lợi.

Hãy xem cách làm việc với tên người dùng chẳng hạn:

#include <iostream>
#include <string>

int main() {
    using namespace std;

    string ten;

    cout << "Nhap ten sinh vien: ";
    getline(cin, ten);

    cout << "Ten da nhap: " << ten << endl;
    cout << "Do dai cua ten: " << ten.length() << " ky tu" << endl;

    string chao = "Xin chao, ";
    string tb = chao + ten + "!";
    cout << tb << endl;

    return 0;
}

Output (ví dụ với input "Nguyen Van A"):

Nhap ten sinh vien: Nguyen Van A
Ten da nhap: Nguyen Van A
Do dai cua ten: 14 ky tu
Xin chao, Nguyen Van A!

Giải thích:

  • #include <string>: Bắt buộc phải có để sử dụng lớp string.
  • string tenSinhVien;: Khai báo một biến kiểu string.
  • getline(cin, tenSinhVien);: Đây là cách nên dùng để đọc chuỗi nhập từ bàn phím khi chuỗi có thể chứa khoảng trắng. cin >> tenSinhVien chỉ đọc đến khoảng trắng đầu tiên.
  • tenSinhVien.length(): Một phương thức của đối tượng string trả về số ký tự trong chuỗi.
  • loiChao + tenSinhVien + "!": Sử dụng toán tử + để nối các chuỗi lại với nhau, tạo thành một chuỗi mới.

Bài tập cho bạn: Hãy thử tìm xem một ký tự hoặc một từ cụ thể có tồn tại trong chuỗi tenSinhVien hay không bằng cách tìm hiểu các phương thức khác của string như find().


3. Tổ Chức Dữ Liệu Với Struct

Khi bạn có các dữ liệu liên quan nhưng thuộc các kiểu khác nhau, việc nhóm chúng lại thành một đơn vị duy nhất sẽ giúp code của bạn gọn gàngdễ quản lý hơn. Đó chính là lúc chúng ta cần đến struct (cấu trúc).

Hãy tạo một cấu trúc để lưu thông tin của một cuốn sách:

#include <iostream>
#include <string>

struct Sach {
    string td; // tieu de
    string tg; // tac gia
    int nam;        // nam xuat ban
    float gia;      // gia tien
};

int main() {
    using namespace std;

    Sach s1;
    s1.td = "Nha Gia Kim";
    s1.tg = "Paulo Coelho";
    s1.nam = 1988;
    s1.gia = 120.50;

    cout << "Thong tin sach:" << endl;
    cout << "Tieu de: " << s1.td << endl;
    cout << "Tac gia: " << s1.tg << endl;
    cout << "Nam xuat ban: " << s1.nam << endl;
    cout << "Gia tien: " << s1.gia << " VND" << endl;

    Sach s2 = {"Hoang Tu Be", "Antoine de Saint-Exupery", 1943, 95.00};

    cout << "\nThong tin sach thu 2:" << endl;
    cout << "Tieu de: " << s2.td << endl;

    return 0;
}

Output:

Thong tin sach:
Tieu de: Nha Gia Kim
Tac gia: Paulo Coelho
Nam xuat ban: 1988
Gia tien: 120.5 VND

Thong tin sach thu 2:
Tieu de: Hoang Tu Be

Giải thích:

  • struct Sach { ... };: Định nghĩa một kiểu dữ liệu mới tên là Sach. Kiểu dữ liệu này chứa các thành viên (tieuDe, tacGia, namXuatBan, giaTien) với các kiểu dữ liệu khác nhau. Dấu chấm phẩy ; sau dấu ngoặc nhọn đóng } là bắt buộc.
  • Sach cuonSach1;: Khai báo một biến (hay còn gọi là đối tượng) có kiểu Sach.
  • cuonSach1.tieuDe = "Nha Gia Kim";: Sử dụng toán tử chấm (.) để truy cập và gán giá trị cho thành viên tieuDe của đối tượng cuonSach1.
  • Sach cuonSach2 = { ... };: Cách khởi tạo nhanh một đối tượng struct bằng cách liệt kê giá trị cho các thành viên theo thứ tự định nghĩa.

Bài tập cho bạn: Tạo một struct để lưu thông tin sinh viên (Mã số, Tên, Tuổi, Điểm trung bình) và thử tạo 2-3 sinh viên khác nhau.


4. Giới Thiệu Sơ Lược Về Vector (vector) - Mảng Linh Hoạt

Mảng cố định có nhược điểm là kích thước không thể thay đổi sau khi được tạo. vector, một kiểu dữ liệu container khác từ STL, giải quyết vấn đề này. vector là một mảng động, có thể tự động co giãn kích thước khi bạn thêm hoặc bớt phần tử.

Đây là một ví dụ đơn giản về cách sử dụng vector:

#include <iostream>
#include <vector>

int main() {
    using namespace std;

    vector<int> v;

    v.push_back(10);
    v.push_back(25);
    v.push_back(5);

    cout << "Kich thuoc vector: " << v.size() << endl;
    cout << "Phan tu dau tien: " << v[0] << endl;

    cout << "Cac phan tu trong vector: ";
    for (int i = 0; i < v.size(); ++i) {
        cout << v[i] << " ";
    }
    cout << endl;

    v.push_back(30);

    cout << "Kich thuoc vector sau khi them: " << v.size() << endl;

    return 0;
}

Output:

Kich thuoc vector: 3
Phan tu dau tien: 10
Cac phan tu trong vector: 10 25 5
Kich thuoc vector sau khi them: 4

Giải thích:

  • #include <vector>: Cần thiết để sử dụng vector.
  • vector<int> danhSachSo;: Khai báo một vector có thể chứa các phần tử kiểu int. <int> bên trong dấu ngoặc nhọn <> chỉ định kiểu dữ liệu mà vector này sẽ lưu trữ.
  • danhSachSo.push_back(10);: Phương thức push_back() được dùng để thêm một phần tử mới vào cuối vector. Vector sẽ tự động tăng kích thước nếu cần.
  • danhSachSo.size(): Trả về số lượng phần tử hiện có trong vector.
  • danhSachSo[i]: Truy cập phần tử tại chỉ số i, tương tự như mảng cố định.

Bài tập cho bạn: Thử tạo một vector chứa các đối tượng Sach mà bạn đã định nghĩa ở mục 3. Thêm 2-3 cuốn sách vào vector đó và duyệt qua vector để in thông tin của từng cuốn sách.

Comments

There are no comments at the moment.