Trả lời nhanh
Nhập a, b, c bằng float(input()), kiểm tra điều kiện tam giác (a, b, c > 0 và tổng hai cạnh bất kì lớn hơn cạnh còn lại). Nếu hợp lệ, chu vi P = a + b + c, nửa chu vi p = P/2, diện tích S = √(p(p−a)(p−b)(p−c)) theo công thức Heron, dùng math.sqrt. Sau đó in P và S ra màn hình.
Phân tích bài toán
- Input: ba số thực a, b, c nhập từ bàn phím.
- Output: chu vi và diện tích tam giác in ra màn hình.
- Xử lí: kiểm tra ba số có tạo thành tam giác không, rồi mới tính.
Đề chỉ nói “hãy tính và đưa ra màn hình”, nhưng nếu không kiểm tra điều kiện thì khi nhập 1, 2, 10 chương trình sẽ gặp biểu thức âm trong căn và báo lỗi. Vì vậy một bài làm tốt nên có bước kiểm tra này.
Kiến thức toán cần dùng
| Đại lượng | Công thức | Viết trong Python |
|---|---|---|
| Điều kiện tam giác | a, b, c > 0; a + b > c; a + c > b; b + c > a | a+b>c and a+c>b and b+c>a |
| Chu vi | P = a + b + c | cv = a + b + c |
| Nửa chu vi | p = (a + b + c)/2 | p = cv / 2 |
| Diện tích (Heron) | S = √(p(p−a)(p−b)(p−c)) | math.sqrt(p*(p-a)*(p-b)*(p-c)) |
Chương trình Python hoàn chỉnh
import math
a = float(input("Nhập độ dài cạnh a: "))
b = float(input("Nhập độ dài cạnh b: "))
c = float(input("Nhập độ dài cạnh c: "))
if a > 0 and b > 0 and c > 0 and a + b > c and a + c > b and b + c > a:
cv = a + b + c
p = cv / 2
s = math.sqrt(p * (p - a) * (p - b) * (p - c))
print("Chu vi tam giác là:", cv)
print("Diện tích tam giác là:", round(s, 2))
else:
print("Ba số đã nhập không là độ dài ba cạnh của một tam giác")
Giải thích từng phần
import math: nạp thư viện toán học để dùng hàm căn bậc haimath.sqrt. Nếu quên dòng này, chương trình báoNameError.float(input(...)): hàminput()luôn trả về xâu kí tự, nên phải đổi sang số thực. Đề nói “số thực” nên dùngfloat, không dùngint.- Câu lệnh
ifkiểm tra điều kiện tam giác. Dùngandđể cả bốn điều kiện cùng đúng. - Tính chu vi, nửa chu vi rồi diện tích. Nhớ viết dấu
*giữa các thừa số, vì Python không hiểup(p-a)là phép nhân. round(s, 2): làm tròn diện tích đến 2 chữ số thập phân cho dễ đọc.
Chạy thử với các bộ dữ liệu
| a, b, c | Kết quả mong đợi | Giải thích |
|---|---|---|
| 3, 4, 5 | Chu vi 12; diện tích 6 | p = 6, S = √(6·3·2·1) = √36 = 6 |
| 5, 5, 6 | Chu vi 16; diện tích 12 | p = 8, S = √(8·3·3·2) = √144 = 12 |
| 13, 14, 15 | Chu vi 42; diện tích 84 | p = 21, S = √(21·8·7·6) = √7056 = 84 |
| 1, 2, 3 | Thông báo không là tam giác | 1 + 2 = 3, không lớn hơn 3 |
| −3, 4, 5 | Thông báo không là tam giác | có cạnh âm |
Lưu ý: với 3, 4, 5, dòng chu vi sẽ in 12.0 chứ không phải 12, vì dữ liệu được lưu dạng số thực. Đây không phải lỗi.
Cách viết gọn: nhập ba số trên một dòng
import math
a, b, c = map(float, input("Nhập a, b, c cách nhau bởi dấu cách: ").split())
if min(a, b, c) > 0 and a + b > c and a + c > b and b + c > a:
p = (a + b + c) / 2
print("Chu vi =", 2 * p)
print("Diện tích =", round(math.sqrt(p * (p - a) * (p - b) * (p - c)), 2))
else:
print("Không phải ba cạnh của tam giác")
Cách này dùng split() để tách xâu thành các phần và map(float, ...) để đổi từng phần sang số thực.
Lỗi thường gặp
- Quên đổi kiểu dữ liệu:
a = input()rồia + bsẽ nối xâu (“3” + “4” = “34”), không cộng số. - Kiểm tra thiếu điều kiện: chỉ kiểm tra a + b > c là chưa đủ, phải kiểm tra cả ba bất đẳng thức.
- Viết sai nửa chu vi:
p = a + b + c / 2chia mỗi c cho 2 do ưu tiên phép chia. Phải viết(a + b + c) / 2. - Lệch thụt lề: các lệnh trong
ifphải thụt vào cùng một mức. - Dùng dấu chấm phẩy hoặc dấu phẩy thập phân: khi nhập số thực phải gõ dấu chấm, ví dụ
2.5.
Mẹo nhớ
Hãy nhớ ba bước: nhập – kiểm tra – tính. Với công thức Heron, chỉ cần tính p trước, sau đó diện tích là căn của tích p với ba hiệu (p − cạnh). Có thể kiểm tra nhanh bằng tam giác vuông 3-4-5, có diện tích bằng nửa tích hai cạnh góc vuông: 3·4/2 = 6.
Bài luyện tập
- Chạy chương trình với a = 6, b = 8, c = 10. Kết quả là gì?
Đáp án: p = 12, S = √(12·6·4·2) = √576 = 24; chu vi 24. - Sửa chương trình để, ngoài chu vi và diện tích, in thêm độ dài đường cao ứng với cạnh a (ha = 2S/a).
Gợi ý: thêmha = 2 * s / avà in ra. Với 3, 4, 5 và a = 3 thì ha = 2·6/3 = 4. - Bổ sung để chương trình thông báo tam giác đó có phải tam giác vuông hay không.
Gợi ý: kiểm traa*a + b*b == c*c(và các hoán vị). Với số thực nên so sánh bằngabs(a*a + b*b - c*c) < 1e-9để tránh sai số.
Câu hỏi thường gặp
Vì sao phải kiểm tra điều kiện tam giác trước khi tính diện tích?
Nếu ba số không thoả mãn bất đẳng thức tam giác, biểu thức dưới dấu căn trong công thức Heron có thể âm và math.sqrt báo lỗi ValueError. Kiểm tra trước giúp chương trình thông báo rõ ràng thay vì dừng đột ngột.
Công thức Heron là gì?
Với tam giác có ba cạnh a, b, c và nửa chu vi p = (a + b + c)/2, diện tích S = √(p(p−a)(p−b)(p−c)). Công thức này tính được diện tích mà không cần biết chiều cao.
Có thể không dùng thư viện math không?
Có. Có thể tính căn bậc hai bằng phép luỹ thừa: s = (p*(p-a)*(p-b)*(p-c)) ** 0.5. Kết quả tương đương math.sqrt.
Tại sao diện tích in ra có nhiều chữ số thập phân?
Căn bậc hai thường là số vô tỉ nên Python in nhiều chữ số. Dùng round(s, 2) hoặc định dạng f"{s:.2f}" để làm tròn khi in.