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

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 – sách giáo khoa trang 81 lớp 11 Khoa học máy tính – Kết Nối Tri Thức, mời các em tham khảo cùng Bumbii.

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

Tham gia cộng đồng học tập Bumbii trên Discord

  • Chia sẻ, hỏi đáp, bàn luận các vấn đề học tập.
  • Gặp gỡ các anh chị, thầy cô có nhiều năm kinh nghiệm.
  • Cập nhật các kiến thức, tài liệu mới nhất.

Tham gia ngay!

Khởi động

Em đã biết thiết lập cấu trúc dữ liệu đóng vai trò quan trọng khi giải quyết trong 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ế sau em sẽ thiết lập cấu trúc dữ liệu như thế nào?

– Lập danh sách họ tên các bạn học sinh lớp em để có thể tìm kiếm, sắp xếp và thực hiện các bài toán quản lí khác.

– Giả sử lớp em cần khảo sát ý kiến theo một yêu cầu của ban giám hiệu. Mỗi học sinh cần có đánh giá theo 4 mức, kí hiệu lần lượt là Đồng ý (2); không phản đối (1); không ý kiến (0); phản đối (-1). Em sẽ tổ chức dữ liệu khảo sát như thế nào để có thể dễ dàng cập nhật và tính toán theo dữ liệu khảo sát.

– Em được giao nhiệm vụ thiết lập và lưu trữ một danh sách các địa điểm là nơi các bạn trong lớp sẽ thường xuyên đến để tham quan và trải nghiệm thực tế. Mỗi địa điểm như vậy cần nhiều thông tin, nhưng thông tin quan trọng nhất là toạ độ (x. y) của thông tin đó trên bản đồ. Em sẽ dụng cấu trúc dữ liệu gì để mô tả danh sách các địa điểm này?

Lời giải:

Lập danh sách họ tên các bạn học sinh lớp em để có thể tìm kiếm, sắp xếp và thực hiện các bài toán quản lí khác: Để lưu trữ danh sách họ tên các bạn học sinh, bạn có thể sử dụng một danh sách (list) hoặc mảng (array) trong ngôn ngữ lập trình. Mỗi phần tử trong danh sách này sẽ là tên của một học sinh.

  • Ví dụ: Nếu lớp có 30 học sinh, chúng ta có thể tạo một danh sách với 30 phần tử và lưu trữ họ tên của các học sinh tại các chỉ số tương ứng của danh sách. Ví dụ: tên học sinh thứ nhất được lưu trữ tại vị trí danh sách thứ 0, tên học sinh thứ hai được lưu trữ tại vị trí danh sách thứ 1, và cứ như vậy.

Khảo sát ý kiến của học sinh với 4 mức đánh giá: Để tổ chức dữ liệu khảo sát, chúng ta có thể sử dụng một cấu trúc dữ liệu gọi là “bảng điểm” (scoreboard) hoặc “bảng đánh giá” (ratingtable). Cấu trúc này có thể được triển khai dưới dạng một mảng.

Lưu trữ danh sách các địa điểm tham quan với toạ độ (x, y) trên bản đồ: Em sẽ dụng cấu trúc dữ liệu 2 chiều để mô tả danh sách các địa điểm này.

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

Hoạt động 1

Thực hiện các thao tác sau, quan sát, trao đổi và thảo luận, từ đó nhận biết về cấu trúc dữ liệu mảng một chiều trong 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

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 = ” “)

Hà Bình Ngọc Anh

d) Các lệnh cơ bản làm việc với danh sách trong Python đã được học trong chương trình Tin học 10, ví dụ: 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 ý: Mặc dù mảng được biểu diễn bằng dữ liệu list, 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.

Lời giải:

Cấu trúc dữ liệu mảng một 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. 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

Thực hiện các lệnh sau, quan sát, trao đổi và thảo luận, từ đó nhận biết về mô hình danh sách 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. Ta thấy mỗi phần tử của dãy này lại 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]

[‘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]

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)

Quang 7.5

Hà 8.0

Bình 9.5

Lời giải:

Python hỗ trợ mô hình dữ liệu danh sách trong danh sách, tức là mỗi phần tử của danh sách là một đối tượng dạng danh sách khác.

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 1: 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, đoạn mã tiếp tục sử dụng vòng lặp for để tính điểm trung bình của từng học sinh và in ra thông tin này.

  • Dòng 15, 16, 17, 18: Lấy tên của học sinh (biến name) và điểm của ba bài thi (biến mark1, mark2, mark3) từ danh sách con tương ứng.
  • Dòng 19: Tính điểm trung bình của học sinh bằng cách tính tổng điểm của ba bài thi và chia cho 3 (biến avg_mark).
  • Dòng 20: In ra màn hình tên của học sinh và điểm trung bình của họ thông qua câu lệnh print.

Kết quả đoạn mã:

Nhập số lượng học sinh: 3
Nhập tên học sinh thứ 1: An
Nhập điểm bài thi 1 của An: 85
Nhập điểm bài thi 2 của An: 90
Nhập điểm bài thi 3 của An: 78
Nhập tên học sinh thứ 2: Hoa
Nhập điểm bài thi 1 của Hoa: 75
Nhập điểm bài thi 2 của Hoa: 88
Nhập điểm bài thi 3 của Hoa: 92
Nhập tên học sinh thứ 3: Mai
Nhập điểm bài thi 1 của Mai: 92
Nhập điểm bài thi 2 của Mai: 78
Nhập điểm bài thi 3 của Mai: 85
Học sinh An có điểm trung bình là 84.33333333333333
Học sinh Hoa có điểm trung bình là 85.0
Học sinh Mai có điểm trung bình là 85.0

Hoạt động 3

Đọc, trao đổi, thảo luận về cấu trúc dữ liệu mảng hai chiều trong Python.

a) Trong tin học, một cấu trúc dữ liệu hai chiều được hiểu là một bảng hay còn gọi là ma trận, bao gồm các hàng và cột dữ liệu. Bảng có thể có kích thước vuông n×n hoặc kích thước bất ki m xin.

Ví dụ một bảng (hay ma trận) vuông bậc ba có dạng như sau:

Tổng quát mô hình bảng bậc m xin có dạng như sau:

Phần tử nằm tại hàng i và cột j sẽ kí hiệu là ai. Như vậy ai là phần tử của ma trận tại vị trí hàng i, cột i.

Ma trận kích thước m xin sẽ bao gồm m x n phần tử, có cấu trúc bao gồm m hàng, mỗi hàng có n cột. Trong Python, mô hình ma trận m x n sẽ dễ dàng được biểu diễn bởi cấu trúc danh sách trong danh sách với một mảng có m phần tử, mỗi phần tử đều có dạng danh sách có n phần tử. Ví dụ ma trận vuông A bậc 3 ở trên có thể khai báo trong Python như sau:

>>> A = [[12, 10, 91], [11,45, 20], [15,34,55]]

Vì mảng trong Python được đánh chỉ số từ 0 nên muốn truy cập phần tử tại hàng 3 cột 2, gõ lệnh.

>>> A[2][1]

34

b) Với cấu trúc dữ liệu hai chiều, ví dụ như ma trận A bậc 3 ở trên, thao tác duyệt theo từng phần tử sẽ được thực hiện bằng hai lệnh duyệt for lồng nhau. Ví dụ sau cho biết cách duyệt ma trận A có 3 × 3 = 9 phần tử, kết quả thể hiện ma trận A theo đúng khuôn mẫu chuẩn là một bảng gồm 3 hàng, 3 cột.

Lời giải:

Trong Python cấu trúc dữ liệu mảng hai chiều có thể được biểu diễn bằng mô hình danh sách trong danh sách. Có thể truy cập từng phần tử và duyệt cấu trúc dữ liệu hai chiều bằng hai lệnh for lồng nhau.

Câu hỏi

Câu 1. Câu lệnh sau sẽ tạo dữ liệu thuộc thể loại gì?

temp = [1, 2, 3, 4]
A = [temp, temp]

Lời giải:

Câu lệnh trên sẽ tạo ra một dữ liệu thuộc thể loại List (danh sách) trong Python, với tên biến A là một danh sách chứa hai phần tử. Mỗi phần tử của danh sách A là một tham chiếu đến đối tượng danh sách temp, được tạo ra trước đó.

Vì vậy, A sẽ chứa hai tham chiếu đến cùng một danh sách temp, với giá trị của temp là [1, 2, 3, 4]. Nếu giá trị của danh sách temp thay đổi, thì giá trị của các phần tử trong danh sách A cũng sẽ thay đổi theo.

Tham gia cộng đồng học tập Bumbii trên Discord

  • Chia sẻ, hỏi đáp, bàn luận các vấn đề học tập.
  • Gặp gỡ các anh chị, thầy cô có nhiều năm kinh nghiệm.
  • Cập nhật các kiến thức, tài liệu mới nhất.

Tham gia ngay!

Câu 2. Nếu A là bảng (ma trận) kích thước m x n thì đoạn chương trình sau sẽ in ra thông tin gì trên màn hình?

for i in range(m):
    for j in range(n):
     print(A[i][j],end=” “)
    print()

Lời giải:

Nếu A là một ma trận kích thước m x n, đoạn chương trình trên sẽ in ra giá trị của từng phần tử trong ma trận A, mỗi dòng một.

Cụ thể, với mỗi giá trị của i trong khoảng từ 0 đến m – 1, vòng lặp đầu tiên sẽ lặp qua từng phần tử trong hàng thứ i của ma trận A. Với mỗi giá trị của j trong khoảng từ 0 đến n – 1, vòng lặp thứ hai sẽ in ra giá trị của phần tử tại vị trí (i,j) trong ma trận A bằng lệnh print(A[i][j],end=" "), kết thúc bằng một khoảng trắng.

Sau khi in hết các phần tử trong hàng thứ i, lệnh print() trong vòng lặp đầu tiên sẽ xuống dòng, chuyển sang in hàng tiếp theo của ma trận A. Như vậy, tổng hợp lại, đoạn chương trình sẽ in ra ma trận A dưới dạng bảng trên màn hình.

Luyện tập

Câu 1. Giả sử số đo chiều cao các bạn trong lớp được cho trong dãy số A. Hãy viết đoạn chương trình tính:

– Số đo chiều cao trung bình của cả lớp.

– Số bạn có chiều cao lớn hơn chiều cao trung bình của cả lớp.

Lời giải:

# Nhập danh sách số đo chiều cao của các bạn trong lớp
heights = []
n = int(input("Nhập số lượng bạn trong lớp: "))

for i in range(n):
    height = float(input(f"Nhập chiều cao của bạn thứ {i+1} (đơn vị cm): "))
    heights.append(height)

# Tính số đo chiều cao trung bình của cả lớp
aveHeight = sum(heights) / len(heights)
print(f"Chiều cao trung bình của cả lớp là: {aveHeight} cm")

# Tính số bạn có chiều cao lớn hơn chiều cao trung bình của cả lớp
countTallerThanAvg = sum(1 for height in heights if height > aveHeight)
print(f"Số bạn có chiều cao lớn hơn chiều cao trung bình của cả lớp là: {countTallerThanAvg}")

Giải thích đoạn mã:

– Dòng 2: Tạo một danh sách rỗng có tên là heights để lưu trữ số đo chiều cao của các bạn trong lớp.

– Dòng 3: Yêu cầu người dùng nhập số lượng bạn trong lớp thông qua biến n. Điều này cho biết chúng ta sẽ nhập bao nhiêu số đo chiều cao.

– Dòng 5: Sử dụng một vòng lặp for để lặp qua từng bạn trong lớp (có n lần), và trong mỗi lần lặp, yêu cầu người dùng nhập chiều cao của bạn đó và thêm nó vào danh sách heights. Biến i được sử dụng để đánh số thứ tự của bạn.

– Dòng 7: append() là một phương thức của danh sách (list) trong Python, nó được sử dụng để thêm một phần tử mới vào cuối danh sách. Dòng lệnh heights.append(height) sẽ thêm giá trị của height vào danh sách heights, làm cho danh sách này mở rộng thêm một phần tử mới.

– Dòng 11: Sau khi đã nhập đủ chiều cao của các bạn trong lớp, chương trình tính chiều cao trung bình của cả lớp bằng cách lấy tổng của tất cả các số đo chiều cao (sử dụng hàm sum(heights)) và chia cho số lượng bạn trong lớp (sử dụng len(heights)). Kết quả được lưu trong biến aveHeight và được in ra màn hình.

– Dòng 14, 15: Chương trình cũng tính số bạn có chiều cao lớn hơn chiều cao trung bình của cả lớp. Điều này được thực hiện bằng cách sử dụng một biểu thức sinh ra một danh sách các giá trị 1 hoặc 0 dựa trên điều kiện chiều cao của từng bạn so với chiều cao trung bình (1 nếu chiều cao lớn hơn, 0 nếu không). Sau đó, tổng của danh sách này sẽ cho biết số bạn có chiều cao lớn hơn chiều cao trung bình. Kết quả được lưu trong biến countTallerThanAvg và được in ra màn hình.

Kết quả đoạn mã:

Nhập số lượng bạn trong lớp: 4
Nhập chiều cao của bạn thứ 1 (đơn vị cm): 150
Nhập chiều cao của bạn thứ 2 (đơn vị cm): 160
Nhập chiều cao của bạn thứ 3 (đơn vị cm): 170
Nhập chiều cao của bạn thứ 4 (đơn vị cm): 180
Chiều cao trung bình của cả lớp là: 165.0 cm
Số bạn có chiều cao lớn hơn chiều cao trung bình của cả lớp là: 2

Câu 2. Viết chương trình nhập từ bàn phím số tự nhiên m, sau đó lần lượt nhập m dòng, mỗi dòng bao gồm n số cách nhau bởi dấu cách, đưa dữ liệu đã nhập vào ma trận A, sau đó in ma trận A ra màn hình.

Trả lời:

m = int(input("Nhập số hàng của ma trận: "))
n = int(input("Nhập số cột của ma trận: "))

A = []

for i in range(m):
    # Nhập một dòng gồm n số nguyên cách nhau bởi dấu cách
    row = list(map(int, input(f"Nhập dòng {i+1}: ").split()))
    A.append(row)

# In ma trận A ra màn hình
print("Ma trận A:")
for i in range(m):
    for j in range(n):
        print(A[i][j], end=" ")
    print()

Giải thích đoạn mã:

– Dòng 1: m = int(input("Nhập số hàng của ma trận: ")): Dòng này yêu cầu người dùng nhập số hàng của ma trận từ bàn phím và lưu giá trị vào biến m. Biến m sẽ là số hàng của ma trận.

– Dòng 2: n = int(input("Nhập số cột của ma trận: ")): Tương tự như trên, dòng này yêu cầu người dùng nhập số cột của ma trận và lưu giá trị vào biến n. Biến n sẽ là số cột của ma trận.

– Dòng 4: A = []: Tạo một danh sách rỗng A để lưu trữ ma trận sau khi nhập.

– Dòng 6: Tiếp theo, chúng ta sử dụng một vòng lặp for để nhập từng hàng của ma trận. Vòng lặp này chạy từ 0 đến m-1 (hoặc số hàng của ma trận), và tại mỗi vòng lặp, người dùng sẽ nhập một dòng của ma trận.

– Dòng 8: row = list(map(int, input(f"Nhập dòng {i+1}: ").split())): Dòng này yêu cầu người dùng nhập dòng thứ i+1 của ma trận và lưu nó vào biến row. Hàm input() lấy dòng văn bản nhập từ người dùng, split() tách nó thành các phần tử dựa trên dấu cách, và map(int, ...) chuyển đổi các phần tử thành số nguyên và cuối cùng đưa vào danh sách row.

– Dòng 9: A.append(row): Sau khi nhập một dòng, danh sách row sẽ được thêm vào danh sách A, tức là mỗi dòng của ma trận sẽ là một phần tử trong danh sách A.

– Dòng 12, 13, 14, 15, 16: Cuối cùng, chúng ta sử dụng hai vòng lặp lồng nhau để in ma trận A ra màn hình. Vòng lặp ngoài chạy qua từng hàng của ma trận (i), và vòng lặp bên trong chạy qua từng phần tử trong hàng đó (j). Mỗi phần tử sẽ được in ra màn hình, và sau mỗi hàng, chúng ta sử dụng print() để xuống dòng và in hàng tiếp theo.

Kết quả đoạn mã:

Nhập số hàng của ma trận: 3
Nhập số cột của ma trận: 3
Nhập dòng 1: 1 2 3
Nhập dòng 2: 4 5 6
Nhập dòng 3: 7 8 9
Ma trận A:
1 2 3 
4 5 6 
7 8 9 

Vận dụng

Câu 1. Viết hàm số UnitMatrix(n) với n là số tự nhiên cho trước, hàm trả lại giá trị là ma trận bậc n như Hình 17.1.

Lời giải:

def UnitMatrix(n):
    matrix = []
    for i in range(n):
        row = []

        for j in range(n):
            if i == j:
                row.append(1)
            else:
                row.append(0)

        matrix.append(row)

    return matrix

Giải thích đoạn mã:

Đoạn code Python này định nghĩa một hàm UnitMatrix(n) để tạo ma trận đơn vị kích thước n x n. Dưới đây là giải thích từng phần của mã:

– Dòng 2: matrix = []: Đây là một danh sách rỗng ban đầu, sẽ được sử dụng để lưu trữ ma trận đơn vị.

– Dòng 3: for i in range(n):: Vòng lặp ngoài đầu tiên lặp qua từng hàng của ma trận. i đại diện cho chỉ số hàng.

– Dòng 4: row = []: Mỗi lần bắt đầu một hàng mới, chúng ta tạo một danh sách con rỗng row để lưu trữ các giá trị của hàng đó.

– Dòng 6: for j in range(n):: Vòng lặp trong lặp qua từng cột của ma trận trong hàng hiện tại. j đại diện cho chỉ số cột.

– Dòng 7: if i == j:: Kiểm tra xem chỉ số hàng i có bằng chỉ số cột j không. Nếu bằng, nghĩa là chúng ta đang trên đường chéo chính của ma trận đơn vị.

– Dòng 8: row.append(1): Nếu i j bằng nhau, chúng ta thêm giá trị 1 vào hàng row cho phần tử này. Điều này tạo ra các phần tử bằng 1 trên đường chéo chính của ma trận đơn vị.

– Dòng 9, 10: else:: Nếu ij không bằng nhau (không nằm trên đường chéo chính), chúng ta thêm giá trị 0 vào hàng row cho phần tử này. Điều này tạo ra các phần tử bằng 0 cho các phần tử nằm ngoài đường chéo chính.

– Dòng 12: matrix.append(row): Sau khi đã tạo xong hàng row, chúng ta thêm nó vào danh sách matrix để tạo ma trận đơn vị.

– Dòng 14: Cuối cùng, sau khi đã tạo xong toàn bộ ma trận đơn vị, hàm trả về ma trận này bằng cách sử dụng lệnh return matrix.

Kết quả của đoạn code: sẽ là một ma trận đơn vị kích thước n x n, ví dụ:

Nếu bạn gọi hàm UnitMatrix(3), nó sẽ trả về ma trận đơn vị 3×3 như sau:

[[1, 0, 0],
 [0, 1, 0],
 [0, 0, 1]]

Câu 2. Viết chương trình cho phép người dùng nhập từ bàn phim một dãy số tự nhiên, hãy đếm với mỗi giá trị của dây có bao nhiêu số lặp lại. Ví dụ nếu dãy ban đầu là:

0 1 5 7 0 2 5 1 1 2

thì chương trình cần thông báo như Hình 17.2.

Lời giải:

numbers = list(map(int, input("Nhập dãy số: ").split()))

count = {}

for number in numbers:
    if number in count:
        count[number] += 1
    else:
        count[number] = 1

for number in count:
    print(f"Số {number} lặp lại {count[number]} lần")

Giải thích đoạn mã:

– Dòng 1: numbers = list(map(int, input("Nhập dãy số: ").split())): Dòng này yêu cầu người dùng nhập một dãy số, các số cách nhau bằng khoảng trắng, sau đó sử dụng phương thức split() để tách các số và chuyển chúng thành một danh sách số nguyên.

– Dòng 3: count = {}: Dòng này tạo một từ điển (dictionary) trống để lưu trữ số lần xuất hiện của từng số.

– Dòng 5: for number in numbers:: Dòng này bắt đầu một vòng lặp qua từng số trong danh sách numbers.

– Dòng 6: if number in count:: Dòng này kiểm tra xem số hiện tại đã có trong từ điển count chưa.

– Dòng 7: Nếu số đã tồn tại trong count, dòng count[number] += 1 sẽ tăng giá trị đếm của số đó lên.

– Dòng 8, 9: Nếu số chưa tồn tại trong count, dòng count[number] = 1 sẽ thêm số vào từ điển và đặt giá trị đếm của nó là 1.

– Dòng 11, 12: Cuối cùng, sau khi đã đếm xong, vòng lặp tiếp theo dùng để in ra màn hình số lần xuất hiện của từng số trong danh sách. Dòng for number in count: duyệt qua từ điển count và in ra số lần xuất hiện của từng số cùng với số đó.

Kết quả đoạn mã:

Nhập dãy số: 0 1 5 7 0 2 5 1 1 2
Số 0 lặp lại 2 lần
Số 1 lặp lại 3 lần
Số 5 lặp lại 2 lần
Số 7 lặp lại 1 lần
Số 2 lặp lại 2 lần

Tham gia cộng đồng học tập Bumbii trên Discord

  • Chia sẻ, hỏi đáp, bàn luận các vấn đề học tập.
  • Gặp gỡ các anh chị, thầy cô có nhiều năm kinh nghiệm.
  • Cập nhật các kiến thức, tài liệu mới nhất.

Tham gia ngay!

Câu 3. Em ghi số tiền điện gia đình em theo từng tháng vào một danh sách gồm 12 số. Mỗi năm lại ghi lại số tiền điện vào một danh sách và ghép với danh sách các năm trước. Như vậy em thu được một bảng kích thước n x 12, trong đó hàng thứ k là số tiền điện của năm thứ k, cột tương ứng số tiền điện theo tháng.

a) Thiết lập mảng mới tính số tiền điện trung bình của các năm, mỗi năm ghi một số.

b) Tính số tiền điện trung bình của tất cả các năm đã được ghi dữ liệu trong bảng.

Lời giải:

#Tạo mảng 2 chiều lưu trữ số tiền điện của gia đình

electricity_bills = [
    [100, 120, 130, 110, 90, 80, 70, 60, 50, 70, 80, 90],

    [110, 130, 140, 120, 100, 90, 80, 70, 60, 80, 90, 100],

    [120, 140, 150, 130, 110, 100, 90, 80, 70, 90, 100, 110],

    [130, 150, 160, 140, 120, 110, 100, 90, 80, 100, 110, 120]
]

# Tính số tiền điện trung bình của từng năm và in kết quả

for i in range(len(electricity_bills)):
    year_total = sum(electricity_bills[i])
    year_average = year_total / len(electricity_bills[i])
    print(f"Số tiền điện trung bình năm {i+1}: {year_average}")

# Tính số tiền điện trung bình của tất cả các năm và in kết quả

total = 0
count = 0
for row in electricity_bills:
    total += sum(row)
    count += len(row)

overall_average = total / count
print(f"=> Số tiền điện trung bình của tất cả các năm: {overall_average}")

Giải thích đoạn mã sau:

Đoạn code Python này thực hiện các phương pháp tính số tiền điện trung bình của từng năm và của tất cả các năm từ một mảng 2 chiều electricity_bills, trong đó hàng thứ i chứa số tiền điện của gia đình trong năm thứ i + 1 và mỗi hàng có 12 giá trị tương ứng với từng tháng trong năm.

– Dòng 3 -> 11: Đầu tiên, mảng electricity_bills được khởi tạo với dữ liệu mẫu của số tiền điện của gia đình trong 4 năm.

– Dòng 15 -> 18: Tiếp theo, vòng lặp for đầu tiên (for i in range(len(electricity_bills))) được sử dụng để tính số tiền điện trung bình của từng năm và in kết quả. Cụ thể, với mỗi năm, tổng số tiền điện của năm đó được tính bằng hàm sum(electricity_bills[i]) và sau đó chia cho 12 (số tháng) để tính số tiền điện trung bình của năm đó. Kết quả được in ra màn hình.

– Dòng 22 -> 26: Vòng lặp thứ hai (for row in electricity_bills) được sử dụng để tính số tiền điện trung bình của tất cả các năm. Trong vòng lặp này, total là tổng số tiền điện của tất cả các năm và count là tổng số tháng của tất cả các năm.

– Dòng 28 -> 29: Sau khi tính tổng, số tiền điện trung bình của tất cả các năm (overall_average) được tính bằng cách chia tổng cho tổng số tháng và kết quả được in ra màn hình.

Kết quả in ra màn hình sẽ hiển thị số tiền điện trung bình của từng năm và của tất cả các năm dựa trên dữ liệu trong mảng electricity_bills.

Kết quả đoạn mã:

Số tiền điện trung bình năm 1: 87.5
Số tiền điện trung bình năm 2: 97.5
Số tiền điện trung bình năm 3: 107.5
Số tiền điện trung bình năm 4: 117.5
=> Số tiền điện trung bình của tất cả các năm: 102.5

Xem các bài giải khác: Giải bài tập SGK lớp 11 định hướng Khoa học máy tính – NXB Kết nối tri thức với cuộc sống

Thông tin liên hệ & mạng xã hội:
Website: https://bumbii.com/
Facebook: https://www.facebook.com/bumbiiapp
Pinterest: https://www.pinterest.com/bumbiitech

5 2 đánh giá
Article Rating
Theo dõi
Thông báo của
guest

1 Bình luận
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
Nam
Nam
5 ngày trước

Cái này khá hữu dụng, cảm ơn

1
0
Cùng chia sẻ bình luận của bạn nào!x