2016-12-11 11 views
0

Это то, что я сделал до сих пор. Я не знаю, что не так с кодом. Теоретически он должен работать отлично (или, может быть, я ошибаюсь), но это просто не так, и это сводит меня с ума. Я начинающий BTW.C программа для вычисления синуса x

Может ли кто-нибудь указать, что не так с кодом?

# 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' form '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, р] перед оценкой серии. Проверьте мои ответы here и here, чтобы понять почему.

1

@Busy Beaver Хороший ответ указывает на некоторые недостатки в коде 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(). Урок для изучения: используйте свой компилятор, чтобы помочь с основными проблемами.

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

теперь я вижу, что это старый пост и OP может иметь left the building.