2012-02-21 67 views
3

我做了一個程序來計算公式(給我的值x1和x2)。但問題是,我需要爲x1和x2編寫2個獨立函數,即使我只需要將「+」符號更改爲「 - 」符號即可獲得x2。只有使用一個函數才能得到相同的輸出嗎?繼承人代碼:使我的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 2012-02-21 22:19:00

+1

這個網站有〜9周百萬的發帖,我不認爲,如果你張貼甚至每一小時(只要它們是* *好問題)一個問題:) – 2012-02-21 22:20:20

+1

其實有人會想到,它是* *有益的網站儘可能多地提出問題/答案,只要他們都有價值。 – 2012-02-21 22:23:01

回答

4

即使世界幾個不同的方法可以做到這一點加雷提到了一個,但另一個是使用輸出參數。 。

使用指針作爲輸入參數,可以填充他們兩個在一個功能,你不需要任何回報

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

這很好,因爲你可以節省昂貴的平方根兩次。你甚至可以單獨存儲'b /(2 * a)'。這也是內聯的一個很好的候選人。 – 2012-02-21 22:28:08

+0

是啊,我的意思是一提的是,你可以簡化遠一點以及 – 2012-02-21 22:29:01

+0

謝謝你,我明白了,現在(我想,即使我真的沒有了解指針尚未):d。 最後,我可以安心入睡。再次感謝你。 – geekkid 2012-02-21 22:35:43

3

傳遞另一個+1或-1的參數,並乘以argument。或者,傳入另一個參數,即0/false或非0/true,並有條件地添加或減去(使用if語句或...?...:...「三元運算符」。

[編輯刪除對部分那現在被刪除原來的問題]

+0

對不起,但我不太關注你,因爲我剛剛開始。如果這不會讓你感到困擾,你能否在代碼中寫下你的解決方案? – geekkid 2012-02-21 22:26:49

+1

恰恰是因爲*你是新來的遊戲,我不想對你太明確 - 如果你爲自己做一些工作,你會學得更好!但* paxdiablo *已經發布了一些代碼,這些代碼採用了我提到的第一種方法。 – 2012-02-21 22:30:22

+1

我不會採用這個選項,因爲傳遞+1/-1來指定哪個選項是不自然的,而真/假不以有意義的方式映射到二次方程的兩個選項。是的,它可以工作,但是你必須知道太多的實現,才能使它適用於任何調用代碼,並且遊戲的名稱不會讓你的調用代碼知道方法的「內部」細節。否則,將來就不可能將它們分開(這是改變其中一個的必要步驟,而不是另一個)。 – 2012-02-21 22:33:58

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