首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言經典練習:三角形分類與屬性計算完整解析

     編輯:關於C語言

問題描述

輸入三角形三邊長 x, y, z,程式需完成以下任務:

  1. 判斷能否構成三角形(任意兩邊之和大於第三邊)。
  2. 若能構成,計算並輸出周長與面積(海倫公式)。
  3. 進一步判斷是否為直角、等腰、等邊三角形,並輸出對應提示。

核心演算法邏輯

1. 三角形判定

正確條件為 三組兩邊之和均大於第三邊:

if (x + y > z && x + z > y && y + z > x) // 原代碼誤用 ||,此處已修正

注意:原始碼中使用 || 會導致判定錯誤(如 1,2,3 會被誤判為合法),實際應用務必改為 &&。

2. 周長與面積計算

  • 周長:p = x + y + z
  • 面積:海倫公式 s = p/2; area = sqrt(s*(s-x)*(s-y)*(s-z))

3. 特殊三角形判定

類型判定條件備註
直角三角形x²+y²==z² || x²+z²==y² || y²+z²==x²浮點數比較建議引入誤差範圍 fabs(a-b) < 1e-6
等腰三角形恰好兩邊相等(排除等邊)原代碼邏輯正確:(x==y || x==z || y==z) && !(x==y && y==z)
等邊三角形x==y && y==z同時滿足等腰條件,但通常單獨分類

完整修正版代碼

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

float perimeter(float x, float y, float z);
float area(float x, float y, float z);
int is_triangle(float x, float y, float z);
int is_right(float x, float y, float z);
int is_isosceles(float x, float y, float z);
int is_equilateral(float x, float y, float z);

int main() {
    float x, y, z;
    printf("Enter three side lengths: ");
    if (scanf("%f %f %f", &x, &y, &z) != 3) return 1;

    if (is_triangle(x, y, z)) {
        printf("Perimeter: %.2f\nArea: %.2f\n", perimeter(x, y, z), area(x, y, z));
        printf(is_right(x, y, z) ? "Right triangle!\n" : "Not a right triangle.\n");
        printf(is_isosceles(x, y, z) ? "Isosceles triangle!\n" : "Not isosceles.\n");
        printf(is_equilateral(x, y, z) ? "Equilateral triangle!\n" : "Not equilateral.\n");
    } else {
        printf("Cannot form a triangle!\n");
    }
    system("pause");
    return 0;
}

float perimeter(float x, float y, float z) { return x + y + z; }

float area(float x, float y, float z) {
    float s = perimeter(x, y, z) / 2.0;
    return sqrt(s * (s - x) * (s - y) * (s - z));
}

int is_triangle(float x, float y, float z) {
    return (x + y > z) && (x + z > y) && (y + z > x) && x > 0 && y > 0 && z > 0;
}

int is_right(float x, float y, float z) {
    float xx = x*x, yy = y*y, zz = z*z;
    return (fabs(xx + yy - zz) < 1e-6) || (fabs(xx + zz - yy) < 1e-6) || (fabs(yy + zz - xx) < 1e-6);
}

int is_isosceles(float x, float y, float z) {
    return (fabs(x - y) < 1e-6 || fabs(x - z) < 1e-6 || fabs(y - z) < 1e-6) && !is_equilateral(x, y, z);
}

int is_equilateral(float x, float y, float z) {
    return fabs(x - y) < 1e-6 && fabs(y - z) < 1e-6;
}

關鍵改進點總結

  1. 修正三角形判定邏輯:將 || 改為 &&,並增加邊長大於 0 檢查。
  2. 浮點數比較容錯:引入 1e-6 閾值避免精度問題導致誤判。
  3. 函式命名規範化:採用 is_ 前綴表達布林語義,提升可讀性。
  4. 輸入健壯性:檢查 scanf 返回值,防止非數字輸入導致未定義行為。

延伸思考

  • 若輸入為整數,可用勾股數生成公式批量產生直角三角形測試資料。
  • 結合圖形庫(如 SDL、OpenGL)可視化繪製三角形,輔助教學演示。
  • 擴展至多邊形判定:給定 n 條邊,判斷能否構成凸多邊形並計算面積(分解為三角形求和)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved