Перейти к содержимому

Фотография

Как вычислить выражениеКак вычислить выражение в NET

net вычисления

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 14

#1
SandA

SandA
  • Частый гость
  • 81 сообщений

Всем здравствовать!

Возможно кто-то сталкивался с подобной задачей...

Необходимо вычислять выражения записанные пользователем через интерфейс.

Например есть введенная пользователем строка: "2+2*2" 

Нужно вычислить выражение средствами NET (C++, C#, VB) получив ответ - 6.

Нужно учитывать знаки, цифры, скобки...

Никак не могу найти ответов не в голове, ни в нэте......................

Help please.

 

Кстати, не найдя ответов пробовал передать запрос в SQL но столкнулся с другой проблемой. SQL возвращает только целые числа, не разобрался почему........

Пробовал итак: select 7/2

Возвращает 3


Сообщение отредактировал SandA: 28.07.2013, 19:00:54

  • 0

#2
vladimir55

vladimir55
  • Постоялец
  • 401 сообщений

Всем здравствовать!

Возможно кто-то сталкивался с подобной задачей...

Необходимо вычислять выражения записанные пользователем через интерфейс.

Например есть введенная пользователем строка: "2+2*2" 

Нужно вычислить выражение средствами NET (C++, C#, VB) получив ответ - 6.

Нужно учитывать знаки, цифры, скобки...

Никак не могу найти ответов не в голове, ни в нэте......................

Help please.

 

Кстати, не найдя ответов пробовал передать запрос в SQL но столкнулся с другой проблемой. SQL возвращает только целые числа, не разобрался почему........

Пробовал итак: select 7/2

Возвращает 3

А если попробовать в SQL

SELECT 7.0/2


  • -1

#3
SandA

SandA
  • Частый гость
  • 81 сообщений

 

Всем здравствовать!

Возможно кто-то сталкивался с подобной задачей...

Необходимо вычислять выражения записанные пользователем через интерфейс.

Например есть введенная пользователем строка: "2+2*2" 

Нужно вычислить выражение средствами NET (C++, C#, VB) получив ответ - 6.

Нужно учитывать знаки, цифры, скобки...

Никак не могу найти ответов не в голове, ни в нэте......................

Help please.

 

Кстати, не найдя ответов пробовал передать запрос в SQL но столкнулся с другой проблемой. SQL возвращает только целые числа, не разобрался почему........

Пробовал итак: select 7/2

Возвращает 3

А если попробовать в SQL

SELECT 7.0/2

 

Спасибо. Буквально с пол часа назад тоже "допер"...

Придется обязать пользователя ставить .0 после целого :)

Кривовато конечно через sql сервер, но зато работает. А вообще интересно, есть ли какой-то функционал в NET для подобных задач?


  • -1

#4
idaa

idaa
  • Частый гость
  • 60 сообщений

http://www.west-wind...ipt-code-from-C

http://odetocode.com/articles/80.aspx

http://msdn.microsof...(v=vs.100).aspx


  • -2

#5
Зул

Зул
  • Свой человек
  • 620 сообщений

Сборище быдлокодеров, лол. Один дебил для простейшего калькулятора придумал СУБД за собой таскать, другой говнокодер предлагает JavaScript использовать. Простейший лексический разбор на токены - цифры, скобки, 4 арифметических действия, порядок должны были во 2 классе проходить. Пишется за час наивная реализация.

 

В том же страуструпе показан очень навороченный калькулятор.

 

 

А вообще интересно, есть ли какой-то функционал в NET для подобных задач?

 

Есть, называется мозг.


Сообщение отредактировал Зул: 30.07.2013, 04:12:22

  • 0

#6
idaa

idaa
  • Частый гость
  • 60 сообщений

Сборище быдлокодеров, лол. Один дебил

 

Cамокритика это похвально. Предлагать в виде ответа на вопрос "есть ли какой-то функционал в NET для подобных задач" использование разбора выражений, может только дебил. Вопрос не стоял "как это сдалать", вопрос стоял "есть или нет".


  • 0

#7
tobber

tobber
  • Гость
  • 10 сообщений

Предлагать в виде ответа на вопрос "есть ли какой-то функционал в NET для подобных задач" использование разбора выражений, может только дебил.
 

 

Но ведь это и есть правильный, насколько это возможно, вариант решения данной задачи.

Такое обычно дают студентам или на курсах. Eval'ить тут - все равно что шпаргалку использовать на экзамене - теряется смысл обучения.

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

 

Если это не студенческая задача - то есть куча решений под .NET, в гугле находятся на раз. Хотя бы http://stackoverflow...culator/2859130


  • 1

#8
asr

asr
  • Модератор
  • 24 325 сообщений

MODERATORIAL (Автоматическое сообщение от asr)

Пользователю Зул вынесено предупреждение за нарушение пункта 2.2.5 Правил в данном сообщении.
Скрытый текст
2.2. Не разрешена отправка сообщений, которые содержат:2.2.5. Грубые, нецензурные выражения и оскорбления. Нецензурные выражения допустимы только в случае их стилистической необходимости, например, в цитатах, и если они не направлены на участников Форума. Но даже в этом случае обязательна подмена не менее двух символов в корне слова на другие, не схожие по начертанию.

  • 0

#9
Зул

Зул
  • Свой человек
  • 620 сообщений

Cамокритика это похвально.

Нет, это про тебя.

Предлагать в виде ответа на вопрос "есть ли какой-то функционал в NET для подобных задач" использование разбора выражений, может только дебил.

Нет, это именно быдлокодеры пытаются вместо стандартнейшей студенческой лабы для 2 курса, для реализации самого типичнейшего рекурсивного спуска, реализация которого занимает пару десятков строчек от силы, прикрутить туда либо СУБД либо виртуальную машину, где евалом разбирать все что пришло от пользователя, не проверяя, не окажется ли там что-то вроде system.exeс("rm -rf /") или drop all databases

Соединение с JS-машиной или СУБД больше кода потребует, лол.

Вопрос не стоял "как это сдалать", вопрос стоял "есть или нет".

Деточка, ты в курсе что должно входить в сдк подобного уровня, а что нет? Это был риторический вопрос, и так понятно что не в курсе. Так вот, в .net не должны входить готовые решения рекурсивного спуска, сортировки пузырьком, создание и вывод матрицы в виде матрицы, вывод в консоль всех квадратов чисел от 1 до n, вывод чисел фиббоначи и прочих типовых студенческих лаб 2-3 курса.

Тут даже не написание лексера по произвольной LL-грамматике, тут примитивнейший разбор рекурсивным спуском. Даже на википедии есть реализации этого, блин, даже у меня на физфаке это рассказывали на лабах по программированию.

Если это не студенческая задача

Да что это еще может быть.

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

Тут где-то была подобная тема с базами данных, когда этот форум не еще сдох. Там быдлокодеры предлагали искать слова перед этим из списка "опасных".


@asr, ты уж или трусы сними, или крестик одень.Поставь предупреждение idaa за употребление слова "дебил".
  • 0

#10
MUster

MUster
  • Свой человек
  • 737 сообщений

Зул конечно слишком резок, но прав. Правильнее всего разложить по токенам(а это судя по всему всего лишь цифры и арифметические операции), а потом рекурсивным спуском все собрать в одно значение разобравшись с порядком операции.


  • 0

#11
asr

asr
  • Модератор
  • 24 325 сообщений

MODERATORIAL (Автоматическое сообщение от asr)

Пользователю idaa вынесено замечание за нарушение пункта 2.2.5 Правил в данном сообщении.

Скрытый текст

2.2. Не разрешена отправка сообщений, которые содержат:
2.2.5. Грубые, нецензурные выражения и оскорбления. Нецензурные выражения допустимы только в случае их стилистической необходимости, например, в цитатах, и если они не направлены на участников Форума. Но даже в этом случае обязательна подмена не менее двух символов в корне слова на другие, не схожие по начертанию.

  • 0

#12
asr

asr
  • Модератор
  • 24 325 сообщений
@asr, ты уж или трусы сними, или крестик одень.Поставь предупреждение idaa за употребление слова "дебил".

 

Справедливо.


  • 0

#13
lexx821

lexx821
  • Свой человек
  • 816 сообщений

 

Всем здравствовать!

Возможно кто-то сталкивался с подобной задачей...

Необходимо вычислять выражения записанные пользователем через интерфейс.

Например есть введенная пользователем строка: "2+2*2" 

Нужно вычислить выражение средствами NET (C++, C#, VB) получив ответ - 6.

Нужно учитывать знаки, цифры, скобки...

Никак не могу найти ответов не в голове, ни в нэте......................

Help please.

 

Кстати, не найдя ответов пробовал передать запрос в SQL но столкнулся с другой проблемой. SQL возвращает только целые числа, не разобрался почему........

Пробовал итак: select 7/2

Возвращает 3

 

Microsoft убрала из Visual Studio Net компонент Microsoft Script Control, раньше я им пользовался когда программировал на vb6, но на дисках с Visual Studio 6.0 этот компонент есть, можете взять оттуда, он находится на третьем CD если у вас есть Visual Studio 6.0 Professional/Enterprise, если у вас есть Visual Basic 6.0 Professional/Enterprise, то этот компонент находится на том-же диски что и Visual Basic. Смотрите папку D:\COMMON\TOOLS\VB\SCRIPT (где D: - это CD/DVD накопитель), просто копируете файл MSSCRIPT.OCX в папку C:\Windows\System32\ а потом запускаете regsvr32 msscript.ocx. Потом запускаете Visual Studio NET, загружаете готовый проект или создаёте новый проект, потом слева где Toolbox нажимаете правой кнопкой мыши выбрать элемент, потом появится диалоговое окно, где вы выбераете COM-компонент "ScriptControl Object", потом лепите этот компонент на форму, и пишите следующий код, (у меня в VS2019 всё работает):
 
private void Form1_Load(object sender, EventArgs e)
{
  this.axScriptControl1.Language = "JScript"; // Выбераем язык JScript (это JavaScript), можно выбрать VBScript
  var result = this.axScriptControl1.Eval("2+3"); // складывает 2+3 и возвращает 5 в result (result=5)
  MessageBox.Show("Значение result=" + result.ToString()); // Выдаёт "Значение 5"
}
Так-же можете глянуть сюда:
 
P.S. Так-же можете подключить ну допустим какой-нибудь NLua (Lua)

  • 0

#14
hes

hes
  • В доску свой
  • 1 567 сообщений

System.Diagnostics.Process p = System.Diagnostics.Process.Start("calc.exe");
p.WaitForInputIdle();
NativeMethods.SetParent(p.MainWindowHandle, this.Handle);

 

мой вариант на конкурс извращений принят?:)


  • 0

#15
lexx821

lexx821
  • Свой человек
  • 816 сообщений

Если для лабораторной работы то вот (в начале июня сделал):

Вот ещё одна идея, работает но считает как есть то-есть 2+3*5 будет не 17 а 25:

(а нет, я код немного испортил, он справа на лево считает):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication2
{
    class ExpressionParser
    {
        private List<String> arrItems = null;
        String expr = "";

        public ExpressionParser(String expression)
        {
            this.expr = expression.Trim();
            this.arrItems = new List<string>();
        }

        public void parse()
        {
            String strItem = "";
            foreach (char ch in this.expr)
            {
                if ((ch >= '0' && ch < '9') || ch == '.')
                {
                    strItem += ch;
                }
                else
                {
                    arrItems.Add(strItem);
                    arrItems.Add(ch.ToString());
                    strItem = "";
                }
            }
        }

        public List<String> getItems()
        {
            return arrItems;
        }

        public double calculate()
        {
            int pos = arrItems.Count - 1;
            double result = 0;


            //foreach (String str in arrItems)
            while(pos > 0)
            {
                if (char.IsDigit(arrItems[pos][0]))
                {
                    result = double.Parse(arrItems[pos]);
                }
                else if (arrItems[pos].Equals("*"))
                {
                    pos--;
                    result *= double.Parse(arrItems[pos]);
                }
                else if (arrItems[pos].Equals("/"))
                {
                    pos--;
                    result /= double.Parse(arrItems[pos]);
                }
                else if (arrItems[pos].Equals("+"))
                {
                    pos--;
                    result += double.Parse(arrItems[pos]);
                }
                else if (arrItems[pos].Equals("-"))
                {
                    pos--;
                    result -= double.Parse(arrItems[pos]);
                }
                pos--;
            }
            return result;
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            String strBuf = "5*3+5=";
            ExpressionParser p = new ExpressionParser(strBuf);
            p.parse();
            MessageBox.Show(p.calculate().ToString());
        }
    }
}

В данном случае результат 40  :lol: а не 20

P.S. Можно переводить в польскую запись https://ru.wikipedia...ольская_нотация .


  • 0



Темы с аналогичным тегами net, вычисления

Количество пользователей, читающих эту тему: 1

пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.