Решение прямоугольного треугольника на C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном практикуме вы научитесь решать прямоугольный треугольник с помощью тригонометрических вычислений на языке программирования 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");

    // ... (остальной код ввода)

    // Решение для неизвестных значений
    solve_triangle(&triangle);

    // Вывод результатов
    print_triangle_info(&triangle);

    return 0;
}

Теперь скомпилируем и запустим обновленную программу:

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

Пример ввода и вывода:

// ... (ввод)

Информация о треугольнике:
Сторона 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;

    // Подсчет известных значений
    // ... (остальной код проверки)
}

int main() {
    // ... (остальной код)
}

Компилируйте и запускайте программу:

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

Пример ввода и вывода:

// ... (ввод)

Результаты вычисления треугольника:
------------------------------
Стороны:
  Сторона 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 для неизвестных значений. Этот шаг имеет решающее значение для выполнения тригонометрических вычислений, чтобы найти недостающие значения в следующей части лабораторной работы.

После определения метода ввода следующим шагом является использование тригонометрических соотношений для вычисления неизвестных сторон или углов на основе известной информации. Последним шагом является вывод пропущенных значений, предоставляя пользователю полное решение задачи прямоугольного треугольника.