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");

    printf("변 a 길이: ");
    scanf("%lf", &triangle.side_a);

    // ... (나머지 입력 부분)

    // 미지의 값 계산
    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() {
    // ... (나머지 코드는 동일)
}

프로그램을 컴파일하고 실행합니다.

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 을 입력할 수 있도록 했습니다. 이 단계는 실험의 다음 부분에서 누락된 값을 찾기 위한 삼각 함수 계산을 수행하는 데 필수적입니다.

입력 방법을 정의한 후 다음 단계는 알려진 정보를 기반으로 미지의 변 또는 각을 계산하기 위해 삼각비를 사용하는 것입니다. 마지막 단계는 누락된 값을 출력하여 사용자에게 직각 삼각형 문제에 대한 완전한 해결책을 제공하는 것입니다.