Chủ đề Fcs : Giải quyết vấn đề với sự trợ giúp của máy tính – Kĩ thuật lập trình – Bài 3. Thực hành về tệp, mảng và danh sách – sách giáo khoa trang 97 lớp 11 Khoa học máy tính – Cánh Diều, mời các em tham khảo cùng Bumbii.
Chủ đề Fcs : Giải quyết vấn đề với sự trợ giúp của máy tính – Bài 3. Thực hành về tệp, mảng và danh sách
NHIỆM VỤ 1: Lát cắt
Yêu cầu:
a) Cho a là mảng (danh sách) các số. Hãy dùng lát cắt tạo danh sách b và dùng vòng lặp for
in kết quả ra màn hình (xem mẫu ở Hình 1) để kiểm tra kết quả trong mỗi trường hợp sau:
- b là nửa cuối của a.
- b là một phần tử kể từ đầu trái của a.
- b là các phần tử chỉ số lẻ của a.
b) Cho a là ma trận (bảng số) hình vuông n x m các số thực. Hãy viết các câu lệnh (dùng lát cắt khi có thể) để in kết quả ra màn hình và kiểm tra kết quả trong mỗi trường hợp sau:
- Các hàng chỉ số chẵn của a.
- Hai phần tử đầu tiên của hàng đầu tiên của a.
- Hai cột đầu tiên của a.
- Các cột chỉ số lẻ của a.
Gợi ý: Toán tử lát cắt (Hình 2) trích ra đoạn con liền mạch hay dãy con (có bước nhảy cách quãng – step
) từ một dãy tuần tự nhiều mục dữ liệu, ví dụ như một biến kiểu danh sách.
Lưu ý: Nếu bước nhảy step
nhận giá trị âm thì toán tử lát cắt sẽ đảo chiều, đi từ cuối danh sách lên đầu danh sách, từ phải sang trái, kết quả nhận được giống như dùng phương thức reverse()
(xem ví dụ Hình 3).
Lời giải:
Tham khảo đoạn chương trình sau:
b = a[::2] # 1 các hàng có chỉ số chẵn của a
print('1 - Các hàng có chỉ số chẳn của a là: ', b)
c = b[0][0::2]
print('2 = Hai phần tử đầu tiên trong hàng đầu tiên của a là: ', c)
#Chỉ dùng lát cắt được cho mỗi hàng
for i in range(len(a)):
print(a[i][:2])
#Chỉ dùng lát cắt được cho mỗi hàng
for i in range(len(a)):
print(a[i][1::2])
NHIỆM VỤ 2: Vòng lặp
Yêu cầu:
Cho a là mảng hai chiều hình vuông gồm n hàng và n cột các số thực. Hãy tính:
a) Tính tổng các phần tử chỉ số chẵn ở hàng i của a.
b) Tổng các phần tử âm; tổng các phẩn tử không âm ở hàng i của a.
c) In ra chỉ số các phần tử bằng số x cho trước.
Gợi ý: Vòng lặp for
hoặc while
duyệt qua các phần tử trong danh sách a và thân vòng lặp có thể xử lí lần lượt tất cả các phần tử hoặc chọn một số phần tử thoả mãn điều kiện nào đó (theo chỉ số i hoặc theo giá trị a[i]).
Lời giải:
a) Có thể chọn ra các phần tử chỉ số chẵn hàng 2 cách: Dùng tham số step
của hàm range
hoặc kiểm tra trực tiếp. Tham khảo đoạn chương trình sau:
n = len(a)
i = 1
tong = 0
for k in range(0, n, 2):
tong += a[i][k]
print('Tổng các phần tử chỉ số chẵn ở hàng ', i, '=', tong)
tong = 0
for k in range(n):
if k%2 == 0: # kiểm tra k là chẵn
tong += a[i][k]
print('Tổng các phần tử chỉ số chẵn ở hàng ', i, '=', tong)
b) Tính tổng các phần tử chỉ số chẵn ở hàng i của a. Tính tổng các phần tử âm, tổng các phần tử không âm ở hàng i của mảng a. Tham khảo đoạn chương trình sau:
tong_am = 0
tong_duong = 0
for k in range(n):
if a[i][k] < 0: #kiểm tra phần tử âm; >= 0 là không âm
tong_am += a[i][k]
else: tong_duong += a[i][k]
print('Tổng các phần tử âm ở hàng ', i, '=', tong_am)
print('Tổng các phần tử dương ở hàng ', i, '=', tong_duong)
c) In ra chỉ số các phần tử bằng số x cho trước. Với mảng hai chiều, cần dùng hai vòng lặp for
lồng nhau. Đoạn chương trình dưới dây là ví dụ:
ds = []
x = 4
for i in range(n):
for k in range(n):
if arr[i][k] == x:
ds.append([i,k])
print('Danh sách chỉ số các phần tử bằng ', x, ds)
NHIỆM VỤ 3: Đọc dữ liệu từ tệp đầu vào và viết ra tệp
Yêu cầu:
Cho tệp “bangDiem.txt” gồm nhiều dòng; các mục dữ liệu cách nhau khoảng trống:
– Dòng thứ nhất: Hai số nguyên dương n và m; với n là số học sinh, m là số môn học.
– Dòng thứ hai: TênHS Toán Văn Tin Li… gồm (m+1) từ.
– n dòng tiếp theo, mỗi dòng có tên học sinh và điểm các môn học của học sinh đó.
Hãy viết một hàm nhapTuTep()
để đọc tệp dữ liệu đầu vào “bangDiem.txt” và khởi tạo dữ liệu sẵn sàng để tính toán phân tích kết quả học tập:
a) Một mảng hai chiều n x m các số thực.
b) Hai danh sách: danh sách tên học sinh và danh sách tên môn học.
Hướng dẫn thực hiện:
Có thể tạo tệp “bangDiem.txt” bằng cách chỉnh sửa và bổ sung bảng trong Hình 1a ở Bài 2; từ Word hay Excel, thao tác Copy\Paste vào cửa sổ của Notepad hay cửa sổ soạn thảo của Python; ghi lưu thành tệp có định dạng text.
– Đọc từng dòng của tệp đầu vào.
– Chuyển đổi mỗi mục của danh sách sang kiểu dữ liệu cần thiết và nối thêm vào danh sách tương ứng trong chương trình (tham khảo chương trình ở Hình 4).
Trong Python, nếu một dòng gồm nhiều mục khác kiểu dữ liệu, xen kẽ nhau, thì phải truy cập từng phần tử của danh sách và chuyển từ xâu kí tự thành kiểu dữ liệu đúng mô tả.
Lời giải:
def nhapTuTep():
fi = open("../bangDiem.txt", encoding='utf-8')
dong = fi.readline().split() #đọc dòng thứ nhất
n = int (dong[0])
m = int (dong[0])
dong = fi.readline().split() #đọc dòng thứ hai có các tên môn học
for i in range(1, m+1):
tenMon.append(dong[i])
for i in range(n): #đọc dòng tiếp theo
dong = fi.readline().split()
ten = dong.pop(0) #lấy tên HS
tenHS.append(ten) #đưa vào danh sách tenHS
diem = [float(d) for d in dong]
a.append(diem) #nối phần còn lại là điểm của HS thành 1 hàng của a
fi.close()
return (n,m)
VẬN DỤNG
Yêu cầu:
Tạo dãy số thực ngẫu nhiên, sử dụng các hàm mean
, median
, mode
trong mô đun statistics
để:
a. Tìm mean
của a và đếm số phần tử bé hơn, bằng, lớn hơn mean
.
b. Tìm median
của a và cho biết đó là phần tử nào hay nó ở giữa hai phần tử nào.
c. Tìm mode
của a và cho biết số lần xuất hiện và dãy các chỉ số tương ứng.
d. Áp dụng để phân tích dãy điểm từng môn học của lớp 11A.
Lời giải:
Tạo dãy số thực hiện ngẫu nhiên: Hàm random()
sinh số ngẫu nhiên trong khoảng (0, 1). Nhân thêm với 100 để chuyển thành số thực ngẫu nhiên trong khoảng (0, 100) và làm tròn đến hai chứ số phần thập phân. Do đó, câu lệnh có thêm hàm round((100*elem), 2)
).
from random import*
def dayNgauNhien(d): #d là độ dài dãy số ngẫu nhiên sẽ được tạo ra
a = []
for i in range(d):
elem = random() # số ngẫu nhiên trong khoảng(0, 1)
a.append(round((100*elem),2))
return a
Sử dụng các hàm mean
, median
, mode
có sẵn trong mô đun statistics
.
a) Tìm mean
của a và đếm số phần tử bé hơn, bằng, lớn hơn mean
: Có thể thực hiện đồng thời bằng một lần duyệt dãy.
def dem(day, m): #m là số để so sánh
behon = 0
lonhon = 0
bang = 0
for i in range(len(day)):
if day[i] < m:
behon += 1
elif day[i] > m:
lonhon += 1
else:
bang += 1
return(behon, bang, lonhon)
b) Tìm median
của a và cho biết đó là phần từ nào hay nó ở giữa hai phần tử nào
Theo định nghĩa, nếu độ dài dãy số n là số lẽ thì trung vị median
là giá trị của một phần từ ở chính giữa sau khi dây đã được sắp thứ tự; khi n là số chẵn thì median
có thể là trung bình cộng của hai phần tử cùng ở giữa dãy.
c) Tìm mode
của a và cho biết số lần xuất hiện cùng dãy các chỉ số tương ứng.
Khi đã biết giá trị mode
của dãy a, việc lập danh sách các chỉ số tương ứng trong dãy a có giá trị bằng mode
tương tự như yêu cầu c) trong Nhiệm vụ 2.
d) Áp dụng để phân tích dãy điểm từng môn học của lớp 11A.
Trong môn Toán, các bạn đã được học về ý nghĩa thống kê của các giá trị mean
, median
, mode
. Câu hỏi này có ý nghĩa vận dụng liên môn.
Xem các bài giải khác: Giải Bài Tập Sách Giáo Khoa Tin Học Lớp 11 Khoa Học Máy Tính – Cánh Diều
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