Graphic Calculator: FIDocalcus
Проект трёх первокурсников (по инженерному практикуму в первом семестре) по созданию графического калькулятора на FLTK C++
Loading...
Searching...
No Matches
Math_func::expose_func_str Class Reference

Класс, который при иниц. мод. строку, обозначающую мат. функцию, хранит все номера мат. функ., завис. от текущей More...

#include <expose_func_str.h>

Collaboration diagram for Math_func::expose_func_str:

Public Member Functions

 expose_func_str (const std::vector< std::string > &_all_funcs_str, std::string &_func_str)
 Инициализирует новый экземпляр expose func_str.
 
std::vector< size_t > get_dependencies ()
 

Private Member Functions

void expose_dep_func ()
 Раскрывает все зависимости, модифицируя строку
 

Private Attributes

std::vector< std::string > all_funcs_str
 Вектор со всеми мат. функциями в виде строк
 
std::vector< size_t > dependencies
 Общий вектор всех номеров мат. функций, которые зависят от текущей
 
std::string & func_str
 Текущая мат. функция в виде строки
 

Detailed Description

Класс, который при иниц. мод. строку, обозначающую мат. функцию, хранит все номера мат. функ., завис. от текущей

Constructor & Destructor Documentation

◆ expose_func_str()

Math_func::expose_func_str::expose_func_str ( const std::vector< std::string > & _all_funcs_str,
std::string & _func_str )

Инициализирует новый экземпляр expose func_str.

Parameters
_all_funcs_strвсе мат. функции
_func_strраскрываемая мат. функция
21 : all_funcs_str{_all_funcs_str}, func_str{_func_str} {
23}
void expose_dep_func()
Раскрывает все зависимости, модифицируя строку
Definition expose_func_str.cpp:25
std::string & func_str
Текущая мат. функция в виде строки
Definition expose_func_str.h:46
std::vector< std::string > all_funcs_str
Вектор со всеми мат. функциями в виде строк
Definition expose_func_str.h:43
Here is the call graph for this function:

Member Function Documentation

◆ expose_dep_func()

void Math_func::expose_func_str::expose_dep_func ( )
private

Раскрывает все зависимости, модифицируя строку

Exceptions
std::invalid_argumentтом случае, если ввод инвалиден

Вектор для записи зависимости, еще не дошедшей до выражения без y_n

Текущий символ

Считываемый предполагаемый номер мат. функции

Номер предполагаемой мат. функции в общем векторе

Индекс предполагаемой мат. функции в общем векторе

25 {
27
28 /// @brief Вектор для записи зависимости, еще не дошедшей до выражения без y_n
29 vector<size_t> unexposed_dependencies;
30
31 // если 'y' нету, то и делать ничего не надо
32 if (!c_in_s('y', func_str)) return;
33
34 // в строке есть y, но за ним нету номера
35 if (func_str.find("y_") == string::npos)
36 throw invalid_argument("invalid usage 'y'");
37
38 // y_n стоит в конце
39 if (func_str.rfind('y') > func_str.size() - 3)
40 throw invalid_argument("invalid usage 'y'");
41
42 // иначе проходимся по строке до тех пор, пока в ней не будут раскрыты все y_n
43 // (мы проходимся не рекурсией, а динамически: подтаскиваем все раскрытия y_n)
44 for (size_t i = 0; i < func_str.size(); i++) {
45 /// @brief Текущий символ
46 char ch = func_str[i];
47
48 if (ch == 'y') {
49 /// @brief Считываемый предполагаемый номер мат. функции
50 // (на данном моменте может оказаться не валидным)
51 string read_est_number = "";
52
53 // склеиваем все цифры кроме нуля, которые идут после '_'
54 for (size_t j = i + 2; j < func_str.size(); j++)
55 if (isdigit(func_str[j]) && func_str[j] != '0')
56 read_est_number += func_str[j];
57 else
58 break; // (дальше пошли не цифры)
59
60 // не считали, значит, это был либо 0, либо что-то иное
61 if (read_est_number.empty())
62 throw invalid_argument("invalid function number");
63
64 /// @brief Номер предполагаемой мат. функции в общем векторе
65 size_t est_number = stoull(read_est_number);
66
67 /// @brief Индекс предполагаемой мат. функции в общем векторе
68 size_t est_index = est_number - 1;
69
70 // номер больше количества возможных к вводу мат. функций
71 if (est_number > all_funcs_str.size())
72 throw invalid_argument("invalid function number: " + read_est_number);
73
74 // встретили внутри еще не до конца раскрытых зависимостей повтор номера
75 if (elem_in_vec(est_number, unexposed_dependencies))
76 throw invalid_argument("self-usage or loop");
77
78 // если новое раскрытие содержит y - значит, оно не полное
79 if (c_in_s('y', all_funcs_str[est_index]))
80 unexposed_dependencies.push_back(est_number);
81 // если не содержит, то раскрыли веточку
82 else
83 unexposed_dependencies.clear();
84
85 // если неполных раскрытий с этим номером не было,
86 // добавляем его в общий список
87 // (таким образом в общем списке не будет повторов)
88 if (!elem_in_vec(est_number, dependencies))
89 dependencies.push_back(est_number);
90
91 // заменяем в func_str выражение y_n на то, что оно означает
92 // (заключаем в скобки, чтобы не нарушать мат. порядок действий)
93
94 // TODO: выводить полный тип ошибки только в боксе первичной мат. функции
95 // TODO: а во всех остальных просто писать, что такая-то такая ошибочна
96
97 // пустая строка - самая очевидная ошибка, её менять нету смысла
98 if (!all_funcs_str[est_index].empty())
99 Backend_utilities::replace(func_str, "y_" + read_est_number,
100 '(' + all_funcs_str[est_index] + ')');
101 else
102 func_str = all_funcs_str[est_index];
103 }
104 }
105}
std::vector< size_t > dependencies
Общий вектор всех номеров мат. функций, которые зависят от текущей
Definition expose_func_str.h:49
bool elem_in_vec(T elem, const std::vector< T > &vec)
Definition utilities.h:24
void replace(string &str, const string &from, const string &to)
Заменяет кусочек строки другим, модифицируя саму строку
Definition utilities.cpp:36
bool c_in_s(char c, const string &s)
Definition utilities.cpp:9
string spaces_deleted(const string &s)
Definition utilities.cpp:27
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_dependencies()

std::vector< size_t > Math_func::expose_func_str::get_dependencies ( )
inline
25{ return dependencies; }

Member Data Documentation

◆ all_funcs_str

std::vector<std::string> Math_func::expose_func_str::all_funcs_str
private

Вектор со всеми мат. функциями в виде строк

◆ dependencies

std::vector<size_t> Math_func::expose_func_str::dependencies
private

Общий вектор всех номеров мат. функций, которые зависят от текущей

◆ func_str

std::string& Math_func::expose_func_str::func_str
private

Текущая мат. функция в виде строки


The documentation for this class was generated from the following files: