Viết chương trình Python nhập a, b, c tính chu vi, diện tích tam giác

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

  1. import math: nạp thư viện toán học để dùng hàm căn bậc hai math.sqrt. Nếu quên dòng này, chương trình báo NameError.
  2. float(input(...)): hàm input() 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ùng float, không dùng int.
  3. Câu lệnh if kiểm tra điều kiện tam giác. Dùng and để cả bốn điều kiện cùng đúng.
  4. 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ểu p(p-a) là phép nhân.
  5. 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ồi a + b sẽ 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 / 2 chia 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 if phả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

  1. 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.
  2. 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êm ha = 2 * s / a và in ra. Với 3, 4, 5 và a = 3 thì ha = 2·6/3 = 4.
  3. 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 tra a*a + b*b == c*c (và các hoán vị). Với số thực nên so sánh bằng abs(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.