В настоящее время я работаю над программой c, которая вычисляет значение pi с помощью суммирования Лейбница, но я получаю сообщение об ошибке «нарушение сегмента («сгенерированное ядро»)» в консоли после выполнения программы. Также я проверил подобные вопросы, но я все еще не могу вписать эту информацию в свою проблему. Это код, который у меня есть:
#include <stdio.h>
double calPi(int x);
double calPi(int x)
{
double sum;
int i;
sum=0.0;
for (i=0; i<=x; i++)
{
if ((i=2)||((i%2)==0))
{
sum=sum+(1/(2*i+1));
}
else sum=sum-(1/(2*i+1));
}
return 4*sum;
}
int main(void)
{
int x;
double PI;
printf("Enter the number of terms you want to calculate");
scanf("%i",x);
PI=calPi(x);
printf("Pi value is: %f", PI);
system("pause");
return 0;
}
Заранее спасибо за любую подсказку, помощь или исправление.
Если бы вы написали if (2=i || (i%2) ==0), вам не нужно было бы задавать этот вопрос.
@machine_1, да, мне все равно пришлось бы задать этот вопрос, потому что это не было причиной ошибки, но спасибо за аннотацию.
Суммирование Либница начинается с 1,0, а не с 0,0.
относительно строк типа: else sum=sum-(1/(2*i+1));
следуйте аксиоме: только один оператор на строку и (максимум) одно объявление переменной на оператор. Указанная строка имеет два утверждения: else
и sum=sum-(1/(2*i+1));
. Такое «заполнение» операторов делает код намного более трудным для понимания, отладки и т. д.
OT: относительно: scanf("%i",x);
Всегда проверяйте возвращаемое значение (а не значения параметров), чтобы убедиться, что операция прошла успешно. т.е. if ( scanf("%i",x) != 1 ) { // handle error }
Обратите внимание, что семейство функций scanf()
возвращает количество успешных преобразований «входного формата».
ОТ: относительно: system("pause");
это не переносимо. Предлагаю: int ch; while( (ch = getchar()) != EOF && ch != '\n' ); getchar();
относительно: if ((i=2)||((i%2)==0))
Это присваивает 2 переменной «i». Итак, 1) всегда будет вводиться тело оператора if ()
. 2) в зависимости от значения «x» это будет либо зацикливаться один раз, либо зацикливаться навсегда
Это ваша проблема:
scanf("%i", x);
Должно быть
scanf("%i", &x);
Вам нужно взять адрес x, иначе простое использование x будет рассматриваться как указатель, указывающий неизвестно на что. Убедитесь, что вы компилируете с включенными предупреждениями, так как ваш компилятор должен предупреждать вас о таких вещах. Мой компилятор жалуется на
"строка формата '%i' требует аргумента типа 'int *', но вариативный аргумент 1 имеет тип 'int'"
Я использовал терминал в качестве компилятора, поэтому я получил всего пару предупреждений, не слишком ясных о моих ошибках, большое спасибо за четкий ответ и объяснение,
if ((i=2)||((i%2)==0))
вызывает бесконечную рекурсию.