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

Посчитать квадратное уравнение - C++

Восстановить пароль Регистрация
 
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 21:40     Посчитать квадратное уравнение #1
Вообщем есть задание. Простейшее. Надо посчитать квадратное уравнение. На вход в cmd дают последовательность чисел. Любых. Приложение должно отфильтровать мусор и правильно параллельно выполняться. Вывод в main'e.
Прошу от вас
Оценить ООП
Правильно ли подобрана структура данных - map?!
Ну и в стиле Скотта найти кучу ошибок/уродств/багов и всего попутного! Спасибо!
https://drive.google.com/folderview?...2s&usp=sharing
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include "SquareSolver.h"
 
#include <exception>
#include <iostream>
 
 
const char * SquareSolver::errorStrings[] = {"not a double",
                                             "was not solved"
};
 
SquareSolver::SquareSolver(int argc, const char* argv[]) {
    this->proceed(argc,argv);   
}
 
//Describes the proper operation of this class
void SquareSolver::usage() const {
    std::cout << "Enter sequence of number using whitespaces" << std::endl;
    std::cout << "Example: " << std::endl;
    std::cout << "1 -2 -3 0 4 -4 11 22" << std::endl;
    exit(-1);
} 
 
//Return describe of current error (without space at begin)
const char* SquareSolver::errorMessage(int i) const {
    return this->errorStrings[i];
}
 
//Core of computing
void SquareSolver::proceed(int argc,const char** argv) {
    if(this->isDigitSet(argc,argv)) 
        this->fillMap();
        this->squareSolve();
}
 
//isDigitSet check is literal is double Digit, if yes it return true, otherwise false.
bool SquareSolver::isDigitSet(int argc, const char** argv) {    
    try {
        std::vector<double> income;  //Try to create atomic operation
        double val;
        for (int i=1; i < argc; i++) {               //for every literal
            char* end;
            val = strtod(argv[i], &end); //Converting to double
            if (argc >= 2 && !end[0]) {         //If all is okay
                income.push_back(val);
            } else {
                std::cout  <<  argv[i] << " " << this->errorMessage(this->notDouble) << std::endl; 
                this->usage();
                return false;
            }
        }
        this->income = income;
        return true;
    } catch(std::exception& e) {
        std::cout << e.what();
        return false;
    }       
}
 
//Filling map
void SquareSolver::fillMap() {
    try{
        std::vector<double> temp; //temporary vector for "set of 3" income data
        std::vector<double> empty;   //for second pair
        std::map< std::vector<double>   ,std::vector<double> >::iterator cur = this->set.begin();
        double expCount = this->income.size()/3;        //calculating how many pairs
        if(this->income.size() % 3 > 0)                      
            expCount += 1;  
        for(int i = 0, size = this->income.size(); i < size; i++) {         
            if(i % 3 == 0 && i != 0) {          
                this->set.insert(cur,std::pair<std::vector<double>,std::vector<double>>(temp,empty));
                temp.clear();
            }
            temp.push_back(this->income.at(i));
            if(i == size - 1) {
                while(temp.size() < 3)
                    temp.push_back(0);
                this->set.insert(cur,std::pair<std::vector<double>,std::vector<double>>(temp,empty));
            }
        }
    }
    catch(std::exception& e) {
        std::cout << e.what();
    }   
}
 
//Main solve function
void SquareSolver::squareSolve() {   
    std::vector<std::thread> pool;
    for(auto cur = this->set.begin();cur != this->set.end(); cur++) {       
        pool.push_back(std::thread(&SquareSolver::squareExp,this,std::ref(cur)));
    }
    for(auto &thread : pool)
        thread.join();
    
}
 
std::map<std::vector<double>,
    std::vector<double>> SquareSolver::getContainer() const {
        return this->set;
}
 
//Parallel function
void SquareSolver::squareExp(std::map< std::vector<double>, std::vector<double> >::iterator& cur) {
    try {
        double d, x1, x2 , a, b , c;
        a = cur->first.at(0) ;
        b = cur->first.at(1);
        c = cur->first.at(2);
 
        if (a == 0) {
            x1 = -c / b;
            d = -1;
            cur->second.push_back(x1);
        } else {
            d = std::pow(b, 2) - 4 * a * c;
        }   
 
        if( d < 0) {
 
        } else if (d) {
            x1 = (-b + std::sqrt(d)) / ( a * 2 );
            x2 = (-b - std::sqrt(d)) / ( a * 2 );
            cur->second.push_back(x1);
            cur->second.push_back(x2);
        } else {
            x1 = (-cur->first.at(1) + std::sqrt(d)) / ( cur->first.at(0) * 2 );
            cur->second.push_back(x1);
        }   
    } catch(std::exception &e) {
        std::cout << e.what() << std::endl;
        std::cout << SquareSolver::errorMessage(notSolved);
        for(int i = 0, size = cur->first.size(); i < size; i++)
            std::cout << cur->first.at(i);
        std::cout << std::endl;
    }
 
 
    
}
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
//SquareSolver.h
#pragma once
 
#include <map>
#include <vector>
#include <string>
#include <thread>
//This class allows to calculate quadratic equation
class SquareSolver {
public:
    SquareSolver(int argc, const char* argv[]);
    std::map<std::vector<double>,
             std::vector<double>> getContainer() const;
private: //functions
    void                            usage() const;              
    void                            proceed(int argc,const char** argv);
    bool                            isDigitSet(int argc, const char** argv);
    void                            fillMap();
    const char *                    errorMessage(int i) const;
    void                            squareSolve();
    void                            squareExp(std::map< std::vector<double>, std::vector<double> >::iterator& cur);
private: //variables
    std::vector<double>             income, answer;
    std::map<std::vector<double>,
             std::vector<double>>   set; //The set of associations      
    static const char *             errorStrings[];
    enum                            errorCode {
                                        notDouble,
                                        notSolved
                                        };
};
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
//main.cpp
#include "SquareSolver.h" 
#include <iostream>
 
int main(int argc,const char* argv[]) {
    SquareSolver* expSolver = new SquareSolver(argc, argv); 
    auto data = expSolver->getContainer();
    auto cur = data.begin();
    //all  solved
    for(cur; cur != data.end(); cur++) {
        double a(cur->first.at(0)), b(cur->first.at(1)), c(cur->first.at(2));
        std::cout<<'('<<a<<' '<<b<<' '<<c<<')'<<" => " <<'(';
 
        for(int i = 0, size = cur->second.size(); i < size; i++)
            if(i != size-1)
                std::cout<<cur->second.at(i)<<' ';
            else if (size == 0)
                std::cout<<" no roots"<<std::endl;
            else
                std::cout << cur->second.at(i)<<')' <<std::endl;
 
    }
    system("pause");
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2014, 21:40     Посчитать квадратное уравнение
Посмотрите здесь:

C++ Квадратное уравнение
C++ Квадратное уравнение в с
C++ С++ квадратное уравнение
C++ Квадратное уравнение
C++ Квадратное уравнение
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 21:54     Посчитать квадратное уравнение #2
Цитата Сообщение от Warezovvv Посмотреть сообщение
C++
1
2
3
4
5
6
//Core of computing
void SquareSolver::proceed(int argc,const char** argv) {
    if(this->isDigitSet(argc,argv)) 
        this->fillMap();
        this->squareSolve();
}
тут потеряли фигурные скобки у if или это кривое выравнивание?

Добавлено через 1 минуту
Цитата Сообщение от Warezovvv Посмотреть сообщение
C++
1
2
3
4
#include "SquareSolver.h"
 
#include <exception>
#include <iostream>
сначала подключаем стандартные хедеры, а затем свои, мало ли какой есть define в SquareSolver.h

Добавлено через 2 минуты
Цитата Сообщение от Warezovvv Посмотреть сообщение
C++
1
for(cur; cur != data.end(); cur++)
для итераторов всегда используем преинкремент

Цитата Сообщение от Warezovvv Посмотреть сообщение
C++
1
new SquareSolver
new есть, а где delete, хотя с таким main это не критично, но все равно зачем new ?
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 22:00  [ТС]     Посчитать квадратное уравнение #3
Все поправил. Ну выделение памяти для класса. Разве можно просто объявить?!)
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 22:03     Посчитать квадратное уравнение #4
Цитата Сообщение от Warezovvv Посмотреть сообщение
Разве можно просто объявить?!)
почему нет?

Цитата Сообщение от Warezovvv Посмотреть сообщение
C++
1
for(int i = 0, size = cur->second.size(); i < size; i++)
все контейнеры стандартной библиотеки для size используют беззнаковый тип, лучше не мешать знаковые и беззнаковые
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
17.07.2014, 22:07     Посчитать квадратное уравнение #5
Цитата Сообщение от Jupiter Посмотреть сообщение
всегда используем преинкремент
А с чего так? Вроде бы определен оператор пост-инкремента во всех std итераторах
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 22:11     Посчитать квадратное уравнение #6
Цитата Сообщение от gromo Посмотреть сообщение
А с чего так? Вроде бы определен оператор пост-инкремента во всех std итераторах
преинкремент возвращает ссылку, а постикремент возвращает копию старого итератора, зачем нам эта копия в данной ситуации?
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 22:11  [ТС]     Посчитать квадратное уравнение #7
Мне самое интересное. Правильно ли у меня вообще класс построен. Может забыл где const. Или enum'ы не в тему?Я мало с ооп работал. Поэтому четкого видения нет еще. Какое то критичное уродство есть?))
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
17.07.2014, 22:14     Посчитать квадратное уравнение #8
Цитата Сообщение от Warezovvv Посмотреть сообщение
C++
1
2
3
4
enum errorCode {
 notDouble,
 notSolved
};
Скот Мейерс бы одобрил использование улучшенных С++11 enum
C++
1
2
3
4
enum class  ErrorCode : std::size_t {
 notDouble,
notSolved
};
ну и имя enum'a оформляют обычно как имя класса - с больших букв.
Ну и за прагму - отдельный котел в аду предоставляют
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 22:18  [ТС]     Посчитать квадратное уравнение #9
Переделаю enum.
Спасибо))
А что плохого в прагме??
Лучше так: #ifndef FOO_HPP
#define FOO_HPP??
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
17.07.2014, 22:20     Посчитать квадратное уравнение #10
Цитата Сообщение от Warezovvv Посмотреть сообщение
А что плохого в прагме??
То что они на разных реализациях компиляторов разные и сл-но делают код непереносимым.
Цитата Сообщение от Warezovvv Посмотреть сообщение
Лучше так: #ifndef FOO_HPP
#define FOO_HPP??
Именно. Это называется include-guard - простая, мощная и переносимая идиома.
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 22:21  [ТС]     Посчитать квадратное уравнение #11
Спасибо большое! Т.е. впринципе такой код можно людям показывать?))
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
17.07.2014, 22:25     Посчитать квадратное уравнение #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Warezovvv Посмотреть сообщение
принципе такой код можно людям показывать?)
Можно еще, конечно, попридираться, но вцелом, как по мне, он выглядит лучше, чем 80% кода, который постят "спрашиватели" в этом разделе форума
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2014, 00:19     Посчитать квадратное уравнение
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
18.07.2014, 00:19     Посчитать квадратное уравнение #13
Цитата Сообщение от Warezovvv Посмотреть сообщение
C++
1
2
3
auto cur = data.begin();
//all *solved
for(cur; cur != data.end(); cur++)
for range loop попроще будет
C++
1
for (auto const& item : data)
Да и в getContainer можно возвращать ссылку, а не копию.

Добавлено через 22 минуты
Кстати
Цитата Сообщение от Warezovvv Посмотреть сообщение
C++
1
val = strtod(argv[i], &end); //Converting to double
strtod вернёт 0 в случае неудачи, поэтому обнаружить неверный формат с ней - проблема.
Yandex
Объявления
18.07.2014, 00:19     Посчитать квадратное уравнение
Ответ Создать тему
Опции темы

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