Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 13.05.2014
Сообщений: 8
1

Поиск дискриминанта, АТД "Квадратное уравнение"

30.10.2014, 09:26. Показов 922. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
нужно создать АТД квадратное уравнение, с выводом корней и самого уравнения на экран. Вывод уравнения, вроде, проходит нормально, а вот если дискриминант равен 0, то пишет нет корней
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
float precision = 0.000001f; 
class uravnenie
{
private:
    float a,b,c,x1,x2;
    int n_roots;
public:
    uravnenie(float A, float B, float C);   
    ~uravnenie(){}
    int num_roots() { return n_roots; } // число действительных корней
    void print_roots(); // печатает корни
    void print_uravnenie(); // печатает уравнение
    void schitivanie();
};
 
uravnenie::uravnenie(float A=0.0, float B=0.0, float C=0.0) :
    a(A), b(B), c(C)
{
        x1=0;
        x2=0;
        n_roots=0;
};
 
void uravnenie::print_roots()
{
    if(n_roots == 2)
        cout << "\nx1=" <<  x1 << endl << "x2=" << x2 << endl;
    if(n_roots==1)
        cout << "\n x=" << x1 << endl;
    if (n_roots == 0)
        cout << "No roots" << endl;
}
void uravnenie::print_uravnenie()
{
    if (a!=0 || b!=0 || c!=0){
        if(a!=0) cout << a << "x^2";
        if (b!=0){
            if (b > 0) cout << "+" << b << "x";
            else cout << b << "x";
        }
        if (c!=0){
            if (c > 0) cout << "+" << c << "=0 \n";
            else cout << c << "=0 \n" << endl;
        }
        else cout << "=0 \n";
    }
}
void uravnenie::schitivanie()
{
    cout << "Vvedite a,b,c \n";
    cin >> a >> b >> c;
    if (abs(a) < precision) // a == 0
        return;
    if (b * b - 4 * a * c < precision)
        return;
    x1 = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
    x2 = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);
    if (abs(x1 - x2) < precision) // x1 == x2
        n_roots = 1;
    else
        n_roots = 2;
}
void main(){
    setlocale(0,"");
    uravnenie a;
    a.schitivanie();
    a.print_uravnenie();
    a.num_roots();
    a.print_roots();
    _getch();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2014, 09:26
Ответы с готовыми решениями:

АТД "Квадратное уравнение"
Цель: создать АТД &quot;Квадратное уравнение&quot;. АТД должен включать в себя данные, описывающие...

Создать производные классы линейное уравнение и квадратное уравнение, в которых данная функция переопределена
Создать абстрактный базовый класс уравнение с виртуальной функцией - корни уравнения. Создать...

Составить квадратное уравнение, с вычислением дискриминанта и корней
Снова здравствуйте! задали задание по функциям, составить квадратное уравнение, с вычислением...

Написать простейше уравнение с нахождением дискриминанта
Нужно написать простейше уравнение с нахождением дискрименанта) незнаю првильно ли - пример с...

1
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,068
30.10.2014, 09:39 2
Ну так в коде ведь именно так и задумано

C++
1
2
if (b * b - 4 * a * c < precision)
  return;
Мол, если дискриминант отрицателен или близок к нулю, что нифига не делать.

Может имелось в виду

C++
1
2
if (b * b - 4 * a * c < -precision)
  return;
но тогда получится ерунда с малыми по модулю отрицательными дискриминантами - 'sqrt' накроется медным тазом.

В общем, раз там всегда безусловно вычисляются оба корня, то надо просто честно написать

C++
1
2
if (b * b - 4 * a * c < 0)
  return;
и не валять дурака с этим 'precision'. А если уж вы хотите все таки оценивать близость к нулю через 'precision', тогда извольте обрабатывать ситуацию с "примерно нулевым" дискриминантом отдельно. Ну например

C++
1
2
3
4
5
float d = b * b - 4 * a * c;
if (d < -precision)
  return;
if (d < 0)
  d = 0;
и дальше работаем с 'd'.


Добавлено через 5 минут
P.S. Класс задуман так, что коэффициенты уравнения приходят в него через конструктор. Никакого запрашивания коэффициентов у пользователя внутри 'schitivanie' быть не должно и в помине. Передавать коэффициенты через конструктор, а потому игнорировать ранее переданное и тупо запрашивать их снова в 'schitivanie' - это профанация.
1
30.10.2014, 09:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2014, 09:39
Помогаю со студенческими работами здесь

Квадратное уравнение
Привет всем, застрял, помогите :) Ввести три вещественных числа a, b, c. Решить квадратное...

Квадратное уравнение
Люди помогите пожалуйста. Коэффициенты b и c квадратного уравнения x^2+b*x+c=0 наудачу...

Квадратное уравнение
Написать программу которая вычисляет корни квадратного уравнения. Коэффициенты вводит пользователь....

Квадратное уравнение
Нужно реализовать класс «Квадратное уравнение». Класс должен содержать несколько конструкторов....

Квадратное уравнение
Дано квадратное уравнение.Определите, чему равен дискриминант,являются ли корни действительными...

Квадратное уравнение
Есть два отдельных файла index.html и decide.php когда ввожу переменные и нажимаю на кнопку...

Квадратное уравнение
Хотел написать программу которая решает квадратное уравнение.Выдает две ошибки. #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru