Slide bài giảng tin học 10 cánh diều bài 17 chủ đề F: Thực hành lập trình giải bài toán trên máy tính

Slide điện tử bài 17 chủ đề F: Thực hành lập trình giải bài toán trên máy tính. Trình bày với các hiệu ứng hiện đại, hấp dẫn. Giúp học sinh hứng thú học bài. Học nhanh, nhớ lâu. Có tài liệu này, hiệu quả học tập của môn Tin học 10 Cánh diều sẽ khác biệt

Bạn chưa đủ điều kiện để xem được slide bài này. => Xem slide bài mẫu

Tóm lược nội dung

BÀI 17: THỰC HÀNH LẬP TRÌNH GIẢI BÀI TOÁN TRÊN MÁY TÍNH (2 TIẾT)

KHỞI ĐỘNG

- GV yêu cầu HS thảo luận và trả lời: Nếu chương trình chạy bị lỗi với thông báo lỗi là ZeroDivisionError thì đó là lỗi gì và em cần sửa lỗi như thế nào?

NỘI DUNG BÀI HỌC GỒM

HÌNH THÀNH KIẾN THỨC

- Thực hành lập trình giải toán?

Nội dung ghi nhớ:

I. Bài 1

Nhận xét để xác định bài toán:

Vì mỗi giờ, khoảng cách giữa hai tàu giảm đi (v1 + v2) hải lí, vì vậy để hai tàu gặp nhau, sẽ cần  giờ.

- Sử dụng kiến thức vật lí để giải thích:

Đặt hệ quy chiếu một chiều với điểm 0 ở vị trí tàu cá và đảo ở vị trí d.

Phương trình chuyển động của tàu cá: x = 0 + v1.t

Phương trình chuyển động của tàu cứu hộ: x = d – v2.t

Yêu cầu tìm t để 0 + v1.t = d – v2.t, tức là tìm t  =  ,có thể giải bằng thuật toán giải phương trình bậc nhất.

Thuật toán:

Bước 1: Nhập vào d, v1, v2.

Bước 2: Tính t = d/(v1+v2).

Bước 3: In ra t.

Tech12h

Chương trình:

Tech12h

Kiểm thử: Đề xuất các bộ test và thực hiện kiểm thử.

II. Bài 2

Xác định bài toán:

Input: Các dữ liệu

- Số liều đã có m ( ).

- Số liều cần có n ( ).

- Năng suất một ngày: cơ sở A sản xuất pa, cơ sở B sản xuất pb liều vacxin, ( )

Output: Số ngày để sản xất đủ vacxin: k ngày.

Thuật toán

Ta xét một thuật toán đơn giản: Mô phỏng đúng quá trình sản xuất, sau mỗi ngày thì số liều đã có tăng lên (pa + pb) và lặp đi lặp lại cho tới khi đủ số liều cần có.

Bước 1: Nhập vào n, m, pa, pb.

Bước 2: k = 0

Bước 3: while m < n: # chừng nào chưa đủ số liều

Bước 4: k +=1# thêm một ngày.

Bước 5: m + = pa + pb # số liều được thêm pa + pb sau một ngày.

Bước 6: In ra k  # in ra số ngày.

Chương trình 1:

Tech12h

Kiểm thử

Xây dựng bộ test:

Dữ liệuKết quả thực hiệnÝ đồ test

200                        50

20                              35

3Bộ test 1: Test ví dụ đề bài

200                        50

4                            6

15Bộ test 2: Sản xuất thêm 15 ngày, không thừa liều nào

201                        50

4                            6

16Bộ test 3: Sản xuất thêm 16 ngày, thừa ra 9 liều

1000                      1000

1                            2

0Bộ test 4: Số liều đã đủ, không cần sản xuất thêm

100000000            0

1                            1

50 000 000Bộ test 5: Cần sản xuất thêm rất nhiều ngày

12                          16

1                            2

0Bộ test 6: Số liều đã thừa, không cần sản xuất thêm

12                          16

0                            0

0Bộ test 7: Không cần sản xuất thêm, pa = pb = 0

16                          12

0                            0

-1Bộ test 8: không thể sản xuất đủ

100000000            0

100000                      100000

500Bộ test 9: Dữ liệu max

Kết quả thực hiện:

TestKết quả mong muốnKết quả thực hiệnTình trạng
133OK
21515OK
31616OK
400OK
55000000050000000Chạy rất chậm
600OK
700OK
8-1 Lặp vô hạn
9500500OK

Có 2/9 bộ test chương trình không đạt yêu cầu, cần hiệu chỉnh thuật toán và chương trình để khắc phục các lỗi này. Ở bộ test số 5, chương trình chạy chậm do vòng lặp while () phải thực hiện tới 50 triệu lần. Trước hết ta thử tối ưu chương trình:

Thay vì duy trì số liều đã có m và số liệu cần có n. Ta tính trước số liệu còn thiếu q = n - m.

Thay vì phải tính số liệu sản xuất ra trong một ngày bằng (pa + pb), ta tính trước luôn p = pa + pb.

Chương trình 2:

Tech12h

Chương trình vẫn chưa có cải thiện đáng kể về tốc độ, cụ thể là test số 5 vẫn rất chậm. Việc điều chỉnh cần được thực hiện ở mức thuật toán.

Có thể thấy rằng để sản xuất q liều với tốc độ p liều một ngày thì cần  ngày. Vì vậy để tính số ngày k, ta không cần dùng vòng lặp mà có thể tính:

k = math.ceil(q/p)

Hoặc dùng công thức sau để tránh phép chia số thực:

k= (q + p -1)//p

C. HOẠT ĐỘNG LUYỆN TẬP

- Hoàn thành bài tập trắc nghiệm sau:

Câu 1: Phát biểu nào sau đây là đúng về lỗi ngoại lệ?

A. Là lỗi câu lệnh viết không theo đúng quy định của ngôn ngữ.

B. Là lỗi xảy ra khi chương trình đang chạy, một lệnh nào đó không thể thực hiện.

C. Là lỗi mặc dù các câu lệnh viết đúng quy định của ngôn ngữ nhưng sai trong thao tác xử lí nào đó.

D. Tất cả các lỗi trên.

Câu 2: Để kiểm thử chương trình có bao nhiêu nhóm dữ liệu khác nhau cần tạo ra:

A. 1

B. 2

C. 3

D. 4

Câu 3: Đâu là lỗi khi lập trình?

A. Lỗi cú pháp

B. Lỗi ngoại lệ (Exceptions Error)

C. Lỗi ngữ nghĩa

D. Tất cả các đáp án trên

Câu 4: Bộ dữ liệu kiểm thử (test) có những tính chất gì?

A. Tính chất phát hiện lỗi của chương trình. 

B. Cần có càng nhiều càng tốt. 

C. Cần được sinh ngẫu nhiên và phủ kín các trường hợp biên của dữ liệu đầu vào bài toán.

D. Không cần có tính chất gì. 

Câu 5: Đâu là mô tả đúng về lỗi cú pháp?

A. lỗi câu lệnh viết không theo đúng quy định của ngôn ngữ lập trình.

B. lỗi xảy ra khi chương trình đang chạy, một lệnh nào đó không thể thực hiện được. Lỗi này sẽ được thông báo ngay trên màn hình.

C. lỗi mặc dù các câu lệnh viết đúng quy định của ngôn ngữ nhưng sai trong thao tác xử lí nào đó.

D. Đáp án khác.

Gợi ý đáp án:

Câu

1

2

3

4

5

Đáp án

B

C

D

C

A

D. HOẠT ĐỘNG VẬN DỤNG

Vận dụng kiến thức, GV yêu cầu HS trả lời câu hỏi:

Câu 1: Công cụ Debug dùng để làm gì?

Câu 2: Hãy tìm lỗi cho đoạn chương trình sau:

a=int(input()

print(a)