Skip to content

Mảng một chiều

Tóm lược nội dung

Bài này trình bày những khái niệm về mảng nói chung và mảng một chiều nói riêng.

Đặt vấn đề

Khi xử lý bảng điểm môn Tin học của một lớp gồm 30 học sinh, việc khai báo 30 biến có vẻ không ổn. Thử xem đoạn mã khai báo sau đây bất tiện như thế nào.

hs1 = 10
hs2 = 9
hs3 = 9.5 
.
.
.
hs29 = 9.1
hs30 = 9.4

Nếu số học sinh nhiều hơn, chẳng hạn 500 học sinh cả khối, thì việc khai báo từng biến là hoàn toàn bất khả thi.

May thay, các ngôn ngữ lập trình đều có hỗ trợ những kiểu dữ liệu dành cho trường hợp bảng điểm như trên, và Python cũng vậy.

Python cũng vậy. Một kiểu dữ liệu của Python có thể giúp xử lý tập hợp nhiều dữ liệu là kiểu list.

Khái quát về mảng

Mảng là cấu trúc dữ liệu dùng để lưu trữ và xử lý tập hợp các phần tử, trong đó:

  • Các phần tử được lưu trữ liên tiếp nhau trên bộ nhớ.
  • Trong nhiều ngôn ngữ, kích thước hoặc độ dài của mảng là số lượng phần tử mà mảng có thể chứa. Số lượng phần tử là hữu hạn.
  • Mỗi phần tử gồm có hai yếu tố: giá trịchỉ số.
    • Mỗi phần tử được truy xuất thông qua chỉ số của nó.
    • Giá trị của các phần tử đều cùng kiểu dữ liệu.

Mảng thường được dùng để giải quyết những bài toán có nhiều giá trị liên quan và cùng kiểu dữ liệu.

Ví dụ:

  • Điểm số môn Tin học của các học sinh trong lớp.
  • Dữ liệu thời gian ghi nhận được ở các lần đo trong thí nghiệm đo thời gian rơi của một vật.

Nói rõ thêm về mảng

  1. Về mặt khái niệm, các phần tử của một mảng được lưu trữ liên tiếp nhau trong bộ nhớ. Tuy nhiên, trên thực tế, trong khi mảng tĩnh vẫn được lưu trữ liên tiếp nhau, thì mảng động hoặc các cấu trúc dữ liệu tương đương thì không nhất thiết lưu trữ liên tiếp nhau, mà các phần tử có thể nằm rải rác trên bộ nhớ.

  2. Trong một số ngôn ngữ "truyền thống" như C hay Java, các phần tử của mảng phải có cùng kiểu dữ liệu. Trái lại, một số ngôn ngữ hiện đại như JavaScript, Ruby, Python cho phép mảng (danh sách) chứa các phần tử có kiểu dữ liệu khác nhau.

Phân loại theo chiều, các loại mảng gồm có:

  • Mảng một chiều
  • Mảng hai chiều
  • Mảng đa chiều.

Bài học này chỉ đề cập mảng một chiều.

Hỏi chút chơi - phần 1

Mảng trong Python

Trong Python, kiểu dữ liệu list có thể được sử dụng để biểu diễn mảng. (Do đã được đề cập trong chương trình lớp 10, nên các bài học về mảng ở lớp 11 sẽ không dùng kiểu list nữa.)

Bên cạnh đó, Python cũng có sẵn thư viện array để làm việc với mảng.

Đặc biệt, thư viện mã nguồn mở numpy giúp xử lý mảng nhanh hơn.

Một số bài học ở lớp 11 này sẽ sử dụng thư viện numpy khi minh hoạ các vấn đề liên quan đến mảng.

Hỏi chút chơi - phần 2

Mảng một chiều

Hình ảnh mảng một chiều trong thực tế:

  • Dãy các phòng học
  • Dãy ghế trong rạp chiếu phim

Mảng một chiều có thể áp dụng khi xử lý:

  • Một dãy số
  • Một hàng hoặc một cột trong bảng

Chỉ số của các phần tử được đánh từ 0 hoặc từ 1, tuỳ ngôn ngữ lập trình. Chỉ số còn có thể xem là vị trí của phần tử trong mảng.

Minh họa mảng một chiều A

Minh họa mảng một chiều A

Cài đặt thư viện numpy

Để sử dụng thư viện numpy, ta cài đặt bằng pip.

Trong cửa sổ Terminal của Visual Studio Code (1) (hoặc PowerShell hoặc Command Prompt của Windows), gõ lệnh sau:

  1. Mở cửa sổ Terminal bằng phím tắt Ctrl+` hoặc chọn menu View > Terminal.
pip install numpy

Import thư viện numpy

Để sử dụng thư viện numpy, ta cần import nó vào chương trình Python.

import numpy as np

Khởi tạo

Để khởi tạo mảng một chiều bằng thư viện numpy, ta sử dụng hàm array() của thư viện.

Các phần tử được liệt kê trong cặp ngoặc vuông [ ] và phân cách nhau bằng dấu phẩy ,.

Ví dụ:

Yêu cầu: Khởi tạo mảng một chiều A bằng cách liệt kê phần tử.

3
4
5
6
if __name__ == '__main__':
    # Khởi tạo mảng một chiều A gồm 12 phần tử là số nguyên
    A = np.array([1, 7, 4, 0, 9, 4, 8, 8, 2, 4, 5, 5])
    print(f'Mảng A: {A}') # (1)!

  1. f'...' là cú pháp f-string (formatted string literal) của Python giúp hiển thị giá trị của biến A.

    Khi sử dụng f-string, các biến hoặc biểu thức bên trong dấu {} sẽ được thay thế bằng giá trị tương ứng.

Output:

Mảng A: [1 7 4 0 9 4 8 8 2 4 5 5]

Để khởi tạo mảng một chiều gồm các phần tử cùng giá trị, ta dùng hàm full() của thư viện numpy.

Ví dụ:

Yêu cầu: Khởi tạo mảng một chiều zeros gồm toàn các phần tử có giá trị 0.

    # Khởi tạo mảng zeros gồm 8 phần tử đều mang giá trị 0
    zeros = np.full(8, 0)
    print(f'Mảng zeros: {zeros}')

Output:

Mảng zeros: [0 0 0 0 0 0 0 0]

Hỏi chút chơi - phần 3

Truy xuất phần tử

Mỗi phần tử của mảng một chiều được truy xuất thông qua chỉ số. Chỉ số được đặt trong cặp ngoặc vuông [ ].

Phần tử đầu tiên có chỉ số là 0 và phần tử cuối cùng có chỉ số là len(mảng) - 1.

Ví dụ:

Yêu cầu: In ra màn hình giá trị của phần tử đầu tiên và cuối cùng của mảng A.

    # In ra phần tử đầu tiên của mảng A
    print(f'Phần tử đầu tiên của mảng A: {A[0]}')

    # In ra phần tử cuối cùng của mảng A
    print(f'Phần tử cuối cùng của mảng A: {A[len(A) - 1]}')

Output:

Phần tử đầu tiên của mảng A: 1
Phần tử cuối cùng của mảng A: 5

Đoạn mã sau đây bị lỗi vì mảng A không có phần tử mang chỉ số 12.

    # Chương trình báo lỗi vì không có chỉ số 12 trong mảng A
    print(f'Phần tử thứ 12 của mảng A: {A[12]}')

Nội dung báo lỗi trong Visual Studio Code:

Exception has occurred: IndexError
index 12 is out of bounds for axis 0 with size 12
  File "D:\ProjectLocal\gdpt-2018\g11\topic-f2\array-1-dimension-numpy.py", line 19, in <module>
    print(f'Phần tử thứ 12 của mảng A: {A[12]}')
                                        ~^^^^
IndexError: index 12 is out of bounds for axis 0 with size 12

Hỏi chút chơi - phần 4

Duyệt mảng

Trong nhiều bài toán, các phần tử của mảng thường được xử lý một loạt tương tự nhau, theo thứ tự từ phần tử đầu đến phần tử cuối. Do đó, ta thường sử dụng vòng lặp để duyệt mảng.

Ví dụ:

Yêu cầu: Duyệt mảng để in ra các phần tử từ đầu đến cuối. Mỗi phần tử nằm trên một dòng.

    # In các phần tử của mảng A trên từng dòng
    for i in range(len(A)):
        print(f'A[{i}] = {A[i]}')

Output:

A[0] = 1
A[1] = 7
A[2] = 4
A[3] = 0
A[4] = 9
A[5] = 4
A[6] = 8
A[7] = 8
A[8] = 2
A[10] = 5
A[11] = 5

Ví dụ:

Yêu cầu: Duyệt mảng để in ra các phần tử từ cuối ngược về đầu. Các phần tử nằm trên cùng một dòng.

    # In mảng A theo thứ tự từ cuối ngược về đầu
    for i in range(len(A) - 1, -1, -1):
        print(A[i], end=' ') # (1)!

  1. Tham số end của hàm print() có giá trị mặc định là '\n', nghĩa là xuống dòng sau khi in ra từng phần tử.

    end=' ' giúp in ra khoảng trắng sau mỗi phần tử.

Output:

5 5 4 2 8 8 4 9 0 4 7 1

Hỏi chút chơi - phần 5

Sơ đồ tóm tắt nội dung

Sơ đồ tóm tắt về mảng và mảng một chiều

Mã nguồn

Các đoạn mã trong bài được đặt tại:

  1. GitHub

  2. Google Colab

Some English words

Vietnamese Tiếng Anh
chỉ số (của phần tử) index
đánh chỉ số từ 0 zero-based indexing
giá trị (của phần tử) value
mảng một chiều one-dimensional array
phần tử element, item