用 C 语言求解直角三角形

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何在 C 编程中使用三角计算来求解直角三角形。本实验涵盖了在给定一组已知值的情况下,确定直角三角形缺失边和角所需的基本步骤。你将首先学习如何读取和定义三角形的已知边和角,然后使用三角比来计算未知值,最后打印缺失的信息。本实验将使你对在实际编程环境中应用三角原理有扎实的理解。

读取已知边/角

在这一步中,我们将学习如何在 C 编程中读取和定义直角三角形的已知边和角。理解如何输入和存储三角形信息对于进行三角计算至关重要。

首先,让我们创建一个新的 C 文件来定义我们的三角形结构和输入方法:

// ~/project/triangle_solver.c
#include <stdio.h>
#include <math.h>

// 定义一个结构体来表示直角三角形
struct RightTriangle {
    double side_a;     // 邻边
    double side_b;     // 对边
    double side_c;     // 斜边
    double angle_A;    // 与边 a 相对的角
    double angle_B;    // 与边 b 相对的角
    double angle_C;    // 直角(90 度)
};

int main() {
    struct RightTriangle triangle;

    // 输入已知边或角
    printf("输入已知边/角的值(如果未知则输入 0):\n");

    printf("边 a 的长度:");
    scanf("%lf", &triangle.side_a);

    printf("边 b 的长度:");
    scanf("%lf", &triangle.side_b);

    printf("边 c(斜边)的长度:");
    scanf("%lf", &triangle.side_c);

    printf("角 A(度数):");
    scanf("%lf", &triangle.angle_A);

    printf("角 B(度数):");
    scanf("%lf", &triangle.angle_B);

    return 0;
}

让我们编译并运行该程序来测试我们的输入方法:

gcc ~/project/triangle_solver.c -o ~/project/triangle_solver -lm
~/project/triangle_solver

示例输出:

输入已知边/角的值(如果未知则输入0):
边a的长度:3
边b的长度:4
边c(斜边)的长度:5
角A(度数):36.87
角B(度数):53.13

代码理解

  1. 我们定义了一个RightTriangle结构体来存储所有可能的三角形测量值。
  2. 该结构体包括三条边(a、b、c)和三个角(A、B、C)。
  3. 我们使用scanf()允许用户输入已知值。
  4. 用户可以为未知值输入 0,我们将在后续步骤中使用它来计算缺失的信息。

输入注意事项

  • 边长可以是任何正实数
  • 角度以度为单位
  • 对于直角三角形,一个角始终是 90 度
  • 要完全求解三角形,你至少需要两个已知值

使用三角比来求未知量

在这一步中,我们将扩展我们的三角形求解器程序,使用三角比来计算未知的边和角。我们将更新之前的代码,以包含求解直角三角形的函数。

让我们修改triangle_solver.c文件来添加计算函数:

// ~/project/triangle_solver.c
#include <stdio.h>
#include <math.h>

#define PI 3.14159265358979323846

struct RightTriangle {
    double side_a;     // 邻边
    double side_b;     // 对边
    double side_c;     // 斜边
    double angle_A;    // 与边 a 相对的角
    double angle_B;    // 与边 b 相对的角
    double angle_C;    // 直角(90 度)
};

// 将度数转换为弧度的函数
double to_radians(double degrees) {
    return degrees * (PI / 180.0);
}

// 将弧度转换为度数的函数
double to_degrees(double radians) {
    return radians * (180.0 / PI);
}

// 使用三角比计算缺失的边
void solve_triangle(struct RightTriangle *triangle) {
    // 如果斜边和一条边已知,计算第三条边
    if (triangle->side_c > 0 && triangle->side_a > 0 && triangle->side_b == 0) {
        triangle->side_b = sqrt(triangle->side_c * triangle->side_c - triangle->side_a * triangle->side_a);
    }

    // 如果两条边已知,计算角度
    if (triangle->side_a > 0 && triangle->side_c > 0) {
        triangle->angle_A = to_degrees(asin(triangle->side_a / triangle->side_c));
        triangle->angle_B = 90.0 - triangle->angle_A;
    }

    // 如果两条边已知,计算斜边
    if (triangle->side_a > 0 && triangle->side_b > 0 && triangle->side_c == 0) {
        triangle->side_c = sqrt(triangle->side_a * triangle->side_a + triangle->side_b * triangle->side_b);
    }
}

// 打印三角形信息
void print_triangle_info(struct RightTriangle *triangle) {
    printf("\n三角形信息:\n");
    printf("边 a: %.2f\n", triangle->side_a);
    printf("边 b: %.2f\n", triangle->side_b);
    printf("边 c(斜边): %.2f\n", triangle->side_c);
    printf("角 A: %.2f 度\n", triangle->angle_A);
    printf("角 B: %.2f 度\n", triangle->angle_B);
    printf("角 C: 90.00 度\n");
}

int main() {
    struct RightTriangle triangle = {0}; // 将所有值初始化为 0

    // 输入已知边或角
    printf("输入已知边/角的值(如果未知则输入 0):\n");

    printf("边 a 的长度:");
    scanf("%lf", &triangle.side_a);

    printf("边 b 的长度:");
    scanf("%lf", &triangle.side_b);

    printf("边 c(斜边)的长度:");
    scanf("%lf", &triangle.side_c);

    printf("角 A(度数):");
    scanf("%lf", &triangle.angle_A);

    printf("角 B(度数):");
    scanf("%lf", &triangle.angle_B);

    // 求解未知值
    solve_triangle(&triangle);

    // 打印结果
    print_triangle_info(&triangle);

    return 0;
}

现在,让我们编译并运行更新后的程序:

gcc ~/project/triangle_solver.c -o ~/project/triangle_solver -lm
~/project/triangle_solver

示例输入和输出:

输入已知边/角的值(如果未知则输入0):
边a的长度:3
边b的长度:4
边c(斜边)的长度:0
角A(度数):0
角B(度数):0

三角形信息:
边a: 3.00
边b: 4.00
边c(斜边): 5.00
角A: 36.87度
角B: 53.13度
角C: 90.00度

理解三角计算

  1. solve_triangle() 使用三角比来计算缺失的值:
    • 使用勾股定理计算边
    • 使用 asin() 计算角度
  2. to_radians()to_degrees() 有助于在度数和弧度之间进行转换
  3. 该程序可以使用各种输入组合来求解三角形

关键三角关系

  • 正弦:对边 / 斜边
  • 余弦:邻边 / 斜边
  • 正切:对边 / 邻边
  • 勾股定理:a² + b² = c²

打印缺失值

在这最后一步中,我们将增强我们的三角形求解器程序,以提供更详细的输出并处理不同的输入场景。我们将修改代码以打印缺失值并添加错误检查。

使用以下改进更新triangle_solver.c文件:

// ~/project/triangle_solver.c
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define PI 3.14159265358979323846
#define EPSILON 0.0001 // 用于浮点数比较的小值

struct RightTriangle {
    double side_a;
    double side_b;
    double side_c;
    double angle_A;
    double angle_B;
    double angle_C;
};

// 之前的函数(to_radians、to_degrees、solve_triangle)保持不变

// 增强的打印函数,带有缺失值检测
void print_triangle_info(struct RightTriangle *triangle) {
    printf("\n三角形计算结果:\n");
    printf("------------------------------\n");

    // 打印边
    printf("边:\n");
    if (triangle->side_a > 0) {
        printf("  边 a:%.2f\n", triangle->side_a);
    } else {
        printf("  边 a:缺失(无法计算)\n");
    }

    if (triangle->side_b > 0) {
        printf("  边 b:%.2f\n", triangle->side_b);
    } else {
        printf("  边 b:缺失(无法计算)\n");
    }

    if (triangle->side_c > 0) {
        printf("  边 c(斜边):%.2f\n", triangle->side_c);
    } else {
        printf("  边 c(斜边):缺失(无法计算)\n");
    }

    // 打印角度
    printf("角度:\n");
    if (triangle->angle_A > 0) {
        printf("  角 A:%.2f 度\n", triangle->angle_A);
    } else {
        printf("  角 A:缺失(无法计算)\n");
    }

    if (triangle->angle_B > 0) {
        printf("  角 B:%.2f 度\n", triangle->angle_B);
    } else {
        printf("  角 B:缺失(无法计算)\n");
    }

    // 在直角三角形中,角 C 始终为 90 度
    printf("  角 C:90.00 度(直角)\n");
}

// 输入验证函数
int validate_input(struct RightTriangle *triangle) {
    int known_values = 0;

    // 计算已知值的数量
    if (triangle->side_a > 0) known_values++;
    if (triangle->side_b > 0) known_values++;
    if (triangle->side_c > 0) known_values++;
    if (triangle->angle_A > 0) known_values++;
    if (triangle->angle_B > 0) known_values++;

    // 求解三角形至少需要两个已知值
    if (known_values < 2) {
        printf("错误:求解三角形的信息不足。\n");
        printf("你需要提供至少两个已知值。\n");
        return 0;
    }

    return 1;
}

int main() {
    struct RightTriangle triangle = {0};

    // 输入已知边或角
    printf("直角三角形求解器\n");
    printf("输入已知值(如果未知则输入 0):\n");

    printf("边 a 的长度:");
    scanf("%lf", &triangle.side_a);

    printf("边 b 的长度:");
    scanf("%lf", &triangle.side_b);

    printf("边 c(斜边)的长度:");
    scanf("%lf", &triangle.side_c);

    printf("角 A(度数):");
    scanf("%lf", &triangle.angle_A);

    printf("角 B(度数):");
    scanf("%lf", &triangle.angle_B);

    // 验证输入
    if (!validate_input(&triangle)) {
        return 1;
    }

    // 求解未知值
    solve_triangle(&triangle);

    // 打印结果
    print_triangle_info(&triangle);

    return 0;
}

编译并运行程序:

gcc ~/project/triangle_solver.c -o ~/project/triangle_solver -lm
~/project/triangle_solver

示例输入和输出:

直角三角形求解器
输入已知值(如果未知则输入0):
边a的长度:3
边b的长度:4
边c(斜边)的长度:0
角A(度数):0
角B(度数):0

三角形计算结果:
------------------------------
边:
  边a:3.00
  边b:4.00
  边c(斜边):5.00
角度:
  角A:36.87度
  角B:53.13度
  角C:90.00度(直角)

关键改进

  1. 增强的print_triangle_info()函数以显示缺失值
  2. 添加了validate_input()以检查是否有足够的三角形信息
  3. 改进了错误处理和用户反馈
  4. 输出格式一致

学习成果

  • 理解如何处理缺失的三角形值
  • 学习验证几何计算
  • 练习高级 C 编程技术

总结

在本实验中,我们学习了如何在 C 编程中读取和定义直角三角形的已知边和角。我们创建了一个RightTriangle结构体来存储所有可能的三角形测量值,包括三条边(a、b、c)和三个角(A、B、C)。然后我们使用scanf()允许用户输入已知值,对于未知值可以输入 0。这一步对于在实验的下一部分进行三角计算以找到缺失值至关重要。

定义输入方法后,下一步是根据已知信息使用三角比来计算未知的边或角。最后一步是打印缺失值,为用户提供直角三角形问题的完整解决方案。