Skip to content

Commit

Permalink
added brackets
Browse files Browse the repository at this point in the history
fix a minor bugs
  • Loading branch information
mvngr committed Apr 16, 2018
1 parent ffda8d6 commit d0a72db
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 42 deletions.
4 changes: 2 additions & 2 deletions LogicCalc.pro.user
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.6.0, 2018-04-14T12:28:25. -->
<!-- Written by QtCreator 4.6.0, 2018-04-15T21:50:52. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
Expand Down Expand Up @@ -292,7 +292,7 @@
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">LogicCalc.pro</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default"></value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">C:/Users/Mike/Documents/Qt/build-LogicCalc-Desktop_Qt_5_9_4_MinGW_32bit-Debug</value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
Expand Down
11 changes: 7 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

На данный момент логический калькулятор умеет выполнять следующее:
* Ввод и проверка переменных на корректность. Под корректностью подразумевается правильное написание букв и операций над ними
* Вывод таблицы истинности для выражения (пока что без использования скобок)
* Вывод таблицы истинности для выражения

### Описание классов:
* [MainWindwow](https://github.com/mvngr/logic_calculator/tree/master#mainwindow)
Expand All @@ -13,9 +13,9 @@

## Условные обозначения

Для корректной работы программы после каждого значащего значения нужно ставить пробел. Возможно, это будет поправлено в будущих версиях программы.
Для корректной работы программы после каждого значащего значения нужно ставить пробел. Возможно, это будет поправлено в будущих версиях программы

Пока что скобки `( )` не реализованы на программном уровне, но в будущем это будет исправлено. На данный момент они добавлены в словарь допустимых символов, но их использование может вызвать только артефакты
Так же вы можете пользоваться скобками в своих задачах `( )`

### Операции

Expand All @@ -39,7 +39,7 @@

`a b c d e f g x y z`

Стоит учесть, что регистр учитывается
Стоит помнить, что регистр учитывается

### Скриншоты

Expand Down Expand Up @@ -111,6 +111,9 @@ fillMap | Заполняет карту `map_`
isRepeat | Проверяет на повторение названия имен в `vars_`
sortVars | Сортирует массив `vars_` по названиям
makeBoolArrays | Создает массив начальных данных у переменных
findBrackets | Находит выражения в скобках и высчитывает их
subString| Возвращает подстроку из строки


### ContentEditor
Класс отвечает за корректный и удобный вывод чего-либо в поле для вывода
Expand Down
82 changes: 52 additions & 30 deletions logic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ Logic::Logic(QList<QString> *v, QPlainTextEdit *output)
vars_ = *new QList<Variable>;
ce_ = new ContentEditor(output);
map_ = * new QMap<QString, int>;

setVars(v);
}
Logic::~Logic(){
Expand All @@ -23,8 +22,8 @@ Logic::~Logic(){
void Logic::setVars(QList<QString> *v){
v_ = v;
fillOperations();
sortVars();
fillVars();
sortVars();
fillMap();
makeBoolArrays();
}
Expand All @@ -46,37 +45,35 @@ void Logic::fillOperations(){
BINARY_OPERATIONS_TO_NUM_["exclusiveDisjunction"] = 6;
BINARY_OPERATIONS_TO_NUM_["notAnd"] = 7;
BINARY_OPERATIONS_TO_NUM_["notOr"] = 8;

AVIABLE_NAME_OF_VARS_ << "A" << "B" << "C" << "D" << "E" << "F" << "G" << "X" << "Y" << "Z"
<< "a" << "b" << "c" << "d" << "e" << "f" << "g" << "x" << "y" << "z";
return;
}
void Logic::compute(){
computeLogicalAction();
computeLogicalAction(v_);
ce_->printTruthTable(getVarsTitle(), getVarsData());
return;
}
void Logic::computeLogicalAction(){
negation(v_);
binaryOperation(v_, "*");
binaryOperation(v_, "+");
binaryOperation(v_, "|");
binaryOperation(v_, "#");
binaryOperation(v_, "->");
binaryOperation(v_, "^");
binaryOperation(v_, "<-");
binaryOperation(v_, "~");
/*implication();
equivalent();
notAnd();
notOr();
exclusiveDisjunction();
negationFunc();*/
void Logic::computeLogicalAction(QList<QString> *v){
findBrackets(v);
negation(v);
binaryOperation(v, "*");
binaryOperation(v, "+");
binaryOperation(v, "|");
binaryOperation(v, "#");
binaryOperation(v, "->");
binaryOperation(v, "^");
binaryOperation(v, "<-");
binaryOperation(v, "~");
return;
}
void Logic::negation(QList<QString> *v){
for(int i = 0; i < v_->length(); i++)
for(int i = 0; i < v->length(); i++)
if(v->at(i) == "!" && i + 1 != v->length() && map_.contains(v->at(i + 1))){
Variable newVar = getVariable(v->at(i + 1)).negation();
if(newVar.getName() != "NULL")
insertWithReplace(newVar, i, i+1);
insertWithReplace(v, newVar, i, i+1);
}
return;
}
Expand All @@ -98,21 +95,48 @@ void Logic::binaryOperation(QList<QString> *v, QString operation){
default: break;
}
if(newVar.getName() != "NULL")
insertWithReplace(newVar, i-1, i+1);
insertWithReplace(v, newVar, i-1, i+1);
else
showError(* new QString("бинарная операция"), * new QString("Ошибка в чтении бинарной операции" + operation));
i--;
}
return;
}
void Logic::insertWithReplace(Variable v, int begin, int end){
if(!map_.contains(v.getName())){
vars_.push_back(v);
map_[v.getName()] = vars_.length() - 1;
void Logic::findBrackets(QList<QString> *v){
QList<int> bracket_ind = * new QList<int>;
for(int i = 0; i < v->length(); i++){
if(v->at(i) == "(")
bracket_ind.push_back(i);
if(v->at(i) == ")"){
QList<QString> *new_v = subString(v, bracket_ind.last() + 1, i - 1);
computeLogicalAction(new_v);
for(int n = bracket_ind.last(); n <= i; n++)
v->removeAt(bracket_ind.last());
QString new_name = * new QString("( " + new_v->at(0) + " )");
v->insert(bracket_ind.last(), new_name);
map_[new_name] = map_[new_v->at(0)];
vars_[map_[new_name]].setName(new_name);
i = bracket_ind.last() + 1;
bracket_ind.removeLast();
}
}
return;
}
QList<QString> * Logic::subString(QList<QString> *v, int begin, int end){
QList<QString> * new_v = new QList<QString>;
do
new_v->push_back(v->at(begin));
while(begin++ < end);
return new_v;
}
void Logic::insertWithReplace(QList<QString> *v, Variable variable, int begin, int end){
if(!map_.contains(variable.getName())){
vars_.push_back(variable);
map_[variable.getName()] = vars_.length() - 1;
}
for(int i = begin; i <= end; i++)
v_->removeAt(begin);
v_->insert(begin, v.getName());
v->removeAt(begin);
v->insert(begin, variable.getName());
return;
}
Variable Logic::getVariable(QString name){
Expand All @@ -124,8 +148,6 @@ void Logic::showError(QString logicOperation, QString error){
}
void Logic::fillVars(){
vars_.clear();
AVIABLE_NAME_OF_VARS_ << "A" << "B" << "C" << "D" << "E" << "F" << "G" << "X" << "Y" << "Z"
<< "a" << "b" << "c" << "d" << "e" << "f" << "g" << "x" << "y" << "z";
for(int i = 0; i < v_->length(); i++){
QChar c = v_->at(i).at(0);
if(AVIABLE_NAME_OF_VARS_.indexOf(v_->at(i)) != -1 && !isRepeat( &c )){
Expand Down
8 changes: 4 additions & 4 deletions logic.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,21 @@ class Logic
~Logic();
void setVars(QList<QString> *v);
void compute();
void computeLogicalAction();
void computeLogicalAction(QList<QString> *v);
QList<QString> getVarsTitle();
QList<QList<bool>> getVarsData();

private:
void negation(QList<QString> *v);
void negationFunc();

void findBrackets(QList<QString> *v);
QList<QString> * subString(QList<QString> *v, int begin, int end);
void binaryOperation(QList<QString> *v, QString operation);
void fillOperations();
QMap<QString, QString> BINARY_OPERATIONS_;
QMap<QString, int> BINARY_OPERATIONS_TO_NUM_;

void showError(QString logicOperation, QString error);
void insertWithReplace(Variable v, int begin, int end);
void insertWithReplace(QList<QString> *v, Variable variable, int begin, int end);
Variable getVariable(QString name);

void fillVars();
Expand Down
7 changes: 5 additions & 2 deletions mainwindow.ui
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>Logic Calculator</string>
<string>Логический калькулятор</string>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QVBoxLayout" name="verticalLayout">
Expand Down Expand Up @@ -47,6 +47,9 @@
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustIgnored</enum>
</property>
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
Expand Down Expand Up @@ -213,7 +216,7 @@
<item row="0" column="1">
<widget class="QPushButton" name="compute">
<property name="text">
<string>Compute</string>
<string>Вычислить</string>
</property>
</widget>
</item>
Expand Down

0 comments on commit d0a72db

Please sign in to comment.