Все эти while
должны быть for
, а 1/i
должно быть либо 1./i
, либо 1/(double)i
, потому что в противном случае выполняется целочисленное деление. Кроме того, вам следует реструктурировать поток программ, чтобы избежать дублирования кода.
Но , есть небольшая, но более важная ошибка: из-за того, как работает арифметика с плавающей запятой, вы должны начать суммировать от меньших чисел до больших, иначе вы можете достичь точки, где каждое новое добавление является меньше текущей точности этого double
, и сложение не будет иметь эффекта 1 . Итак, ваш for
должен быть обратным:
for (i=v; i>=1; i--)
<ч />
Также: вы должны проверить, чтобы возвращаемое значение scanf
было равно 1, чтобы убедиться, что пользователь действительно вставил какой-либо действительный числовой ввод. И , спецификатор printf
для double
s равен %f
, без l
.
Учитывая все это, вы можете переписать программу следующим образом:
#include <stdio.h>
int main( void )
{
int v=0,i,ch;
double x=0.;
printf("Enter a value to calculate the value of this harmonic series: ");
/* The loop calls the scanf, and is repeated as far as the user continues to
write garbage */
while(scanf("%d",&v)==0 || v<=0)
{
printf("Please enter a POSITIVE number: ");
/* Empty the input buffer to remove the eventual garbage; the logic is
a bit convoluted to handle the case where the user enters EOF */
while((ch=getchar())!='\n')
if(ch==EOF)
return 1;
}
/* perform the actual sum - done from smallest to biggest term */
for (i=v; i>=1; i--)
x+=1./i;
printf("The value for the series is %f\n", x);
return 0;
}
<ч />
- Для ряда гармоник это на самом деле практически невозможно - вам нужно перейти к действительно большим числам, чтобы заметить некоторую разницу - но с другими рядами (чьи термины становятся очень маленькими очень быстрыми) это предложение может быть действительно важным.