1 Востаннє редагувалося zhivkoroma (03.01.2017 13:08:02)

Тема: Потрібна допомога по програмі

Потрібна допомога з програмою)
Як зробити щоб програма рахувала вираз з дужками? наприклад такий (10+5)/3
Зара зависає. Прикрипів проект. Хто може допоможіть дуже виручите.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

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 = trigFunctions(expr, ref index);
            while (true)
            {
                char op = expr[index];
                if (op != '/' && op != '*' && op != '^')
                    return x;
                index++;
                double y = trigFunctions(expr, ref index);
                if (op == '*')
                    x *= y;
                if (op == '^')
                    x = Math.Pow(x, y);
                if (op == '/')
                    x /= y;
                if (y == 0)
                {
                    MessageBox.Show("На 0 ділити не можна", "Повідомлення");
                }


            }
        }
        
        private static double trigFunctions(char[] expr, ref int index)
        {
            if (expr[index] >= 48 && expr[index] <= 57 || expr[index] == 46 || expr[index] == 45)
                return GetDouble(expr, ref index);
            else
            {
                char op = expr[index];
                if (op != 'c' && op != 't' && op != 's')
                    return GetDouble(expr, ref index);
                index += 4;
                double x = GetDouble(expr, ref index);
                if (index + 1 != expr.Length) index++;
                if (op == 'c')
                    return Math.Cos(x);
                if (op == 't')
                    return Math.Tan(x);
                else
                    return Math.Sin(x);

            }
        }
        private static double GetDouble(char[] expr, ref int index)
        {
            string dbl = "";
            while ((expr[index] >= 48 && expr[index] <= 57 || expr[index] == 46))
            {
                dbl += expr[index].ToString();
                index++;
                if (index == expr.Length)
                {
                    index--;
                    break;
                }
            }
            return double.Parse(dbl);
        }
    }
}
Post's attachments

56465.rar 104.54 kb, 298 downloads since 2017-01-03 

2

Re: Потрібна допомога по програмі

Я вчора трошки подивився як це можна зробити і якщо вам дійсно цікаво як правильно це зробити то можете глянути на https://github.com/pieterderycke/Jace і просто продебажити як воно працює і взяти пару ідей звідтам. Я ще дивився на NCalc воно працює по похожій схемі наскільки я зрозумів але там просто ппц код для розуміння таке враження що він автогенерований.

Подякували: leofun011

3

Re: Потрібна допомога по програмі

може почитайте про контектсно залежну граматику? чи шось таке

4

Re: Потрібна допомога по програмі

Пане, це форум програмістів. Якщо ви не в курсі, то програмісти - це люди, які пишуть код, а не тупо його копіюють з інших сайтів. Вам тут нема чого робити, доки ви не захочете стати програмістом.

Подякували: leofun011