2012-02-21 5 views
3

私は方程式(私に値x1とx2を与える)を計算するプログラムを作った。しかし、問題は、x2を得るために "+"記号を " - "記号に変更する必要があったとしても、x1とx2の2つの別々の関数を書く必要がありました。 1つの関数だけを使って同じ出力を得ることは可能ですか? Heresコード:私のCコードを短くする

double equation(double a, double b, double c) { 
    double argument, x1; 
    argument = sqrt(pow(b, 2) - 4*a*c); 
    x1 = (-b + argument)/(2 * a); 
    return x1; 
} 

double equation2(double a, double b, double c) { 
    double argument, x2; 
    argument = sqrt(pow(b, 2) - 4*a*c); 
    x2 = (-b - argument)/(2 * a); // here i changed the "+" sign to "-" 
    return x2; 
} 

ありがとうございます!

+4

することができますあなたが重複して投稿していない限り、あなたが好むほど頻繁に投稿してください。 – Pubby

+1

このサイトは約9百万の投稿を持っていますが、毎回1つの質問(*良い*質問である限り)を投稿すると誰も気にしません:) –

+1

実際には、*有益な*サイト彼らはすべて価値がある限り、できるだけ多くの質問/回答を持つようにしてください。 –

答えて

4

するガレスは1に言及し、あなたがこれを行うことができますカップルの異なる方法をtheresのが、別の出力パラメータを使用することです。

入力パラメータとしてポインタを使用して、次に、あなたのメインのコードから呼び出すあなたは、1つの関数にそれらの両方を読み込むことができ、あなたは何

void equation(double a, double b, double c, double *x1, double *x2) { 
    double argument, x1; 
    argument = sqrt(pow(b, 2) - 4*a*c); 
    *x1 = (-b + argument)/(2 * a); 
    *x2 = (-b - argument)/(2 * a); 
} 

を返却する必要はありません。

int main (void) 
{ 
    //Same up to the prints above 
    double x1, x2; 
    equation (a , b, c , &x1, &x2); 

    printf("\nx1 = %.2f", x1); 
    printf("\nx2 = %.2f", x2); 
} 
+1

高価な平方根を2回実行しないようにすることができます。あなたは 'b /(2 * a)'も別々に保存することさえできます。これはインライン展開にも適しています。 –

+0

ええ、もう少し単純化することができます。 –

+0

ありがとう、私は今それを得る(私は本当にまだポインタについて学んでいないが、私は思う):D。 最後に私は落ち着いて眠りにつくことができます。ありがとうございました。 – geekkid

3

+1または-1の別の引数を渡し、argumentを乗算します。または、0 /偽または0 /真ではない別の引数を渡して、条件付きで加算または減算します(ifステートメントまたは...?...:...「3項演算子」)。

[編集しました。今削除されています元の質問]

+0

申し訳ありませんが、私はちょうど始めたように、あなたにあまり追いついていません。それがあなたにはあまり気にしないなら、あなたの解決策をコードで書いてください。 – geekkid

+1

それはあなたがあまりにも明白になりたくないので、あなたはゲームの初心者ですから、あなた自身のためにいくつかのことをすればもっと良く学べますからね。しかし、* paxdiablo *は私が言及したアプローチの第1を取るいくつかのコードを掲載しています。 –

+1

どのオプションを指定するには+1/-1を渡すのは不自然であり、true/falseは2次方程式の2つのオプションに意味のある方法でマッピングしないので、このオプションは使用しません。はい、それは動作しますが、呼び出しコードで動作させるために実装についてはあまりにも多くのことを知っていなければなりません。また、ゲームの名前は呼び出しコードにメソッドの "内部"の詳細が分からないようにすることです。さもなければ、将来的にそれらを解き放つことが不可能になります(1つを変更するために必要なステップですが、もう1つは変更しないでください)。 –

1

さて、あなたはような何か行うことができます:。。

double equation_either (double a, double b, double c, double d) { 
    double argument, x1; 
    argument = sqrt(pow(b, 2) - 4*a*c); 
    x1 = (-b + (d * argument))/(2 * a); 
    //   ^^^^^^^^^^^^^^ 
    // auto selection of correct sign here 
    // 
    return x1; 
} 
: 
printf("\nx1 = %.2f", equation_either(a, b, c, 1.0)); 
printf("\nx2 = %.2f", equation_either(a, b, c, -1.0)); 
関連する問題