Форум программистов, компьютерный форум CyberForum.ru

Класс квадратных уравнений - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
26.11.2011, 12:54     Класс квадратных уравнений #1
Всем привет. Написал класс квадратных уравнений и программу, которая его использует (решает их).
Все работает, но по возможности проверьте, пожалуйста и не скажите, где и почему я не прав. Желательно не только по поводу самим способов решения задач, и по поводу остальных вещей вроде форматирования кода и т. д. Заранее спасибо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class QuadraticEquations
{
public:
    QuadraticEquations( double = 1, double = 0, double = 0,  
                        double = 0, double = 0 );   
    
    void setValues( double, double, double );          
    
    bool solve();             // решает уравнение. возвращает 0 в случае "НЕТ КОРНЕЙ"
                              // и 1 в случае успешного решения
    double getX1() const;                             
    double getX2() const;
       
private:
    double a;
    double b;
    double c;
    
    double x1, x2;
    
    double findDiscrim();                                      
};
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
#include <cmath>
#include "QuadraticEquations.h"
 
#define SUCCESS 1
#define FAIL    0
 
QuadraticEquations::QuadraticEquations( double aa, double bb, double cc,
                                        double xx1, double xx2 )
                                        : a( aa ), b( bb ), c( cc ), x1( xx1 ), x2( xx2 )
{
                                        
}
 
void QuadraticEquations::setValues( double aa, double bb, double cc )
{
    a = aa;
    b = bb;
    c = cc;
}
 
bool QuadraticEquations::solve()
{
    double d = findDiscrim(); 
     
    if( a != 0 && d >= 0 ) {
        x1 = ( -b + ( sqrt( d ) ) ) / ( 2 * a );
        x2 = ( -b - ( sqrt( d ) ) ) / ( 2 * a );
        
        return SUCCESS;
    }
    else if( a == 0 || d < 0 )
        return FAIL;
}
 
double QuadraticEquations::getX1() const
{
    return x1;
}
 
double QuadraticEquations::getX2() const
{
    return x2;
}
 
double QuadraticEquations::findDiscrim()
{
    return ( b * b ) - ( 4 * a * c );
}
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
#include <conio.h>
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
 
#include "QuadraticEquations.h"
 
void askKoefficients( double *, double *, double * );
void showRoots( QuadraticEquations );
 
int main()
{
    double a, b, c;
    askKoefficients( &a, &b, &c );
    
    QuadraticEquations equation( a, b, c );
    
    if( !equation.solve() )
        cout << "No real roots." << endl;
    else
        showRoots( equation );
    
    getch();
    return 0;
}
 
void askKoefficients( double *a, double *b, double *c )
{
    cout << "Enter A, B, C: ";
    cin >> *a >> *b >> *c;
}
 
void showRoots( QuadraticEquations equation )
{
    double x1 = equation.getX1(), 
           x2 = equation.getX2();
           
    if( x1 != x2 )
        cout << "x = " << x1 << " or x = " << x2 << ".";
    else
        cout << "x = " << x1 << ".";
}
Добавлено через 14 часов 58 минут
Проверьте кто-нибудь, пожалуйста.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
26.11.2011, 14:22     Класс квадратных уравнений #2
В целом всё достаточно грамотно.
Только я бы убрал из параметров конструктора корни уравнения, чтобы пользователю их нельзя было явно установить, и, возможно, стоит решать уравнение автоматически и в конструкторе, и после изменения коэффициентов, чтобы не могло возникнуть ситуации, при которой уравнение с одними коэффициентами имело бы корни от уравнения с другими.
Ну и если уж делаешь препроцессорные определения, то делай их правильно: если определяешь булевские значения, то делай их не единицей и нулём, а истиной и ложью. А вообще, лучше это делать не с помощью препроцессора, а с помощью глобальных констант.

Добавлено через 38 минут
Да, и ещё к числу с плавающей точкой некорректно применять операции равенства и неравенства.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
26.11.2011, 14:24  [ТС]     Класс квадратных уравнений #3
Спасибо большое.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
26.11.2011, 14:29     Класс квадратных уравнений #4
И ещё, раз уж у тебя класс, а не функция, то можно сделать доступ к коэффициентам уравнения.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
26.11.2011, 14:30     Класс квадратных уравнений #5
Цитата Сообщение от vortexx1 Посмотреть сообщение
// решает уравнение. возвращает 0 в случае "НЕТ КОРНЕЙ"
// и 1 в случае успешного решения
а почему бы не возвращать структуру которая содержит два поля double(в них хранится ответ)
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
26.11.2011, 14:34     Класс квадратных уравнений #6
Van111, если из функции решения сразу возвращать корни, то придётся ещё как-то возвращать и булевское значение, которое указывает, решается ли уравнение в целых числах, а это неудобно.
Yandex
Объявления
26.11.2011, 14:34     Класс квадратных уравнений
Ответ Создать тему
Опции темы

Текущее время: 08:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru