Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Nortin
0 / 0 / 0
Регистрация: 13.05.2014
Сообщений: 8
#1

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

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

нужно создать АТД квадратное уравнение, с выводом корней и самого уравнения на экран. Вывод уравнения, вроде, проходит нормально, а вот если дискриминант равен 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2014, 09:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Поиск дискриминанта, АТД "Квадратное уравнение" (C++):

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

Проверить истинность высказывания: "Квадратное уравнение имеет действительные корни" - C++
Даны числа A, B, C (число A не равно 0). Рассмотрев дискриминант D = B2 – 4·A·C, проверить истинность высказывания: «Квадратное уравне- ...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

АТД список. Заменить меньшую часть списка символом "#" - C++
Здравствуйте!! Подскажите пожалуйста!! Нужна заменить меньшую часть (половину) списка символом &quot;#&quot; ! Например: Есть...

АТД "Однонаправленный список" с элементами типа char - C++
помогите пожалуйста) АТД − однонаправленный список с элементами типа char. Дополнительно перегрузить следующие операции: + –...

Задание по ООП: создание АТД "Массив" - C++
Такое задание на листке бумаги написать ADT массива, то что я принес преподаватель откатл и сказал что много чего не достает и ещё и не ...

1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4307 / 2326 / 575
Регистрация: 18.10.2014
Сообщений: 3,965
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2014, 09:39
Привет! Вот еще темы с ответами:

Создание АТД "Стек" на основе массива - C++
&quot;Реализуйте АТД “стек” на основе массива фиксированного размера для элементов, являющихся односвязными списками целых чисел (т.е., стек...

Программа по созданию АТД "Фотоаппарат" - C++
Нужно создать АТД - фотоаппарат. Поля структуры: Название, Количество кадров в заряженной пленке, Номер текущего кадра. Реализовать...

Описать шаблон класса АТД: "Участник очереди на печать издания: фамилия, телефон, количество страниц" - C++
Шаблоны классов с++. Нужно доделать задачу. 1. Описать шаблон класса АТД: &quot;Участник очереди на печать издания: фамилия, телефон,...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru