0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 98
1

Калькулятор с парсингом ввода

04.10.2014, 13:05. Показов 15311. Ответов 78
Метки нет (Все метки)

Всем привет, не так давно начал постигать c++. Возник вопрос как сделать программу-калькулятор, в которую можно вводить свои числа и арифметические операции.
Пример:
Выскакивает консолька и пользователь вводит "17 + 19 * 6 - 8", то есть пользователь не ограничен в действиях.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2014, 13:05
Ответы с готовыми решениями:

Простой калькулятор и калькулятор с парсингом
Ребят я совсем не давно только начал изучать сишку, решил написать простенький калькулятор который...

Калькулятор с парсингом строки
Добрый день, дорогие программисты помогите написать калькулятор. Я ввожу строку например 5+8/7*10...

Калькулятор с парсингом арифметических выражений
Народ интересует вопрос возможно ли сделать калькулятор в console приложении на C++ так что бы я...

Корень и дробная часть. Калькулятор с парсингом
Прошу вас помочь мне. Ибо все мои пробы не к чему не приводят. Я пишу консольный калькулятор. ...

78
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.10.2014, 13:14 2
Вообще то это называется приоритетный инфиксный калькулятор. И пока что видны как раз целых два ограничения: выражение ограничено одной строкой и вообще нет переменных. И определитесь с языком: или чистые си, или их потомок. Что нибудь одно.
0
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 98
04.10.2014, 13:18  [ТС] 3
Я вас не понял.
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.10.2014, 13:22 4
Какое слово не понятно?
0
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 98
04.10.2014, 13:45  [ТС] 5
приоритетный инфиксный калькулятор, выражение ограничено одной строкой и вообще нет переменных, и выбор языка.
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.10.2014, 15:29 6
2+3*2 как считается? Сначала выполняется умножение, потом сложение. Почему? Потому что умножение имеет приоритет над сложением. Поэтому 2+3*2=8. Обычный калькулятор в виде устройства с 19-ю кнопками и табло сначала сложит, потом умножит, получится 10. Потому что у него действия не имеют приоритетов. Он бесприоритетный, а тот, который выдаст 8, - приоритетный. 3*2+2=8 с сточки зрения любого калькулятора, так как здесь порядок операций соответствует порядку их написания. А в 2+3*2 правильный порядок операции не соответствует порядку их написания. Зато в обоих выражениях правильный порядок операций соответствует их приоритетам. Теперь инфиксность. Сумму двух и трех можно записать как 2+3, можно как
2
3
+, а можно как
+
2
3
, в первом случае знак операции находится между операндами (то, над чем выполняется операция - это операнды, в данном случае это два и три). 2 и 3 - это с чем надо что то сделать, а + - это что надо сделать. То, с чем что то делают, - это операнд. Такая форма называется инфиксной. Вторая форма суффиксная, или постфиксная, так как в ней знак операции ставится после обоих операндов. А третья - префиксная. Теперь о строке. Разве инфиксное выражение может занимать несколько строк? Перенос на следующую возможен, но он лишь означает, что следующая строка является продолжением предыдущей. Данное ограничение вытекает из нотации инфиксной нотации, даже если выражение занимает весь экран, на самом деле это одна строка, просто она многократно перенесена из-за дефицита ширины экрана. Символа же перехода на следующую строку в наборе нет, в отличие от двух других нотаций. Ну и переменные. 2 - это не переменная, это просто константа. Переменная имеет имя, к которому можно многократно обращаться и значение, которое подразумевается под этим именем и кроме того это значение может меняться. Здесь:
C++
1
a=23+4;
переменная одна.

Добавлено через 6 минут
Цитата Сообщение от perec200 Посмотреть сообщение
выбор языка.
Это раздел чистого c. А теперь читаем стартовый пост:
Цитата Сообщение от perec200 Посмотреть сообщение
не так давно начал постигать c++.
. c и c++ - два разных языка. Один является потомком другого, но это два разных языка, а не один. Похожи? Этого и следовало ожидать, потомок должен быть похож на предка. Но всё таки разные. Например,
C++
1
void main()
не валидно,
C
1
void main()
валидно.
C
1
std::cout>>x;
не валидно,
C++
1
std::cout>>x;
может быть валидно, если выше определено пространство std, его член cout, переменная x и оператор >> у которого тип левого операнда совпадает с типом члена cout пространства std, а тип правого операнда совпадает с типом переменной x. При всём сходстве различия слишком существенны и многочисленны, чтоб считать, что c и c++ - это разные группы диалектов одного языка.
0
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
04.10.2014, 16:13 7
Цитата Сообщение от perec200 Посмотреть сообщение
Возник вопрос как сделать программу-калькулятор, в которую можно вводить свои числа и арифметические операции.
Отвечаю. Можно разобрать варианты. Например, вариант 1: выражение вычисляется; вариант 2: выражение вычисляется, последний результат запоминается, так что к нему можно применить частично определенную функцию (result = n; + a == n + a).
Ваша задача на данном этапе реализовать вычисление некоего математического выражения (функции, пусть и ограниченной кольцом простейших арифметический операций). Для этого Вам необходимо правильно обработать входные данные и сформировать выходные данные. Начните с того что в качестве входных данных допускается строковый линерал. Теперь этот строковый литерал надо проверить на корректность (наличие только допустимых символов) и обработать это исключение по Вашему усмотрению (можно делать это и в процессе реализации структуры вычислений). Далее необходимо разбить выражение на атомарные операции. Это можно сделать двумя (известными мне) способами: 1. Организация стека для операций и стека для переменных, промежуточный результат хранится в одной переменной. Т.н. обратная польская запись. 2. То же самое, но в виде дерева, где листьями выступают значения, а корнями -- операции. Дальше остается только все это достать и посчитать.
0
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 98
04.10.2014, 16:28  [ТС] 8
C++
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
 
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    int a, b;
    char Operator;
 
    cout << "VVedite primer: " << endl;
    cin >> a >> Operator >> b;  
 
    /*/
    if (Operator == '+')
    {
        c = a + b;
        cout << "Otvet: " <<c;
    }
    else
    {
        if (Operator == '-')
        {
            c = a - b;
            cout << "Otvet: " <<c;
        }
        else
        {
            if (Operator == '/')
            {
                c = a / b;
                cout << "Otvet: " <<c;
            }
            else
            {
                if (Operator == '*')
                {
                    c = a * b;
                    cout << "Otvet: " <<c;
                }
                else
                {
                    cout << "nevern simvol!";
                }
            }
        }
    }
    /*/
    switch (Operator)
    {
    case '+': cout << "Vah otvet: " << a + b; break;
    case '-': cout << "Vah otvet: " << a - b; break;
    case '/': cout << "Vah otvet: " << a / b; break;
    case '*': cout << "Vah otvet: " << a * b; break;
    }
 
    _getch();
    return 0;
}
Данная программа, ограничена двумя цифрами и одним знаком. Я вас понял с точки зрения теории, а на практике, как это реализовать?
P.s. Опыта маловато.

И у кого есть видео-курсы по программированию, пытался начать читать книгу Страуса Трупа, не воспринимаю, то как он пишет. Начал смотреть видео-курс http://www.youtube.com/playlis... 6mzTiX65gs что про него можете сказать?
0
4814 / 2275 / 287
Регистрация: 01.03.2013
Сообщений: 5,933
Записей в блоге: 26
04.10.2014, 16:39 9
1) Вам уже сказали - с трупами идите в другой раздел: С++. Здесь живой С, по нему есть Керниган, Риччи и другие фамилии.
2) У вас имхо сложности не с языком (или, по крайней, мере, не только с ним), а с алгоритмом. Алгоритм не зависит от языка. Его можно написать на бумажке на псевдокоде. Или нарисовать в виде ромбиков. Вам тут советуют строить дерево разбора синтаксического выражения или обратную польскую запись. Я бы сказал другие слова: сортировочная станция Дейкстры.
1
easybudda
04.10.2014, 17:22
  #10
 Комментарий модератора 
Перенесено из раздела "С для начинающих"
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
04.10.2014, 17:28 11
Цитата Сообщение от perec200 Посмотреть сообщение
Страуса Трупа

Не по теме:

извините не смог удержаться

Кликните здесь для просмотра всего текста
:rofl: :rofl: :rofl: АХХАХАХХАХХА :rofl: :rofl: :rofl:

1
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.10.2014, 18:42 12
Цитата Сообщение от perec200 Посмотреть сообщение
Данная программа, ограничена двумя цифрами и одним знаком. Я вас понял с точки зрения теории, а на практике, как это реализовать?
Попробуйте рекурсивный парсинг инфиксных выражений.
0
4814 / 2275 / 287
Регистрация: 01.03.2013
Сообщений: 5,933
Записей в блоге: 26
04.10.2014, 19:15 13
Цитата Сообщение от taras atavin Посмотреть сообщение
Попробуйте рекурсивный парсинг инфиксных выражений.
taras atavin, напишите ваш код, реализующий ваше предложение. Рискну предположить, что он будет выдавать ошибочные результаты даже на строке из нескольких символов.

Добавлено через 8 минут
ЗЫ кстати, предлагаю это сделать не только taras atavin, а и остальным любителям "рекурсивного парсинга" - проверим на паре примеров, для простоты кода пусть все числа состоят из одного десятичного разряда - то есть от 0 до 9.
0
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
04.10.2014, 19:37 14

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
Я бы сказал другие слова: сортировочная станция Дейкстры
Да, что-то припоминаю такое у Таненбаума. Станция с поездами.


Цитата Сообщение от taras atavin Посмотреть сообщение
Попробуйте рекурсивный парсинг инфиксных выражений.
Лол, зачем рекурсивный в императивных языках?
0
_Ivana
04.10.2014, 19:41
  #15

Не по теме:

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

0
Каратель
Эксперт С++
6606 / 4025 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
04.10.2014, 19:45 16
Цитата Сообщение от perec200 Посмотреть сообщение
Я вас понял с точки зрения теории, а на практике, как это реализовать?
а на практике это все очень громоздко. на форуме за дарма вы максимум получите направление что и где искать.
вот например статья с примером реализации рекурсивного спуска http://habrahabr.ru/post/122397/

Добавлено через 53 секунды
Цитата Сообщение от _Ivana Посмотреть сообщение
ЗЫ кстати, предлагаю это сделать не только taras atavin, а и остальным любителям "рекурсивного парсинга" - проверим на паре примеров, для простоты кода пусть все числа состоят из одного десятичного разряда - то есть от 0 до 9.
какие проблемы?
1
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.10.2014, 19:49 17
Цитата Сообщение от castorsky Посмотреть сообщение
Лол, зачем рекурсивный в императивных языках?
А где ж ещё нужна рекурсия? Уж не на декларативных ли языках описания страниц?
0
4814 / 2275 / 287
Регистрация: 01.03.2013
Сообщений: 5,933
Записей в блоге: 26
04.10.2014, 19:51 18
Цитата Сообщение от Jupiter Посмотреть сообщение
какие проблемы?
будете смеяться, но сейчас подумал, и вроде никаких не должно быть. Это я просто вспомнил, как у меня были проблемы с рекурсивным алгоритмом в подобной задачке, только там надо было не вычислить, а переписать выражение в префиксной форме функций со скобками. Вот она http://atpp.vstu.edu.ru/cgi-bi... id_prb=898 Если не видите проблем, напишите рекурсивный алгоритм. Хотя в вашем случае у меня меньше сомнений
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.10.2014, 19:58 19
Цитата Сообщение от _Ivana Посмотреть сообщение
ЗЫ кстати, предлагаю это сделать не только taras atavin, а и остальным любителям "рекурсивного парсинга" - проверим на паре примеров, для простоты кода пусть все числа состоят из одного десятичного разряда - то есть от 0 до 9.
А при чём здесь разрядность чисел? Скобки и приоритеты операций остаются, а значит выражение может состоять из подвыражений, то есть часть операндов сама может быть выражениями. 2+3*2. Операнды суммы 2 и 3*2, 3*2 - элементарное выражение (в одну операцию). 2+3-6*4*5*7. Операнды разности 2-3 и 6*4*5*7. 2-3 - элементарное выражение, 6*4*5*7 - не элементарное. (2+3-8)*5. Операнды произведения 2+3-8 и 5. А если (2+3-6*4)/3? Или (2+3-4*6+2*(2+3*4-3/6+3*(5-8)+2*3)*4+2)*6+4/7+8? Наоборот, для 267945454-454654987894 рекурсия не нужна.
0
4814 / 2275 / 287
Регистрация: 01.03.2013
Сообщений: 5,933
Записей в блоге: 26
04.10.2014, 20:02 20
taras atavin, это я для простоты кода ограничение предложил. Но при чем тут русские буквы и код на С++? Напишите рекурсивный парсер для задачи по моей ссылке (код, а не русские буквы). Предлагаю потому, что есть шанс, что вы допустите ту же ошибку что и я, когда впервые решал ее. Если нет - честь вам и хвала.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2014, 20:02
Помогаю со студенческими работами здесь

Помогите с парсингом С++!!!
Народ помогите с парсингом я в этом деле жесткий нуб скиньте ссылки на книжки какие-нибудь где есть...

Как преобразовать обычный калькулятор в калькулятор использующий класс стек?
#include &lt;iostream&gt; int main(){ int a = 0; int b = 0; char operation; ...

Калькулятор в строке ввода
короче говоря нужен калькулятор в строке ввода а то есть без конопочек=)

Калькулятор: контроль ввода данных
Делаю калькулятор формат Form1.vb нужна помощь . Как сделать чтоб с клавиатуры нельзя было...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru