2012-02-21 5 views
3

방정식을 계산하는 프로그램을 만들었습니다 (x1 및 x2 값을 제공함). 하지만 문제는 비록 x2를 얻으려면 "+"기호를 "-"기호로 변경해야한다고해도 x1과 x2에 대해 2 개의 별도 함수를 작성해야했습니다. 하나의 함수 만 사용하여 동일한 출력을 얻을 수 있습니까? 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

실제로 사이트에 도움이됩니다. 모두가 가치가있는 한 최대한 많은 질문/답변을 갖고 있어야합니다. –

답변

4

는 몇 가지 방법으로이 작업을 수행 할 수 가레스 하나를 언급 Theres는하지만, 다른 출력 매개 변수를 사용하는 것입니다 .

입력 매개 변수로 포인터를 사용

, 당신은 모두 하나의 함수에서 그들을 채울 수 있고, 당신은 아무것도에게 반환해야

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)'도 별도로 저장할 수 있습니다. 이것은 또한 인라이닝을위한 좋은 후보입니다. –

+0

그래, 내가 좀 더 단순화시킬 수 있다고 언급 했어. –

+0

고맙습니다. 지금은 (나는 아직 포인터에 대해 알지 못했지만) 생각합니다. D. 마침내 나는 내 마음을 진정으로 자러 갈 수있다. 다시 감사합니다. – geekkid

3

+1 또는 -1 인 다른 인수를 전달하고 argument을 곱하십시오. 또는의 또 다른 인수를 전달하거나 허위 또는 비 0/사실, 0/추가하거나 if 문 또는 ...?...:... "삼항 연산자"을 (조건부 뺍니다.

[의 부분에 응답을 제거 수정 됨 지금은 삭제 된 원래의 질문] 그럼

+0

미안하지만, 나는 처음에 시작한 것처럼 너를 따라 가지 않는다. 코드가 그다지 신경 쓸 필요가 없다면 솔루션을 작성해 주시겠습니까? – geekkid

+1

당신이 게임에 익숙하지 않기 때문에 당신에게 지나치게 노골적으로 말하고 싶지 않기 때문에 - 당신이 스스로 일을하면 더 잘 배울 것입니다. 그러나 * paxdiablo *는 앞서 언급 한 접근법 중 첫 번째 코드를 게시했습니다. –

+1

어떤 옵션을 지정하기 위해 +1/-1을 전달하는 것은 부자연 스럽기 때문에이 옵션을 사용하지 않을 것이고 true/false는 의미있는 방식으로 이차 방정식의 두 옵션에 매핑하지 않습니다. 예, 작동하지만 모든 호출 코드에서 작동하도록 구현에 대해 너무 많이 알 필요가 있습니다. 게임의 이름은 호출 코드에서 메소드의 "내부"정보를 알지 못하게하는 것입니다. 그렇지 않으면 미래에 그들을 풀 수 없게됩니다 (하나를 바꾸기위한 필수 단계, 다른 하나는 변경하지 마십시오). –

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)); 
관련 문제