Xem thêm

Bài 17. Dữ liệu mảng một chiều và hai chiều

Huy Erick
Chủ đề 6. Kĩ thuật lập trình - Bài 17. Dữ liệu mảng một chiều và hai chiều Giới thiệu Trong bài học trước, chúng ta đã được học về cấu trúc dữ liệu mảng...

Chủ đề 6. Kĩ thuật lập trình - Bài 17. Dữ liệu mảng một chiều và hai chiều

Giới thiệu

Trong bài học trước, chúng ta đã được học về cấu trúc dữ liệu mảng một chiều và mảng hai chiều. Mảng một chiều là một cấu trúc dữ liệu tuyến tính và mảng hai chiều là một cấu trúc dữ liệu hai chiều. Trong bài này, chúng ta sẽ tìm hiểu thêm về cách khai báo và sử dụng cấu trúc dữ liệu này.

Khởi động

Trước khi bắt đầu, chúng ta hãy nhớ lại rằng cấu trúc dữ liệu đóng vai trò quan trọng khi giải quyết các bài toán thực tế trên máy tính. Trong các bài toán thực tế, chúng ta thường cần lưu trữ và quản lý các dữ liệu theo một cấu trúc nhất định để thực hiện các thao tác tìm kiếm, sắp xếp và tính toán. Mảng một chiều và mảng hai chiều là hai cấu trúc dữ liệu phổ biến và hữu ích trong việc lưu trữ và quản lý dữ liệu.

1. Cấu trúc dữ liệu mảng một chiều

Hoạt động 1

Chúng ta hãy cùng thực hiện một số thao tác và ví dụ về cấu trúc dữ liệu mảng một chiều trong ngôn ngữ lập trình Python.

a) Thiết lập các mảng một chiều, thông qua kiểu dữ liệu list trong Python.

A = [1, 3, 5, 7, 9, 11]
B = ["Hà", "Bình", "Ngọc", "Anh"]
C = [9.5, 8.0, 10, 7.2]

b) Có thể truy cập từng phần tử của mảng một chiều theo chỉ số. Toán tử "in" kiểm tra một đối tượng có nằm trong mảng hay không. Trong Python, chỉ số bắt đầu từ 0.

7 in A
# Kết quả: True

c) Có thể dễ dàng duyệt từng phần tử của mảng một chiều bằng lệnh "for".

for hs in B:
    print(hs, end=" ")
# Kết quả: Hà Bình Ngọc Anh

d) Có thể sử dụng các lệnh cơ bản để làm việc với danh sách trong Python như append (bổ sung phần tử vào cuối), remove (xoá một phần tử), insert (bổ sung phần tử vào vị trí bất kì), clear (xoá toàn bộ các phần tử của danh sách).

Lưu ý rằng mặc dù mảng được biểu diễn bằng kiểu dữ liệu list trong Python, nhưng không được đồng nhất khái niệm mảng của khoa học máy tính với kiểu dữ liệu list trong Python.

Câu hỏi

Câu 1. Sử dụng hàm sum() tính tổng các số của một dãy. Hãy viết câu lệnh tính giá trị trung bình của dãy số A cho trước.

Lời giải:

Chúng ta sẽ thay thế dãy số A bằng dãy số thực tế của bạn. Hàm sum(A) tính tổng các số trong dãy A và len(A) trả về độ dài của dãy A. Sau đó, chúng ta chia tổng cho độ dài để tính giá trị trung bình và in ra màn hình.

A = [1, 2, 3, 4, 5] # Thay thế dãy số A bằng dãy số thực tế của bạn
trungBinh = sum(A) / len(A)
print("Giá trị trung bình của dãy số A là: ", trungBinh)

Kết quả này được tính bằng cách cộng tổng các phần tử trong dãy [1, 2, 3, 4, 5] (tổng là 15) và sau đó chia cho độ dài của dãy (5), nên kết quả là 3.0.

Giá trị trung bình của dãy số A là: 3.0

Câu 2. Có thể duyệt các phần tử của mảng theo chiều ngược lại, từ cuối về đầu, được không?

Lời giải:

Có thể duyệt các phần tử của mảng theo chiều ngược lại, từ cuối về đầu, bằng cách sử dụng chỉ số âm trong Python. Trong Python, chỉ số âm đại diện cho vị trí từ cuối của mảng. Cụ thể, các phần tử của mảng có thể được truy cập bằng cách sử dụng index âm bắt đầu từ -1 đến -n, trong đó n là số phần tử của mảng.

Dưới đây là ví dụ về cách duyệt một mảng từ cuối về đầu:

array = [1, 2, 3, 4, 5] # Duyệt mảng từ cuối về đầu
for i in range(len(array) - 1, -1, -1):
    print(array[i])

Trong ví dụ này, chúng ta sử dụng vòng lặp for với hàm range() để duyệt từ vị trí cuối cùng (len(array) - 1) đến vị trí đầu tiên (-1), và sử dụng bước -1 để di chuyển ngược lại từ cuối về đầu. Điều này cho phép bạn truy cập các phần tử của mảng theo chiều ngược lại.

Các phần tử của mảng array đã được in theo thứ tự ngược lại từ cuối về đầu:

5 4 3 2 1

2. Cấu trúc dữ liệu mảng hai chiều

Hoạt động 2

Chúng ta hãy cùng thực hiện một số lệnh để hiểu và làm việc với cấu trúc dữ liệu mảng hai chiều trong Python.

a) Xét dữ liệu biểu diễn điểm của học sinh trong lớp, mỗi phần tử sẽ bao gồm hai thông tin là tên học sinh và điểm số. Lệnh sau sẽ tạo một bộ dữ liệu như vậy. Từ bộ dữ liệu trên, ta thấy mỗi phần tử của mảng là một danh sách bao gồm hai phần tử.

DS_diem = [["Quang", 7.5], ["Hà", 8.0], ["Bình", 9.5]]

b) Nếu truy cập một phần tử của danh sách, ta nhận được một dãy bao gồm tên và điểm của học sinh tương ứng.

DS_diem[1]
# Kết quả: ['Hà', 8.0]

c) Muốn truy cập một giá trị điểm cụ thể, ví dụ điểm của học sinh tên "Quang", cần thực hiện lệnh sau:

DS_diem[0][1]
# Kết quả: 7.5

d) Lệnh duyệt các phần tử của dãy gốc có dạng mở rộng như sau:

for hs, diem in DS_diem:
    print(hs, diem)
# Kết quả:
# Quang 7.5
# Hà 8.0
# Bình 9.5

Lời giải:

Cấu trúc dữ liệu mảng hai chiều trong Python có thể biểu diễn bằng kiểu dữ liệu danh sách (list) với chức năng truy cập dễ dàng từng phần tử theo chỉ số, truy cập theo vùng chỉ số. Toán tử "in" và lệnh "for .. in" sẽ hỗ trợ duyệt từng phần tử của mảng.

Câu hỏi

Câu 1. Thiết lập mảng bao gồm dữ liệu là toạ độ các điểm trên mặt phẳng, mỗi điểm P được cho bởi hai toạ độ (px, py).

Lời giải:

Ta có thể sử dụng kiểu dữ liệu danh sách (list) trong Python để lưu trữ các điểm trên mặt phẳng. Mỗi điểm sẽ được biểu diễn bằng một danh sách chứa hai phần tử là toạ độ px và py.

Ví dụ: để tạo một mảng bao gồm 4 điểm: (1,2), (3,4), (5,6), (7,8) , bạn có thể sử dụng mã như sau:

# Tạo mảng chứa các điểm trên mặt phẳng
diem = [(1, 2), (3, 4), (5, 6), (7, 8)]

Câu 2. Thiết lập mảng bao gồm dãy các thông tin là danh sách học sinh và thông tin 3 điểm thi của học sinh tương ứng các bài thi số 1, 2, 3. Viết đoạn lệnh nhập bộ dữ liệu trên và chương trình in ra danh sách học sinh cùng với điểm trung bình của các bài thi.

Lời giải:

Để lưu trữ danh sách học sinh và thông tin điểm thi của họ, bạn có thể sử dụng một danh sách chứa nhiều danh sách con. Mỗi danh sách con sẽ chứa tên học sinh (dạng chuỗi) và ba điểm số (dạng số) của họ tương ứng với ba bài thi.

Ví dụ: Để tạo một mảng danh sách học sinh với thông tin điểm số, ta có thể sử dụng mã như sau:

# Nhập danh sách học sinh và điểm số
students = []
n = int(input("Nhập số lượng học sinh: "))
for i in range(n):
    name = input(f"Nhập tên học sinh thứ {i+1}: ")
    mark1 = float(input(f"Nhập điểm bài thi 1 của {name}: "))
    mark2 = float(input(f"Nhập điểm bài thi 2 của {name}: "))
    mark3 = float(input(f"Nhập điểm bài thi 3 của {name}: "))
    students.append([name, mark1, mark2, mark3])

# Tính điểm trung bình và in ra danh sách học sinh và điểm trung bình của họ
for student in students:
    name = student[0]
    mark1 = student[1]
    mark2 = student[2]
    mark3 = student[3]
    avg_mark = (mark1 + mark2 + mark3) / 3
    print(f"Học sinh {name} có điểm trung bình là {avg_mark}")

Đoạn mã Python này thực hiện các công việc sau:

  • Dòng 2: Khởi tạo một danh sách trống có tên là students để lưu trữ thông tin về học sinh và điểm số của họ.
  • Dòng 3: Yêu cầu người dùng nhập số lượng học sinh (biến n).
  • Dòng 6: Sử dụng vòng lặp for để nhập thông tin về học sinh và điểm số của họ dựa trên số lượng học sinh (n) mà người dùng đã nhập. Vòng lặp này thực hiện các công việc sau:
    • Dòng 7: Yêu cầu người dùng nhập tên của học sinh (biến name).
    • Dòng 8, 9, 10: Yêu cầu người dùng nhập điểm cho bài thi 1, bài thi 2 và bài thi 3 của học sinh (biến mark1, mark2, mark3).
    • Dòng 11: Tạo một danh sách con chứa thông tin về học sinh và điểm số của họ, sau đó thêm danh sách con này vào danh sách students. Mỗi danh sách con chứa tên và điểm của một học sinh.
  • Dòng 14: Sau khi nhập thông tin của tất cả học sinh
1