Ôn tập: mảng tổng quát
Thuộc phần Lập trình hướng đối tượng trong hành trình C của Coddy. Bài học 53 trên 61.
Thử thách
DễHãy xây dựng một vùng chứa GenericArray: một cấu trúc dữ liệu linh hoạt có thể chứa cả số nguyên và chuỗi trong cùng một tập hợp bằng cách sử dụng con trỏ void*.
Bạn sẽ sắp xếp code trong ba tệp:
generic_array.h: Định nghĩa structGenericArrayvới ba thành viên: một mảngvoid**để chứa các con trỏ, mộtintđể lưu số lượng hiện tại và mộtintđể lưu sức chứa. Khai báo nguyên mẫu các hàm để tạo mảng, thêm phần tử, lấy phần tử theo chỉ số và giải phóng mảng.generic_array.c: Triển khai chức năng của vùng chứa:create_array: cấp phát một GenericArray với sức chứa ban đầu đã cho và khởi tạo count bằng 0add_element: lưu một con trỏvoid*vào vị trí còn trống tiếp theo và tăng count (giả sử sức chứa đủ lớn)get_element: trả vềvoid*tại chỉ số được chỉ địnhfree_array: giải phóng mảng items và chính struct GenericArray
main.c: Minh họa cách dùng mảng tổng quát bằng cách lưu cả số nguyên và chuỗi. Đọc số phần tử cần thêm, sau đó đọc ký hiệu kiểu dữ liệu (icho số nguyên,scho chuỗi), theo sau là giá trị của từng phần tử. Sau khi thêm tất cả phần tử, duyệt qua mảng và in ra từng giá trị. Với số nguyên, in trực tiếp số đó. Với chuỗi, in trực tiếp văn bản.
Chương trình của bạn sẽ nhận:
- Số phần tử cần thêm
- Với mỗi phần tử: một ký hiệu kiểu dữ liệu (
ihoặcs), theo sau là giá trị
Khi thêm số nguyên, hãy cấp phát bộ nhớ cho int và lưu con trỏ. Khi thêm chuỗi, hãy cấp phát bộ nhớ và sao chép chuỗi. Khi lấy phần tử, ép kiểu về kiểu dữ liệu phù hợp để in ra.
Quan trọng: Để theo dõi kiểu dữ liệu khi in, bạn có thể dùng một mảng song song đơn giản chứa các ký hiệu kiểu dữ liệu trong main, hoặc lưu ký tự ký hiệu kiểu dữ liệu bên cạnh từng phần tử.
Ví dụ đầu ra khi đầu vào là 3, tiếp theo là i 42, s Hello, i 100:
42
Hello
100Ví dụ đầu ra khi đầu vào là 4, tiếp theo là s World, s Generic, i -5, s Arrays:
World
Generic
-5
ArraysNhớ dùng include guard trong tệp header. Bản thân vùng chứa không cần biết nó lưu những kiểu dữ liệu nào. Nó chỉ chứa các con trỏ void*. Code thêm và lấy phần tử chịu trách nhiệm biết kiểu dữ liệu.
Tự làm thử
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"
int main() {
int n;
scanf("%d", &n);
// TODO: Tạo một GenericArray có sức chứa n
// TODO: Tạo một mảng song song để theo dõi kiểu dữ liệu (mảng char kích thước n)
// TODO: Với mỗi phần tử:
// - Đọc ký hiệu chỉ kiểu dữ liệu (i hoặc s)
// - Đọc giá trị
// - Nếu là số nguyên: cấp phát bộ nhớ cho int, lưu giá trị rồi thêm vào mảng
// - Nếu là chuỗi: cấp phát bộ nhớ cho chuỗi, sao chép giá trị rồi thêm vào mảng
// - Lưu ký hiệu chỉ kiểu dữ liệu vào mảng song song
// TODO: Duyệt mảng và in ra từng phần tử
// - Kiểm tra kiểu dữ liệu trong mảng song song
// - Ép void* về kiểu phù hợp rồi in ra
// TODO: Giải phóng toàn bộ bộ nhớ đã cấp phát (số nguyên, chuỗi và mảng)
return 0;
}
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình mô-đun
Tệp tiêu đềInclude guardTệp mã nguồnHàm staticÔn tập: Máy tính mô-đun4Tính đóng gói
Khái niệm con trỏ mờĐịnh nghĩa struct mờHàm truy xuất và hàm gánKiểm tra tính hợp lệ trong hàm gánÔn tập: Hộp bí mật7Con trỏ hàm
Khai báo con trỏ hàmGọi con trỏ hàmDùng typedef cho con trỏ hàmTruyền hàm làm đối sốÔn tập: điều phối máy tính10Bộ chứa tổng quát
Ôn tập con trỏ voidTrình bao bọc tổng quátHoán đổi tổng quátSo sánh tổng quátÔn tập: mảng tổng quát2Đối tượng và phương thức
Struct dưới dạng đối tượngCon trỏ 'Self'Tính đúng đắn của constCon trỏ và giá trịPhương thức hỗ trợÔn tập: trình quản lý Point5Dự án: Tài khoản ngân hàng đơn giản
Thiết lập dự ánTriển khai tài khoản3Vòng đời đối tượng
Mẫu hàm khởi tạoMẫu hàm hủyKhởi tạo trên ngăn xếpSao chép sâuÔn tập: lớp bao bọc chuỗi6Kế thừa bằng cách kết hợp
Nhúng structQuy tắc thành viên đầu tiênTruy cập thành viên lớp chaUpcastingÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch C online