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

Вычисление математических выражений

16.12.2016, 23:10. Показов 2782. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как сделать чтобы программа сначала решала выражение в скобках ??
Напрмер такой 2 + 6 * (4 + 6-9) - (2 + 9 * (2-6)) + 10
Сейчас программа зависает


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
namespace Coursework
{
    class Parser
    {
        public static double Eval(char[] expr)
        {
            return parseSummands(expr, 0);
        }
 
        private static double parseSummands(char[] expr, int index)
        {
            double x = parseFactors(expr, ref index);
            while (true)
            {
                char op = expr[index];
                if (op != '+' && op != '-')
                    return x;
                index++;
                double y = parseFactors(expr, ref index);
                if (op == '+')
                    x += y;
                else
                    x -= y;
            }
        }
        private static double parseFactors(char[] expr, ref int index)
        {
            double x = GetDouble(expr, ref index);
            while (true)
            {
                char op = expr[index];
                if (op != '/' && op != '*' && op != '^')
                    return x;
                index++;
                double y = GetDouble(expr, ref index);
                if (op == '/' && y != 0)
                    x /= y;
                else if (op == '*')
                    x *= y;
                else if (op == '^')
                    x = Math.Pow(x, y);
            }
        }
        private static double GetDouble(char[] expr, ref int index)
        {
            string dbl = "";
            while (((int)expr[index] >= 48 && (int)expr[index] <= 57 || (int)expr[index] == 46))
                {
                dbl += expr[index].ToString();
                index++;
                if (index == expr.Length)
                {
                    index--;
                    break;
                }
            }
            return double.Parse(dbl);
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2016, 23:10
Ответы с готовыми решениями:

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

Вычисление математических выражений
A *b-45. Если a&gt;b X= 18 если a=b 2a+2b. Если a&lt;b X-lg(x). При...

Вычисление значений математических выражений с рациональными числами
Доброго времени суток. Задача состоит в: пользователь вводит выражение (пример:...

Написать парсер математических выражений с функцией упрощения этих выражений
Люди, здравствуйте. Есть такая задача: написать упроститель выражений. На вход подается строка...

6
548 / 479 / 315
Регистрация: 24.09.2013
Сообщений: 3,345
Записей в блоге: 1
16.12.2016, 23:45 2
"Напрмер такой 2 + 6 * (4 + 6-9) - (2 + 9 * (2-6)) + 10"

C#
1
2
3
4
5
6
7
8
Forms Code
{
       private void button1_Click(object sender, EventArgs e)
       {
          iint n =  2 + 6 * (4 + 6-9) - (2 + 9 * (2-6)) + 10;
           textBox1.Text  = n.ToString();  //Ничего не зависает, результат 52
       }
}
0
0 / 0 / 0
Регистрация: 22.11.2015
Сообщений: 23
18.12.2016, 00:52  [ТС] 3
Так понятно но когда я ввожу выражение через TexBox зависает

C#
1
2
3
4
 private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Parser.Eval(textBox1.Text.ToCharArray()).ToString());
        }
0
548 / 479 / 315
Регистрация: 24.09.2013
Сообщений: 3,345
Записей в блоге: 1
18.12.2016, 01:06 4
Понятно, что зависает. Нужно использовать парсер строки. Помочь не смогу
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
18.12.2016, 02:24 5
Вроде правильно работает
Кликните здесь для просмотра всего текста
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
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
class Parser
{
    string _input;
    int _index;
    
    private char Current => _input[_index];
    
    public Parser(string input)
    {
        _input = input + "$";
    }
    
    public double Parse()
    {
        double result = ParseSum(1);
        if (Current != '$')
            throw new Exception();
        return result;
    }
    
    public double ParseGroup()
    {
        if (!Match("("))
            throw new Exception();
        var result = ParseSum(1);
        if (!Match(")"))
            throw new Exception();
        return result;
    }
    
    public double ParseSum(int sign)
    {
        double first = sign * ParseProduction(1);
        int op = Match("+","-");
        if (op == -1)
            return first;
        return first + ParseSum(op == 0 ? 1 : -1);
    }
    
    private double ParseProduction(int power)
    {
        double first;
        if (Current == '(')
            first = ParseGroup();
        else if (char.IsDigit(Current))
            first = ParseDouble();
        else
            throw new Exception();
        first = Math.Pow(first, power);
        
        int op = Match("*","/");
        if (op == -1)
            return first;
        
        return op == 0 ? first * ParseProduction(1) : first * ParseProduction(-1);
    }
    
    private double ParseDouble()
    {
        var sb = new StringBuilder();
        while (char.IsDigit(Current) || Current == '.')
        {
            sb.Append(Current);
            _index++;
        }
        return double.Parse(sb.ToString(), System.Globalization.CultureInfo.InvariantCulture);
    }
    
    private int Match(params string[] words)
    {
        for (int i = 0; i < words.Length; i++)
            if (Match(words[i]))
                return i;
        return -1;
    }
    
    private bool Match(string word)
    {
        if (word.Length > _input.Length - _index + 1)
            return false;
        bool matched = _input.Substring(_index, word.Length) == word;
        if (matched)
            _index += word.Length;
        return matched;
    }
}
 
static void Main()
{
    var expression = "2 + 6 * (4 + 6-9) - (2 + 9 * (2-6)) + 10";
    expression = expression.Replace(" ", "");
    var parser = new Parser(expression);
    var result = parser.Parse();
    Console.WriteLine(result);
}
1
0 / 0 / 0
Регистрация: 22.11.2015
Сообщений: 23
18.12.2016, 11:18  [ТС] 6
ошибка cs0116 a namespace cannot directly contain members such as fields or methods здесь
C#
1
static void Main()
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
18.12.2016, 11:27 7
tarabar1, ну оберните мой код в какой-нибудь класс
0
18.12.2016, 11:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2016, 11:27
Помогаю со студенческими работами здесь

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

Парсер математических выражений
Есть код для парсера математических выражений (калькулятора) для операций: +, -, *, /. Помогите...

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

Интерпретатор математических выражений.
Набор программных способов для решения задач составления интерпретатора математических выражений. ...


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

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

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