Показать полную графическую версию : Решение квадратных уравнений на С++
ShadowMas
06-02-2009, 14:22
Люди подскажите плиз, пробую написать тестовую програмку на С++ , чего то не правельно считает "sqrt" от числа , тип переменной назначаю с плавающей тачкой(навсякмй случа).
Вот пример
для проверки можно взять такое квадратное уравнение
y = 4x^2 + 3x - 5
Програмка
#include <iostream.h>
#include <conio.h>
#include <math.h>
main()
{
float b,a,x,c,D,y,z;
D=0;
cout <<"Davayte reshim kvadratnoe uravnenie sleduyushego vida y=ax**2+b*x+c "<<endl;
cout <<"Dla etogo vnesite znacheniya v posledovatelnosti a,b,c"<<endl;getch();clrscr();
cout <<"a="<<endl;
cin>>a;
if (a==0)
{
cout <<"Esli znachenie a=0 - Net resheniy"<<endl;getch();clrscr();
}
if (a!=0)
{
cout <<"b="<<endl;
cin>>b;
cout <<"c="<<endl;
cin>>c;
D=b*b-4*a*c;
cout <<"Diskremenant="<<D<<endl;getch();clrscr();
}
if (D<0)
{
cout <<"Net resheniy"<<endl;getch();clrscr();
}
if (D==0)
{
x=b*b/2*a;
cout <<"naydeno odno vozmoznoe reshenie x="<<x<<endl;getch();clrscr();
}
if (D>0)
{
y=b*b+sqrt(D)/2*a;
z=b*b-sqrt(D)/2*a;
cout <<"naydeni znacheniya x1 i x2"<<endl;
cout <<"x1="<<y<<" x2="<<z<<endl;getch();clrscr();
}
}
Вопрос то сам как раз в выделеной части, почему то неправельно считает?
Может структура записи формулы не правельная?
ShadowMas, Гляньте в комментарий 2 (http://forum.oszone.net/post-1026187-2.html). И ещё я бы
...
cout <<"a = ";
cin>>a;
while(a == 0){ // Вместо 'if' - разовой, прикрутил бы циклическую проверку
cout <<"Esli znachenie a = 0 - Net resheniy"<<endl;
clrscr();
cout <<"a = ";
cin>>a;
}
...Тогда отпадёт необходимость в следующем условии:
...
// if(a != 0){
cout <<"b = ";
cin>>b;
cout <<"c = ";
cin>>c;
D = b * b + 4 * a * c;
cout <<"Diskriminant = "<<D<<endl;
// getch();
// clrscr();
// }
...Картина в целом
...
cout <<"a = ";
cin>>a;
while(a == 0){
cout <<"Esli znachenie a = 0 - Net resheniy"<<endl;
clrscr();
cout <<"a = ";
cin>>a;
}
cout <<"b = ";
cin>>b;
cout <<"c = ";
cin>>c;
D = b * b + 4 * a * c;
cout <<"Diskriminant = "<<D<<endl;
...Ко всему ещё стоит добавить 'else', тогда не будет ненужной проверки всех условий
...
if(D < 0){
// Код
}
else if(D == 0){
// Код
}
else if(D > 0){
// Код
...
y=b*b+sqrt(D)/2*a;
z=b*b-sqrt(D)/2*a; »
Элементарная ошибка в последовательности выполнения операторов с числами.
Сначала выполняется умножения/деления, потом сложения/вычитания.
сначала все, что в скобках, потом все что вне скобок.
У нас числитель равен b*b-sqrt(D)
знаменатель 2*a
т.е. ( b*b+sqrt(D) ) / ( 2*a )
Тем самым мы сделаем нужный нам, правильный, порядок выполнения операций.
ShadowMas
06-02-2009, 16:41
Спасибо огромное за совет!
А если целое " int " то результат вобще левый? »Не левый, а приведённый к типу 'int', без дробной части:
х1 = 0
х2 = -1
Призабыл уже как вычисляется это уравнение... Погуглил, нашёл, вот только не пойму
...
x = b * b / 2 * a;
...Получается, что неправильно?
при D = 0 корень один:
x = –b/2a.
...
x = -b / (2 * a);
...
И ещё один момент, авторский вариант
...
(b * b + sqrt(D)) / (2 * a);
...Почему не так?
...
(-b + sqrt(D)) / (2 * a);
(-b - sqrt(D)) / (2 * a);
...
ShadowMas
06-02-2009, 17:29
Да спасибо огромное я уже разобрался,я там просто с арихметикой на тупил решил что корень от 89 сто пудово должен быть 9 :) и с это вот увереностью тут вам и морочу голову
:)
Ещё раз огромное спасибо за вашу помощь и терпение!
ShadowMas, Значит твой код считает правильно? :)
ShadowMas, это
...
if(D < 0){
// Код
} »
оставить с заделом на будущие, ибо в случаи изучении высшей математики станет известно, что при дискриминанте меньшем нуля корни тоже есть, но они лежат в комплексном множестве.
Admiral, Drongo, Мо-лод-цы! :clapping:
Admiral, Drongo, Мо-лод-цы! »А сам чего не с нами? Тоже ж помогал, значит и ты - мо-ло-дец! :up
А что я? Это вы ребята. Я лишь посоветовал не забивать голову фразой что корней при дискриминанте меньше нуля не существует, а в программе предусмотреть на будущее этот вариант.
Я когда-то на VB6 сделал сабжевую прогу, и выводил сообщение о том что корней нет при дискриминанте меньше нуля.
Я вот отсюда оттолкнулся, Как вычислить дискриминант квадратного уравнения? (http://www.genon.ru/GetAnswer.aspx?qid=97c62039-dd30-4b41-99a4-11570cdd1557) Там и формула есть, но вот не могу найти ссылку, где тоже говорилось что-то о высшей математике касательно квадратных уравнений.
Drongo есть эксперт в этой области, портал http://exponenta.ru/
на нём и ссылка http://model.exponenta.ru/bt/bt_001141.html
Таким образом, при решении квадратного уравнения может оказаться, что решения его среди действительных чисел от -∞ до +∞ не имеется. Можно было бы воспринять это как данность и считать, что операция вычисления корней может выводить решение за пределы существующих чисел. Но математики пошли по другому пути, добиваясь того, чтобы каждое квадратное уравнение имело корни. Они обобщили понятие числа, добавив к числам новые математические объекты, которые получаются из обычных чисел домножением их на корень квадратный из -1.
Так что автор может теперь апгредить прогу.
Хорошие ссылки. Так что автор может теперь апгредить прогу. »Да в принципе я думаю, при таком варианте
...
if(D < 0){
// Код
}
...Вместо сообщения "корней нет", достаточно вывести уведомлениепри дискриминанте меньшем нуля корни тоже есть, но они лежат в комплексном множестве. »
А когда знаний и опыта хватать будет считать комплексные, как математические программы.
complex.h (http://www.opengroup.org/onlinepubs/009695399/basedefs/complex.h.html) в помощь.
ShadowMas
21-02-2009, 21:44
Огромное спачибо всем участникам темки очень помогли,узнал много нового!
Ещё раз ОГРОМНОЕ СПАСИБО!!!
y = 4x^2 + 3x - 5 »В общем, немножко проконсультировался со своей знакомой педагогом-математики, и получилось следующее, одним словом я запутался, итак дано:
4х^2 + 3х – 5 = 0
Оно же в общем виде
ах^2 + bх – с = 0.
Дискриминант:
D = b^2 – 4ac
корни:
х1 = (-b + sqrt(D)) / 2a
x2 = (-b - sqrt(D)) / 2a
Ключевой момент 4х^2 + 3х – 5 = 0
Если человек учитывает такое число –5, то программе, в формуле нет этого, там задаётся только положительное число, в смысле в переменной отрицательное храниться может, но хранится в этом случае, неправильное, положительное! Тоесть в случае
...
cin>>c;
... нужно явно указывать отрицательное!
...
cout<<"c = "<<endl;
cin>>c;
D = (b * b) - (4 * a * c);
...» и получается следующее
D = (3 * 3) - (4 * 4 * 5) = –71, Корней нет!
вместо
D = (3 * 3) – (4 * 4 * (-5)) = 89, Корень = 9,43
Х1 = (-3 + 9,43) / 8 = 0,8
Х2 = (-3 – 9,43) / 8 = -1,55
Так что нужно ещё учесть знаковые числа. Либо использовать следующую конструкцию, принудительно ставить знак минус
...
D = (b * b) - (4 * a * (—c));
...
Или я ошибся? :dont-know
Drongo,
в переменной отрицательное храниться может, но хранится в этом случае, неправильное, положительное! »
правильно, в этом случаи если float b,a,x,c,D,y,z; »
с & другие переменные могут принимать лишь положительные значения в вещественном диапазоне зависящем от платформы и от компилятора (от заданного в float.h/cfloat).
Нужно указывать signed float.
В аналогичном сабже (http://www.cyberforum.ru/cpp-beginners/thread15211.html) так и поступили. У них float только дискриминант. :happy:
В аналогичном сабже (http://www.cyberforum.ru/cpp-beginners/thread15211.html) так и поступили »Я видел это решение, когда искал первый раз, грамотно написано, но у меня не компилировалось, выдаёт ошибку:
[C++ Ошибка] Unit1.cpp(25): E2176 Too many types in declaration
...
mes("Введите квадратное уравнение (типа 2x^2+3x-6=0): ");
string input, a, b, c;
signed float fA=1, fB=1, fC=1; // Ошибка на этой строке
getline(cin,input);
...И что нужно сделать, я не знаю.
Drongo, помоему слово signed лишнее :
float fA=1, fB=1, fC=1;
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.