2013-02-14 4 views
0

다항식의 근원을 찾기 위해 이분법 알고리즘을 쓰고 있습니다. FP가 0이거나 절대 값이 b-a이라면 내 코드의 두 번째 부분에서 if 문을 깨뜨린 것입니다.C에서 루프를 벗어나는 방법

for 루프 (반복)를 완전히 멈추고 p를 반환하도록 프로그램을 설정합니다. 그리고 마지막으로 솔루션을 얻는데 걸리는 반복 횟수를 출력하고 싶지만 내 printf 문을 사용하면 분명히 프로그램이 루트 (영)가 얻어 졌다는 생각조차도 계속 실행한다는 것을 알 수 있습니다.

전체 메커니즘을 중지하고 0 인 p 값과 정확한 반복 횟수를 반환하는 방법에 대한 아이디어가 있습니까? 당신이 break 문 앞에 return p;을 가지고 있기 때문에 감사

double computeroots(double a, double b, double epsilon, int MaxIter) 
{ 
    double FA = pow(a,4) -4*a + 1; 
    double FB = pow(b,4) - 4*b + 1; 
    double FP; 
    double p; 
    int i; 

    for(i=0;i<MaxIter;i++) { 
     if(FA * FB < 0) { 
      p = a + (b-a)/2; 
      FP = pow(p,4) - 4*p +1; 
      if(FP == 0 || abs(b-a) < epsilon) { 
       return p; 
       break; 
      } else if (FA * FP >0) { 
       a =p; 
       FA = FP; 
      } else { 
       b = p; 
       FB = FP; 
      } 
      i++; 
     } 
    } 

    printf("the number of iterations is : %d\n", i); 
} 
+1

의 두 번째 점진을 제거하지만 확실히 오해의 소지가 있습니다. 하나의 루프 만 있고 외부 루프와 중첩 루프는 없습니다. –

+0

당신은'i'를 두번 증가 시켜서 반복의 절반 만 실행합니다. –

답변

3

귀하의 printf 문이 명중되지 않습니다. return 문은 즉시 함수를 종료합니다.

당신은 printf 이후에 return 문을 이동하거나 이동해야 printfreturn 전에 : 당신은 첫 번째 요소는 결과 복식의 배열, 두 번째를 반환 할 수 있습니다

 if(FP == 0 || abs(b-a) < epsilon) 
     { 
      printf("the number of iterations is : %d\n", i); 
      return p; 
     } 
     ... 

    printf("failed to converge after %d iterations\n", i); 
    return p; 
} 
+2

또는 자리를 비우고 함수의 끝으로 돌아가십시오. (속한 곳) –

0

하나는 반복 횟수입니다.

은 또는, 당신은 다음과 같이 함수에 변수에 대한 참조를 전달하고, 할당 :

double compute_something(int param1, int param2, int* iterations) { 
    // your code ... 
    // when you want to return, use this: 
    *iterations = 5; 
    return 1.23; 
    // your code ... 
} 

int iter; 
double result = compute_something(1,2, &iter); 

이 후, 결과는 결과를 포함, 당신은 저장 반복 횟수 ITER. 반복 횟수를 명확하게 정수로 반환하지 않기 때문에이 솔루션이 더 좋을 수 있습니다.

1

return 성명을 사용하는 경우 break 성명은 쓸모가 없습니다. 리턴은 함수의 범위를 벗어나서 호출자에게로 돌아가므로 나중에 명령어가 실행되지 않습니다.

그래서이 :

return p; 
break; 

이 될해야 : 당신이 종료 조건이 제대로 선택되지 않은 것을 볼 경우

printf("the number of iterations is : %d\n", i); 
return p; 

가 나는 그것이 더 유한 정밀도 문제 같아요 것입니다. 을 확인하고 있지만 FPdouble이므로 FP이 정확히 일치하지 않을 때 0에 가까울 때 중지해야합니다. 예 : abs(FP) < epsilon.

0

하나 이상의 값을 반환해야하는 경우 out-arguments를 사용하여 수행 할 수 있습니다.추가, 단지 반환하기 전에,

int numIter; 
soln = computeroots(a, b, epsilon, MaxIter, &numIter); 

및 함수에 :

*numIterations = i; 
+0

감사합니다. Adrian 님이 하루를 구 했습니 다. 그러나 내가 이해하지 못하는 것은 당신이 computeroots numIterations라는 이름의 정수에 대한 포인터를 기대해야합니다 !! 지금까지 그렇게 좋은, 그리고 당신이 그것을 호출 할 때 그것은 포인터이기 때문에 당신도 앰퍼샌드를 사용하고 있습니다 ..하지만 그것은 혼란 스럽네요 numIterations 정수로 포인터가 아니라 선언하고있다. 그냥 괜찮지 만 아직도 혼란 스럽다. int numIterations뿐만 아니라 int numIterations를 선언해야한다. – user2059456

+0

printf에 numIterations의 값을 표시하고 싶을 때 비 호환성에 대한 경고를 반환한다. 나는 printf (".....", * numIterations)라고 말했다. 나는 별표가 없어야한다는 것을 알고 있지만 그 이유를 이해하지 못합니다. 별표가 없으면 포인터는 포인터가 가리키는 값을 반환하기 전에 별표를 가져야합니다. 별표가 없으면 포인터는 값이 아닌 변수의 주소를 반환해야합니다 ... 어떤 설명을 하시겠습니까 – user2059456

+0

그것은 아닙니다 포인터. 그것은 함수에 대한 참조로써 그것을 전달하는 정상적인 정수 구매입니다 : &는 "메모리의 방향"으로 번역 될 수 있습니다. 그래서 함수 내부에서 * (간접 연산자이고 "메모리 방향의 내용 ..."으로 번역하는 것이 유용 할 수 있습니다). 일반 변수의 메모리 참조를 사용할 수 있습니다. 꼭 포인터 일 필요는 없습니다. –

0

모든 필요한 개조/s의 병합하려면 다음과 같은

double computeroots(double a, double b, double epsilon, int MaxIter, int *numIterations) 

전화를 당신의 기능을 변경

double computeroots(
    double a, 
    double b, 
    double epsilon, 
    size_t MaxIter, 
    size_t * pNumIter 
) 
{ 
    double FA = pow(a,4) -4*a + 1; 
    double FB = pow(b,4) - 4*b + 1; 
    double FP; 
    double p = NaN; 
    size_t i; 

    for(i=0; i<MaxIter; ++i) { 
     if(FA * FB < 0) { 
      p = a + (b-a)/2; 
      FP = pow(p,4) - 4*p +1; 
      if(FP == 0 || abs(b-a) < epsilon) { 
       break; 
      } else if (FA * FP >0) { 
       a =p; 
       FA = FP; 
      } else { 
       b = p; 
       FB = FP; 
      } 
     } 
    } 

    *pNumIter = i; 

    printf("the number of iterations is : %z\n", *pNumIter); 

    return p; 
} 

다음과 같이 호출하십시오. 모드/s의에

double a, b, epsilon; 
size_t sizeMax, sizeIterations; 

... /* some initialisations here */ 

double d = computeroots(a, b, epsilon, sizeMax, &sizeIterations); 

참고 : 잘못 제거

  • return
  • 는 마지막에 반환 누락
  • 더 나은 카운터
  • 에 대한 unsigned 타입의 정장으로, size_t을 할 int의 변경 추가 된
  • addtionaly에 대한 추가 참조 size_t 반복 횟수를 반환하는 변수
  • i 내가 제목을 변경하지 않은
관련 문제