• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program obliczający wartość funkcji w postaci rzędu nie zrywa pętli do..while

Object Storage Arubacloud
+1 głos
1,022 wizyt
pytanie zadane 21 października 2015 w C i C++ przez weewee2 Nowicjusz (150 p.)

Mam na zadanie napisać program obliczający wartość funkcji podanej w postaci rzędu (poniżej), dla wartości x z przedziału [0,1] zwiększanych co 0.1, z błędem 0.0001.
Kod nie jest jeszcze ukończony, ale wstępnie, przy próbie obliczenia dla wartości 0.9 jest jakiś błąd. Program uruchamia się prwidłowo, lecz nie zrywa pętli do..while. Powinien zerwać przy k=2 i wyświetlać 2 razy zmienną element, a wyświetla 10 razy.

Proszę o pomoc i z góry dziękuję.

Kod:

#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;
double licznik, mianownik = 1, y = 0;
int znak = 1;
double x = 0.9;

int main()
{
	do
	{
		for (int k = 0; k < 10; k++)
		{
			for (int i = 2 * k + 3; i > 1; i--)
			{
				mianownik = mianownik * i;
			}
			licznik = pow(x, 2 * k + 3);
			licznik = licznik * znak;
			znak = -znak;
		        y = y + (licznik / mianownik);
			mianownik = 1;
			cout << element << endl;

		}
	} while (abs(licznik / mianownik) > 0.0001);

	system("PAUSE");
	return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 21 października 2015 przez furas Maniak (53,800 p.)
edycja 21 października 2015 przez furas
Nie chce mi się analizować kodu ale zawsze możesz użyć `cout` i wypisywać wszelkie zmienne aby zaobserwować co się dzieje w programie i czy wszystko przebiega z twoimi założeniami.

---

EDIT: na pierwszy rzut oka masz jeden błąd: wypisujesz zawartość zmiennej `element` ale nie masz jej nigdzie zadeklarowanej. Może chodziło o zawartośc zmiennej `y` ?
komentarz 22 października 2015 przez weewee2 Nowicjusz (150 p.)

Poprawione. Program uruchamia się, lecz wypisuje: 

a powinien wypisać tylko pierwsze dwie wartości, ponieważ przy trzeciej pętla do..while powinna zwrócić wartość false. Problem w tym, że nie zwraca.

Poprawiony kod:

#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;

double licznik, mianownik = 1, y = 0, element;
int znak = 1;
double x = 0.9;

int main()
{
	do
	{
		for (int k = 0; k < 10; k++)
		{
			for (int i = 2 * k + 3; i > 1; i--)
			{
				mianownik = mianownik * i;
			}
			licznik = pow(x, 2 * k + 3);
			licznik = licznik * znak;
			znak = -znak;
			element = licznik / mianownik;
			y = y + element;
			mianownik = 1;
			cout << element << endl;

		}
	} while (abs(element) > 0.0001);

	system("PAUSE");
	return 0;
}

 

komentarz 22 października 2015 przez furas Maniak (53,800 p.)
Teraz widzę, że oblcizenia są wewnątrz pętli `for` więc `while` zostanie sprawdzone dopiero po zakończeniu tej pętli `for`. Trzeba by zamiast `while` zrobić wewnątrz `if` i użyć `break` do wyskakiwania z pętli przed jej zakońćzeniem.
komentarz 22 października 2015 przez furas Maniak (53,800 p.)

Tak to u mnie wygląda - kompilowane pod Linux więc część rzeczy zakomentowałe, użyłem fabs zamiast abs bo nie chciał tego użyć dla liczb różnych od całkowitych. Ustawiłem rzeczy trochę inaczej dla czytelności kodu.

//#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;

double licznik;
double mianownik;
double element; 

int znak = 1;

double x = 0.9;
double wynik = 0;

int main()
{
  for (int k = 0; k < 10; k++)
  {
    mianownik = 1;

    for (int i = 2 * k + 3; i > 1; i--)
    {
      mianownik = mianownik * i;
    }
    
    licznik = znak * pow(x, 2 * k + 3);
    znak = -znak;
    element = licznik / mianownik;
    wynik = wynik + element;
    
    cout << element << endl;

    if (fabs(element) <= 0.0001)
    {
      break;
    }
  }

//  system("PAUSE");
  return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 927 wizyt
pytanie zadane 12 listopada 2016 w C i C++ przez orlicki12 Początkujący (450 p.)
0 głosów
3 odpowiedzi 267 wizyt
pytanie zadane 22 sierpnia 2015 w C i C++ przez revan95 Początkujący (270 p.)
0 głosów
2 odpowiedzi 206 wizyt

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...