0

以下の仕様でCで関数を書いています:

float find_root(float a, float b, float c, float p, float q);

find_root二次方程式の係数 a,b,c と間隔 (p, q) を取ります。指定された間隔でこの方程式の根を返します。

例: find_root(1, -8, 15, 2, 4)3.0 に「近い」ルートを生成する必要があります。

以下のコードを書きましたが、それが機能しない理由がわかりません。

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

main()
{
    printf("Hello World");
}

float find_root(float a, float b, float c, float p, float q) {

    float d,root1,root2;  
    d = b * b - 4 * a * c;
    root1 = ( -b + sqrt(d)) / (2* a);
    root2 = ( -b - sqrt(d)) / (2* a);

    if (root1<=q || root1>=p)
    {
        return root1;
    }
    return root2;
}

エラーの内容を教えてください。

4

4 に答える 4

1

そのデータの場合、2 つのルートは53です。p == 2q == 4: _

if (root1<=q || root1>=p)

になります:

if (5<=4 || 5>=2)

これは真なので、 が得られます5

ifあなたが望む条件は次のとおりです。

if ((p <= root1) && (root1 <= q))

次のプログラムに示すように、正しい を生成します3

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

float find_root (float a, float b, float c, float p, float q) {
    float d,root1,root2;

    d = b * b - 4 * a * c;
    root1 = ( -b + sqrt(d)) / (2* a);
    root2 = ( -b - sqrt(d)) / (2* a);

    if ((p <= root1) && (root1 <= q))
        return root1;

    return root2;
}

int main (void) {
    printf ("%f\n", find_root(1, -8, 15, 2, 4));
    return 0;
}

それは、根の計算の論理エラーです。

コードにはにも問題があることに注意してください。

実際に関数自体を呼び出すようにする必要がありますが、main現状ではそうではありません。

また、境界内に値を生成しp/qません。代わりに、それらの境界内にある場合は最初のルートを提供し、そうでない場合は、その値に関係なく 2 番目のルートを提供します。

d平方根を取りたくないので、 が負の状況を捉えたいと思うかもしれません:

a = 1000, b = 0, c = 1000: d <- -4,000,000

最後に、コンパイラがリンクできないと文句を言っている場合sqrt(コメントの 1 つによると)、次のような数学ライブラリを指定することで修正できることがわかるでしょう。

gcc -o myprog myprog.c -lm
于 2015-02-06T06:52:53.667 に答える