Giải SBT Tin học 10 Bài 3 Cánh diều: Bài tập Python F13–F17 có lời giải

Trả lời nhanh

Năm câu F13–F17 SBT Tin học 10 Bài 3 đều là bài toán thực tế giải bằng biểu thức số học: F13 cho 12 bóng đèn (a = 2, b = 1), F14 in ra 30 đoạn và dư 7 cm, F15 và F16 tính thời gian làm chung bằng 1/(1/a + 1/b [+ 1/c]), F17 tìm chiều dài – chiều rộng sân từ chu vi và hiệu hai cạnh. Mấu chốt là chọn đúng giữa /, // và %.

Cần nắm gì trước khi làm bài tập Python lớp 10 ở Bài 3?

Các câu F13–F17 chỉ dùng những thứ rất cơ bản: biến, phép gán, biểu thức số học và hai lệnh input(), print(). Em ôn lại bảng sau là đủ.

Phép toán Kí hiệu Python Ví dụ Kết quả
Cộng, trừ, nhân + - * 7 * 3 21
Chia (luôn ra số thực) / 12 / 5 2.4
Chia lấy phần nguyên // 12 // 5 2
Chia lấy phần dư % 12 % 5 2
Luỹ thừa ** 2 ** 3 8

Hai điểm hay bị quên: (1) input() luôn trả về chuỗi nên phải bọc int(...) hoặc float(...) trước khi tính; (2) dấu / trong Python 3 luôn cho kết quả kiểu số thực, dù chia hết (ví dụ 12/4 ra 3.0).

Nếu cần nhắc lại cách mở IDLE hoặc chạy chương trình đầu tiên, xem lý thuyết tại Lý thuyết Tin học 10 Bài 3 (Cánh diều) và phần thực hành trong Giải SGK Tin học 10 Bài 3 (Cánh diều).

Câu F13 (trang 23): Đếm số bóng đèn quanh bảng hiệu

Đề: bảng hiệu hình chữ nhật dài a dm, rộng b dm; hai bóng liên tiếp cách nhau 5 cm. Viết chương trình in ra số bóng cần mắc, thử với a = 2, b = 1.

Cách nghĩ

  1. Đổi đơn vị trước: 1 dm = 10 cm, nên các cạnh là 10a cm và 10b cm.
  2. Dãy đèn chạy kín một vòng nên độ dài dãy bằng chu vi: 2 × (10a + 10b) cm.
  3. Cứ 5 cm có một bóng, và vì vòng khép kín nên số bóng = chu vi : 5 (không cộng thêm 1).

Chương trình

a = 2
b = 1
so_bong = (a * 10 + b * 10) * 2 // 5
print(so_bong)

Kiểm tra bằng tay: chu vi = (20 + 10) × 2 = 60 cm, 60 : 5 = 12. Chương trình in ra 12.

Góc nhìn thêm: chu vi tính theo cm là 20(a + b), chia 5 được 4(a + b). Với a, b nguyên, số bóng luôn là số nguyên nên dùng // là an toàn, kết quả in 12 chứ không phải 12.0. Nếu em dùng / như nhiều bạn, chương trình vẫn đúng giá trị nhưng in 12.0, trông không tự nhiên với một số lượng bóng đèn.

Xem thêm trang riêng: Câu F13 trang 23 SBT Tin 10.

Câu F14 (trang 23): Cưa gỗ thành các đoạn bằng nhau

Đề: cây gỗ dài d cm, cưa thành các đoạn s cm. In ra hai dòng: số đoạn nhiều nhất và độ dài đoạn thừa. Thử với d = 307, s = 10.

Cách nghĩ

Đây là đúng bản chất của phép chia có dư: d = s × (thương) + (số dư). Thương là số đoạn tròn đủ s cm, số dư là phần gỗ còn lại.

d = 307
s = 10
print(d // s)
print(d % s)

Kết quả: dòng 1 là 30, dòng 2 là 7. Kiểm tra: 30 × 10 + 7 = 307.

Mẹo nhớ: // trả lời “được mấy lần?”, % trả lời “thừa bao nhiêu?”. Hai kí hiệu này thường đi cùng nhau trong các bài chia kẹo, chia nhóm, đổi giờ – phút.

Trang chi tiết: Câu F14 trang 23 SBT Tin 10.

Câu F15 (trang 23): Hai vòi nước cùng chảy đầy bể

Đề: vòi 1 chảy một mình đầy bể sau a giờ, vòi 2 sau b giờ. Nhập a, b và in thời gian đầy bể khi mở cả hai vòi.

Cách nghĩ (bài toán “năng suất”)

  • Một giờ vòi 1 chảy được 1/a bể, vòi 2 chảy được 1/b bể.
  • Một giờ cả hai vòi chảy được (1/a + 1/b) bể.
  • Thời gian đầy bể = 1 : (1/a + 1/b) = a·b/(a + b).
a = int(input())
b = int(input())
t = 1 / (1 / a + 1 / b)
print(t)

Ví dụ tự đặt: nhập a = 3, b = 6 thì 1/3 + 1/6 = 1/2, thời gian là 2 giờ; chương trình in ra khoảng 2.0. Cách viết tương đương t = a * b / (a + b) cho 18/9 = 2.0 và ít phép chia hơn.

Lưu ý: phải để dấu ngoặc đúng chỗ. Viết 1 / 1 / a + 1 / b sẽ cho kết quả sai vì Python tính từ trái sang phải. Ngoài ra nếu nhập a = 0 sẽ bị lỗi chia cho 0 (về mặt thực tế, vòi chảy “0 giờ” cũng vô nghĩa). Nếu muốn nhập số thập phân như 1.5 giờ, đổi int thành float.

Trang chi tiết: Câu F15 trang 23 SBT Tin 10.

Câu F16 (trang 23): Ba người cùng làm một công việc

Đề: ba người làm riêng lần lượt hết a, b, c giờ. Nhập a, b, c và in thời gian xong việc nếu cùng làm.

Đây là F15 mở rộng thêm một số hạng: mỗi giờ cả nhóm làm được 1/a + 1/b + 1/c công việc, nên thời gian là nghịch đảo của tổng đó.

a = int(input())
b = int(input())
c = int(input())
t = 1 / (1 / a + 1 / b + 1 / c)
print(t)

Ví dụ tự đặt: a = 3, b = 6, c = 6. Tổng năng suất = 1/3 + 1/6 + 1/6 = 2/3 công việc mỗi giờ, nên t = 1,5 giờ. Máy có thể in 1.5 hoặc 1.5000000000000002 do số thực làm tròn nhị phân; đây là hiện tượng bình thường, không phải lỗi của em. Dạng gọn không gặp hiện tượng này với số nguyên là t = a*b*c / (b*c + a*c + a*b): 108 / 72 = 1.5.

Trang chi tiết: Câu F16 trang 23 SBT Tin 10.

Câu F17 (trang 24): Tìm chiều dài, chiều rộng sân vận động

Đề: Lan đi bộ một vòng quanh sân hết t phút, mỗi phút đi v mét; chiều dài hơn chiều rộng d mét. Chương trình trong sách (có hình kèm theo) tính chiều dài và chiều rộng, với t, d, v lần lượt là 15, 80, 100. Yêu cầu: chạy chương trình và nêu kết quả; sau đó đổi giá trị v thành 111 (đề ghi là thay lệnh gán ở dòng v) rồi xem kết quả còn đúng không, nếu sai thì sửa.

Vì chương trình gốc nằm trong hình của sách, dưới đây em dùng một chương trình tương đương (cùng cách tính, có thể khác tên biến) để phân tích.

Lập luận toán học

Gọi dài là x, rộng là y. Chu vi p = t × v. Ta có hệ: x + y = p/2 và x − y = d. Cộng hai vế: x = (p/2 + d)/2; trừ hai vế: y = (p/2 − d)/2.

Hình chữ nhật sân vận động với chiều dài x, chiều rộng y và các công thức tính từ chu vi và hiệu hai cạnh
Sơ đồ lập luận cho câu F17: từ chu vi p = t·v và hiệu d suy ra chiều dài, chiều rộng.

Chương trình (bản dùng phép chia lấy phần nguyên)

t = 15
d = 80
v = 100
p = t * v // 2        # nửa chu vi
x = (p + d) // 2      # chiều dài
y = (p - d) // 2      # chiều rộng
print("Chiều dài:", x)
print("Chiều rộng:", y)

Yêu cầu 1: chạy với t = 15, d = 80, v = 100

Chu vi = 1500 m, nửa chu vi = 750. Chiều dài = (750 + 80)/2 = 415, chiều rộng = (750 − 80)/2 = 335. Kiểm tra: 415 − 335 = 80 và 2 × (415 + 335) = 1500. Kết quả đúng.

Yêu cầu 2: đổi v = 111

Chu vi = 15 × 111 = 1665 m (số lẻ). Khi đó nửa chu vi thật là 832,5 m, nhưng 1665 // 2 chỉ cho 832, mất 0,5. Chương trình in chiều dài 456 và chiều rộng 376. Hai số này hơn kém nhau đúng 80 nhưng chu vi tính lại là 2 × (456 + 376) = 1664 ≠ 1665, tức là kết quả không còn chính xác.

Giá trị đúng là chiều dài 456,25 m và chiều rộng 376,25 m (kiểm tra: hiệu 80, chu vi 2 × 832,5 = 1665).

Cách sửa

Thay mọi phép // bằng / để giữ phần thập phân:

p = t * v / 2
x = (p + d) / 2
y = (p - d) / 2

Chạy lại với v = 111 được 456.25 và 376.25; với v = 100 được 415.0 và 335.0. Bài học: // chỉ dùng khi đại lượng cần tìm thật sự là số nguyên (số đoạn gỗ, số bóng đèn); còn độ dài, thời gian thì dùng /.

Trang chi tiết: Câu F17 trang 24 SBT Tin 10.

Bảng tổng hợp kết quả chạy thử

Câu Dữ liệu thử Biểu thức chính Kết quả
F13 a = 2, b = 1 (a*10 + b*10) * 2 // 5 12
F14 d = 307, s = 10 d // s, d % s 30 và 7
F15 a = 3, b = 6 (ví dụ tự đặt) 1 / (1/a + 1/b) 2.0
F16 a = 3, b = 6, c = 6 (ví dụ tự đặt) 1 / (1/a + 1/b + 1/c) khoảng 1.5
F17 t = 15, d = 80, v = 100 (p ± d) / 2 415 và 335

Những lỗi thường gặp khi làm bài tập Python lớp 10

  • Quên đổi đơn vị: ở F13, dùng a, b (dm) trực tiếp rồi chia cho 5 (cm) sẽ cho kết quả sai gấp 10 lần.
  • Chọn nhầm / và //: kết quả “12.0 bóng đèn” hoặc mất phần lẻ như F17 đều bắt nguồn từ đây.
  • Thiếu ngoặc: 1 / 1/a + 1/b khác hẳn 1 / (1/a + 1/b).
  • Không ép kiểu input: a = input() rồi tính 1/a sẽ báo lỗi kiểu dữ liệu.
  • Thụt đầu dòng lung tung: trong chương trình tuần tự, mọi dòng bắt đầu sát lề trái.
  • Đặt tên biến có dấu cách hoặc bắt đầu bằng chữ số: như so bong, 2a sẽ gây lỗi cú pháp; dùng so_bong, a2.

Bài luyện tập có đáp án

Bài 1. Một mảnh vườn hình chữ nhật có a = 7 m, b = 3 m. Viết chương trình in chu vi và diện tích.

a = 7
b = 3
print((a + b) * 2)
print(a * b)

Đáp án: in ra 20 và 21.

Bài 2. Có n = 47 chiếc kẹo chia đều cho k = 5 bạn, mỗi bạn nhận số kẹo nguyên. In số kẹo mỗi bạn nhận và số kẹo còn lại.

Gợi ý: dùng n // k và n % k. Đáp án: mỗi bạn 9 chiếc, còn lại 2 chiếc.

Bài 3. Hai xe xuất phát cùng lúc từ hai tỉnh cách nhau 200 km, đi ngược chiều với vận tốc 40 km/h và 60 km/h. Nhập vận tốc hai xe và quãng đường, in thời gian gặp nhau.

Gợi ý: tốc độ lại gần nhau là tổng hai vận tốc. Đáp án: t = s / (v1 + v2) = 200 / 100 = 2.0 giờ.

Bài 4 (nâng cao nhẹ). Nhập số nguyên có hai chữ số n (ví dụ 83). In chữ số hàng chục và hàng đơn vị.

Đáp án: hàng chục n // 10 = 8, hàng đơn vị n % 10 = 3.

Xem thêm các bài giải SBT Tin học 10 Cánh diều

  • Bài 2: Biến, phép gán và biểu thức số học
  • Bài 4: Các kiểu dữ liệu số và câu lệnh vào – ra đơn giản
  • Bài 5: Thực hành viết chương trình đơn giản
  • Bài 6, 7: Câu lệnh rẽ nhánh – Thực hành câu lệnh rẽ nhánh
  • Giải SBT Tin học 10 – Cánh diều (mục lục)
  • Trắc nghiệm Tin học 10 – Cánh diều

Câu hỏi thường gặp

Vì sao câu F13 dùng // mà không dùng / cho số bóng đèn?

Số bóng đèn là số nguyên. Dấu / luôn trả về số thực nên in ra 12.0, còn // cho đúng 12. Với a, b nguyên thì chu vi tính theo cm luôn chia hết cho 5 nên // không làm mất phần lẻ nào.

Trong câu F17, vì sao đổi v = 111 thì kết quả sai?

Khi v = 111, chu vi là 15 × 111 = 1665, một số lẻ. Phép chia lấy phần nguyên làm mất 0,5 khi chia đôi chu vi nên chiều dài và chiều rộng bị lệch. Sửa bằng cách dùng phép chia / để giữ phần thập phân, được 456,25 m và 376,25 m.

Câu F15 và F16 có cần dùng int(input()) không?

Cần ép kiểu vì input() trả về chuỗi. Dùng int nếu nhập số nguyên giờ, dùng float nếu muốn nhập số thập phân như 1,5 giờ. Đồng thời không được nhập 0 vì sẽ gây lỗi chia cho 0.

Kết quả 1.5000000000000002 trong F16 có phải chương trình sai không?

Không sai. Máy lưu số thực bằng hệ nhị phân nên đôi khi có sai số rất nhỏ ở chữ số cuối. Có thể dùng công thức a*b*c/(b*c + a*c + a*b) với số nguyên để có kết quả gọn hơn.