Obliczanie sumy wyrazów ciągu.

0

Witam mam problem z następującym programem:
"Napisz program, który oblicza sume 1,2,3, i tak dalej (aż do pewnej granicy) wyrazów następujących ciągów:

  1. 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + ...

  2. -1.0/2.0 + 1.0/3.0 -1.0/4.0 + ...
    Maksymalna liczba wyrazów powinna być określana przez użytkownika."

Niestety mój program omija całkiem drugą pętlę while. Nie wiem czemu skoro wpisanie wartości nie będącej liczbą jest warunkiem na wyjście z pętli i powinien on po prostu przejść do następnej. Proszę o wyjaśnienie :)
(Dodam, że programowania uczę się od niedawna, więc proszę o wyrozumiałość.)

#include <stdio.h>

int main() {
	
	int Awyraz,Bwyraz,i;
	float presuma,suma;
	
	printf("Obliczmy sume wyrazow dwoch ciagow:\n "
			"\na(n)= 1/2 , 1/3 , 1/4, ...\n "
			"\nb(n)= -1/2 , 1/3 , -1/4, ...\n");
			
	printf("\n\nPodaj nr ostatniego wyrazu ciagu a(n): ");
	
	while ( (scanf("%d", &Awyraz)==1) && (Awyraz>0) )
	{
		
		suma=presuma=0;
				
		for (i=1;i<=Awyraz;i++){
			
			float f = i;
			presuma= (1.0/(f + 1.0));
			suma+=presuma;
		
		}
	
		printf("\nSuma %d wyrazow ciagu a(n) wynosi: %f\n\n",Awyraz,suma);
		printf("Podaj nowy numer lub przejdz do drugiego ciagu wpisujac znak nie bedacy liczba: ");
	
	}
	
	
	printf("Podaj nr ostatniego wyrazu ciagu b(n): ");
	

	while ( (scanf("%d", &Bwyraz)==1) && (Bwyraz>0) )                               // nie chce czytac tej pętli
	{

		suma=presuma=0;
				
		for (i=1;i<=Bwyraz;i++){
			
			float f = i;
			
			presuma=(((-1.0)*(f)*(1.0))/(f + 1.0));
			suma+=presuma;
		
		}
	
		printf("\nSuma %d wyrazow ciagu b(n) wynosi: %f\n\n",Bwyraz,suma);
		printf("Podaj nowy numer lub wyjdz z programu wpisujac znak nie bedacy liczba: ");
		
	}
		
		printf("blebleble");                         // to juz przeczyta
	return 0;
}
 
0

podaj zero na drugie pytanie: "Podaj nr ostatniego wyrazu ciagu a(n): "

0

Dzięki. Zmieniłem treść printfa na "Podaj nowy numer lub przejdz do drugiego ciagu wpisujac liczbe mniejsza od zera:".
Teraz zorientowałem się ze metoda liczenia drugiego ciągu jest zła, ale to postaram się sam wymyślić :).

0

mul=1;
mul=-mul;
mul=-mul;
mul=-mul;

0

Można i tak
[code]
#include <stdio.h>
#include <math.h>
int main(void)
{
float suma=0.0, c;
int a, licznik1=0, licznik2=0;
double b=2.0;
printf("Podaj liczbe wyrazow do zsumowania: ");
scanf("%d", &a);
do
{
suma+=1.0/b;
b++;
} while(a+1>=b);
printf("Suma %d wyrazow wynosi %f\n\n", a, suma);
suma=0.0;
b=2.0;
do
{
licznik2=licznik1;
while (licznik2%2==0)
{
b*=-1;
licznik2++;
}
suma+=1.0/b;
b=fabs(b);
b+=1;
licznik1++;
} while(a+1>=b);
printf("Suma %d wyrazow wynosi %f\n\n", a, suma);
getchar();
getchar();
return 0;
}
[/code]

0

Wystarczy tyle:

#include <stdio.h>
int main()
  {
   double a=0,b=0,div=1;
   int N,i,mul=1;
   printf("Podaj liczbe wyrazow do zsumowania: ");
   scanf("%d",&N);
   for(i=0;i<N;++i)
     {
      mul=-mul;
      a+=1/(++div);
      b+=mul/div;
     }
   printf("a(%d)=%lf; b(%d)=%lf;\n",N,a,N,b);
   while(getchar()!='\n') {}
   getchar();
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1