Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2020, 00:36   #1
Cyber_Dezz
Новичок
Джуниор
 
Регистрация: 18.06.2020
Сообщений: 5
По умолчанию Нужно перевести небольшой логический калькулятор с Python на С++

нужна срочная помощь перевести код с Python в C++

Это калькулятор логических выражений,поддерживающий операции (скобок,и,или,отрицание,ввод переменных)
Код:
def ob():
    global res
    global lv
    global j
    if (lv[j]>='a' and lv[j]<='z'):
        t = input(lv[j]+"=")
        j += 1
        return int(t)
    elif (lv[j]=='0' or lv[j]=='1'):
        t = int(lv[j])
        j += 1
        return t
    elif (lv[j]=='('):
        t = int(v())
        j += 1
        if (lv[j-1]!=')'):
            print("Синтаксическая ошибка")
        else:
            return t


def mint():
    global res
    global lv
    global j
    t = ob()
    while(j<len(lv)):
        if (lv[j]=='&'):
            j += 1
            s = ob()
            t=t*s
        else:
            break
    return t


def v():
    global lv
    global res
    global j
    t = ob()
    if lv[j]=='^':
        otr = 1
        j += 1
    else:
        otr = 0
        j += 1
    t = mint()
    if otr ==1:
        t=(t+1)%2
    while(j<len(lv)):
        if (lv[j]=='+'):
            j+=1
            if mint()==1:
                t=1
        else:
            break
    return t


j = 0
lv = input("Введите логическое выражение:")
res = v()
print(res)
Начал пробовать сам,но не знаю как сделать в соответсвии python и чтоб работало. вот что накидал:
Код:
#include <iostream>
#include<string>
using namespace std;

string lv;
int j = 0;
int res;



int ob()
{
    t = ob();
    if (lv[j] >= 'a' and lv[j] <= 'z')
    {
        cout << "=";
        t = cin >> lv[j] ;
        j += 1;
        return int(t);
    }
    else if(lv[j] == '0' or lv[j] == '1')
    {
        t = int(lv[j]);
        j += 1;
        return t;
    }
    else if (lv[j] == '(')
    {
        t = int(v());
        j += 1;
        if (lv[j - 1] != ')')
        {
            cout << "Синтаксическая ошибка" << endl;
        }
        else
        {
            return t;
        }
    }
}


int mint()
{
    t = ob();
    while (j < lv.length())
    {
        if (lv[j] == '&')
        {
            j += 1;
            s = ob();
            t = t * s;
        }
        else
        {
            break;
        }
        return t;
    }

}




int v() 
{
    t = ob();
    int otr = -1;
    if (lv[j] == '^')
    {
        otr = 1;
        j += 1;
    }
    else
    {
        otr = 0;
        j += 1;
        t = mint();
    }
    if ( otr == 1) 
    {
        t = (t + 1) % 2;
    } 
     while (j < lv.length())
     {
         if (lv[j] == '+')
         {
             j += 1;
             if (mint() == 1)
             {
                 t = 1;
             }
         }
         else
         {
             break;
         }
         return t;       
     }
           
}

int main()
{

    cout << ("Введите логическое выражение:");
    cin >> lv;
    res = v();
    cout << (res);
}
Cyber_Dezz вне форума Ответить с цитированием
Старый 18.06.2020, 01:37   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
#include <iostream>
#include<string>
using namespace std;

string lv;
int j = 0;

int v();

int ob()
{
    if (lv[j] >= 'a' && lv[j] <= 'z')
    {
        string t;
        cout << lv[j] << "=";
        cin >> t;
        j += 1;
        return atoi(t.c_str());
    }
    else if (lv[j] == '0' || lv[j] == '1')
    {
        int t = int(lv[j] - '0');
        j += 1;
        return t;
    }
    else if (lv[j] == '(')
    {
        int t = v();
        j += 1;
        if (lv[j - 1] != ')')
            cout << "Синтаксическая ошибка" << endl;
        else
            return t;
    }
}

int mint()
{
    int t = ob();
    while (j < lv.length())
    {
        if (lv[j] == '&')
        {
            j += 1;
            t *= ob();
        }
        else
            break;
    }
    return t;
}

int v() 
{
    int t = ob();
    int otr;
    if (lv[j] == '^')
    {
        otr = 1;
        j += 1;
    }
    else
    {
        otr = 0;
        j += 1;
    }
    t = mint();
    if (otr == 1)
        t = (t + 1) % 2;
     while (j < lv.length())
     {
         if (lv[j] == '+')
         {
             j += 1;
             if (mint() == 1)
                 t = 1;
         }
         else
             break;
     }
     return t;
}

int main()
{
    cout << ("Введите логическое выражение:");
    cin >> lv;
    int res = v();
    cout << res;
    return 0;
}
Поправил до состояния компилируемости и большего соответствия питоновскому коду.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.06.2020 в 02:57.
BDA вне форума Ответить с цитированием
Старый 18.06.2020, 02:28   #3
Cyber_Dezz
Новичок
Джуниор
 
Регистрация: 18.06.2020
Сообщений: 5
По умолчанию

BDA, А есть догадки почему с переменными (a..z) считает хорошо,а с (0,1) нет ?(стал выводить не корректный результат)
Cyber_Dezz вне форума Ответить с цитированием
Старый 18.06.2020, 02:40   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Да, я там лишнего "соптимизировал". Исправил в коде выше.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 18.06.2020, 02:49   #5
Cyber_Dezz
Новичок
Джуниор
 
Регистрация: 18.06.2020
Сообщений: 5
По умолчанию

BDA, И ещё 1 вопросик,как пофиксить ошибку при работе со скобками?)
Изображения
Тип файла: png с1.png (1.7 Кб, 19 просмотров)
Тип файла: png с2.png (2.8 Кб, 18 просмотров)
Cyber_Dezz вне форума Ответить с цитированием
Старый 18.06.2020, 03:01   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Опять "соптимизировал", не учитывая побочные действия. Поправил код выше. Зарекаюсь с этих пор трогать код после 12 часов вечера
"Синтаксическую ошибку" убрал, но и исходный питоновский код зацикливается на выражениях со скобками.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 18.06.2020, 03:15   #7
Cyber_Dezz
Новичок
Джуниор
 
Регистрация: 18.06.2020
Сообщений: 5
По умолчанию

BDA, Хаха.Да что-то в питновском коде не проверял на такие ошибки,даже ещё некоторые нашёл по типу если вводится 1 значение или 1 переменная,со скобками и т.п.=)
Постараюсь пока сам их дальше поправить.
Вы и так сильно помогли с проблемой.
Большое спасибо,за помощь!
Cyber_Dezz вне форума Ответить с цитированием
Старый 18.06.2020, 03:34   #8
Cyber_Dezz
Новичок
Джуниор
 
Регистрация: 18.06.2020
Сообщений: 5
По умолчанию

BDA, Исправил часть ошибок, убрав лишнюю строку на 1 скрине. Осталось понять как исправить
случай когда вводится 1 элемент и ещё с 1 странной ситуацией
Изображения
Тип файла: png f1.png (4.6 Кб, 20 просмотров)
Тип файла: png f2.png (3.4 Кб, 20 просмотров)
Тип файла: png f3.png (1.8 Кб, 20 просмотров)
Cyber_Dezz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Небольшой тест на python kartofelka12 Python 4 07.12.2016 20:27
Логический калькулятор С++ Александp Фриланс 2 22.04.2016 17:29
Логический калькулятор, как построить таблицу истинности? Алексей_2012 Общие вопросы C/C++ 5 29.03.2015 11:20
Логический калькулятор Avely Помощь студентам 1 16.04.2011 17:03
небольшой калькулятор Shevali Помощь студентам 8 26.03.2009 21:17