Ĺadny brzuch
Witam
Napisałem krótki programik mający stosować schemat chornera czyli znajdować pierwiastek równania trzeciego stopnia ax^3 + bx^2 + cx + d
[ code ]#include <iostream.h>
main()
{
float a, b, c, d, i ;
cout << " \npodaj a, b, c, d\n " ;
cin >> a ; /* a=1 b=4 c=-27 d=-90 wynik -3 */
cin >> b ; /* a=1 b=-1 c=-1 d=1 wynik 1 */
cin >> c ;
cin >> d ;
for( i = -11 ; ((((((i*a)+b )*i)+c)*i)+d) == 0 ; i=i+1)
cout << "\nwynik\n" << i ;
}[ /code ]
oto link opisujący schemat http://pl.wikipedia....Schemat_Hornera
Wprowadzam do programu wartości funkcji a następnie pętla for ma tak długo zwiększać wartość „i” aż znajdzie liczbę dla której równanie ((((((i*a)+b )*i)+c)*i)+d) wyzeruje się i ta liczba ma zostać wypisana, i należy do przedziału < 0 ; nieskończoności > liczb całkowitych, przyjąłem szukanie od –11. Sprawa polega na tym, że pętla nie działa dlaczego?
W komentarzu programu podałem dwie kombinacje funkcji i ich wyniki wyliczone na piechotę i bankowo są poprawne. Mam też prośbę jestem początkującym w c++ i proszę o pisanie językiem prostym i jak najmniejsza ingerencją w mój kod.
zamiast == daj !=
Ale wogole musisz przemyslec schemat tej petli, poniewaz warunek w niej zawarty jest troszeczke zawily :P Dla tego problemu proponuje do while. O wiele lepiej bedzie dzialalo i wygladalo:P
//EDIT
A moze napiszesz co nie dziala. Bo w twoim przypadku wynikiem dzialania programu bedzie wyswietlajacy sie napis wynik i wartosc od -11 w gore.
Program dziala tak jak go napisales.
Użytkownik greco edytował ten post 19 sierpień 2005, 11:59
zmiana == na != nie rozwiązuje problemu
[CODE]
#include <iostream.h>
#include <conio.h> //dla getch()
int main()
{
float a, b, c, d, i ;
cout << " \npodaj a, b, c, d\n " ;
cin >> a ; /* a=1 b=4 c=-27 d=-90 wynik -3 */
cin >> b ; /* a=1 b=-1 c=-1 d=1 wynik 1 */
cin >> c ;
cin >> d ;
//for( i = -11 ; ((((((i*a)+b )*i)+c)*i)+d) == 0 ; i=i+1) taka pętla nie
//zadziala nigdy, gdyż dla i=-11 warunek w wyniku daje FALSE i przy
//pierwszym sprawdzeniu konczy działanie
//for( i = -11 ; ((((((i*a)+b )*i)+c)*i)+d) != 0 ; i=i+1) taka pętla,
//z kolei, działa do momentu, gdy warunek bedzie równy 0. Zakończy jednak
//dzialanie po napotkaniu pierwszego miejsca zerowego, lecz zdąży jeszcze
//zwiększyć licznik i=i+1. Dlatego najlepiej jest przyjąć jakiś przedział
//działania (np. od -11 do +11) i umieścić go w pętli a potem sprawdzać
//czy Horner obliczyl 0. Przy takim zakresie, w pierwszym przypadku,
//w wyniku będą trzy miejsca zerowe(-6;-3;5), w drugim tylko dwa(-1;1):
//
for( i = -11 ; i<11 ; i=i+1)
if( ((((((i*a)+b )*i)+c)*i)+d) == 0)
cout << "\nwynik =" << i;
getch();
return 0;
}
poza tym nie mozna porownywac floatow za pomoca == albo !=, bo wszelkie obliczenia na nich obarczone sa utrata precyzji.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Napisałem krótki programik mający stosować schemat chornera czyli znajdować pierwiastek równania trzeciego stopnia ax^3 + bx^2 + cx + d
[ code ]#include <iostream.h>
main()
{
float a, b, c, d, i ;
cout << " \npodaj a, b, c, d\n " ;
cin >> a ; /* a=1 b=4 c=-27 d=-90 wynik -3 */
cin >> b ; /* a=1 b=-1 c=-1 d=1 wynik 1 */
cin >> c ;
cin >> d ;
for( i = -11 ; ((((((i*a)+b )*i)+c)*i)+d) == 0 ; i=i+1)
cout << "\nwynik\n" << i ;
}[ /code ]
oto link opisujący schemat http://pl.wikipedia....Schemat_Hornera
Wprowadzam do programu wartości funkcji a następnie pętla for ma tak długo zwiększać wartość „i” aż znajdzie liczbę dla której równanie ((((((i*a)+b )*i)+c)*i)+d) wyzeruje się i ta liczba ma zostać wypisana, i należy do przedziału < 0 ; nieskończoności > liczb całkowitych, przyjąłem szukanie od –11. Sprawa polega na tym, że pętla nie działa dlaczego?
W komentarzu programu podałem dwie kombinacje funkcji i ich wyniki wyliczone na piechotę i bankowo są poprawne. Mam też prośbę jestem początkującym w c++ i proszę o pisanie językiem prostym i jak najmniejsza ingerencją w mój kod.
zamiast == daj !=
Ale wogole musisz przemyslec schemat tej petli, poniewaz warunek w niej zawarty jest troszeczke zawily :P Dla tego problemu proponuje do while. O wiele lepiej bedzie dzialalo i wygladalo:P
//EDIT
A moze napiszesz co nie dziala. Bo w twoim przypadku wynikiem dzialania programu bedzie wyswietlajacy sie napis wynik i wartosc od -11 w gore.
Program dziala tak jak go napisales.
Użytkownik greco edytował ten post 19 sierpień 2005, 11:59
zmiana == na != nie rozwiązuje problemu
[CODE]
#include <iostream.h>
#include <conio.h> //dla getch()
int main()
{
float a, b, c, d, i ;
cout << " \npodaj a, b, c, d\n " ;
cin >> a ; /* a=1 b=4 c=-27 d=-90 wynik -3 */
cin >> b ; /* a=1 b=-1 c=-1 d=1 wynik 1 */
cin >> c ;
cin >> d ;
//for( i = -11 ; ((((((i*a)+b )*i)+c)*i)+d) == 0 ; i=i+1) taka pętla nie
//zadziala nigdy, gdyż dla i=-11 warunek w wyniku daje FALSE i przy
//pierwszym sprawdzeniu konczy działanie
//for( i = -11 ; ((((((i*a)+b )*i)+c)*i)+d) != 0 ; i=i+1) taka pętla,
//z kolei, działa do momentu, gdy warunek bedzie równy 0. Zakończy jednak
//dzialanie po napotkaniu pierwszego miejsca zerowego, lecz zdąży jeszcze
//zwiększyć licznik i=i+1. Dlatego najlepiej jest przyjąć jakiś przedział
//działania (np. od -11 do +11) i umieścić go w pętli a potem sprawdzać
//czy Horner obliczyl 0. Przy takim zakresie, w pierwszym przypadku,
//w wyniku będą trzy miejsca zerowe(-6;-3;5), w drugim tylko dwa(-1;1):
//
for( i = -11 ; i<11 ; i=i+1)
if( ((((((i*a)+b )*i)+c)*i)+d) == 0)
cout << "\nwynik =" << i;
getch();
return 0;
}
poza tym nie mozna porownywac floatow za pomoca == albo !=, bo wszelkie obliczenia na nich obarczone sa utrata precyzji.