Bài 18. Thực hành dữ liệu mảng một chiều và hai chiều

Chủ đề 6. Kĩ thuật lập trình – Bài 18. Thực hành dữ liệu mảng một chiều và hai chiều – sách giáo khoa trang 86 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 18. Thực hành dữ liệu mảng một chiều và hai chiều

Khởi động

Trong bài học trước, em đã biết cấu trúc dữ liệu mảng có thể giúp giải quyết tốt các bài toán quản lí danh sách trong thực tế. Việc quản lí danh sách điểm kiểm tra của một môn học là quản lí danh sách học sinh và mỗi học sinh có một danh sách điểm kiểm tra. Bảng điểm môn học cả lớp được coi là danh sách của danh sách điểm của các học sinh. Theo em, người ta dùng mảng một chiều hay hai chiều để quản lí danh sách điểm một môn học của mỗi học sinh? để quản lí điểm một môn học của cả lớp ?

Lời giải:

Người ta thường sử dụng mảng hai chiều (hoặc ma trận) để quản lý điểm một môn học của cả lớp và mảng một chiều để quản lý điểm một môn học của mỗi học sinh.

  1. Quản lý điểm một môn học của mỗi học sinh:
    • Mỗi học sinh có một danh sách điểm kiểm tra của riêng mình.
    • Dữ liệu này thường được lưu trữ trong một mảng một chiều, trong đó mỗi phần tử của mảng tương ứng với một học sinh và chứa danh sách điểm kiểm tra của học sinh đó.
  2. Quản lý điểm một môn học của cả lớp:
    • Bảng điểm môn học cả lớp có thể được lưu trữ trong một mảng hai chiều (ma trận).
    • Mỗi hàng của ma trận tương ứng với một học sinh, và mỗi cột tương ứng với một kỳ kiểm tra hoặc một loại điểm (ví dụ: điểm kiểm tra 1, điểm kiểm tra 2, điểm cuối kỳ).
    • Các điểm của học sinh được lưu trữ trong ma trận, cho phép dễ dàng truy cập và tính toán tổng điểm, điểm trung bình của cả lớp.

Luyện tập

Câu 1. Chỉnh sửa lại chương trình của Nhiệm vụ 1 để bổ sung chức năng:

a) Thông báo điểm đầu tiên và điểm cuối cùng trong danh sách.

b) Cho phép người dùng tra cứu đầu điểm thứ n với quy ước n bắt đầu từ 1 ứng với điểm đâu tiên. Nếu n lớn hơn tổng số đâu điềm hoặc nhỏ hơn 1, cần thông báo không hợp lệ và yêu cầu người dùng nhập lại.

Lời giải:

marks = []
line = input("Hãy nhập các điểm kiểm tra cách nhau bởi dấu cách: ")
marks = [float(x) for x in line.split()]
total = 0
min_mark = marks[0]
max_mark = marks[0]
num_students = len(marks)
for m in marks:
    total += m
    if min_mark > m:
        min_mark = m
    if max_mark < m:
        max_mark = m

print("Điểm trung bình: ", total / num_students)
print("Điểm cao nhất: ", max_mark)
print("Điểm thấp nhất: ", min_mark)
print("Điểm đầu tiên: ", marks[0])
print("Điểm cuối cùng: ", marks[-1])

while True:
    n = int(input("Nhập vào STT của điểm kiểm tra thứ n (1 <= n <= số lượng điểm kiểm tra): "))
    if n < 1 or n > num_students:
        print("STT không hợp lệ. Vui lòng nhập lại!")
    else:
        print("Điểm kiểm tra thứ", n, "là:", marks[n - 1])
        break

a)

  • marks[0] là cách để truy cập phần tử đầu tiên trong danh sách marks. Python sử dụng chỉ số bắt đầu từ 0, do đó marks[0] là phần tử đầu tiên.
  • marks[-1] là cách để truy cập phần tử cuối cùng trong danh sách marks. Trong Python, bạn có thể sử dụng chỉ số âm để đếm từ cuối danh sách, vì vậy marks[-1] là phần tử cuối cùng.

b) Bắt đầu vòng lặp while vô hạn để cho phép người dùng tra cứu điểm kiểm tra theo số thứ tự (STT). Người dùng được yêu cầu nhập vào STT (n) và chương trình kiểm tra xem nếu n không nằm trong khoảng từ 1 đến số lượng điểm kiểm tra (num_students) thì hiển thị thông báo không hợp lệ và yêu cầu nhập lại. Nếu n hợp lệ, chương trình sẽ in ra điểm kiểm tra thứ n tương ứng trong danh sách marks (lưu ý rằng STT bắt đầu từ 1, trong khi chỉ số của danh sách bắt đầu từ 0). Sau đó, vòng lặp while sẽ kết thúc.

Kết quả chương trình:

Hãy nhập các điểm kiểm tra cách nhau bởi dấu cách: 2 3 4 5 6
Điểm trung bình:  4.0
Điểm cao nhất:  6.0
Điểm thấp nhất:  2.0
Điểm đầu tiên:  2.0
Điểm cuối cùng:  6.0
Nhập vào STT của điểm kiểm tra thứ n (1 <= n <= số lượng điểm kiểm tra): 3
Điểm kiểm tra thứ 3 là: 4.0

Câu 2. Chỉnh sửa lại chương trình để người dùng có thể:

a) Tra cứu các đầu điểm kiểm tra theo STT (số thứ tự) của học sinh. Quy ước số thứ tự bắt đầu từ 1. Nếu người dùng nhập STT lớn hơn số lượng học sinh thì chương trình thông báo STT không hợp lệ và yêu cầu nhập lại.

b) Tra cứu điểm kiểm tra cụ thể lần thứ n của một học sinh theo STT. Nếu n và STT không hợp lệ chương trình cần thông báo và yêu cầu nhập lại.

Lời giải:

marks = []
line = input("Hãy nhập các điểm kiểm tra cách nhau bởi dấu cách: ")
marks = [float(x) for x in line.split()]
total = 0
min_mark = marks[0]
max_mark = marks[0]
num_students = len(marks)

for m in marks:
    total += m
    if min_mark > m:
        min_mark = m
    if max_mark < m:
        max_mark = m

print("Điểm trung bình: ", total / num_students)
print("Điểm cao nhất: ", max_mark)
print("Điểm thấp nhất: ", min_mark)
print("Điểm đầu tiên: ", marks[0])
print("Điểm cuối cùng: ", marks[-1])

while True:
    n = int(input("Nhập vào STT của học sinh (1 <= STT <= số lượng học sinh): "))
    if n < 1 or n > num_students:
        print("STT không hợp lệ. Vui lòng nhập lại!")
    else:
        break

while True:
    m = int(input(f"Nhập vào lần kiểm tra cụ thể (1 <= lần kiểm tra <= {num_students}): "))
    if m < 1 or m > num_students:
        print("Lần kiểm tra không hợp lệ. Vui lòng nhập lại!")
    else:
        break

student_index = n - 1  # Chuyển từ STT sang chỉ số trong danh sách
specific_mark = marks[student_index] if student_index < len(marks) else None

if specific_mark is not None:
    print(f"Điểm kiểm tra lần {m} của học sinh STT {n} là: {specific_mark}")
else:
    print("Không có điểm kiểm tra phù hợp.")

a) Trong vòng lặp thứ hai (while True: m = int(input(...))), người dùng được yêu cầu nhập lần kiểm tra cụ thể (1 <= lần kiểm tra <= số lượng điểm kiểm tra). Tương tự như vòng lặp trước, nếu lần kiểm tra không hợp lệ, thông báo lỗi và yêu cầu nhập lại.

b) Chương trình tính chỉ số của học sinh dựa trên STT (chuyển từ STT sang chỉ số trong danh sách) và sau đó kiểm tra xem liệu điểm kiểm tra cụ thể có tồn tại trong danh sách hay không. In điểm kiểm tra cụ thể của học sinh dựa trên STT và lần kiểm tra hoặc thông báo rằng không có điểm kiểm tra phù hợp nếu điều kiện không được đáp ứng.

Kết quả chương trình:

Hãy nhập các điểm kiểm tra cách nhau bởi dấu cách: 2 3 4 5 6 7
Điểm trung bình:  4.5
Điểm cao nhất:  7.0
Điểm thấp nhất:  2.0
Điểm đầu tiên:  2.0
Điểm cuối cùng:  7.0
Nhập vào STT của học sinh (1 <= STT <= số lượng học sinh): 2
Nhập vào lần kiểm tra cụ thể (1 <= lần kiểm tra <= 6): 3
Điểm kiểm tra lần 3 của học sinh STT 2 là: 3.0

Vận dụng

Câu 1. Viết chương trình nhập vào từ bàn phím danh sách lên (không gồm họ và đệm) học sinh cách nhau bởi dấu cách và lưu vào trong một mảng. Giả thiết rằng tên, không gồm khoảng trắng. Sau đó hệ thống kê xem có bao nhiêu tên khác nhau và mỗi tên xuất hiện bao nhiêu lần trong danh sách.

# Nhập danh sách tên học sinh từ người dùng
name_list = input("Nhập danh sách tên học sinh (cách nhau bởi dấu cách): ").split()

# Tạo một từ điển để lưu trữ số lần xuất hiện của từng tên
name_count = {}

# Đếm số lần xuất hiện của từng tên trong danh sách
for name in name_list:
    # Làm sạch tên bằng cách loại bỏ khoảng trắng và chuyển thành chữ thường để tránh trường hợp tên viết hoa/không viết hoa khác nhau
    cleaned_name = name.strip().lower()
    
    # Tăng số lần xuất hiện của tên trong từ điển
    if cleaned_name in name_count:
        name_count[cleaned_name] += 1
    else:
        name_count[cleaned_name] = 1

# In ra số lượng tên khác nhau và số lần xuất hiện của mỗi tên
print("Số lượng tên học sinh khác nhau:", len(name_count))
for name, count in name_count.items():
    print(f"Tên '{name}' xuất hiện {count} lần trong danh sách.")

Kết quả chương trình:

Nhập danh sách tên học sinh (cách nhau bởi dấu cách): An Anh Viet Nam Hoa Binh An Viet
Số lượng tên học sinh khác nhau: 6
Tên 'an' xuất hiện 2 lần trong danh sách.
Tên 'anh' xuất hiện 1 lần trong danh sách.
Tên 'viet' xuất hiện 2 lần trong danh sách.
Tên 'nam' xuất hiện 1 lần trong danh sách.
Tên 'hoa' xuất hiện 1 lần trong danh sách.
Tên 'binh' xuất hiện 1 lần trong danh sách.

Câu 2. Viết chương trình nhập từ bàn phím số tự nhiên m và n. 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, in ma trận A ra màn hình, Sau đó:

a) Tính tổng các phần tử ma trận A.

b) In ra dòng có tổng các phần tử lớn nhất (nếu có nhiều dòng bằng nhau thì in tất cả các dòng).

c) In ta giá trị các phần tử phân biệt trong ma trận tức là nếu có các giá trị xuất hiện nhiều lần trong mã trận A thì chỉ in rõ một lần.

d) Cho phép người dùng tìm số lần xuất hiện của một số bất kì trong ma trận A, ví dụ người dùng nhập vào số 3 chương trình thông báo số 3 xuất hiện x lần trong ma trận tại các vị trí cột (i,j) cụ thể.

Lời giải:

# Hàm tính tổng các phần tử trong ma trận
def tinh_tong_ma_tran(matrix):
    total = 0
    for row in matrix:
        total += sum(row)
    return total

# Hàm tìm các dòng có tổng lớn nhất
def tim_dong_max(matrix):
    max_sum = max([sum(row) for row in matrix])
    return [i for i, row in enumerate(matrix) if sum(row) == max_sum]

# Hàm lấy các giá trị phân biệt từ ma trận
def gia_tri_phan_biet(matrix):
    unique_values = set()
    for row in matrix:
        unique_values.update(row)
    return list(unique_values)

# Hàm tìm số lần xuất hiện của một số trong ma trận
def tim_so_x(matrix, x):
    positions = [(i, j) for i, row in enumerate(matrix) for j, val in enumerate(row) if val == x]
    return positions

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

# Nhập dữ liệu vào ma trận A
A = []
print(f"Nhập ma trận {m}x{n}:")

for i in range(m):
    row = list(map(int, input().split()))
    A.append(row)

# In ma trận A
print("Ma trận A:")
for row in A:
    print(" ".join(map(str, row)))

# a) Tính tổng các phần tử ma trận A
tong = tinh_tong_ma_tran(A)
print("Tổng các phần tử trong ma trận A:", tong)

# b) In ra các dòng có tổng các phần tử lớn nhất
dong_max = tim_dong_max(A)
print("Các dòng có tổng các phần tử lớn nhất:", dong_max)

# c) In giá trị các phần tử phân biệt trong ma trận
phan_biet = gia_tri_phan_biet(A)
print("Các giá trị phân biệt trong ma trận:", phan_biet)

# d) Tìm số lần xuất hiện của một số bất kỳ
so_tim = int(input("Nhập số bạn muốn tìm: "))
ket_qua_tim = tim_so_x(A, so_tim)

if len(ket_qua_tim) > 0:
    print(f"Số {so_tim} xuất hiện {len(ket_qua_tim)} lần tại các vị trí:")
    for i, j in ket_qua_tim:
        print(f"Dòng {i + 1}, Cột {j + 1}")
else:
    print(f"Số {so_tim} không xuất hiện trong ma trận.")

Kết quả chương trình:

Nhập số hàng (m): 4
Nhập số cột (n): 4
Nhập ma trận 4x4:
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
Ma trận A:
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
Tổng các phần tử trong ma trận A: 64
Các dòng có tổng các phần tử lớn nhất: [3]
Các giá trị phân biệt trong ma trận: [1, 2, 3, 4, 5, 6, 7]
Nhập số bạn muốn tìm: 3
Số 3 xuất hiện 3 lần tại các vị trí:
Dòng 1, Cột 3
Dòng 2, Cột 2
Dòng 3, Cột 1

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

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

0 Bình luận
Phản hồi nội tuyến
Xem tất cả bình luận
0
Cùng chia sẻ bình luận của bạn nào!x