You are on page 1of 167

Chủ đề F

GIẢI QUYẾT VẤN ĐỀ


VỚI SỰ TRỢ GIÚP CỦA MÁY TÍNH

LẬP TRÌNH CƠ BẢN

1
Bài 1 LÀM QUEN VỚI NGÔN NGỮ LẬP TRÌNH BẬC CAO
MÔI TRƯỜNG LẬP TRÌNH PYTHON CHƯƠNG TRÌNH CON VÀ THƯ VIỆN
Bài 10
CÁC CHƯƠNG TRÌNH CON CÓ SẴN
Bài 2 BIẾN, PHÉP GÁN
VÀ BIỂU THỨC SỐ HỌC THỰC HÀNH LẬP TRÌNH
Bài 11
VỚI HÀM VÀ THƯ VIỆN
Bài 3 THỰC HÀNH LÀM QUEN VÀ
KHÁM PHÁ PYTHON
Bài 12 KIỂU DỮ LIỆU
Bài 4 CÁC KIỂU DỮ LIỆU SỐ XÂU KÍ TỰ - XỬ LÍ XÂU KÍ TỰ
VÀ CÂU LỆNH VÀO - RA ĐƠN GIẢN
Bài 13 THỰC HÀNH DỮ LIỆU KIỂU XÂU
THỰC HÀNH
Bài 5 VIẾT CHƯƠNG TRÌNH ĐƠN KIỂU DỮ LIỆU
GIẢN Bài 14 DANH SÁCH - XỬ LÍ DANH SÁCH
Bài 6 CÂU LỆNH RẼ NHÁNH
THỰC HÀNH Bài 15 THỰC HÀNH VỚI KIỂU DỮ LIỆU DANH SÁCH
Bài 7 CÂU LỆNH RẼ NHÁNH
Bài 16 KIỂM THỬ VÀ
Bài 8 CÂU LỆNH LẶP GỠ LỖI CHƯƠNG TRÌNH

Bài 17 THỰC HÀNH LẬP TRÌNH


Bài 9 THỰC HÀNH CÂU LỆNH LẶP GIẢI BÀI TOÁN TRÊN MÁY TÍNH

Bài 18 LẬP TRÌNH GIẢI QUYẾT BÀI TOÁN


TRÊN MÁY TÍNH
Bài 1

LÀM QUEN VỚI NGÔN NGỮ LẬP TRÌNH BẬC CAO


MÔI TRƯỜNG LẬP TRÌNH PYTHON

3
...
Pascal

C++

Ngôn ngữ chung giữa con người và máy tính: ngôn ngữ lập trình

Python
Java
...
4
8p
hút
13
g iâ
y

299 792 458 m/giây


5
print(‘Khoảng cách từ mặt trời tới trái đất:’, 299792456*(8*60+13))
y
/g
343 m

Sau 8 giây – nghe thấy tiếng sấm.


print(‘Khoảng cách từ tia chớp tới người nghe thấy:’, 343*8, ‘m.’)

Sau 12.5 giây – nghe thấy tiếng sấm.


print(‘Khoảng cách từ tia chớp tới người nghe thấy:’, 343*12.5, ‘m.’)

Nếu sau 11 giây? Sau 14.3 giây? Sau 16.4 giây? . . .

6
1 2 5
3. Soạn chương
trình

4
6

t = float(input())
print(‘Khoảng cách từ tia chớp tới người nghe thấy:’, 343*t, ‘m.’)
7
Soạn thảo một lần
Sử dụng nhiều lần
Bài 1. Em hãy viết câu lệnh print()sao cho khi thực hiện câu lệnh này trên màn
hình sẽ hiển thị dòng chữ “Học lập trình với Python để ra lệnh cho máy tính”.

print(‘Học lập trình với Python để ra lệnh cho máy tính’)

Bài 2. Đường cao tốc Hà Nội – Lào Cai (kí hiệu CT.05) có chiều dài 264 km. Một
ô tô chạy với tốc độ trung bình toàn tuyến là 70 km/h. Em hãy dùng ngôn ngữ lập
trình Python ra lệnh cho máy tính xác định thời gian ô tô đó đi hết đường cao tốc
Hà Nội – Lào Cai.
print(‘Thời gian cần thiết’,264/70,’giờ.’)

8
Năm 2020 nước ta sản xuất được 247 tỉ kWh điện. Sản lượng điện của nước ta
được dự báo sẽ tiếp tục tăng nhanh với tốc độ trung bình là 8,6%/năm. Em hãy
dùng ngôn ngữ lập trình Python ra lệnh cho máy tính để tính sản lượng điện của
nước ta sản xuất được trong năm 2021 theo dự báo.

print(‘Sản lượng điện năm 2021:’, 247*1.086, ‘tỉ kWh.’)

9
Câu 1. Trong các câu sau đây, những câu nào đúng?

1) Chương trình là một bản chỉ dẫn cho máy tính làm việc, được viết bằng một ngôn ngữ lập trình.
2) Chỉ có một ngôn ngữ lập trình bậc cao là Python.
3) Lập trình bằng Python có thể đưa ra các thông báo bằng tiếng Việt.
4) Môi trường lập trình hỗ trợ người lập trình phát hiện ra câu lệnh viết sai ngữ pháp.
Đáp án: Các câu đúng: 1, 3, 4
Câu 2. Trong các câu sau đây, những câu nào phù hợp với lí do nên học lập trình?
Em học lập trình để:
1) Giỏi tiếng Anh.
2) Làm phong phú kiến thức cá nhân.
3) Có thể truy cập Internet.
4) Sử dụng được các phần mềm văn phòng.
5) Điều khiển máy tính giải nhiều loại bài toán sẽ gặp trong thực tế.
6) Sau này trở thành chuyên gia trong lĩnh vực tin học. 10
Đáp án: Các câu đúng: 2, 5, 6
11
Bài 2
BIẾN, PHÉP GÁN
VÀ BIỂU THỨC SỐ HỌC

12
Các giá trị tính toán: được đặt tên để trích dẫn

Toán học Python


Gọi số giây trong một ngày là Số giây

Số giây = 24×3600 Số_giây = 24*3600


Thay dấu cách bằng ký tự _
Phép gán

 Chỉ chứa chữ cái, chữ số và dấu gạch dưới,


 Bắt đầu bằng chữ cái hoặc dấu gạch dưới,
 Phân biệt chữ hoa và chữ thường.

a1
Hai tên khác nhau!
A1
13
Soạn thảo chương trình

Trình bày muộn hơn!

Minh họa thông qua ví dụ cụ thể soạn thảo chương trình


cho một bài toán trong các phần tiếp theo.

14
Bài 1. Em hãy nêu ba tên biến đúng, ba tên biến sai. Với tên biến sai, em hãy giải thích
tại sao đó không phải là tên biến.
Ba tên đúng Ba tên sai
Điện_Biên Mường Thanh Chứa dấu cách
a1 a&b Chứa ký tự ngoài phạm vi cho phép (&)
result 2kq Bắt đầu bằng chữ số
Bài 2. Học sinh thử nghiệm.

Bài 3. Em hãy hoàn thiện chương trình ở Hình 5 bằng cách viết biểu thức gán cho
biến pound để nhận được chương trìnhchuyển đổi đơn vị đo khối lượng từ đơn vị ki-
lô-gam sang pound, biết rằng 1 kg bằng 2,205 pound. Em hãy thay đổi giá trị gán cho
biến kilo để chạy thử nghiệm chương trình.

kilo = 4.5
pound = kilo*2.205
print(pound)
15
Mảnh vườn trồng cúc đại đoá có chiều rộng m mét, chiều dài n mét. Mỗi mét vuông
trồng được một khóm hoa. Mỗi khóm hoa bán được a nghìn đồng. Em hãy viết chương
trình để đưa ra màn hình tổng số tiền thu được khi bán hết hoa trong vườn, với bộ dữ
liệu đầu vào là m = 5, n = 18, a = 30.
Đáp án: m = 5
n = 18
a = 30
print(‘Số tiền thu được là’, m*n*a, ‘nghìn đồng.’)

Câu 1. Xét đoạn chương trình ở hình bên.


Em hãy cho biết c hay d nhận giá trị lớn hơn.
Đáp án: c = 2, d = 3 d lớn hơn
Câu 2. Có thể lưu chương trình Python dưới dạng tệp hay không?
Đáp án: Có. 16
17
Bài 3 THỰC HÀNH LÀM QUEN

KHÁM PHÁ PYTHON
Tổng bình phương ba số
Em hãy gán giá trị số nguyên cho ba biến tương ứng a, b, c, mỗi giá trị có thể là số dương, số âm hoặc bằng 0 và
có số chữ số tuỳ ý.
Viết chương trình đưa ra màn hình tổng ba số và tổng bình phương ba số đó.
Ví dụ:

18
19
Làm quen với hai cửa sổ lập trình của Python

a = 20
b = 100
a = a - 5
b = b - a
print(b)
20
Làm quen với thông báo lỗi của Python

Gợi ý sửa
Làm quen với nhập dữ liệu là một dòng chữ

Tìm hiểu Python sử dụng màu sắc trong chương trình

21
Tên chương trình: TIME.PY
Khoảng thời gian
Để theo dõi hoạt động của động vật trong một Vườn bảo tồn Quốc gia người ta lắp một camera
trên một lối đi mà các con vật hay qua lại. Mỗi khi có vật chuyển động trong phạm vi quan sát
của ống kính, camera sẽ tự động chụp hình và ghi lại thời điểm chụp dưới dạng số giây kể từ
khi được lắp đặt.
Trong số các ảnh thu được có tấm hình một động vật quý hiếm với thời điểm chụp là s.
Hãy đưa ra thời điểm chụp dưới dạng “ngày:giờ:phút:giây”.
Ngày đầu tiên đặt máy được tính là 0.
Dữ liệu: Vào từ thiết bị vào chuẩn của hệ thống gồm một dòng chứa số nguyên dương s.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống thời điểm chụp theo quy cách mới đã nêu.
Ví dụ:

INPUT   OUTPUT
12345656   142:21:20:56

22
Giải thuật
86400
seconds = seconds % day
day =
24*3600
days = seconds//day

hours = seconds//3600
hour = 3600

seconds = seconds % 3600

minute = 60 minutes = seconds//60

seconds = seconds%60
23
seconds = int(input())
days = seconds // (24 * 3600)
seconds = seconds % (24 * 3600)
hours = seconds // 3600
seconds = seconds % 3600
minutes = seconds // 60
seconds = seconds % 60
print(days, hours, minutes, seconds,sep=':')

24
Điểm thi Tên chương trình: EVALS.PY
Trong một cuộc thi tay nghề mỗi thí sinh phải thực hiện bốn bài trong bốn môn thi khác nhau và
điểm tổng hợp của thí sinh là trung bình cộng của điểm 4 bài. Điểm của mỗi bài là một số thực.
Cho biết điểm của mỗi bài thi hãy tính điểm tổng hợp và đưa ra kết quả làm tròn tới 5 chữ số
sau dấu chấm thập phân.
Dữ liệu: Vào từ thiết bị vào chuẩn của hệ thống gồm một dòng chứa 4 số thực a, b, c và d,
các số cách nhau ít nhất một dấu cách.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống một số thực – điểm tổng hợp tính được.
Ví dụ:

INPUT   OUTPUT
95.31 87.345 96.048254 98.713116   94.35409

25
Hướng dẫn
Cách nhập 4 số thực ghi trên một dòng, cách nhau ít nhất một dấu cách:

a,b,c,d = map(float, input().split())

Tính giá trị trung bình 4


số :
 Giá trị trung bình là số thực → dùng phép tính /

 (a + b + c + d)/4

Làm tròn giá trị x tới k chữ số sau dấu chấm thập phân:

round(x,k)

Ví dụ: print(round(8/3,4) Kết quả đưa ra: 2.6667 26


a,b,c,d = map(float, input().split())

print(round((a+b+c+d)/4,5))

27
Du lịch Phan Xi Păng
Để lên đỉnh Phan Xi Păng (Hình 6) cần mua vé cáp treo a nghìn
đồng/1 người lớn và b nghìn đồng/1 trẻ em, vé xe lửa là u nghìn
đồng/1 người lớn và v nghìn đồng/1 trẻ em. Đoàn du lịch có x
người, trong số đó có y trẻ em. Hãy xác định số tiền cần chuẩn bị
để mua vé cho cả đoàn và đưa kết quả ra màn hình.

Các dữ liệu a, b, u, v, x, y là các số nguyên không âm (y ≤ x).


Gợi ý: Số tiền cần chuẩn bị được tính theo công thức sau đây:
Số_tiền = a × (x – y) + u × ( x – y) + b × y + v × y
= (a + u) × (x – y) + (b + v) × y
Lưu ý: Có thể đưa ra dòng thông báo tuỳ chọn trước mỗi phép nhập dữ liệu và trước mỗi kết quả,
Python cho phép đưa ra dòng thông báo dưới dạng tiếng Việt có dấu.
Ví dụ:

28
Trường hợp nhập mỗi số trên một dòng
a = int(input('a = '))
b = int(input('b = '))
u = int(input('u = '))
v = int(input('v = '))
x = int(input('x = '))
y = int(input('y = '))
Số_tiền = (a + u) * (x - y) + (b + v) * y
print('Tổng số tiền vé:',Số_tiền,'ngàn đồng.')

Trường hợp nhập các số trên một dòng

a, b, u, v, x, y = map(int, input().split())
Số_tiền = (a + u) * (x - y) + (b + v) * y
print('Tổng số tiền vé:',Số_tiền,'ngàn đồng.')

29
 Chỉ chứa chữ cái, chữ số và dấu gạch dưới,
 Bắt đầu bằng chữ cái hoặc dấu gạch dưới,
 Phân biệt chữ hoa và chữ thường.

Không cần thuộc!


Tên
Người dùng đặt Từ khóa
 Đã được dùng với ý nghĩa nhất định
Tên chuẩn
 Không được dùng với nghĩa
 Đã được dùng với ý nghĩa nhất định khác
 Có thể dùng với nghĩa khác if
else
int for
print
. . .
input
. . . 30
Các phép tính số học

Chỉ dùng một loại cặp ngoặc: ( )

Phép gán: Tên_biến = Biểu_thức

31
Bài 4 CÁC KIỂU DỮ LIỆU SỐ
VÀ CÂU LỆNH VÀO - RA ĐƠN GIẢN

32
Có Ph
b i ép
Dấ ếnl c
u ch oạ hia
ấm i th th
thậ ực ự c
pp
h ân

Giá trị thực Kiểu thực


Giá trị nguyên Kiểu nguyên

Lệnh type cho biết biết kiểu dữ liệu của biến hay biểu thức

33
TỔ CHỨC VÀO - RA

Nhóm câu lệnh phức tạp nhất trong mọi ngôn ngữ lập trình nói chung và Python nói riêng,
Dần dần làm quen với các dạng thường dùng.

NHẬP DỮ LIỆU
Cần lưu ý: Các dữ liệu thuộc kiểu gì?
Mỗi dữ liệu ghi trên một dòng hay các dữ liệu ghi trên một dòng

Dữ liệu nhập vào: gán cho biến hoặc các biến.

Biết một số mẫu thường dùng Quen dần


(Không cần thuộc ngay!)

34
TỔ CHỨC VÀO - RA

Nhập giá trị một biến kiểu nguyên ghi trên một dòng: k = int(input())
Nhập giá trị một biến kiểu thực ghi trên một dòng : x = float(input())

Nhập giá trị hai biến kiểu nguyên ghi trên một dòng: m,n = map(int,input())

Nhập giá trị hai biến kiểu thực ghi trên một dòng: x,y = map(float,input())

Kéo dài danh sách nếu cần Có thể có dòng thông báo
trước khi nhập dữ liệu
nhập giá trị cho nhiều biến

Ví dụ: Nhập 4 số nguyên a, b, u, v, các số ghi trên một dòng, cách nhau ít nhất một dấu cách.
a,b,u,v = map(int,input(‘Dữ liệu vào: ‘))
INPUT a: 5 b: 8 u: -2 v: 6
5 8 -2 6 35
TỔ CHỨC VÀO - RA

Đưa ra kết quả: print(Danh sách biểu thức)

Ví dụ:
a = 5
b = 3
print(a, b, a+b, a-b, a*b, a//b, a%b)

Kết quả: 5 3 8 2 15 1 2

Các giá trị đưa ra trên một dòng riêng, cách nhau một dấu cách.

Các cách đưa ra đáp ứng các yêu cầu khác: Sẽ học sau!

36
TỔ CHỨC VÀO - RA

Ví dụ 2. Viết chương trình nhập ba số thực là điểm kiểm tra cuối học kì của ba môn Ngữ văn,
Vật lí và Sinh học. Tính và đưa ra màn hình tổng điểm và điểm trung bình của ba môn. Hình 4a
và Hình 4b minh hoạ chương trình và một kết quả chạy chương trình.

Hằng Trong Python hằng tương tự như biến có gán trị.


37
Tam giác vuông B

Viết chương trình thực hiện nhập từ bàn phím hai số nguyên
dương b, c là độ dài hai cạnh góc vuông của tam giác vuông
ABC, tính và đưa ra màn hình:
c a
– Diện tích tam giác.
– Độ dài cạnh huyền.
Có thể đưa ra dòng thông báo tuỳ chọn (bằng tiếng Việt có dấu) trước
mỗi dữ liệu nhập vào và trước mỗi kết quả xuất ra. A b C
Ví dụ:
INPUT   OUTPUT
b = 3   Diện tích tam giác: 6.0
c = 4 Độ dài cạnh huyền: 5.0

38
Nhập b và c,
Đưa ra diện tích: b*c/2
Đưa ra độ dài cạnh huyền: (a2+b2)1/2
Trường hợp nhập b, c, mỗi số trên một dòng:

b = int(input())
c = int(input())
print(‘Diện tích tam giác:’, b * c / 2)
print(‘Độ dài cạnh huyền:’, (a*a + b*b)**0.5)

Trường hợp hai số b, c ghi trên một dòng, cách nhau ít nhất một dấu cách:

b, c = map(int,input())
print(‘Diện tích tam giác:’, b * c / 2)
print(‘Độ dài cạnh huyền:’, (a*a + b*b)**0.5)

39
Chia mận
Cô giáo đi du lịch ở Sa Pa mang về túi mận làm quà cho cả lớp. Túi mận có k quả, lớp có n
học sinh. Mận được chia đều để em nào cũng nhận được một số lượng quả như nhau. Nếu còn
thừa, những quả còn lại sẽ được dành cho các em nữ.
Viết chương trình: nhập n và k vào từ bàn phím, đưa ra màn hình số quả mận mỗi học sinh
nhận được và số quả dành riêng cho các em nữ.
Sử dụng dòng thông báo cho dữ liệu nhập vào và mỗi kết quả đưa ra.
Ví dụ:

INPUT   OUTPUT
Số học sinh: n = 31   Mỗi học sinh được chia 3 quả mận.
Số mận: k = 123 Số mận dành riêng cho các em nữ là 30.

40
Nhập n và k,
Tính số mận cho mỗi người: n//k
Tính số mận cho các bạn nữ: n%k.

n = int(input(‘Số học sinh: n = ‘))


c = int(input(‘Số mận: k = ‘))
print(‘Mỗi học sinh được chia’, n//k,’quả mận.’)
print(‘Số mận dành riêng cho các em nữ là’, n%k, ’quả
mận.’)

41
Tính số bàn học
Trường mới đẹp và rộng hơn trường cũ, số phòng học cũng nhiều hơn so với trước. Nhà trường
dự định tuyển thêm học sinh cho ba lớp mới với số lượng học sinh mỗi lớp tương ứng là a, b
và c. Cần mua bàn cho các lớp mới này. Mỗi bàn học có không quá hai chỗ ngồi cho học sinh.
Xác định số lượng bàn tối thiểu cần mua.
Em hãy viết chương trình giải quyết bài toán trên. Dữ liệu được nhập vào từ bàn phím. Kết quả
được đưa ra màn hình.
Ví dụ:
INPUT   OUTPUT
a = 35   Số bàn tối thiểu cần mua: 59
b = 42    
c = 39

42
Giải thuật

Xét số học sinh trong lớp là a


 Nếu a chẵn thì số bàn cần mua là a//2
Số bàn cần mua là (a+1)//2
 Nếu a lẻ thì số bàn cần mua là a//2+1
Số học sinh trong lớp là b → Số bàn cần mua là (b+1)//2
Số học sinh trong lớp là c → Số bàn cần mua là (c+1)//2
Kết quả cần đưa ra:

(a+1)//2 + (b+1)//2 + (c+1)//2

a = int(input(‘a = ‘))
b = int(input(‘b = ‘))
c = int(input(‘c = ‘))
print(‘Số bàn tối thiểu cần mua:’,(a+1)//2+(b+1)//2+(c+1)//2)
43
Trong các câu sau đây, những câu nào đúng?

1) Để tính toán, các ngôn ngữ lập trình bậc cao không phân biệt kiểu dữ liệu số nguyên
và kiểu dữ liệu số thực.

2) Trong Python, câu lệnh n = int(input('n = ')) cho nhập vào một số thực từ
bàn phím.
3) Trong Python mỗi câu lệnh print()chỉ đưa ra được giá trị của một biến.

4) Trong Python, với câu lệnh input() có thể nhập dữ liệu cùng với thông báo hướng dẫn.

Đáp án: Câu đúng: 4

44
45
Bài 5 THỰC HÀNH
VIẾT CHƯƠNG TRÌNH ĐƠN GIẢN
Bài 1. Giải phương trình bậc nhất
Chương trình ở Hình 1a được viết để giải phương trình bậc nhất ax + b = 0, với a, b là hai
số thực nhập từ bàn phím (a ≠ 0) và nghiệm được thông báo ra màn hình.
Tuy nhiên, chương trình đó còn viết thiếu ở những vị trí “. . .”. Em hãy hoàn thiện chương
trình và kiểm thử xem với dữ liệu vào a = 1 và b = 2, chương trình em vừa hoàn thiện có cho
kết quả giống như Hình 1b không.

Chương trình sẽ đưa ra màn hình thông tin gì nếu nhập vào giá trị a = 0?
46
Đáp án:

a = float(input(“a = “))
b = float(input(“b = “))
print(“Nghiệm phương trình là”, -b/a)

Khi nhập giá trị a = 0: Hệ thống sẽ chỉ ra số thứ tự câu lệnh chứa lỗi và thông báo
gặp lỗi chia cho 0 (division by zero)

47
Bài 2. An ninh lương thực
Trung bình mỗi người dân cần có a kg gạo để ăn, chế biến và phục vụ chăn nuôi trong một
năm. Để đảm bảo an ninh lương thực, tổng số gạo dự trữ trong các kho của nhà nước chia cho
đầu người phải lớn hơn hoặc bằng a kg.
Một nước có số dân là b thì cần dự trữ tối thiểu bao nhiêu ki-lô-gam gạo? Em hãy viết chương
trình nhập từ bàn phím hai số a, b và đưa ra màn hình khối lượng gạo tối thiểu cần dự trữ.
Yêu cầu: Cần đưa ra màn hình hướng dẫn nhập dữ liệu và thông báo kết quả bằng tiếng Việt
có dấu.
Ví dụ:
INPUT   OUTPUT
a = 365   Số gạo cần dự trữ:33246497310
b = 91086294
   

48
Đáp án:

a = int(input(‘a = ‘))
Nhập các số nguyên a và b,
Đưa ra kết quả: a*b b = int(input(‘b = ‘))
print(‘Số gạo cần dự trữ:’, a*b)

49
Bài 3. Tìm ước chung lớn nhất
Em hãy viết chương trình nhập vào từ bàn phím hai số nguyên a và b, tính và đưa ra màn
hình ước chung lớn nhất của hai số đó.
Gợi ý: Hãy tìm hiểu một số hàm toán học thường dùng trong Python.
Ví dụ:
INPUT   OUTPUT
a = 9855   Ước chung lớn nhất: 27
b = 11556
   
Giải thuật

Làm quen với việc khai thác các hàm trong


thư viện của hệ thống lập trình Python

Thư viện math:Chứa một số hàm toán học thường


dung.
Tham khảo
Không cần học thuộc! 50
Giải thuật

Nhập các số nguyên a và b,


Sử dụng hàm gcd đưa ra gcd(a,b)

from math import gcd


a = int(input(‘a = ‘))
b = int(input(‘b = ‘))
print(‘Ước số chung lớn nhất:’,gcd(a,b))

Cần nạp hàm gcd từ thư viện math vào chương trình
Một cách nạp:
Viết ở đầu chương trình:

from math import gcd


51
Bài 4. Làm quen với ghi chú thích trong chương trình

52
Viết chương trình tính và đưa ra màn hình vận tốc v (m/s) khi chạm mặt đất của một vật
rơi tự do từ độ cao h, biết rằng v = √2gh, trong đó g là gia tốc trọng trường (g ≈ 9.8 m/s2). Độ
cao h tính theo mét được nhập từ bàn phím.

Đáp án:

h = float(input('h = '))
v = (2*9.8*h)**0.5
print('v =',v,'m/gy.')

53
Bài 6

54
Bài toán 1
Nhập từ bàn phím số nguyên n. Kiểm tra nếu n không thuộc khoảng [10, 99] thì đưa ra thông báo:
n không phải là số nguyên dương hai chữ số.

Giải thuật Toán học


10 ≤ n ≤ 99
Điều kiện n là số nguyên dương 2 chữ số: hoặc
Cách viết điều kiện trong Python 9 < n < 100

10 <= n <= 99

9 < n < 100

55
Nói
Nhập số nguyên n,
Nếu không thỏa mãn kiều kiện 2 chữ số thì
Đưa ra thông báo theo yêu cầu đầu bài
Viết
n = int(input(‘n = ‘))
if not(9 < n < 100):
print(n,’không phải là số nguyên dương hai chữ số’)

Viết lùi sang phải

56
Bài toán 2 Nhập vào từ bàn phím số nguyên A và đưa ra thông báo cho biết đó là số chẵn
hay số lẻ.

Giải thuật Điều kiện A là số chẵn:


Toán học: A chia hết cho 2
Tin học: A % 2 == 0

Công việc gồm một câu lệnh


Nhập số nguyên A,
Có thể viết ngay sau dấu :
Nếu A là số chẵn thì Đưa ra thông báo là số chẵn
Trong trường hợp ngược lại thì Đưa ra thông báo là số lẻ.

A = int(input(“A = “))
if A%2 == 0: print(A,’là số chẵn’)
else: print(A,’là số chẵn’) 57
Ví dụ 4.
Tây Nguyên sản xuất hai loại cà phê là Robusta và Arabica. Trung bình hằng
năm lượng cà phê Arabica chiếm 10% tổng sản lượng và giá bán trung bình
gấp 2,5 lần so với cà phê Robusta. Những năm Arabica được mùa (chiếm từ
10% tổng sản lượng trở lên), giá bán chỉ gấp 2 lần, còn khi mất mùa thì giá
bán gấp 3 lần.

c = int(input("Tổng sản lượng cà phê: "))


a = int(input("Sản lượng Arabica: "))
if a/c >= 0.1 :
print("Arabica được mùa.")
hs = 2
else:
print("Arabica mất mùa.")
hs = 3
print("Hệ số giá bán:", hs)
58
Bài 1. Hoàn thiện câu lệnh if trong chương trình ở Hình 8a để có được chương trình
nhập từ bàn phím ba số thực a, b, c và đưa ra màn hình thông báo “Cả ba số đều dương”
nếu ba số nhập vào đều dương. Hình 8b minh hoạ một kết quả chạy chương trình.

Đáp án:

a = float(input("a = "))
b = float(input("b = "))
c = float(input("c = "))
if a > 0 and b > 0 and c > 0:
print("Cả ba số đều dương") Hình 8b. Một kết quả
thực hiện
Hình 8a. Chương trình
59
Bài 2. Viết chương trình để nhập từ bàn phím hai số nguyên a và b, đưa ra màn hình thông
báo “Positive” nếu a + b > 0, “Negative” nếu a + b < 0 và “Zero” nếu a + b = 0.

Đáp án:

a = int(input("a = "))
b = int(input("b = "))
Tồn tại cách viết khác
if a + b > 0: print("Positive")
gọn hơn!
else:
if a + b < 0: print("Negative")
else: print("Zero")

60
Năm nhuận
Năm nhuận là những năm chia hết cho 400 hoặc là những năm chia hết cho 4 nhưng không
chia hết cho 100. Đặc biệt, những năm chia hết cho 3 328 được đề xuất là năm nhuận kép.
Với số nguyên dương n nhập vào từ bàn phím, em hãy đưa ra màn hình thông báo: “Không là
năm nhuận” nếu n không phải là năm nhuận; “Năm nhuận” nếu n là năm nhuận và “Năm
nhuận kép” nếu n là năm nhuận kép.
Giải thuật

Nhập số nguyên dương n,


Nếu n chia hết cho 3328: Đưa ra thông báo “Năm nhuận kép”
Trong trường hợp ngược lại:
Nếu n % 400 == 0 hoặc đồng thời n % 4 == 0 và n % 100 != 0:
Đưa ra thông báo “Năm nhuận”
Trong trường hợp còn lại: Đưa ra thông báo “Không là năm nhuận”

61
n = int(input())
if n %3328 == 0: print('Năm nhuận kép.')
else:
if n % 400 == 0 or(n % 4 == 0 and n % 100 != 0):
print('Năm nhuận.')
else: print('Không phải là năm nhuận.')
62
Trong các câu sau đây, những câu nào đúng?

1) Trong câu lệnh rẽ nhánh của ngôn ngữ lập trình bậc cao phải có một biểu thức logic thể
hiện điều kiện rẽ nhánh.

2) Biểu thức logic chỉ được lấy làm điều kiện rẽ nhánh nếu chưa chạy chương trình đã xác
định được giá trị của biểu thức đó đúng hay sai.

3) Có thể kết nối các biểu thức logic với nhau bằng các phép tính logic để được một điều kiện
rẽ nhánh.

4) Trong Python câu lệnh rẽ nhánh có dạng: if <điều kiện> else <các câu
lệnh>.
Đáp án: Các câu đúng: 1 3

63
CÂU LỆNH RẼ NHÁNH TÓM TẮT

Việc rẽ nhánh được thực hiện bằng lệnh if

Các dạng của câu lệnh rẽ nhánh:

True Thực hiện

if Điều kiện : if a >= 0:


Nhóm câu lệnh print(a**0.5)

if d != 0:
3 dấu cách x = dx / d
y = dy / d 64
CÂU LỆNH RẼ NHÁNH

r ue
T Sai Đúng
if Điều kiện : (False) (True)
Điều kiện
al se Nhóm câu lệnh_1
F
else:
Nhóm câu Nhóm câu
Nhóm câu lệnh_2 lệnh_2 lệnh_1

if a % b == 0:
print(b,’ là ước của’, a)
else:
print(b,’ không phải là ước của’, a)
65
Bài 7
THỰC HÀNH
CÂU LỆNH RẼ NHÁNH

Nếu nhiệt độ t ngoài trời nhỏ hơn 100C – if t < 10:


đưa ra thông báo “Rét đậm” print(‘Rét đậm.’)

Nếu nồng độ p của NaCl trong một lít nước if p > 1.0:
lớn hơn 1g/l thì đưa ra thông báo “Nước mặn” print(‘Nước mặn.’)

Nếu vật thể chuyển động với tốc độ v > 343 if v > 343:
m/gy thì đưa ra thông báo “Tốc độ siêu thanh”. print(‘Tốc độ siêu thanh.’)
67
Bài 2. Chia kẹo
Có n chiếc kẹo và m em bé. Hãy viết chương trình nhập vào hai số nguyên dương n, m và
kiểm tra n chiếc kẹo có chia đều được cho m em bé hay không (thông báo ra màn hình “Cóˮ
hoặc “Khôngˮ). Chạy chương trình ba lần, mỗi lần với bộ dữ liệu n, m khác nhau.
Gợi ý: Để có thể chia đều số kẹo thì n phải chia hết cho m, như vậy ở đây cần kiểm tra số dư
của phép chia n cho m có bằng 0 hay không, tức là kiểm tra điều kiện n%m == 0.

Đáp án:

n, m = map(int,input().split())
if n%m == 0: print(‘Có’)
else: print(‘Không’)

68
Bài 3. Tìm lỗi sai
Cần viết else từ
đầu dòng
a < b

Chương trình tham khảo


a = float(input("a = "))
Đưa chú thích
b = float(input("b = "))
xuống cuối dòng
c = float(input("c = "))
print("Số ở giữa:",a+b+c-max(a,b,c)-min(a,b,c))

69
Bài 4. Tìm số lớn nhất

Có thể đưa vào máy tính để thực hiện


Để hiểu cách xử lý thông tin

70
Tiền điện
Trong tháng người dùng tiêu thụ x (kWh) điện. Nếu x ≤ a thì số tiền phải trả là x × d1, nếu a <
x ≤ b thì số tiền phải trả là a × d1 + (x – a) × d2, nếu x > b thì số tiền phải trả là a × d1 + (b
– a) × d2 + (x – b) × d3.
Em hãy viết chương trình nhập vào từ bàn phím các số nguyên dương a, b, d1, d2, d3 và x,
tính và đưa ra màn hình số tiền điện phải trả. Tìm hiểu bảng giá điện hiện hành và chạy chương
trình một số lần sao cho có đủ các bộ dữ liệu đầu vào đại diện cho các mức tính tiền điện.

Đáp án:
a, b, d1, d2, d3, x = map(int,input().split())
if x <= a: ans = x*d1
else:
if x <= b: ans = a*d1+(x-a)*d2
else: ans = a*d1+(b-a)*d2+(x-b)*d3
print(ans)
71
BÀI 8 CÂU LỆNH LẶP 72
Bài toán. Tính tổng các số chia hết cho 3
Viết chương trình nhập vào số nguyên n và in ra tổng các số nguyên dương chia hết cho 3
không lớn hơn n.
Dữ liệu: Nhập từ thiết bị vào chuẩn số nguyên n (n > 0).
Kết quả: Đưa ra màn hình một số nguyên – tổng tính được.

Ví dụ:
INPUT OUTPUT
10 18
Giải thuật
 Nhập số nguyên n
 Chuẩn bị tích lũy kết quả vào biến sum: Cho sum nhận giá trị 0.
 Duyệt các số nguyên i với giá trị lần lượt từ 1 đến n-1: i = 1, 2, 3, 4, 5, ...
 Kiểm tra nếu i chia hết cho 3 → tích lũy i vào kết quả:

if i%3 == 0: sum = sum + i

Điều kiện i chia hết


cho 3

Câu lệnh được lặp lại với i = 1, 2, 3, . . ., n-1


 Đưa ra sum
Nhập số nguyên n
Chuẩn bị tích lũy kết quả vào biến sum
Với mọi số nguyên i lần lượt từ 1 đến trước n
 Kiểm tra nếu i chia hết cho 3 → tích lũy i vào sum
Đưa ra sum

Bắt đầu từ 1
n = int(input('n = ')) Câu lệnh cần thực hiện lặp lại
sum = 0 Lệnh lặp i còn bé hơn nhiều lần
for i in range(1, n):
if i%3 == 0: sum = sum + i # sum += i
print("Tổng của các số tự nhiên nhỏ hơn",n,"và chia hết cho 3 là:", sum)

Viết lùi
Cách viết để thực hiện lặp nhiều lần câu lệnh hoặc nhóm câu lệnh

Ví dụ một câu lệnh for


Cách viết để thực hiện lặp nhiều lần câu lệnh hoặc nhóm câu lệnh

Bài toán. Các phần mềm ứng dụng mang tính cá nhân thường dùng mật khẩu để xác nhận
quyền sử dụng. Chương trình dưới đây yêu cầu người dùng nhập mật khẩu.
Người dùng sẽ được yêu cầu nhập lại cho đến khi nhập đúng mật khẩu (là HN123). Khi dữ
liệu nhập vào đúng là “HN123ˮ thì thông điệp “Bạn đã nhập đúng mật khẩuˮ xuất hiện trên
màn hình.
Nhập mật khẩu,
Không biết trước
Chừng nào mật khẩu ≠ HN123:
số lần lặp
Nhập mật khẩu
Thông báo đã nhập đúng mật khẩu Điều kiện còn lặp

password = input("Nhập mật khẩu: ")


while password != "HN123":
password = input("Nhập mật khẩu: ")
print("Bạn đã nhập đúng mật khẩu")
Viết lùi
Cách viết để thực hiện lặp nhiều lần câu lệnh hoặc nhóm câu lệnh
Ví dụ 6. Chương trình ở Hình 6 khi thực hiện sẽ in ra màn hình các số từ 1 đến 6. Điều kiện
lặp là sodem <= 6. Khi điều kiện lặp đúng thì sodem được in ra màn hình và được tăng lên 1
đơn vị, rồi điều kiện lặp được kiểm tra lại. Quá trình trên được lặp lại cho đến khi sodem > 6
thì vòng lặp kết thúc.

Đáp án: for i in range(1, 7): print(i)


F35_B. In ra các số chia hết 3 trong khoảng
Viết chương trình nhập vào các số nguyên m và n,(m, n > 0).
Đưa ra các số nguyên dương chia hết cho 3 trong khoảng [m, n] theo thứ tự tăng dần.
Dữ liệu: Nhập từ thiết bị vào chuẩn số nguyên m, n (m, n > 0).
Kết quả: Đưa ra trên một dòng các số tìm được, theo thứ tự tăng dần, các số cách nhau một
dấu cách.
Ví dụ:
INPUT OUTPUT
8 20 9 12 15 18
Chương trình Python
Chương trình I

Bỏ qua các câu lệnh còn lại trong


nhóm câu lệnh cần lặp
m, n = map(int,input().split())
for i in range(m,n+1):
if i%3 > 0: continue # Không chia hết cho 3: Bỏ qua
print(i, end = ' ')

Nhóm câu lệnh cần lặp


Chương trình Python
Chương trình II
m, n = map(int,input().split())
i = m
while i <= n:
if i%3 == 0: print(i, end = ' ')
i += 1

Chương trình III

m, n = map(int,input().split())
i = m-1
while i < n:
i += 1
if i%3 > 0: continue
print(i, end = ' ')
Tổng quát CÂU LỆNH LẶP Được thực hiện chừng nào điều kiện sau while
còn đúng hoặc chưa gặp break (nếu có)
Câu lệnh while
while
Điều_kiện :

Câu lệnh while


Nhóm câu lệnh sau
n = int(input())
ans = 0

while
continue
Có thể có k = 2
hoặc không
break while k*k <= n:
if n%k == 0: ans += 2
k += 1

if (k-1)**2 == n: ans -= 1
print(ans)
Tìm số lượng ước thực sự của n
(Ước khác 1 và n)
Ví dụ: n = 16 → ans = 3 82
CÂU LỆNH LẶP Câu lệnh for

Có nhiều cách Được thực hiện với i = 0, 1,


Biến điều khiển
viết dòng đầu 2, . . ., n-1 hoặc cho đến khi gặp
vòng lặp
break (nếu có)

for i in range(n):
n,a,b = map(int,input().split())

Nhóm câu lệnh sau

Câu lệnh for


ans = 0
for i in range(n):
continue if i%a == 0 and i%b != 0:

for
Có thể có
hoặc không ans += 1
break
print(ans)

Đếm số lượng số nguyên không âm nhỏ hơn n


chia hết cho a và không chia hết cho b.

Ví dụ: n = 100, a = 6 b = 10 → ans = 13


83
Bài 1. Em hãy dự đoán chương trình
Bài 2. Trong các chương trình trò chơi truyền hình, người
hình dưới đây đưa ra màn hình những
dẫn chương trình thường đếm ngược để bắt đầu trò chơi.
gì.
Em hãy viết chương trình nhập một số nguyên dương n,
sau đó in ra các giá trị từ n về 1 để mô phỏng quá trình
đếm ngược.

Đáp án:
1 2
2 4
3 6
4 8
5 10
6 12
7 14 Đáp án:
8 16
9 18 n = int(input(‘n = ‘))
10 20 for i in range(n,0,-1): print(i)
Mẹ em dự định gửi tiết kiệm một khoản tiền tại một ngân hàng có lãi suất 5% một năm,
nghĩa là sau mỗi năm tiền lãi nhận được là 5% số tiền gửi. Hết một năm, nếu mẹ không rút tiền
thì cả vốn lẫn lãi sẽ tự động được gửi tính cho năm tiếp theo. Em hãy viết chương trình nhập vào
số tiền T (đơn vị triệu đồng) sau đó tính và đưa ra 10 dòng, mỗi dòng ghi số tiền sau mỗi năm
trong 10 năm gửi liên tiếp cả gốc lẫn lãi để mẹ tham khảo.

Đáp án:

số_tiền = 1_000_000*int(input('T = '))


for i in range(1,11):
số_tiền = int(số_tiền*1.05)
print('Sau', i, 'năm số tiền sẽ là:',số_tiền)
Trong các câu sau đây, những câu nào đúng?

1) Trong các ngôn ngữ lập trình bậc cao đều có câu lệnh thể hiện cấu trúc lặp.

2) Trong Python chỉ có câu lệnh lặp while để thể hiện cấu trúc lặp.

3) Trong Python chỉ có câu lệnh lặp for để thể hiện cấu trúc lặp.

4) Có thể sử dụng câu lệnh while để thể hiện cấu trúc lặp với số lần lặp biết trước.

5) Có thể sử dụng câu lệnh for để thể hiện cấu trúc lặp với số lần lặp chưa biết trước.

Đáp án: Những câu đúng: 1 4


BÀI 9. THỰC HÀNH CÂU LỆNH LẶP
Bài 1. Làm quen với câu lệnh lặp trong Python
Em hãy dự đoán xem chương trình ở Hình 1 sau đây sẽ đưa ra màn hình những gì.
Chạy chương trình để kiểm tra kết quả.

Đáp án: Chương trình đưa ra 100 dòng,

Dòng thứ i chứa 2 số nguyên: i và tổng các số tự nhiên từ 1 tới i.


Bài 2. Đếm các ước thực sự của một số nguyên

Bạn Hà viết chương trình ở Hình 2 để đếm


xem số nguyên n nhập vào từ bàn phím có bao
nhiêu ước số thực sự (ước khác 1 và n). Tuy
nhiên, chương trình chạy ra kết quả sai.
Em hãy sửa lỗi giúp bạn Hà.

Đáp án: Lỗi ở các vị trí được đánh dấu,


Chương trình đúng:

n = int(input('n = '))
i = 2
so_uoc = 0
while i <= n//2:
if n%i == 0: so_uoc = so_uoc + 1
i = i + 1
print(n, "có số ước thực sự là:", so_uoc)
Bài 3. Nhập dữ liệu có kiểm tra
Tham khảo chương trình ở Ví dụ 5 trong Bài 8, em hãy viết chương trình yêu cầu người dùng
nhập một số nguyên lớn hơn 1 000 000. Chừng nào người dùng nhập chưa đúng yêu cầu thì
có thông báo yêu cầu nhập lại, chương trình chỉ kết thúc với thông báo “Cảm ơn, bạn đã nhập
dữ liệu đúng yêu cầu.” khi số người dùng gõ vào thoả điều kiện đặt ra.

Đáp án:

Ký tự tách số cho dễ đọc

n = 1
while n <= 1_000_000:
n = int(input('Hãy nhập số nguyên lớn hơn 1 000 000: '))
print('Cám ơn, bạn đã nhập dữ liệu đúng yêu cầu.')
Đáp án:
n, m = map(int,input('n, m = ').split())
gà = n
if n%2 > 0 or m%2 > 0 or 2*n > m: gà = -1
if gà >= 0:
chó = (m - n*2)//2
gà = gà - chó
if gà < 0: print('Vô nghiệm.')
else: print('Số gà:',gà,'Số chó:',chó)
CHƯƠNG TRÌNH CON VÀ THƯ VIỆN
BÀI 10
CÁC CHƯƠNG TRÌNH CON CÓ SẴN
CHƯƠNG TRÌNH CON VÀ THƯ VIỆN CÁC CHƯƠNG TRÌNH CON SẴN CÓ
Chương trình con Hàm
Còn có thể
Toán học Tin học (Python) ngắn gọn hơn

Gọi f(x) = 6x + 1 def f(x):


t = 6*x + 1
Yêu cầu: Tính v = f(8) + 4 return t
Hàm
v = f(8) + 4 print(f(8) + 4)
= 49 + 4
Sử dụng
= 53
93
V. CHƯƠNG TRÌNH CON VÀ THƯ VIỆN CÁC CHƯƠNG TRÌNH CON SẴN CÓ

V.1.1 – Hàm Như tên biến Có thể không có!

def tên_hàm( Danh_sách_biến_ cần_ thay_ thế): Viết trước khi sử dụng
(trước khi gọi hàm)

Thông thường: Ở đầu chương trình

Chú ý
khoảng Có thể có câu return biểu_thức
cách lệnh:
Gán giá trị cho
tên hàm
Khi gọi hàm: Nêu danh sách biến cần để tính (nếu có)
Hàm không chứa lệnh return: Dùng như câu lệnh 94
Hàm có lệnh return: Dùng như một biến trong biểu thức
95
Chuyển dữ liệu cho hàm thực hiện
Ví dụ 2. Chương trình ở Hình 4 khai báo và sử dụng hàm BMI(h,w) tính chỉ số sức khoẻ
BMI theo hai tham số chiều cao và cân nặng. Lời gọi BMI(cao,nang) đã làm hàm
BMI(h,w) được thực hiện với h có giá trị của biến cao, w có giá trị của biến nang. Giá trị
của hai biến cao và nang của chương trình đã được nhập vào từ bàn phím trước khi chương
trình gọi thực hiện hàm BMI(h,w).

96
Hàm có trả về giá trị
Hàm có lệnh return: Dùng như một biến trong biểu thức

97
Các hàm được xây dựng sẵn THƯ VIỆN
Trong mỗi hệ thống ngôn ngữ lập trình bậc cao:
Những phép xử lý thường gặp ở từng lĩnh vực ứng dụng

Các hàm được xây dựng sẵn

Thư viện toán học


math

sqrt(x)
gcd(x,y)

98
Các cách kết nối với thư viện

99
Bài 1. Với hàm BCNN được xây dựng ở chương trình sau đây (Hình 8), trong những
dòng lệnh có sử dụng hàm BCNN, dòng lệnh nào đúng, dòng lệnh nào sai và tại sao?

Thiếu các tham số

100
Bài 2. Chương trình ở Hình 9 xây dựng một hàm tính diện tích một tam giác bằng công thức
Heron theo ba cạnh của tam giác. Em hãy hoàn thiện chương trình bằng lời gọi hàm thích hợp
để đưa ra màn hình kết quả tính diện tích của tam giác có ba cạnh là 3, 4, 5.

Đáp án:
def dientichtg (a, b, c):
p = (a + b + c)/2
s = p*(p - a)*(p - b)*(p - c)
return s**0.5

a, b, c = map(int, input('Các cạnh tam giác: ').split())


print(dientichtg(a,b,c))
101
Sử dụng kết quả của Bài 2 phần Luyện tập, em hãy viết chương trình giải bài toán ở
Hoạt động 1.
Bài toán: Cho ba tam giác có độ dài ba cạnh lần lượt là a, b và c; u, v và w; p, q và r. Độ dài các cạnh
đều là số thực cùng đơn vị đo. Em hãy tính diện tích của mỗi tam giác đó và đưa ra diện tích lớn nhất
trong các diện tích tính được.
Công thức Heron tính diện tích tam giác theo độ dài ba cạnh:

Đáp án:
from math import sqrt
def dientichtg (a, b, c):
p = a + b + c
s = sqrt(p*(p - 2*a)*(p - 2*b)*(p - 2*c))/4
return s

a, b, c = map(int, input('Các cạnh tam giác thứ nhất: ').split())


u, v, w = map(int, input('Các cạnh tam giác thứ hai: ').split())
p, q, r = map(int, input('Các cạnh tam giác thứ ba: ').split())

print(max(dientichtg(a,b,c),dientichtg(u,v,w),dientichtg(p,q,r))) 102
Ngắn gọn hơn:

from math import sqrt


def dientichtg ():
a, b, c = map(int, input('Các cạnh tam giác: ').split())
p = a + b + c
s = sqrt(p*(p - 2*a)*(p - 2*b)*(p - 2*c))/4
return s

print(max(dientichtg(),dientichtg(),dientichtg()))

103
Trong các câu sau đây, những câu nào đúng?

1) Sử dụng chương trình con sẽ làm chương trình dễ hiểu, dễ tìm lỗi hơn.

2) Hàm chỉ được gọi một lần duy nhất ở chương trình chính.

3) Hàm luôn trả một giá trị qua tên của hàm.

4) Python chỉ cho phép chương trình gọi một hàm xây dựng sẵn trong các thư viện của Python

5) Khai báo hàm trong Python luôn có danh sách tham số.

Đáp án: Câu đúng: 1

104
105
Bài 11 THỰC HÀNH LẬP TRÌNH
VỚI HÀM VÀ THƯ VIỆN

106
Bài 1. Giải phương trình

Chương trình cho trong Hình 1 nhằm


tạo một bảng chọn việc, để người chạy
chương trình chọn cho máy tính giúp
giải phương trình bậc nhất hay giải
phương trình bậc hai.

Em hãy đưa khai báo của các hàm thực


hiện hai việc nói trên và các lời gọi
chúng vào đúng chỗ trong chương
trình. Sau đó hãy chạy thử chương
trình với một số dữ liệu đầu vào khác
nhau để kiểm thử chương trình.

107
Đáp án:
def GPTB1():
# ax+b = 0
a, b = map(float,input('a, b = ').split())
if a == b == 0: print('PT vô định.')
elif a == 0 and b != 0: print('PT vô nghiệm.')
else: print('Nghiệm PT:', -b/a)

def GPTB2():
# ax^2 + bx + c = 0, a != 0
from math import sqrt
a, b, c = map(float,input('a, b, c = ').split())
delta = b*b - 4*a*c
if delta < 0: print('PT vô nghiệm.')
else:
x1 = (-b - sqrt(delta))/(2*a)
x2 = -b/a - x1
print('x1 =',x1,'x2 =',x2)
108
# Tạo bảng chọn việc
while True:
print ("****************************")
print (' BẢNG CHỌN VIỆC ')
print ('1. Giải phương trình bậc nhất ')
print ('2. Giải phương trình bậc hai ')
print ('3. Thoát khỏi công việc ')
print ("****************************")
chon = input(' Hãy chọn (1 hay 2 hay 3): ')
if chon == "1":
print (' Giải phương trình bậc nhất')
GPTB1()
elif chon == "2":
print (' Giải phương trình bậc hai')
GPTB2()
else:
print (' Tạm biệt')
break 109
Bài 2. Thời gian gặp nhau

Hiện tại, anh trai Khánh Nam đang ở thành phố A còn em gái
Sương Mai đang ở thành phố B. Khoảng cách giữa hai thành
phố đó là d km. Hai anh em đi ô tô xuất phát cùng một thời
điểm từ hai thành phố, ô tô khởi hành từ A đi về B với tốc độ
không đổi v1 km/h, ô tô khởi hành từ B đi đến A với tốc độ
không đổi v2 km/h; trong đó d, v1, v2 là các số thực. Chương
trình ở Hình 2 khai báo hàm mtime với các tham số d, v1, v2
để
xác định thời gian hai ô tô gặp nhau tính từ lúc xuất phát.
Em hãy:
1) Hoàn thiện chương trình ở Hình 2a bằng cách bổ sung cho
chương trình lời gọi hàm mtime với dữ liệu nhập từ bàn phím.
2) Chạy chương trình và chạy thử chương trình với ít nhất hai
bộ dữ liệu vào khác nhau.
Hướng dẫn: Viết hàm mtime với tham số d, v1, v2 và trả về
thời gian gặp nhau

110
Đáp án:

def mtime():
d = float(input("d = "))
v1 = float(input("v1 = "))
v2 = float(input("v2 = "))
t = v1+v2
return d/t

print(' Hai xe gặp nhau sau',mtime(),'giờ.')

111
Bài 3. Thời gian thực hiện chương trình

Hàm time (với lời gọi time()) trong thư viện time cho biết thời gian tại thời điểm hiện tại
(tính theo giây). Để biết thời gian thực hiện chương trình, người ta ghi nhận thời điểm lúc bắt
đầu thực hiện chương trình, thời điểm lúc kết thúc chương trình và đưa ra hiệu các thời điểm
đã xác định. Em hãy gắn hàm time từ thư viện time vào một số chương trình đã có của em
và đưa ra thời gian thực hiện chương trình.
Hướng dẫn:
– Gắn thư viện time vào chương trình: import time
– Để ghi nhận thời điểm bắt đầu viết câu lệnh đầu tiên là: tb = time.time()
– Cuối chương trình, đưa ra thời gian thực hiện: time.time()-tb
– Để cho đẹp: Nên dùng quy cách %.4f hoặc dùng hàm round để đưa ra thời gian thực hiện
chương trình với bốn chữ số ở phần thập phân (Hình 3).

112
Ví dụ:

import time
tb = time.time()
n = 0
s = 0
x = int(input())
while x > 0:
n = n + 1
s = s + x
x = int(input())
if n > 0 : print('Trung bình cộng:',s/n)
print(‘Time:’,round(time.time()-tb,4))

113
Viết chương trình vẽ một hình chữ nhật bằng các dấu # với một
cạnh có độ dài bằng 10, một cạnh có độ dài bằng a. ##########
##########
Ví dụ với a = 4, hình chữ nhật cần vẽ như hình bên. ##########
Yêu cầu xây dựng một hàm Drawbox với tham số (a), hàm này đưa ra ##########
màn hình các dòng, mỗi dòng chứa 10 dấu # liên tiếp và tham số a quyết
định số dòng sẽ được đưa ra. Chương trình gọi hàm Drawbox(a)với a
nhập vào từ bàn phím.

Đáp án:
def Drawbox(a):
for i in range(a): print('##########')

a = int(input('a = '))
Drawbox(a)

114
ài 12
B
LI ỆU Í TỰ
U D Ữ U K
KIỂ Ử LÍ X Â
Ự - X
KÍ T
XÂU

115
116
117
CÁC PHÉP TÍNH VỚI XÂU KÝ TỰ

Xâu: dãy ký tự bất kỳ được đặt trong cặp dấu nháy đơn hoặc dấu nháy kép
Các phép tính với xâu:

Gán xâu
Cộng xâu
Nhân với biểu thức giá trị nguyên

Các ký tự đánh số từ trái sang phải, bắt đầu từ 0


Có thể truy cập tới ký tự thứ i : s[i]

Python không cho phép thay đổi ký tự trong xâu hiện có!
118
VI. KIỂU DỮ LIỆU XÂU KÝ TỰ MỘT SỐ HÀM VÀ PHƯƠNG THỨC XỬ LÝ XÂU
len(x) - Cho độ dài của xâu x.
y.count(x) – Đếm số lần xuất hiện không giao nhau của x trong y.
 y.count(x,i) – Tìm số lần xuất hiện của x trong y bắt đầu từ vị trí i của y,
 y.count(x,i,j) – Tìm số lần xuất hiện của x trong y bắt đầu từ vị trí i cho tới trước vị trí
j của y.
Hàm y.find(x) trả về một số nguyên xác định vị trí đầu tiên trong y mà từ đó x xuất hiện như
một xâu con
 Tồn tại các phương thức y.find(x,i) và y.find(x,i,j)
 Kết quả trả về sẽ là -1 nếu không tìm thấy.
Hàm y.replace(x1,x2) tạo xâu mới từ xâu y bằng cách thay thế xâu con x1 không giao
nhau của y bằng xâu x2
 y.replace(x1,x2,n) – Chỉ thay thế trong n lần đầu gặp x1
Hàm y.upper() tạo xâu mới biến đổi các ký tự chữ cái trong xâu y thành chữ cái hoa, giữ
nguyên các ký tự không phải là chữ cái
Hàm y.lower() tạo xâu mới biến đổi các ký tự chữ cái trong xâu y thành chữ cái
thường, giữ nguyên các ký tự không phải là chữ cái 119
Các ví dụ xử lý xâu
Đếm số lần xuất hiện xâu con

Tìm vị trí xuất hiện lần đầu tiên của một xâu trong xâu khác

Thay thế xâu con

120
Trúc xinh trúc mọc bờ ao Trúc xinh trúc mọc sân đình
Em xinh em đứng một mình cũng xinh
KIỂU DỮ LIỆU XÂU KÝ TỰ Xác định xâu con (lát cắt)
[m:n] – Xác định xâu con từ ký tự vị trí m đến trước vị trí n,
[:m] – lấy ra m ký tự đầu tiên, s = ‘Olympiad’
0 1 2 3 4 5 6 7
[m:] – bỏ m ký tự đầu tiên,
s[1:5] ‘lymp’ O l y m p i a d
[:] – Lấy toàn bộ xâu,
s[:4] ‘Olym’ O l y m p i a d
[m:n:k] – Trích ra xâu con
bắt đầu từ vị trí m cho tới trước s[4:] ‘piad’ O l y m p i a d
vị trí n với bước là k, s[:] ‘Olympiad’
[::-1] – Đảo ngược xâu. s[1:7:2] ‘lmi’ O l y m p i a d
s[::-1] ‘daipmylO’ O l y m p i a d
Biết

121
Bài 1. Hãy dự đoán kết quả đưa ra màn hình sau mỗi câu lệnh xuất dữ liệu print() trong
chương trình ở hình bên và sau đó dùng cửa sổ Shell để đối chiếu, kiểm tra từng kết quả dự đoán.

Đáp án:

Bài 2. Em hãy viết chương trình nhập từ bàn phím xâu s ghi ngày tháng dạng dd/mm/yyyy, trong đó dd là hai kí
tự chỉ ngày, mm là hai kí tự chỉ tháng, yyyy là bốn kí tự chỉ năm. Sau đó đưa ra màn hình ngày, tháng, năm dưới
dạng xâu “Ngày dd tháng mm năm yyyy”.
Ví dụ:

Đáp án:
s = input()
print('Ngày',s[:2],'tháng',s[3:5],'năm',s[6:])
Nhập vào từ bàn phím hai xâu s1 và s2, mỗi xâu không chứa kí tự dấu cách ở đầu và cuối xâu
cũng như không chứa hai hay nhiều dấu cách liên tiếp nhau. Nếu xâu không chứa dấu cách thì nó là một
từ, trong trường hợp ngược lại, dấu cách là dấu phân tách các từ trong xâu. Ví dụ, xâu “Bước tới Đèo
Ngang, bóng xế tà” chứa bảy từ.
Em hãy viết chương trình xác định và đưa ra màn hình tổng số từ trong hai xâu s1 và s2 đã cho.
Ví dụ:

Đáp án:

s1 = input()
s2 = input()
print(s1.count(' ')+s2.count(' ')+2)
123
Trong các câu sau đây, những câu nào đúng?

1) Có thể ghép các xâu để được xâu mới.

2) Có thể tìm vị trí một xâu con trong một xâu.

3) Không thể xoá một xâu con trong một xâu.

4) Không thể đếm số lần xuất hiện một xâu con trong một xâu.

Đáp án: Câu đúng: 1 2 3

124
125
Tìm hiểu thêm: thay thế bàn phím và màn hình bằng file

126
Bài 13 THỰC HÀNH DỮ LIỆU KIỂU XÂU

Bài 1. Xoá kí tự trong xâu


1) Em hãy viết chương trình tạo một xâu mới từ xâu s đã cho bằng việc xoá những kí tự
được chỉ định trước.
Hướng dẫn: Xoá kí tự tương đương với việc thay kí tự đó bằng kí tự rỗng.
2) Em hãy chạy thử chương trình và kiểm tra kết quả.
Ví dụ:

127
THỰC HÀNH DỮ LIỆU KIỂU XÂU
Bài 2. Giúp bạn tìm và sửa lỗi chương trình
Tên tệp thường gồm hai phần: phần tên và phần mở rộng được ngăn cách nhau bởi dấu “.”.
Ví dụ, các tệp chương trình Python có phần mở rộng là “py”, các tệp văn bản có phần mở
rộng là “doc” hoặc “docx”. Trong hệ điều hành Windows, tên tệp không phân biệt chữ hoa và
chữ thường. Bạn Khánh Linh muốn viết chương trình nhập vào một xâu là tên của một tệp và
kiểm tra xem tên tệp đó có phải là tên của tệp chương trình Python trong hệ điều hành
Windows không.
Khánh Linh đã nghĩ ra thuật toán, bằng cách lấy ra hai kí tự cuối cùng của xâu rồi so
sánh với xâu “py”. Tuy nhiên, chương trình do Khánh Linh viết vẫn còn có lỗi. Em hãy
giúp bạn Khánh Linh tìm và sửa lỗi để chương trình chạy được và đưa ra kết quả đúng.

128
Đáp án: Các chỗ sai

len
2

Chuẩn hóa về
chữ thường

fileName = input("Nhập một tên tệp: ")

Length = len(fileName)
extensionName = fileName[Length - 2:] #Lấy hai kí tự cuối cùng của xâu fileName
if extensionName.lower() =="py":
print(fileName, "là tệp mã nguồn Python")
else:
print(fileName, "không phải là tệp mã nguồn Python")
129
THỰC HÀNH DỮ LIỆU KIỂU XÂU
Bài 3. Xác định toạ độ
1) Tìm hiểu bài toán: Robot thám hiểm Sao Hoả đang ở điểm có toạ độ (0; 0) nhận
được dòng lệnh điều khiển từ Trái Đất. Dòng lệnh chỉ chứa các kí tự từ tập kí tự
{E, S, W, N}, mỗi kí tự là một lệnh di chuyển với quãng đường bằng một đơn vị độ
dài. Lệnh E – đi về hướng đông, lệnh S – đi về hướng nam, lệnh W – đi về hướng
tây
và lệnh N – đi về hướng bắc. Trục Ox của hệ toạ độ chạy từ tây sang đông, trục Oy
– chạy từ nam lên bắc. Em hãy xác định toạ độ của robot sau khi thực hiện lệnh di
chuyển nhận được.
Ví dụ: Với dòng lệnh “ENENWWWS”, sau khi thực hiện robot sẽ tới vị trí (‒1; 1) Đường đi của robot
Gợi ý: Toạ độ x của đích tới bằng số lượng kí tự 'E' trừ số lượng kí tự 'W'.
Toạ độ y của đích tới bằng số lượng kí tự 'N' trừ số lượng kí tự 'S'. Đáp án:
2) Em hãy đọc hiểu và chạy thử chương trình ở dưới đây và cho biết chương trình đó có giải quyết được bài toán
ở mục 1) hay không.

130
THỰC HÀNH DỮ LIỆU KIỂU XÂU
Tên gọi chữ số bằng tiếng Anh

Em hãy viết chương trình nhập vào từ bàn phím một chữ số trong hệ thập phân, đưa ra màn
hình tên gọi của chữ số đó bằng tiếng Anh.
Ví dụ:

Đáp án: Trong phạm vi kiến thức đã học có thể giải bài toán đã nêu theo cách sau:

Tạo xâu names lưu tên các chữ số, mỗi tên 5 ký tự (bổ sung dấu cách ở cuối nếu chưa đủ 5)
zero one two three four five six seven eight nine

Tên chữ số p: Xâu con các ký tự names[p*5:p*5+5]

p = int(input())
names = 'zero one two threefour five six seveneightnine '
print(names[p*5:p*5+5])
131
Bài 14 KIỂU DỮ LIỆU
DANH SÁCH - XỬ LÍ DANH SÁCH

132
Kiểu dữ liệu danh sách

Danh sách các nhiệt độ


Số ngày trong tháng của năm không nhuận:
Tháng 1 2 3 4 5 6 7 8 9 10 11
12
Số ngày 31 28 31 30 31 30 31 31 30 31 30 31

Dãy số month

Lưu dưới dạng danh sách 133


Khởi tạo danh sách

Bằng phép gán a = [] # Tạo danh sách rỗng


b = [1, 4, 3, 2]

Dùng vòng lặp tính các phần tử


c = [ i*i for i in range(1,10)]
d = [[1,i*i4,for
9, i16,
in 25, 36, 49, 64,
range(1,10) 81] == 0]
if i%2
[4, 16, 36, 64]
Dùng hàm list(Dữ_liệu)
s = ‘Informatics’
ds = list(s)
tạo danh sách n phần tử nguyên bằng 0 e = [0]*n
Khởi[‘I’,‘n’,’f’,’o’,’r’,’m’,’a’,’t’,’i’,’c’,’s’] 134
e = [0]*4 [0, 0, 0, 0]
Nhập và xuất danh sách

Nhập danh sách:


Các số nguyên ghi trên một dòng, các số ghi cách nhau ít nhất một dấu cách:
ds = [int(i) for i in input().split()]
Các số thực ghi trên một dòng, các số ghi cách nhau ít nhất một dấu cách:
ds = [float(i) for i in input().split()]
Các xâu ghi trên một dòng, các xâu ghi cách nhau ít nhất một dấu cách:
ds = input().split()

Đưa ra danh sách: Đưa ra dạng lưu trữ trong máy: print(ds)
Đưa ra biên tập để đọc: print(*ds)

ds = input().split() Nhập dòng: Bài tập Vật lý


print(ds) [‘Bài’, ‘tập’, ‘Vật’, ‘lý’]
print(*ds) Bài tập Vật lý
135
KIỂU DỮ LIỆU DANH SÁCH – XỬ LÝ DANH SÁCH XỬ LÝ DANH SÁCH
Truy cập tới các phần tử trong danh sách: Tên_danh_sách[Chỉ_số]
Chỉ số có thể nhận giá trị âm (tính từ cuối về đầu)
Được phép trực tiếp gán giá trị mới cho phần tử của danh sách.

Có thể truy nhập theo lát cắt (tương tự như ở xâu) 136
KIỂU DỮ LIỆU DANH SÁCH – XỬ LÝ DANH SÁCH XỬ LÝ DANH SÁCH
Tạo một bản sao danh sách: Hai cách b = a[:]
Cộng các danh sách: b = list(a)
a = [1,2]
b = [7,8,9] + a + [0,1] b = [7,8,9,1,2,0,1]
Nhân một danh sách với số nguyên, biến nguyên giá trị không âm:
a = [1,2]
b = a*3 b = [1,2,1,2,1,2]
c = a*0 c = []

Duyệt các phần tử trong danh sách a:


 Duyệt mọi phần tử theo trình tự lưu trữ: for i in a:
 Duyệt các phần tử theo thứ tự tăng dần (bản thân a không bị sắp xếp lại):
for i in sorted(a):
 Duyệt các phần tử khác nhau của a: for i in set(a):
 Duyệt các phần tử khác nhau của a và không có trong b:
137
for i in set(a).difference(b):
KIỂU DỮ LIỆU DANH SÁCH – XỬ
LÝ DANH SÁCH HÀM VÀ PHƯƠNG THỨC XỬ LÝ DANH SÁCH

max(a) Trả về phần tử lớn nhất trong danh sách a (các phần tử phải cùng kiểu dữ liệu)
min(a) Trả về phần tử nhỏ nhất trong danh sách a (các phần tử phải cùng kiểu dữ liệu)
len(a) Trả về số lượng phần tử trong danh sách a
Trả về tổng các phần tử trong danh sách a
item in a Kiểm tra phần tử item có trong a hay không. Kết quả: True hoặc False
sum(a)
Bổ sung phần tử x vào cuối danh sách
a.append(x)
a.insert(i,x) Bổ sung phần tử x vào trước phần tử ở vị trí i
a.remove(x) Tìm phần tử đầu tiên trong danh sách bằng x và xóa
a.count(x) Trả về số lần xuất hiện x trong danh sách,
a.sort() Sắp xếp các phần tử theo thứ tự không giảm
a.sort(reverse=True) Sắp xếp các phần tử theo thứ tự không tăng
a.clear() Xóa nội dung của danh sách
138
Bài 1. Đọc chương trình sau đây và cho biết kết quả in ra màn hình. Em hãy soạn thảo và
chạy chương trình để kiểm tra dự đoán của em.

Đưa ra số lượng các số nhỏ hơn hoặc bằng


Đáp án: 100 trong dãy số nhập vào.

Bài 2. Bạn Thanh muốn tính trung bình cộng của nhiệt độ trung bình các ngày trong tuần.
Thanh đã viết được đoạn chương trình nhập từ bàn phím nhiệt độ trung bình của bảy ngày
trong tuần vào một danh sách (Hình dưới đây). Em hãy giúp bạn Thanh viết tiếp những câu
lệnh còn thiếu vào chỗ trống để máy tính đưa ra màn hình kết quả cần có.
Đáp án:
Cách I:
for i in nh_d: t = t + i
Cách II:
t = sum(nh_d) 139
Camera đặt cạnh trạm thu phí đường cao tốc ghi nhận nhiều thông tin, trong đó có mảng số
nhận dạng loại ô tô đi qua. Mỗi loại ô tô được mã hoá thành một số nguyên dương. Cho dãy số,
mỗi số là mã hoá về loại của một ô tô đi qua trạm thu phí.
Em hãy viết chương trình nhập dãy số mã hoá xe vào từ bàn phím và đưa ra màn hình số loại
xe khác nhau đã được nhận dạng.
Ví dụ:

Đáp án:

Nên định hướng lại các thiết bị chuẩn:


Bàn phím → file input.txt
Màn hình→ file output.txt
Lí do: Danh sách dữ liệu vào gồm nhiều số 140
Đáp án:
import sys
fi = open('input.txt')
fo = open('output.txt','w')
sys.stdin = fi
sys.stdout = fo

xe = [int(i) for i in input().split()]


xe.sort()
ans = 1
for i in range(1,len(xe)): print(len(set(xe)))
if xe[i] != xe[i-1]: ans = ans +1
print(ans)

fo.close()
fi.close()

141
Trong các câu sau đây, những câu nào đúng?

1) Trong các ngôn ngữ lập trình bậc cao đều có kiểu dữ liệu để lưu trữ một dãy hữu hạn các
phần tử.

2) Trong ngôn ngữ lập trình Python, dữ liệu kiểu danh sách là một dãy hữu hạn các phần tử
cho phép truy cập đến từng phần tử của nó.

3) Python bắt buộc các phần tử của một danh sách phải có cùng một kiểu dữ liệu.

4) Phải khởi tạo một danh sách trong Python bằng phép gán trong chương trình, không thể
nhập các phần tử của danh sách từ bàn phím.

5) Python chỉ cung cấp những hàm sau đây để xử lí danh sách: append(), pop(),
insert(), sort(), clear().

Đáp án: Câu đúng: 1 2


142
143
Bài 15 THỰC HÀNH VỚI KIỂU DỮ LIỆU DANH SÁCH
Bài 1. Cập nhật danh sách
Viết chương trình nhập vào từ bàn phím một danh sách các số nguyên, sau đó thực hiện:
– Thay thế các phần tử âm bằng ‒1, phần tử dương bằng 1, giữ nguyên các phần tử giá trị 0.
– Đưa ra màn hình danh sách nhận được

Hướng dẫn:
– Tạo danh sách a từ dữ liệu nhập vào.
– Duyệt các phần tử ai (với i = 0, 1, 2,...,
len(a)– 1); thay ai = 1 nếu ai > 0 và ai
= ‒1 nếu ai < 0.
Lưu ý: Lệnh print()chứa tham số end =
' ' để thêm dấu cách giữa các phần tử của
danh sách.
– Tham khảo chương trình ở Hình 1
Hướng dẫn:
– Tạo danh sách a từ dữ liệu nhập vào.
– Duyệt các phần tử ai (với i = 1, 2,...,
len(a)‒1), đếm các phần tử ai thoả mãn
điều
kiện ai‒1 < ai > ai+1.
– Tham khảo chương trình ở Hình 2.
Bài 3. Trò chơi với các chiếc giày
Có n đôi giày cùng loại chỉ khác nhau về kích cỡ được xếp thành một hàng theo
thứ tự ngẫu nhiên. Chủ trò bí mật rút một chiếc giày và giấu đi, sau đó yêu cầu
người chơi cho biết chiếc giày được giấu là chiếc giày trái hay phải và có số là
bao nhiêu.
Hà My muốn viết một chương trình nhập vào một dãy, mỗi số trong dãy mô tả
một chiếc giày, số có giá trị âm cho biết đó là giày trái, số có giá trị dương cho
biết đó là giày phải, giá trị tuyệt đối của số là kích cỡ của giày (Hình 3). Chương
trình sẽ cho biết chiếc giày nào còn thiếu trong dãy.

Cách làm thông thường để tìm ra chiếc giày còn thiếu là đi ghép các đôi giày, tuy nhiên cách làm này sẽ mất
nhiều thời gian. Một cách làm đơn giản là dựa trên nhận xét: Nếu dãy không thiếu chiếc giày nào thì tổng sẽ
bằng 0, nên có thể xác định chiếc giày còn thiếu khi biết tổng các số trong dãy. Hình 4 là chương trình mà Hà
My viết theo cách làm trên, tuy nhiên chương trình vẫn còn có lỗi. Em hãy giúp Hà My sửa các lỗi để nhận
được chương trình chạy được và cho ra kết quả đúng.
-sum
Quản lí tiền điện
Viết chương trình nhập vào 12 số nguyên dương tương ứng là tiền điện của 12 tháng
trong năm vừa rồi của nhà em, đưa ra màn hình các thông tin sau:
– Tổng số tiền điện của cả năm và tiền điện trung bình theo tháng.
– Liệt kê các tháng có số tiền điện nhiều hơn tiền điện trung bình theo tháng.
Đáp án: import sys
fi = open('input.txt')
fo = open('output.txt','w')
sys.stdin = fi
sys.stdout = fo

t = [int(i) for i in input().split()]


total = sum(t)
tb = total/12
print(total,tb)
for i in range(12):
if t[i] > tb: print(i+1,end = ' ')

fo.close()
fi.close()
Bài 16 KIỂM THỬ VÀ
GỠ LỖI CHƯƠNG TRÌNH
Phân loại lỗi

Hệ thống thông
báo

Lỗi cú pháp: Viết câu lệnh không đúng quy tắc a = (b + c * p


Thiếu hoặc thừa ngoặc
Lỗi ngoại lệ: Gặp tình huống không thực hiện được câu lệnh vì giá trị các biến
không phù hợp (Ví dụ, chia cho 0).

Lỗi ngữ nghĩa: Viết câu lệnh không đúng yêu cầu cần xử lý.
Ví dụ: Đưa ra nghiệm phương trình ax+b = 0 print(b/a)
(Câu lệnh đúng: print(-b/a) )
Tự tìm và sửa
Chương trình sau thực hiện yêu cầu nhập vào hai số nguyên p, q và danh sách a gồm các số nguyên, sau đó
đưa ra max{│ai│, i = p, p + 1,..., q}. Biết rằng các phần tử của danh sách a được đánh chỉ số bắt đầu từ 0 và
0 ≤ p ≤ q < len(a).

Cần q+1

Kết quả đúng Kết quả sai!


Truy vết với cách bổ sung câu lệnh theo dõi kết quả trung gian

Việc bổ sung thêm các câu lệnh đưa kết quả trung gian trong quá trình xử lý sẽ giúp:
 Xác định các đoạn chương trình không chứa lỗi,
 Cục bộ hóa được đoạn xử lý sai.
Thêm vào ở đâu và đưa ra cái gì:
Ví dụ: Kinh nghiệm!
Truy vết với công cụ gỡ lỗi của ngôn ngữ lập trình

Minh họa cách dung debug của hệ thống với một đoạn của một chương trình cụ thể,

Có thể xét chương trình đã nêu ở trên,

Chỉ nên dừng lại ở mức trình diễn!


Em hãy soạn thảo và thực hiện từng bước chương trình ở hình sau:

Thực hiện chương trình ở chế độ debug, theo dõi giá trị của i và s sau từng bước lặp:
 Trình chiếu cho cả lớp xem,
 Yêu cầu tự thực hiện lại toàn bộ quá trình.
Câu 1. Em hãy nêu một vài lỗi thuộc nhóm lỗi cú pháp và một vài lỗi thuộc nhóm lỗi
ngữ nghĩa.
if x > 0: res = res +1 a = [2, 4, 6]
else res = res - 1 print(a[3]//2)

print(sum(a) n = input()
m = n // 3

Câu 2. Tại sao phải tạo nhiều bộ dữ liệu vào khác nhau để kiểm thử chương trình?
Có thể chương trình chỉ sai ở vài trường hợp riêng.
Câu 3. Có bao nhiêu nhóm dữ liệu khác nhau cần tạo ra để kiểm thử chương trình?
Ba nhóm:  Dữ liệu ứng với trường hợp phổ biến, thường gặp,
 Dữ liệu ứng với trường hợp riêng, ít gặp,
 Dữ liệu ứng với trường hợp kích thước, giá trị lớn.

Câu 4. Có thể xem giá trị các biến sau khi thực hiện một câu lệnh ở đâu?
Ở cửa sổ debug.
Bài 17
THỰC HÀNH LẬP TRÌNH
GIẢI BÀI TOÁN TRÊN MÁY TÍNH
Bài 1. Cứu nạn
Em hãy mô tả thuật toán cho bài toán Cứu nạn sau đây bằng cách liệt kê các bước hoặc dùng sơ đồ khối.
Bài toán Cứu nạn
Một tàu đánh cá có ngư dân bị tai nạn cần cấp cứu đã gọi điện về cơ sở y tế ở đảo gần nhất cách đó d (hải lí). Để
người bị tai nạn được sơ cứu sớm hơn, tàu đánh cá đổi hướng, đi thẳng về phía đảo với vận tốc v1 (hải lí/giờ),
đồng thời từ đảo người ta cũng cho một tàu cứu nạn có thiết bị y tế sơ cứu đi theo đường đó tới hướng tàu cá với
vận tốc v2 (hải lí/giờ). Em hãy xác định sau bao lâu hai tàu gặp nhau, khi biết dữ liệu d, v1, v2.
Gợi ý: 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
d/(v1+v2) giờ.

B1. Nhập dữ liệu d, v1, v2,


B2. Đưa ra d/(v1+v2)
Bài 2. Dự trữ vacxin
Với bài toán Dự trữ vacxin sau đây, hãy thực hiện từng bước theo hướng dẫn để có chương trình giải quyết
được bài toán này.
Hướng dẫn
Bước 1. Tìm thuật toán và cách tổ chức dữ liệu (kết quả là mô tả thuật toán bằng liệt kê các bước hoặc sơ đồ
khối, dự kiến chọn kiểu dữ liệu cho các biến).
Bước 2. Viết chương trình và chạy thử với một vài bộ dữ liệu tự tạo để kiểm thử chương trình
Bài toán Dự trữ vacxin
Để sẵn sàng triển khai tiêm vacxin cho địa phương có nguy cơ bùng dịch cao, người ta cần dự trữ không ít hơn n
liều vacxin. Hiện nay trong kho đang có m liều vacxin. Trong nước có hai cơ sở A và B sản xuất vacxin. Nếu làm
việc hết công suất cơ sở A mỗi ngày sản xuất được pa liều, còn cơ sở B sản xuất được pb liều. Em hãy xác định
sớm nhất sau bao nhiêu ngày sẽ có đủ n liều vacxin.
Dữ liệu: Đưa vào từ thiết bị vào chuẩn của hệ thống, dòng đầu tiên chứa 2 số nguyên n và m (0 ≤ n, m ≤ 108 ),
dòng thứ hai chứa 2 số nguyên pa và pb (0 ≤ pa, pb ≤ 105).
Kết quả: Đưa ra từ thiết bị ra chuẩn của hệ thống một số nguyên là số ngày sớm nhất có đủ vacxin dự trữ theo
kế hoạch.
Ví dụ:
Giải thuật và chương trình
Nhập dữ liệu: n, m, pa, pb
Nếu n ≤ m: Đưa ra “0”
Trong trường hợp ngược lại:
Nếu pa == 0 và pb == 0: đưa ra “Không thể có đủ vacxin”
Nếu khác: Đưa ra (n-m)/(pa+pb) làm tròn lên đến số nguyên gần nhất.

n, m = map(int, input().split())
pa, pb = map(int, input().split())

if n <= m: print(0)
elif pa == 0 and pb == 0: print('Không thể có đủ vacxin.')
else: print((n-m+pa+pb-1)//(pa+pb))
Các bức ảnh
Trong một hoạt động ngoại khoá của lớp, giáo viên chủ nhiệm đã chụp được n bức ảnh, các bức ảnh
được lưu trên máy tính có kích thước tương ứng là d1, d2,..., dn (đơn vị Kb).
Giáo viên dự định ghi một số đĩa CD làm phần thưởng cho học sinh. Đĩa CD
mà giáo viên dùng chỉ có thể ghi tối đa W (đơn vị Kb). Vì tất cả các bức ảnh
đều rất đẹp và thú vị nên giáo viên muốn lựa chọn các bức ảnh để ghi vào đĩa
CD với tiêu chí càng nhiều bức ảnh được ghi vào đĩa CD càng tốt. Giáo viên
băn khoăn và muốn biết số lượng tối đa các bức ảnh có thể ghi vào đĩa CD là
bao nhiêu.
Em hãy chỉ ra kết quả từng bước thực hiện để có được chương trình nhận dữ liệu vào là các số nguyên W, d1, d2,...,
dn và trả về số lượng tối đa các bức ảnh có thể ghi vào đĩa CD

Đáp án:
Nhập dữ liệu: W và d = [d1, d2, . . ., dn] ,
Chuẩn bị: ans = 0
Duyệt với mọi v theo thứ tự tăng dần của di:
Nếu v ≤ W: Tăng ans lên 1 và cho W = W –v
Ngược lại: Thoát khỏi vòng lặp.
Đưa ra ans.
Bài 18 LẬP TRÌNH GIẢI QUYẾT BÀI TOÁN
TRÊN MÁY TÍNH
Quá trình giải một bài toán bằng lập trình
Bài toán tin học:
Thường gắn liền với các vấn đề thực tế trong cuộc sống,
Được phát biểu dưới dạng ngôn ngữ tự nhiên,
Gắn liền với bối cảnh xuất hiện bài toán.

Ví dụ: Bài toán Quản lí tiền điện


Em có dữ liệu về số tiền mà gia đình em chi trả cho tiêu thụ điện trong mỗi tháng của năm vừa rồi. Hãy tính tổng
số tiền điện gia đình em phải trả cho cả năm, tính số tiền điện trung bình phải trả mỗi tháng và liệt kê các tháng
dùng nhiều điện hơn trung bình cho mỗi tháng.
Dữ liệu: vào từ bàn phím gồm một dòng chứa 12 số nguyên, các số cách nhau bằng dấu cách, số thứ i là tiền điện
(tính theo đơn vị nghìn đồng) phải chi trả ở tháng i, (i = 1, 2,..., 12).
Kết quả: đưa ra màn hình, dòng thứ nhất là tổng số tiền phải trả trong cả năm, dòng thứ hai là thông báo về số tiền
trung bình hàng tháng phải trả, dòng thứ ba chứa danh sách các tháng dùng điện cao hơn mức trung bình .
Quá trình giải một bài toán bằng lập trình

Để giải bài toán đã cho cần:


 Xác định rõ bài toán yêu cầu tìm gì,
Phát biểu lại bài toán dưới dạng tóm tắt,
 Dữ liệu vào từ đâu, gồm những gì và được cho ở dạng nào,
Nêu các mối quan hệ toán học giữa
 Kết quả cần đưa ra đâu, đưa ra cái gì và như thế nào.
các đại lượng đã cho.

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

Cô đọng, ngắn gọn


Quá trình giải một bài toán bằng lập trình

Tìm thuật toán giải bài toán và cách tổ chức dữ liệu


Quá trình giải một bài toán bằng lập trình

Viết chương trình

Kiểm thử, chạy và hiệu chỉnh chương trình

Chuẩn bị các bộ dữ liệu Lưu ý phân biệt thông


Input/Output dịch và biên dịch
Bài 1. Có nhất thiết phải tìm được thuật toán trước khi viết chương trình để giải bài toán
đó không?

Đáp án: Có.

Bài 2. Nếu muốn học một ngôn ngữ lập trình bậc cao, em sẽ phải tìm hiểu những gì ở ngôn
ngữ lập trình đó?
Đáp án:
 Các quy định về cú pháp của ngôn ngữ
 Các loại câu lệnh và cách viết,
 Các kiểu dữ liệu thường sử dụng và những phép xử lý cơ bản gắn với những kiểu dữ liệu đó,
 Các thư viện chuẩn của ngôn ngữ,
Em hãy giới thiệu một bài toán thực tế mà em biết và trình bày các bước cần thực hiện để
giải quyết bài toán đó bằng máy tính.
Đáp án: Yêu cầu có tính mở, nội dung trả lời: đa dạng.

Trong các câu sau, những câu nào đúng?


1) Kết quả của bước xác định bài toán có ý nghĩa quan trọng đối với bước tìm thuật toán giải
bài toán.

2) Nếu không biết thuật toán của một bài toán thì không thể viết được chương trình để máy
tính giải quyết bài toán đó.

3) Việc viết chương trình không liên quan gì đến thuật toán và cách tổ chức dữ liệu.

4) Chỉ cần kiểm thử một chương trình khi không thực hiện được chương trình và gặp báo lỗi
trên màn hình.

Đáp án: Câu đúng: 1 2

You might also like