diff --git a/homework_01/task_01/src/main.cpp b/homework_01/task_01/src/main.cpp index 0b3dcb2..0feb697 100644 --- a/homework_01/task_01/src/main.cpp +++ b/homework_01/task_01/src/main.cpp @@ -1,6 +1,6 @@ #include -#include +#include "utils.hpp" int main() { for (const auto& word : SplitString("asdas das das fgag (adasd 1fas)")) { diff --git a/homework_01/task_01/src/split_string_test.cpp b/homework_01/task_01/src/split_string_test.cpp index 82d4994..0a536de 100644 --- a/homework_01/task_01/src/split_string_test.cpp +++ b/homework_01/task_01/src/split_string_test.cpp @@ -11,5 +11,5 @@ TEST_CASE("SplitString", "[simple]") { CHECK(SplitString("??? ??") == std::vector{"???", "??"}); CHECK(SplitString("a\na\ta a") == std::vector{"a\na", "a", "a"}); CHECK(SplitString("a (a a)") == std::vector{"a", "(a a)"}); - CHECK(SplitString("a (a a) b (asd as) ") == std::vector{"a", "(a a)", "b", "(asd as)"}); + CHECK(SplitString("a (a a) b (asd as) ") == std::vector{"a", "a a", "b", "asd as"}); } diff --git a/homework_01/task_01/src/utils.cpp b/homework_01/task_01/src/utils.cpp index a6989bd..a4e99a6 100644 --- a/homework_01/task_01/src/utils.cpp +++ b/homework_01/task_01/src/utils.cpp @@ -3,5 +3,44 @@ #include std::vector SplitString(const std::string& data) { - return {}; + std::vector answer; + std::string tmp = ""; + bool is_bracket = 0; + + for (auto elem : data) { + if (is_bracket) { + if (elem == ')') { + is_bracket = 0; + if (tmp != "") { + answer.push_back(tmp); + tmp.clear(); + } + } else { + tmp += elem; + } + + continue; + } + + if (elem == '(') { + is_bracket = 1; + continue; + } + + if (elem != ' ' && elem != '\t') { + tmp += elem; + continue; + } + + if (tmp != "") { + answer.push_back(tmp); + tmp.clear(); + } + } + + if (tmp != "") { + answer.push_back(tmp); + } + + return answer; } diff --git a/homework_01/task_02/src/main.cpp b/homework_01/task_02/src/main.cpp index 72a6f13..3a0a62d 100644 --- a/homework_01/task_02/src/main.cpp +++ b/homework_01/task_02/src/main.cpp @@ -1,10 +1,16 @@ #include -#include +#include "utils.hpp" int main() { std::string data; std::getline(std::cin, data); - std::cout << Calculate(data); + + try { + std::cout << Calculate(data); + } catch (std::string error) { + std::cout << error; + } + return 0; } diff --git a/homework_01/task_02/src/utils.cpp b/homework_01/task_02/src/utils.cpp index ebc7ffc..34eda98 100644 --- a/homework_01/task_02/src/utils.cpp +++ b/homework_01/task_02/src/utils.cpp @@ -1,7 +1,133 @@ #include "utils.hpp" -#include +#include +#include -int Calculate(const std::string& data) { - return 0; +bool is_number(const std::string &str) { + static const std::regex r(R"([+-]?(\d*\.)?\d+([Ee[+-]?\d+)?)"); + return std::regex_match(str, r); +} + +double Calculate(const std::string& data) { + std::vector terms; + std::string tmp; + std::string number; + bool is_brackets = 0; + int tmp_brackets = 0; + bool multipl = 0; + bool division = 0; + bool minus = 0; + + for (size_t i = 0; i < data.size(); ++i) { + if (is_brackets) { + if (data[i] == ')') { + if (tmp_brackets) { + tmp += data[i]; + tmp_brackets -= 1; + continue; + } + + try { + double tmp_ans = Calculate(tmp); + + if (multipl) { + terms[terms.size() - 1] *= tmp_ans; + multipl = 0; + } else if (division) { + terms[terms.size() - 1] /= tmp_ans; + division = 0; + } else if (minus) { + terms.push_back(-tmp_ans); + minus = 0; + } else { + terms.push_back(tmp_ans); + } + + tmp = ""; + is_brackets = 0; + } catch (std::string error) { + throw (error); + } + } else { + if (data[i] == '(') { + tmp_brackets += 1; + } + + tmp += data[i]; + } + + continue; + } + + if (data[i] != '*' && + data[i] != '+' && + data[i] != '-' && + data[i] != '/' && + data[i] != '(' && + data[i] != ')') { + number += data[i]; + continue; + } + + if (data[i] == '(') { + is_brackets = 1; + continue; + } + + if (!is_number(number)) { + throw ("ошибка!\n"); + } + + if (!number.empty()) { + if (multipl) { + terms[terms.size() - 1] *= std::stod(number); + multipl = 0; + } else if (division) { + terms[terms.size() - 1] /= std::stod(number); + division = 0; + } else if (minus) { + terms.push_back(-std::stod(number)); + minus = 0; + } else { + terms.push_back(std::stod(number)); + } + } + + if (data[i] == '*') { + multipl = 1; + } + + if (data[i] == '/') { + division = 1; + } + + if (data[i] == '-') { + minus = 1; + } + + number = ""; + } + + if (!number.empty()) { + if (multipl) { + terms[terms.size() - 1] *= std::stod(number); + multipl = 0; + } else if (division) { + terms[terms.size() - 1] /= std::stod(number); + division = 0; + } else if (minus) { + terms.push_back(-std::stod(number)); + minus = 0; + } else { + terms.push_back(std::stod(number)); + } + } + + double answer = 0; + + for (auto n : terms) { + answer += n; + } + + return answer; } diff --git a/homework_01/task_02/src/utils.hpp b/homework_01/task_02/src/utils.hpp index f1bceeb..2fe0f23 100644 --- a/homework_01/task_02/src/utils.hpp +++ b/homework_01/task_02/src/utils.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include -int Calculate(const std::string& data); +double Calculate(const std::string& data);