C 言語で二次方程式を解く

CCBeginner
オンラインで実践に進む

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、C プログラミングで二次方程式を解く方法を学びます。この実験では、二次方程式の係数を読み取り、判別式を計算し、実数解または複素数解を求めるまでの完全なプロセスをカバーしています。ユーザーに係数を入力させ、必要な計算を行い、解を出力する C プログラムを作成します。

この実験は 2 つの主要なステップに分かれています。まず、ユーザーから係数 a、b、c を読み取る方法を学びます。次に、プログラムを修正して判別式を計算し、二次公式を使用して方程式の解を求め、実数解と複素数解の両方を扱います。

a、b、c を読み取る

このステップでは、C 言語で二次方程式の入力値を読み取る方法を学びます。ユーザーから係数 a、b、c を受け取るプログラムを作成します。

まず、二次方程式の求解プログラム用の新しいファイルを作成します。

cd ~/project
nano quadratic_solver.c

次に、以下のコードをファイルに追加します。

#include <stdio.h>

int main() {
    double a, b, c;

    // Prompt user for input
    printf("Enter coefficient a: ");
    scanf("%lf", &a);

    printf("Enter coefficient b: ");
    scanf("%lf", &b);

    printf("Enter coefficient c: ");
    scanf("%lf", &c);

    // Print the entered coefficients
    printf("Coefficients entered:\n");
    printf("a = %.2f\n", a);
    printf("b = %.2f\n", b);
    printf("c = %.2f\n", c);

    return 0;
}

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

gcc quadratic_solver.c -o quadratic_solver

プログラムを実行します。

./quadratic_solver

出力例:

Enter coefficient a: 1
Enter coefficient b: -5
Enter coefficient c: 6
Coefficients entered:
a = 1.00
b = -5.00
c = 6.00

コードの主要な部分を解説します。

  • scanf() は各係数のユーザー入力を読み取るために使用されます。
  • %lf は倍精度浮動小数点数の書式指定子です。
  • 係数は変数 a、b、c に格納されます。
  • プログラムは入力された係数を再表示して入力を確認します。

判別式を計算して解を求める

このステップでは、前のプログラムを修正して判別式を計算し、二次公式を使用して二次方程式の解を求めます。

既存のファイルを開き、コードを更新します。

cd ~/project
nano quadratic_solver.c

前のコードを以下のコードに置き換えます。

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

int main() {
    double a, b, c;
    double discriminant, root1, root2;

    // Prompt user for input
    printf("Enter coefficient a: ");
    scanf("%lf", &a);

    printf("Enter coefficient b: ");
    scanf("%lf", &b);

    printf("Enter coefficient c: ");
    scanf("%lf", &c);

    // Calculate discriminant
    discriminant = b * b - 4 * a * c;

    // Check discriminant to determine root types
    if (discriminant > 0) {
        // Two distinct real roots
        root1 = (-b + sqrt(discriminant)) / (2 * a);
        root2 = (-b - sqrt(discriminant)) / (2 * a);
        printf("Two distinct real roots:\n");
        printf("Root 1 = %.2f\n", root1);
        printf("Root 2 = %.2f\n", root2);
    } else if (discriminant == 0) {
        // One real root (repeated)
        root1 = -b / (2 * a);
        printf("One real root (repeated):\n");
        printf("Root = %.2f\n", root1);
    } else {
        // Complex roots
        double realPart = -b / (2 * a);
        double imaginaryPart = sqrt(-discriminant) / (2 * a);
        printf("Complex roots:\n");
        printf("Root 1 = %.2f + %.2fi\n", realPart, imaginaryPart);
        printf("Root 2 = %.2f - %.2fi\n", realPart, imaginaryPart);
    }

    return 0;
}

数学ライブラリを使用してプログラムをコンパイルします。

gcc quadratic_solver.c -o quadratic_solver -lm

さまざまなシナリオでプログラムを実行します。

./quadratic_solver

出力例(2 つの実数解):

Enter coefficient a: 1
Enter coefficient b: -5
Enter coefficient c: 6
Two distinct real roots:
Root 1 = 3.00
Root 2 = 2.00

出力例(1 つの実数解):

Enter coefficient a: 1
Enter coefficient b: -2
Enter coefficient c: 1
One real root (repeated):
Root = 1.00

出力例(複素数解):

Enter coefficient a: 1
Enter coefficient b: 2
Enter coefficient c: 5
Complex roots:
Root 1 = -1.00 + 2.00i
Root 2 = -1.00 - 2.00i

コードの要点:

  • 二次公式を使用して解を計算します。
  • 判別式をチェックして解の種類を判断します。
  • 2 つの実数解、1 つの実数解、複素数解の 3 つのシナリオを扱います。
  • math.h ライブラリの sqrt() 関数を使用します。
  • 数学ライブラリをリンクするために -lm フラグでコンパイルします。

実数解または複素数解を出力する

このステップでは、二次方程式の求解プログラムを拡張して、より詳細な出力を提供し、異なる解のタイプをより適切な書式で扱います。

既存のファイルを開き、コードを更新します。

cd ~/project
nano quadratic_solver.c

前のコードを以下のコードに置き換えます。

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

void printQuadraticSolutions(double a, double b, double c) {
    double discriminant = b * b - 4 * a * c;

    printf("Quadratic Equation: %.2fx² + %.2fx + %.2f = 0\n", a, b, c);
    printf("Discriminant: %.2f\n", discriminant);

    if (discriminant > 0) {
        double root1 = (-b + sqrt(discriminant)) / (2 * a);
        double root2 = (-b - sqrt(discriminant)) / (2 * a);

        printf("Solution Type: Two Distinct Real Roots\n");
        printf("Root 1: %.2f\n", root1);
        printf("Root 2: %.2f\n", root2);
    } else if (discriminant == 0) {
        double root = -b / (2 * a);

        printf("Solution Type: One Real Root (Repeated)\n");
        printf("Root: %.2f\n", root);
    } else {
        double realPart = -b / (2 * a);
        double imaginaryPart = sqrt(-discriminant) / (2 * a);

        printf("Solution Type: Complex Conjugate Roots\n");
        printf("Root 1: %.2f + %.2fi\n", realPart, imaginaryPart);
        printf("Root 2: %.2f - %.2fi\n", realPart, imaginaryPart);
    }
}

int main() {
    double a, b, c;

    printf("Quadratic Equation Solver\n");
    printf("------------------------\n");

    printf("Enter coefficient a: ");
    scanf("%lf", &a);

    printf("Enter coefficient b: ");
    scanf("%lf", &b);

    printf("Enter coefficient c: ");
    scanf("%lf", &c);

    printf("\n");
    printQuadraticSolutions(a, b, c);

    return 0;
}

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

gcc quadratic_solver.c -o quadratic_solver -lm

さまざまなシナリオでプログラムを実行します。

./quadratic_solver

出力例(2 つの実数解):

Quadratic Equation Solver
------------------------
Enter coefficient a: 1
Enter coefficient b: -5
Enter coefficient c: 6

Quadratic Equation: 1.00x² + -5.00x + 6.00 = 0
Discriminant: 1.00
Solution Type: Two Distinct Real Roots
Root 1: 3.00
Root 2: 2.00

出力例(1 つの実数解):

Quadratic Equation Solver
------------------------
Enter coefficient a: 1
Enter coefficient b: -2
Enter coefficient c: 1

Quadratic Equation: 1.00x² + -2.00x + 1.00 = 0
Discriminant: 0.00
Solution Type: One Real Root (Repeated)
Root: 1.00

出力例(複素数解):

Quadratic Equation Solver
------------------------
Enter coefficient a: 1
Enter coefficient b: 2
Enter coefficient c: 5

Quadratic Equation: 1.00x² + 2.00x + 5.00 = 0
Discriminant: -16.00
Solution Type: Complex Conjugate Roots
Root 1: -1.00 + 2.00i
Root 2: -1.00 - 2.00i

主な改良点:

  • コードの整理のために、別の関数 printQuadraticSolutions() を作成しました。
  • 解のタイプと方程式の詳細を含む、より説明的な出力を追加しました。
  • 前のステップと同じ解の計算ロジックを維持しました。
  • タイトルと明確な書式でユーザーインターフェイスを改善しました。

まとめ

この実験では、C 言語で二次方程式の入力値を読み取り、判別式を計算し、二次公式を使用して実数解または複素数解を求める方法を学びます。プログラムはユーザーに係数 a、b、c の入力を促し、判別式を計算して解の性質を判断します。最後に、プログラムは実数解または複素数解を出力します。

この実験でカバーされる主要なステップには、係数のユーザー入力を読み取ること、判別式を計算すること、および二次公式を適用して解を求めることが含まれます。プログラムは入力された係数を確認し、計算された解を提供します。