homework-tk - #14
Conversation
|
|
||
| std::vector<std::string> SplitString(const std::string& data) { | ||
| return {}; | ||
| std::vector<std::string> v; |
There was a problem hiding this comment.
плохое имя у переменной, непонятно что она означает
| std::vector<std::string> v; | ||
| std::string tmp = ""; | ||
|
|
||
| for (auto c : s) { |
There was a problem hiding this comment.
тут ошибка компиляции будет, нет переменной s
| std::string tmp = ""; | ||
|
|
||
| for (auto c : s) { | ||
| if (c != ' ') { |
There was a problem hiding this comment.
если посмотреть в тесты, то там не только по пробелу разделение идет, но и по символу табуляции ('\t')
|
|
||
| #include <regex> | ||
| #include <stack> | ||
| #define vector_string std::vector<std::string> |
There was a problem hiding this comment.
using vector_string = std::vector<std::string>;
так же можно использовать typedef
не стоит использовать define где этого можно избежать
|
|
||
| int Calculate(const std::string& data) { | ||
| return 0; | ||
| std::vector<int> v1; // хотела сделать тип double, но в тестах int, так что пока так |
There was a problem hiding this comment.
если хочешь сделай double, это только плюс
название переменной так себе (непонятно что означает)
| return 0; | ||
| std::vector<int> v1; // хотела сделать тип double, но в тестах int, так что пока так | ||
| std::string tmp; | ||
| bool f = 0, pr = 0, dl = 0, mns = 0; |
There was a problem hiding this comment.
совсем непонятные названия переменных, и хорошая практика: одна переменная - одна строка
| bool f = 0, pr = 0, dl = 0, mns = 0; | ||
|
|
||
| for (size_t i = 0; i < data.size(); ++i) { | ||
| if (data[i] != "*" && data[i] != "+" && data[i] != "-" && data[i] != "/" && !(is_numb(data[i]))) { |
There was a problem hiding this comment.
!(is_numb(data[i])) лишние круглые скобки
а ещё лучше вот так оформить:
if (data[i] != "*" &&
data[i] != "+" &&
data[i] != "-" &&
data[i] != "/" &&
!is_numb(data[i]))
|
|
||
| for (size_t i = 0; i < data.size(); ++i) { | ||
| if (data[i] != "*" && data[i] != "+" && data[i] != "-" && data[i] != "/" && !(is_numb(data[i]))) { | ||
| std::cout << "ошибка!\n"; |
There was a problem hiding this comment.
тут можно кинуть исключение, например std::runtime_error
|
в первой задаче не рассмотрен случай со скобками и табуляцией |
| #include <stack> | ||
| #define vector_string std::vector<std::string> | ||
|
|
||
| bool is_numb(const std::string &str) { |
There was a problem hiding this comment.
В большинстве случаев не стоит сокращать слова в именах. Имя IsNumber (ну или is_number) проще понять, чем is_numb (к тому же numb переводится с английского как онемевший, что добавляет двусмысленности)
| bool f = 0, pr = 0, dl = 0, mns = 0; | ||
|
|
||
| for (size_t i = 0; i < data.size(); ++i) { | ||
| if (data[i] != "*" && data[i] != "+" && data[i] != "-" && data[i] != "/" && !(is_numb(data[i]))) { |
There was a problem hiding this comment.
Следующий код не скомпилируется
if (data[i] != "*" && data[i] != "+" && data[i] != "-" && data[i] != "/" && !(is_numb(data[i]))).
Первая причина: data[i] имеет тип char, а символы "*", "+", "-" и "/" тип const char*, и сравнивать их нельзя.
Вторая причина: функция is_numb принимает аргумент типа const std::string &str, а вы передаёте char.
Можно исправить эту строчку так:
if (data[i] != '*' && data[i] != '+' && data[i] != '-' && data[i] != '/' && !(is_numb(std::to_string(data[i]))))
| } | ||
|
|
||
| if (f) { | ||
| if (data[i] == ")") { |
There was a problem hiding this comment.
Не скомпилируется. Исправление: data[i] == ')'
| continue; | ||
| } | ||
|
|
||
| if (data[i] == "(") { |
| } | ||
|
|
||
| if (pr) { | ||
| v1[v1.size()-1] *= std::stoi(data[i]); |
There was a problem hiding this comment.
Не скомпилируется. Функция std::stoi принимает строку, не char. Вариант исправления:
v1[v1.size() - 1] *= data[i] - '0';
| continue; | ||
| } | ||
|
|
||
| if (data[i] == "*") { |
| continue; | ||
| } | ||
|
|
||
| if (data[i] == "/") { |
| continue; | ||
| } | ||
|
|
||
| if (data[i] == "-") { |
| continue; | ||
| } | ||
|
|
||
| if (data[i] == "+") { |
| continue; | ||
| } | ||
|
|
||
| v1.push_back(std::stoi(data[i])); |
поправила названия переменных, добавила проверку на табуляцию
я так посмотрела, define у меня в принципе нигде не используется... упс увидела, кстати, у себя заметную проблему в коде, скоро исправлю, заодно доисправляю названия переменных
LostPointer
left a comment
There was a problem hiding this comment.
поправь в тестах для первого задания с { "a", "(a a)", "b", "(asd as)" } на { "a", "a a", "b", "asd as" }, так будут проходить тесты
| is_bracket = 0; | ||
| if (tmp != "") { | ||
| answer.push_back(tmp); | ||
| tmp = ""; |
There was a problem hiding this comment.
лучше оспользовать метод clear: tmp.clear()
это даст немного больше понимания что ты очищаешь переменную, а не присваиваешь значение переменной
| #include <iostream> | ||
| #include <regex> | ||
| #include <stack> | ||
| #include "utils.hpp" |
There was a problem hiding this comment.
а вот если у тебя два файла с одинаковым мененм и расширениями .cpp и .hpp, в cpp инклуд hpp должен идти первым. получится примерно вот так:
#include "utils.hpp"
#include <regex>
#include <stack>
#include <iostream>
| } | ||
|
|
||
| if (!is_number(number)) { | ||
| throw ("ошибка!\n"); |
| } | ||
|
|
||
| if (multipl) { | ||
| terms[terms.size()-1] *= std::stoi(number); |
There was a problem hiding this comment.
пробелы пропущены: terms.size() - 1
| number += data[i]; | ||
| continue; | ||
| } | ||
|
|
There was a problem hiding this comment.
Скобочки у вас пока ещё корректно не обрабатываются. Наличие скобочек приводит к вылетам программы. Чтобы исправить вылеты, вставьте сюда код (но это ещё не всё):
if (number.empty())
continue;
| minus = 0; | ||
| } else { | ||
| terms.push_back(std::stoi(number)); | ||
| } |
There was a problem hiding this comment.
Чтобы исправить вылеты из-за скобочек, окружите операторы 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));
}
}
|
|
||
| for (size_t i = 0; i < data.size(); ++i) { | ||
| if (is_brackets) { | ||
| if (data[i] == ')') { |
There was a problem hiding this comment.
Замечу просто, что если отключать флаг is_brackets сразу, как только встречается закрывающая скобка, то вложенные друг в друга скобки точно корректно оброватываться не будут. Впрочем, для первого задания и так хорошо
| } | ||
|
|
||
| if (multipl) { | ||
| terms[terms.size() - 1] *= std::stoi(number); |
There was a problem hiding this comment.
std::stoi(number) возвращает int, а term хранит double (да и функция Calculate, вроде, должна double возвращать). Нестыковка)
No description provided.