Đáp án và lời giải
Giải SBT Tin học 11 Cánh diều Bài 2, 3. Mảng hai chiều Thực hành về tệp, mảng và danh sách có đáp án
Câu 1
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Em có thể xem bản chất của mảng hai chiều chính là một mảng gồm các mảng một chiều. Kết quả của chương trình đã cho là:
4
3
6
Câu 2
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
- Quan sát công thức, ta thấy C(i, j) phụ thuộc vào hai ô ở dòng i – 1. Vậy em có thể tính từng dòng một của tam giác và thêm dần vào mảng hai chiều C. - Quan sát đoạn chương trình ở Cách 1, ta thấy C được khai báo là kiểu danh sách (dấu []), nên các phần tử không cần phải giống nhau về kiểu dữ liệu. Em có thể thấy các phần tử của C (các dòng của bảng) có kích thước khác nhau (dòng thứ i có chứa đúng i số).
Một hướng làm khác giúp tiết kiệm bộ nhớ hơn, đó là sử dụng hai mảng (n + 1)(n+2) một chiều thay vì dùng cả bảng có kích thước vào khoảng 2 Làm được như vậy vì trong công thức ta chỉ cần quan tâm tới dòng i − 1 và dòng i.
Chương trình mẫu:
Cách 1:

Cách 2:

Câu 3
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Dễ thấy thời khoá biểu là một thông tin dạng bảng nên em có thể áp dụng mảng hai chiều.
- Cần phải điền nội dung vào trước, sau đó mới có cơ sở để tính độ rộng của cột và thực hiện in ra. Các thao tác này đều thực hiện được bằng hai vòng lặp for. Chương trình mẫu:
q = int(input())
TKB = [[""] * 8 for i in range (11)]
# Dòng 0 dành cho tiêu đề cột
TKB[0] = ["Tiet", "Hai", "Ba", "Tu", "Nam", "Sau", "Bay", "CN"]
# Cột 0 chứa tiêu đề dòng
for i in range (1,11):
TKB [i][0] = str(i)
for i in range (q):
a, b, c = input ().split()
a = int (a)
b = int (b)
TKB [a] [b-1] = C
# Vì đã có dòng 0 nên lấy [a] thay vì [a-1]
# Tương tự, vì cột 0 đầu tiên cũng đã có nội dung
# Nên lấy [b-1] thay vì [b-2]
doRong = [0] * 8
for i in range (11):
for j in range (8):
doRong [j] = max (doRong [j], len (TKB [i][j]) + 1)
for i in range (11):
for j in range (8):
print (TKB [i][j], end = "")
print (" "* (doRong [j] - len (TKB [i][j])), end = "")
print ()
Câu 4
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
A =[int (v) for v in input().split()] k int (input())
= for i in range (len (A)
print (min (A[i:i+k]))
k + 1):
Câu 5
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Hướng dẫn (duyệt qua từng dòng, dùng hàm sum để tính tổng):
fin = open("input.txt"", "r")
lines fin.readlines ()
result = 0
for line in lines:
nums = [int (v) for v in line.split()]
result += sum (nums)
print("Tổng các số trong tệp là:", result)
Câu 6
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Dùng danh sách hai chiều, mỗi dòng của danh sách là thông tin của một thí sinh.
import sys
sys.stdin = open ("thi TN.inp", "r") sys.stdout = open("thi TN. out", "w") n = int(input())
A = []
for i in range (n):
s = input().split()
A.append(s)
for i in range(n):
# Cú pháp a[-i] để truy cập phần tử thứ i
# từ phải sang của mảng a
x = format (float (A[i] [-3])+ float (A[i] [-2])+ float (A[i] [-1]), ".1f")
A[i].append(x)
# Sắp xếp danh sách A theo thứ tự tăng dần của cột tổng A. sort (key-lambda x: x[-1])
for x in A:
for temp in x: print (temp, end=" ")
print ()
Câu 7
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Tham khảo chương trình sử dụng danh sách:
Chúý: S.split(ch) tách xâu S thành các xấu con, phân cách bởi kí tự ch
Ví dụ:
S="8T2T10T5"
A = S.split("T") #A= ["8", "2", "10", "5"]
