Giải bài tập SGK: Bài 21: Câu lệnh lặp while – Tin học 10

Mục lục [Ẩn]

Chọn đến phần học sinh cần nhanh chóng thông qua mục lục bằng cách click đến phần đó

Câu hỏi mở đầu trang 108

Câu hỏi mở đầu

Đề bài: Cho các việc được ghi trong cột A và cột B của bảng. Đối với mỗi hàng, em hãy cho biết công việc được lặp đi lặp lại là gì? Điều kiện để dừng công việc là gì? Số lần thực hiện việc lặp giữa hai cột có gì khác nhau?

Lời giải:

Phân tích từng hàng trong bảng:

Hàng Công việc lặp Điều kiện dừng (Cột A) Điều kiện dừng (Cột B)
1 Chạy 1 vòng quanh sân Đã chạy đủ $20$ vòng Hết $2$ tiếng
2 Làm 1 bài tập về nhà Đã làm xong $5$ bài Đến giờ ăn cơm
3 Lấy 1 xô nước Đã lấy đủ $15$ xô Thùng nước đã đầy

Khác nhau về số lần lặp giữa hai cột:

  • Cột A: Số lần lặp biết trước (20, 5, 15 lần). → Tương ứng với lệnh lặp for.
  • Cột B: Số lần lặp không biết trước, phụ thuộc vào điều kiện. → Tương ứng với lệnh lặp while.

1. Lệnh lặp while

Hoạt động 1 trang 108

Đề bài: Quan sát đoạn chương trình sau, giải thích kết quả in ra.

>>> S = 0
>>> k = 1
>>> while k < 100:
        S = S + k
        k = k + 7
>>> print(S)
750

Lời giải:

Phân tích từng bước:

  • Khởi tạo: $S = 0$, $k = 1$.
  • Vòng lặp tiếp tục khi điều kiện $k < 100$ còn đúng.
  • Mỗi vòng lặp: cộng dồn $k$ vào $S$, rồi tăng $k$ thêm $7$.

Các giá trị của $k$ qua từng vòng lặp:

$$k: 1 \to 8 \to 15 \to 22 \to 29 \to 36 \to 43 \to 50 \to 57 \to 64 \to 71 \to 78 \to 85 \to 92 \to 99$$

Sau đó $k = 99 + 7 = 106 \geq 100$ → vòng lặp dừng.

Tính $S$:

$$S = 1 + 8 + 15 + 22 + 29 + 36 + 43 + 50 + 57 + 64 + 71 + 78 + 85 + 92 + 99 = 750$$

→ Kết quả $S = 750$ là tổng của 15 số trong dãy, mỗi số hơn số trước $7$ đơn vị, bắt đầu từ $1$.

Câu hỏi củng cố mục 1 trang 109

Đề bài:

1. Lệnh while kiểm tra điều kiện trước hay sau khi thực hiện khối lệnh lặp?

Lời giải:

Lệnh while kiểm tra điều kiện trước khi thực hiện khối lệnh lặp:

  • Nếu <điều kiện> đúng (True) → thực hiện khối lệnh lặp.
  • Nếu <điều kiện> sai (False) → kết thúc lệnh while, không thực hiện khối lệnh.

Hệ quả: Nếu ngay từ đầu điều kiện đã sai, khối lệnh lặp sẽ không được thực hiện lần nào.

2. Viết đoạn chương trình tính tổng $2 + 4 + … + 100$ sử dụng lệnh while.

Lời giải:

Ý tưởng:

  • Bắt đầu với $k = 2$, mỗi vòng cộng $k$ vào $S$ rồi tăng $k$ thêm $2$.
  • Lặp khi $k \leq 100$.

Chương trình:

S = 0
k = 2
while k <= 100:
    S = S + k
    k = k + 2
print(S)

Kết quả khi chạy:

2550

Kiểm tra: $S = 2 + 4 + 6 + … + 100$. Dãy có $50$ số chẵn, tổng $= \dfrac{(2 + 100) \times 50}{2} = 2550$. ✓

Thực hành trang 110

Nhiệm vụ 1 trang 110

Đề bài: Viết chương trình in toàn bộ dãy các số tự nhiên từ $1$ đến $100$ trên một hàng ngang.

Hướng dẫn thực hành:

Ý tưởng:

  • Dùng vòng lặp while với điều kiện $k < 100$ (kết hợp với việc tăng $k$ trước khi in để in được số $100$).
  • Để in trên cùng một hàng, dùng thêm end = " " trong lệnh print().

Em mở chế độ soạn thảo (File / New File) và gõ:

k = 0
while k < 100:
    k = k + 1
    print(k, end = " ")

Cách hoạt động:

  • Mỗi vòng lặp tăng $k$ thêm $1$ rồi in $k$.
  • Khi $k$ tăng đến $100$, lệnh print in $100$ rồi vòng lặp kiểm tra điều kiện $100 < 100$ (sai) → dừng.

Kết quả khi chạy:

1 2 3 4 5 6 7 8 9 10 ... 98 99 100 

Nhiệm vụ 2 trang 110

Đề bài: Viết chương trình in ra màn hình dãy các chữ cái tiếng Anh từ "A" đến "Z" theo ba hàng ngang trên màn hình, hai hàng đầu có $10$ chữ cái, hàng thứ ba có $6$ chữ cái.

Hướng dẫn thực hành:

Ý tưởng:

  • Các chữ cái A đến Z có số thứ tự trong bảng mã ASCII từ $65$ đến $90$.
  • Dùng lệnh chr(k) để chuyển số $k$ thành kí tự tương ứng (ví dụ chr(65) = 'A').
  • Tạo biến đếm $i$ để biết đang in đến chữ cái thứ mấy. Cứ in đủ $10$ chữ (tức $i \% 10 == 0$) thì xuống dòng.

Chương trình:

i = 0
k = 65   # bắt đầu từ số thứ tự của chữ cái A
while k <= 90:
    i = i + 1
    if i%10 == 0:
        print(chr(k))               # in xong rồi xuống dòng
    else:
        print(chr(k), end = " ")    # in trên cùng một hàng
    k = k + 1

Kết quả khi chạy:

A B C D E F G H I J
K L M N O P Q R S T
U V W X Y Z 

Giải thích cách xuống dòng:

  • Khi $i = 10$ (chữ thứ 10), $i \% 10 == 0$ đúng → in chr(k)tự động xuống dòng (vì lệnh print() không có end = " ").
  • Khi $i = 20$ (chữ thứ 20), tương tự → xuống dòng.
  • Sau đó in tiếp $6$ chữ cuối ($U, V, W, X, Y, Z$) trên hàng thứ ba.

Luyện tập trang 110

Luyện tập 1 trang 110

Đề bài: Cho dãy số $1, 4, 7, 10, …$ Viết chương trình in ra phần tử lớn nhất của dãy nhưng nhỏ hơn $100$.

Lời giải:

Phân tích:

  • Dãy có quy luật: số sau hơn số trước $3$ đơn vị (công sai $3$).
  • Cần tìm phần tử cuối cùng của dãy mà nhỏ hơn $100$.

Ý tưởng: Dùng biến last lưu giá trị trước đó của $k$. Khi vòng lặp dừng, last chính là phần tử lớn nhất nhỏ hơn $100$.

Chương trình:

k = 1
while k < 100:
    last = k
    k = k + 3
print(last)

Cách hoạt động:

  • $k$ lần lượt nhận giá trị: $1, 4, 7, 10, …, 94, 97, 100$.
  • Khi $k = 97$ vẫn $< 100$: gán last = 97, sau đó $k = 100$.
  • Khi $k = 100$: điều kiện $100 < 100$ sai → vòng lặp dừng. last vẫn giữ giá trị $97$.

Kết quả khi chạy:

97

Luyện tập 2 trang 110

Đề bài: Viết chương trình đếm trong dãy $100$ số tự nhiên đầu tiên có bao nhiêu số thoả mãn điều kiện: hoặc chia hết cho $5$ hoặc chia cho $3$ dư $1$.

Lời giải:

Ý tưởng:

  • Duyệt $k$ từ $1$ đến $100$.
  • Nếu $k$ chia hết cho $5$ (k%5 == 0) hoặc $k$ chia cho $3$ dư $1$ (k%3 == 1) thì tăng biến đếm count.

Chương trình:

count = 0
k = 1
while k <= 100:
    if k%5 == 0 or k%3 == 1:
        count = count + 1
    k = k + 1
print(count)

Kết quả khi chạy:

47

Vận dụng trang 110

Vận dụng trang 110

Đề bài: Viết chương trình in các số tự nhiên từ $1$ đến $100$ ra màn hình thành $10$ hàng, mỗi hàng $10$ số, có dạng như sau:

1 2 3 ...  10
11 12 ... 20
.................
91 92 ... 100

Lời giải:

Ý tưởng:

  • Duyệt $k$ từ $1$ đến $100$.
  • Cứ in được $10$ số (tức là $k$ chia hết cho $10$: $k = 10, 20, 30, …, 100$) thì xuống dòng.
  • Các số còn lại thì in trên cùng một hàng (dùng end = " ").

Chương trình:

k = 1
while k <= 100:
    if k%10 == 0:
        print(k)                # in xong rồi xuống dòng
    else:
        print(k, end = " ")     # in trên cùng một hàng
    k = k + 1

Kết quả khi chạy:

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
...
91 92 93 94 95 96 97 98 99 100

Chú ý: Cách làm này tương tự Nhiệm vụ 2 ở phần Thực hành (in chữ cái A đến Z theo hàng), chỉ khác là ở đây in số từ $1$ đến $100$ và xuống dòng sau mỗi $10$ số.

Thầy Phạm Thành Danh

Thầy Phạm Thành Danh

(Người kiểm duyệt, ra đề)

Chức vụ: Trưởng ban biên soạn môn Tin Học THPT

Trình độ: Cử nhân Sư phạm Tin học, Chứng chỉ hạng II, Chứng chỉ Tin học, Ngoại ngữ B1

Kinh nghiệm: 8+ năm kinh nghiệm tại Trường THPT Thuận Hóa