Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
5b48ec8
дз Корниенко
Tatyana145 Dec 12, 2022
927d13d
Update utils.cpp
tatiana-kornienko14 Dec 12, 2022
d7e0ebf
Update utils.cpp
tatiana-kornienko14 Dec 12, 2022
967dcd6
Update utils.cpp
tatiana-kornienko14 Dec 13, 2022
7d98991
Update utils.cpp
tatiana-kornienko14 Dec 13, 2022
4478790
поменяла названияя переменных, скоро поправлю еще кое-что
Tatyana145 Dec 13, 2022
583d79f
почти доделала, осталось немного
Tatyana145 Dec 13, 2022
cbf9a23
вроде все поправила
Tatyana145 Dec 13, 2022
cbe78b7
доделала; вот это уже должно работать
Tatyana145 Dec 13, 2022
9d256ec
обработала ошибку в main.cpp
Tatyana145 Dec 13, 2022
eef1f60
это не особо важно
Tatyana145 Dec 14, 2022
e10e177
добавила условие со скобками, надо еще доработать
Tatyana145 Dec 14, 2022
ad1ddc4
вроде добила
Tatyana145 Dec 14, 2022
a3f08ef
пара поправок
Tatyana145 Dec 14, 2022
cffd546
поправила
Tatyana145 Dec 15, 2022
82eaff7
поправила
Tatyana145 Dec 15, 2022
b9d468e
пока временно поменяла все на int, потом верну обратно; добавила empty
Tatyana145 Dec 16, 2022
f95057c
СКОБОЧКИ РАБОТАЮТ, УРА :D а вообще осталось чуть-чуть
Tatyana145 Dec 16, 2022
6165635
теперь скобочки работают и внутри скобочек
Tatyana145 Dec 17, 2022
7af5548
работает! :D
Tatyana145 Dec 17, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion homework_01/task_01/src/main.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <iostream>

#include <utils.hpp>
#include "utils.hpp"

int main() {
for (const auto& word : SplitString("asdas das das fgag (adasd 1fas)")) {
Expand Down
2 changes: 1 addition & 1 deletion homework_01/task_01/src/split_string_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ TEST_CASE("SplitString", "[simple]") {
CHECK(SplitString("??? ??") == std::vector<std::string>{"???", "??"});
CHECK(SplitString("a\na\ta a") == std::vector<std::string>{"a\na", "a", "a"});
CHECK(SplitString("a (a a)") == std::vector<std::string>{"a", "(a a)"});
CHECK(SplitString("a (a a) b (asd as) ") == std::vector<std::string>{"a", "(a a)", "b", "(asd as)"});
CHECK(SplitString("a (a a) b (asd as) ") == std::vector<std::string>{"a", "a a", "b", "asd as"});
}
41 changes: 40 additions & 1 deletion homework_01/task_01/src/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,44 @@
#include <stack>

std::vector<std::string> SplitString(const std::string& data) {
return {};
std::vector<std::string> 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;
}
10 changes: 8 additions & 2 deletions homework_01/task_02/src/main.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
#include <iostream>

#include <utils.hpp>
#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;
}
132 changes: 129 additions & 3 deletions homework_01/task_02/src/utils.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,133 @@
#include "utils.hpp"

#include <stack>
#include <iostream>
#include <regex>

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<double> 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] == ')') {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Замечу просто, что если отключать флаг is_brackets сразу, как только встречается закрывающая скобка, то вложенные друг в друга скобки точно корректно оброватываться не будут. Впрочем, для первого задания и так хорошо

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;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Скобочки у вас пока ещё корректно не обрабатываются. Наличие скобочек приводит к вылетам программы. Чтобы исправить вылеты, вставьте сюда код (но это ещё не всё):

if (number.empty())
  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));
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Чтобы исправить вылеты из-за скобочек, окружите операторы if-else ещё одной проверкой:

if (!number.empty())
{
    if (multipl) {
        terms[terms.size() - 1] *= std::stoi(number);
        multipl = 0;
    } else if (division) {
        terms[terms.size() - 1] /= std::stoi(number);
        division = 0;
    } else if (minus) {
        terms.push_back(-std::stoi(number));
        minus = 0;
    } else {
        terms.push_back(std::stoi(number));
    }
}


double answer = 0;

for (auto n : terms) {
answer += n;
}

return answer;
}
3 changes: 1 addition & 2 deletions homework_01/task_02/src/utils.hpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#pragma once

#include <string>
#include <string_view>
#include <vector>

int Calculate(const std::string& data);
double Calculate(const std::string& data);