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. この構造体には、3 つの辺 (a, b, c) と 3 つの角 (A, B, C) が含まれています。
  3. scanf() を使用して、ユーザーが既知の値を入力できるようにしています。
  4. ユーザーは未知の値に 0 を入力できます。この値は、後続のステップで不足している情報を計算するために使用されます。

入力の考慮事項

  • 辺の長さは任意の正の実数です。
  • 角は度数法で表します。
  • 直角三角形では、1 つの角は常に 90 度です。
  • 三角形を完全に解くには、少なくとも 2 つの既知の値が必要です。

三角比を用いて未知数を求める

このステップでは、三角比を用いて未知の辺や角度を計算するように、三角形ソルバープログラムを拡張します。直角三角形を解くための関数を追加して、前のコードを更新します。

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) {
    // 斜辺と 1 辺が既知の場合、3 辺目を計算
    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);
    }

    // 2 辺が既知の場合、角度を計算
    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;
    }

    // 2 辺が既知の場合、斜辺を計算
    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

入力例と出力例:

既知の辺/角度の値を入力してください (未知の場合は 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++;

    // 三角形を解くには、少なくとも 2 つの既知の値が必要です
    if (known_values < 2) {
        printf("エラー: 三角形を解くための情報が不十分です。\n");
        printf("少なくとも 2 つの既知の値が必要です。\n");
        return 0;
    }

    return 1;
}

int main() {
    // ... (入力部分)

    // 入力検証
    if (!validate_input(&triangle)) {
        return 1;
    }

    // 未知の値を計算
    solve_triangle(&triangle);

    // 結果を出力
    print_triangle_info(&triangle);

    return 0;
}

プログラムをコンパイルして実行します。

// ... (コンパイルと実行コマンド)

入力例と出力例:

// ... (入力例と出力例)

主要な改善点

  1. 欠損値を表示するように print_triangle_info() 関数を強化
  2. 三角形情報の十分性をチェックするために validate_input() 関数を追加
  3. エラー処理とユーザーフィードバックを改善
  4. 出力のフォーマットを統一

学習成果

  • 欠損している三角形値を処理する方法を理解する
  • 幾何学的計算を検証する方法を学ぶ
  • 高度な C プログラミング技術を実践する

まとめ

この実験では、C プログラミングで直角三角形の既知の辺と角度を読み取り、定義する方法を学びました。RightTriangle 構造体を作成して、3 つの辺 (a, b, c) と 3 つの角度 (A, B, C) を含む、三角形のすべての測定値を格納しました。次に、scanf() を使用して、ユーザーが既知の値を入力できるようにしました。未知の値の場合は 0 を入力できます。このステップは、実験の次の部分で欠落している値を見つけるための三角法計算を実行するために非常に重要です。

入力方法を定義した後、次のステップは、既知の情報に基づいて、未知の辺または角度を三角比を使用して計算することです。最終ステップは、欠落している値を出力して、ユーザーに直角三角形問題の完全な解決策を提供することです。