fork download
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4.  
  5.  
  6. void nhap_so(double&, double&, double&); // Hàm nhập ba cạnh
  7. void loai_tam_giac(double, double, double); // Hàm xác định loại tam giác
  8.  
  9. int main() {
  10. double a, b, c;
  11. nhap_so(a, b, c);
  12. loai_tam_giac(a, b, c);
  13. return 0;
  14. }
  15.  
  16. void nhap_so(double &a, double &b, double &c) {
  17. // Dùng vòng lặp để bắt người dùng nhập lại nếu nhập sai
  18. do {
  19. cout << "Nhap so cho canh dau tien : ";
  20. cin >> a;
  21. cout << "Nhap so cho canh thu hai : ";
  22. cin >> b;
  23. cout << "Nhap so cho canh thu ba : ";
  24. cin >> c;
  25.  
  26. // Nếu có cạnh <= 0 thì thông báo lỗi
  27. if (a <= 0 || b <= 0 || c <= 0)
  28. cout << "Canh khong hop le! Moi nhap lai.\n";
  29.  
  30. } while (a <= 0 || b <= 0 || c <= 0);
  31. }
  32.  
  33.  
  34. void loai_tam_giac(double a, double b, double c) {
  35. const double eps = 1e-6; // Sai số cho so sánh số thực (để tránh lỗi do làm tròn)
  36.  
  37. // Bước 1: Kiểm tra điều kiện tồn tại của tam giác
  38. // Tổng hai cạnh phải lớn hơn cạnh còn lại
  39. // Dùng "eps" để xử lý trường hợp sai số dấu phẩy động (floating point error)
  40. if (a + b <= c + eps || a + c <= b + eps || b + c <= a + eps) {
  41. cout << "Khong ton tai tam giac\n";
  42. return;
  43. }
  44.  
  45. // Bước 2: Xác định loại tam giác
  46. bool deu = false; // Biến đánh dấu tam giác đều
  47. bool can = false; // Biến đánh dấu tam giác cân
  48. bool vuong = false; // Biến đánh dấu tam giác vuông
  49.  
  50. // So sánh bằng "fabs(... ) < eps" để tránh sai số khi nhập số thực
  51. // Kiểm tra tam giác đều
  52. if (fabs(a - b) < eps && fabs(b - c) < eps)
  53. deu = true;
  54. // Kiểm tra tam giác cân
  55. else if (fabs(a - b) < eps || fabs(b - c) < eps || fabs(a - c) < eps)
  56. can = true;
  57.  
  58. // Kiểm tra tam giác vuông
  59. // Gọi maxSide là cạnh lớn nhất (vì cạnh lớn nhất sẽ là cạnh huyền nếu vuông)
  60. double maxSide = max(a, max(b, c));
  61.  
  62. // Tổng bình phương 3 cạnh = 2 * bình phương cạnh lớn nhất nếu tam giác vuông
  63. double sum = a*a + b*b + c*c;
  64. if (fabs(2 * maxSide * maxSide - sum) < eps)
  65. vuong = true;
  66.  
  67. // Bước 4: In kết quả
  68. // Ưu tiên phân loại đặc biệt trước (đều, vuông cân)
  69. if (deu)
  70. cout << "Tam giac deu\n";
  71. else if (vuong && can)
  72. cout << "Tam giac vuong can\n";
  73. else if (vuong)
  74. cout << "Tam giac vuong\n";
  75. else if (can)
  76. cout << "Tam giac can\n";
  77. else
  78. cout << "Tam giac thuong\n";
  79. }
  80.  
Success #stdin #stdout 0s 5316KB
stdin
Standard input is empty
stdout
Nhap so cho canh dau tien : Nhap so cho canh thu hai : Nhap so cho canh thu ba  : Khong ton tai tam giac