2016-12-11 20 views
0

이것은 지금까지 내가 한 것입니다. 나는 코드에 무엇이 잘못된 것인지 모른다. 이론적으로는 완벽하게 잘 작동해야합니다 (또는 잘못된 것일 수도 있습니다).하지만 그렇지 못하고 나를 미치게 만듭니다. 나는 초보자입니다.x의 사인을 계산하는 C 프로그램

누구든지 코드에 무엇이 잘못 되었습니까?

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

main() 
{ 
    int i , sum = 0 , n; 
    float x; 
    printf("Please enter the desired values for x and n (n>0): "); 
    scanf("%f %d",&x,&n); 
    for(i=1;i<=n;i++) 
    { 
     sum = sum +((pow(-1,i+1)*pow(x,2*i-1))/(factorial(2*i-1))); 
    } 
    printf("%f",sum); 
} 

int factorial(int n) 
{ 
    int c; 
    int result = 1; 

    for(c = 1 ; c <= n ; c++) 
     result = result*c; 

    return (result); 
} 
+1

이것은 디버거를 사용하는 법을 배울 수있는 좋은 기회입니다. 그것은 당신에게 선 아래로 많은 시간을 절약 할 수있는 귀중한 기술을 가르쳐 줄 것입니다. – NPE

+1

'int'에 들어갈 수있는 최대 값은 무엇인지 생각해보아야합니다. – NPE

+1

'sum'의 형태는'double' 형태의'int'로 바뀝니다. – BLUEPIXY

답변

1

주요 문제 :

  • sum 유형 float 또는 double하지 int해야한다;
  • factorial(int n)은 매우 큰 숫자를 반환 할 수 있어야하므로 반환 유형은 double이어야합니다.

가능한 해결 방법 :

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

double factorial(int n) 
{ 
    if (n == 0) return 1; 
    return n * factorial(n-1); 
} 
main() 
{ 
    int n; 
    double x, sum = 0; 
    printf("Please enter the desired values for x and n (n>0): "); 
    scanf("%lf %d", &x, &n); 
    for(int i = 0; i <= n; i++) 
    { 
     sum += pow(-1, i) * pow(x, 2 * i + 1)/(factorial(2 * i + 1)); 
    } 
    printf("%f", sum); 
} 

은 사인 계산기는 사용자가 입력 x의 값을 확인하고 도메인에 적어도 그것을 줄이기 위해 몇 줄을 추가해야 방탄 만들려면 [-pi, PI] 시리즈를 평가하기 전에. 이유를 이해하려면 내 대답 herehere을 확인하십시오.

1

@Busy Beaver 좋은 대답은 OP 코드의 일부 오류를 지적합니다.

그러나 OP가이 문제를 해결할 수있는 방법에 대해 자세히 알아 보려면 스택 오버플로.

누구든지 코드에 무엇이 잘못 되었습니까?

도움을 청하기보다는 먼저 컴파일러를 사용하십시오. 모두 컴파일러 경고를 활성화하십시오. 좋은 컴파일러는 아래와 같은 것에 대해 불평 할 것입니다. 이것은 SO에 게시하는 것보다 더 빠른 피드백입니다. 이러한 경고를 고정함으로써


// return type defaults to 'int' 
main() 
// this should be as below (amongst other possibilities) 
int main(void) 

// implicit declaration of function 'factorial' 
sum = sum +((pow(-1,i+1)*pow(x,2*i-1))/(factorial(2*i-1))); 
// factorial should be declared/defined before it it used 

// conversion to 'int' from 'double' may alter its value 
sum = sum +((pow(-1,i+1)*pow(x,2*i-1))/(factorial(2*i-1))); 
// This is the hint that `sum` should also be a floating point. 

// format '%f' expects argument of type 'double', but argument 2 has type 'int' 
printf("%f",sum); 
// sum is type `int`, the matching specifier is "%d"`. 

이 코드는 다른 변화없이 "작동". factorial() 계산에는 여전히 정밀도, 제한된 범위, 효율성 및 오버플로 문제가 있습니다. 학습 할 학습 : 컴파일러를 사용하여 기본 문제를 해결하십시오.

지금이 오래된 게시물입니다 볼 영업 이익은 left the building이 될 수 있습니다

Please enter the desired values for x and n (n>0): 1 5 
0.841471 

.