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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Вычисление корня квадратного из комплексного числа http://www.cyberforum.ru/cpp-beginners/thread1229026.html
Написать программу для вычисления корня квадратного из комплексного числа z=x+iy. Такая операция на множестве комплексных чисел, как известно, имеет два решения z1=sqrt(|z|)exp(i\varphi/2) и sqrt(|z|)exp(i\varphi/2+ipi), где |z|=sqrt(x^2+y^2) есть модуль комплексного числа z, а \varphi - его аргумент. Вычислить действительную и мнимую части чисел z1 и z2. параметры x и y вводятся пользователем с...
C++ Задержка на несколько секунд в приложении Как сделать задержку на несколько секунд? Например, чтобы вывелась строчка, а через десять секунд вывелась другая. http://www.cyberforum.ru/cpp-beginners/thread1229025.html
C++ Завершение потока ввода
Всем привет,столкнулся с небольшой проблемой,расскажите почему так происходит собственно.. сама суть проблемы.. После ввода нескольких чисел нажимаю Ctrl+z для завершения ввода.. и далее программа завершается, не выполнив оставшиеся инструкции.. код vector<double> num; double number; int count; cout<<"Введите несколько чисел"<<endl; cin>>number; while(cin>>number){...
C++ Работа функции qsort - объяснить работу функции
#include<iostream> #include<cstdlib> int mysort(const void *arg1, const void *arg2); int main() { const short ARR_SIZE=5; int arr={10,5,6,1,3}; std::qsort(arr, ARR_SIZE, sizeof (int), mysort); for (int i=0;i<ARR_SIZE;++i) { std::cout<<arr<<std::endl; }
C++ Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И http://www.cyberforum.ru/cpp-beginners/thread1228840.html
Здравствуйте. Помогите, пожалуйста. У меня возникли проблемы. Вот задание: Описать массив записей "семья". -------------------------------------------------------------- Отец ! Мать ! Ребенок ! ! Ребенок! --------------------------------------- ----------- Ф.И.О.!дата !Ф.И.О.!дата ! Имя !дата ! ...... ! Имя !дата ! !рожд.! ...
C++ Std::thread, создать указатель на член класса Есть класс #pragma once #include <map> #include <vector> #include <string> #include <thread> //This class allows to calculate quadratic equation class SquareSolver { public: подробнее

Показать сообщение отдельно
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 21:40     Посчитать квадратное уравнение
Вообщем есть задание. Простейшее. Надо посчитать квадратное уравнение. На вход в 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru