-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvariable.cpp
More file actions
236 lines (217 loc) · 7.32 KB
/
Copy pathvariable.cpp
File metadata and controls
236 lines (217 loc) · 7.32 KB
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#include "variable.h"
Variable::Variable(const QChar name){
setName(name);
}
Variable::Variable(const QString &name){
setName(name);
}
Variable::Variable(const QChar name, const QList<bool> * vars){
setName(name);
if(vars)
setVars(*vars);
}
Variable::Variable(const QChar name, const int numberVariables, const int positionVariable){
setName(name);
setVars(numberVariables, positionVariable);
}
/*!
* \brief Variable::operator > оператор больше
* \param other другая переменная
* \return больше ли данная перменная
*
* \warning Используется только для сортировки, не является логическим действием в понимании самого калькулятора!
*/
bool Variable::operator > (const Variable &other)
{
return name_ > other.name_;
}
/*!
* \brief Variable::operator < оператор меньше
* \param other другая переменная
* \return меньше ли данная перменная
*
* \warning Используется только для сортировки, не является логическим действием в понимании самого калькулятора!
*/
bool Variable::operator < (const Variable &other)
{
return name_ < other.name_;
}
/*!
* \brief Variable::conjunction Конъюнкция
* \param other с данной переменной
* \return Получившееся значение
*/
Variable Variable::conjunction(const Variable &other) const{
Variable v(makeName(getName(), " * ", other.getName()));
QList<bool> temp;
for(int i = 0; i < vars_.size(); i++)
temp.push_back(vars_[i] && other.vars_[i]);
v.setVars(temp);
return v;
}
/*!
* \brief Variable::disjunction Дизъюнкция
* \param other с данной переменной
* \return Получившееся значение
*/
Variable Variable::disjunction(const Variable &other) const{
Variable v(makeName(getName(), " + ", other.getName()));
QList<bool> temp;
for(int i = 0; i < vars_.size(); i++)
temp.push_back(vars_[i] || other.vars_[i]);
v.setVars(temp);
return v;
}
/*!
* \brief Variable::implication Импликация
* \param other с данной переменной
* \return Получившееся значение
*/
Variable Variable::implication(const Variable &other) const{
Variable v(makeName(getName(), " -> ", other.getName()));
QList<bool> temp;
for(int i = 0; i < vars_.size(); i++)
temp.push_back(( vars_[i] == true && other.vars_[i] == false ) ? false : true);
v.setVars(temp);
return v;
}
/*!
* \brief Variable::converse Обратная импликация
* \param other с данной переменной
* \return Получившееся значение
*/
Variable Variable::converse(const Variable &other) const{
Variable v(makeName(getName(), " <- ", other.getName()));
QList<bool> temp;
for(int i = 0; i < vars_.size(); i++)
temp.push_back(( vars_[i] == false && other.vars_[i] == true ) ? false : true);
v.setVars(temp);
return v;
}
/*!
* \brief Variable::notAnd Штрих Шеффера
* \param other с данной переменной
* \return Получившееся значение
*/
Variable Variable::notAnd(const Variable &other) const{
Variable v(makeName(getName(), " | ", other.getName()));
QList<bool> temp;
for(int i = 0; i < vars_.size(); i++)
temp.push_back(( vars_[i] == true && other.vars_[i] == true ) ? false : true);
v.setVars(temp);
return v;
}
/*!
* \brief Variable::notOr Стрелка Пирса
* \param other с данной переменной
* \return Получившееся значение
*/
Variable Variable::notOr(const Variable &other) const{
Variable v(makeName(getName(), " # ", other.getName()));
QList<bool> temp;
for(int i = 0; i < vars_.size(); i++)
temp.push_back(vars_[i] == false && other.vars_[i] == false);
v.setVars(temp);
return v;
}
/*!
* \brief Variable::exclusiveDisjunction Исключающее ИЛИ
* \param other с данной переменной
* \return Получившееся значение
*/
Variable Variable::exclusiveDisjunction(const Variable &other) const{
Variable v(makeName(getName(), " ^ ", other.getName()));
QList<bool> temp;
for(int i = 0; i < vars_.size(); i++)
temp.push_back(vars_[i] == other.vars_[i] ? false : true);
v.setVars(temp);
return v;
}
/*!
* \brief Variable::equivalent Эквиваленция
* \param other с данной переменной
* \return Получившееся значение
*/
Variable Variable::equivalent(const Variable &other) const{
Variable v(makeName(getName(), " ~ ", other.getName()));
QList<bool> temp;
for(int i = 0; i < vars_.size(); i++)
temp.push_back(vars_[i] == other.vars_[i] ? true : false);
v.setVars(temp);
return v;
}
/*!
* \brief Variable::negation Отрицание самой переменной
* \return получившееся значение
*/
Variable Variable::negation(){
setName(QString("! " + getName()));
for(int i = 0; i < vars_.size(); i++)
vars_[i] = !vars_[i];
return *this;
}
/*!
* \brief Variable::setName Задает имя
* \param name задаваемое имя
*/
void Variable::setName(const QString &name){
name_ = name;
}
/*!
* \brief Variable::setVars Задает принимаемые значения
* \param vars задаваемые значения
*/
void Variable::setVars(const QList<bool> &vars){
vars_ = vars;
}
/*!
* \brief Variable::setVars Генерирует значения
* \param index индекс элемента
* \param size количество элементов
*/
void Variable::setVars(const int index, const int size){
vars_.clear();
int switcherCounter = 0;
bool switcher = false;
for(int i = 0; i < pow2(size); i++){
if(switcherCounter < pow2(size - index - 1)) // swap 0 1 2 3 to 3 2 1 0
switcherCounter++;
else{
switcher = !switcher;
switcherCounter = 1;
}
vars_.push_back(switcher);
}
}
/*!
* \brief Variable::getName Отдает название
* \return название переменной
*/
QString Variable::getName() const{
return name_;
}
/*!
* \brief Variable::getVars Отдает значения переменной
* \return Значения переменной
*/
QList<bool> Variable::getVars() const{
return vars_;
}
/*!
* \brief Variable::makeName Создает строку из двух названий переменных и операции между ними
* \param first Первое значение
* \param operation Операция между этими значениями
* \param second Второе значение
* \return Получившаяся строка
*/
QString Variable::makeName(const QString &first, const QString &operation, const QString &second) const{
return first + operation + second;
}
/*!
* \brief Variable::pow2 Возвращает степень числа два
* \param power степень
* \return полученное число
*/
int Variable::pow2(const int power) const{
return 1 << power;
}