powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / как вычислить выражение?
25 сообщений из 116, страница 2 из 5
как вычислить выражение?
    #37883877
Ъыжсло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexeiKЪыжсло,

бизнесс логика для калькулятора?

это не калькулятор.
в двух словах: существет таблица номенклатуры. для каждого типа номенклатуры (например для рейса авиакомпании ЮТЭйр в Тюмень стоимость перевозки рассчитывается как произведение количества мест на вес). т.е. стоимость будет Стоимость=Вес*Кол-во
НО! рассчет итоговой стоимости может производиться разными алгоритмами:
Например:
Рес на Белоярский 1кг веса приравнивается к 25 таким образом формула расчета будет
Если Вес <=15 -> Вес = 15
Стоимость = Вес * Кол-во * Повыш.Коэф.

Вот тут уже и формула и бизнес логика.
И таких извращенных тарифов может быть уйма. И они постоянно меняются. Не переписывать же программу?
Фишка в том что при вводе новых тарифов Агент склада смог написать формулу которую программа будет использовать для расчета.

как-то так...
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37883908
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ъыжсло,

и ты выбрал для этого , то что озвучил в первом посте - простой текст?
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884008
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУskyANAВ ВикипедиИ алгоритм расписан: Обратная польская запись .
Алгоритму место на свалке. Возведение в степень, корни, прогрессии и иже с ним - в уме считать будем?
Нужен готовый компилятор выражений, всё остальное - пионерия.
нормальный, работающий пример, удобный для допиливания.
самому что то подобное потребовалось, взял оное как временную основу. и пилится прекрасно.
а готовый компилятор в JS это дело такое.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884073
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA, это всё, конечно, хорошо, но пока еще не вижу кода )
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884087
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЪыжслоИ таких извращенных тарифов может быть уйма. И они постоянно меняются. Не переписывать же программу?
Открой для себя CodeDom. В строке описывается .нет код, который приводится к единому интерфейсу тарифа и получается результат. Можно использовать весь прикладной код любых подключенных сборок.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884096
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-er, зачем что-то пилить, еще не факт, что получится реализовать все требования. Проще взять готовый компилятор.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884106
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУbeg-in-er, зачем что-то пилить, еще не факт, что получится реализовать все требования. Проще взять готовый компилятор.
наверно в 90% случаях готовый подходит на ура,
но увы , под мою задачу готовый ну никак не катит. чёта мне задачи такие попадаются.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884116
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erМСУbeg-in-er, зачем что-то пилить, еще не факт, что получится реализовать все требования. Проще взять готовый компилятор.
наверно в 90% случаях готовый подходит на ура,
но увы , под мою задачу готовый ну никак не катит. чёта мне задачи такие попадаются.
Зачем нужна подделка, которая не решает 10% задач, если можно взять решение, которое покроет 100% требований, написав всего пару строк безопасного кода?
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884372
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

о чем говоришь? какие пара строк?
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884381
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosМСУ,

о чем говоришь? какие пара строк?
А сколько?
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884423
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

ты про содедом что ли?
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884428
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosМСУ,

ты про содедом что ли?
а всё хорошо , и коддом, и готовые решения, и допилка пионэрская.
для каждой найдётся свой место.
коддом имеет свой минус. Он медленный - 0.1 сек. там если и гнать , так целый трактат.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884432
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ если можно взять решение, которое покроет 100% требований, написав всего пару строк безопасного кода?
всегда найдётся задача, для которой не будет 100% покрытия и парой строк не обойтись.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884497
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosМСУ, ты про содедом что ли?
Нет, про джаву.

beg-in-erкоддом имеет свой минус. Он медленный - 0.1 сек. там если и гнать , так целый трактат.
Откуда такие феерические замеры, из воспаленного сознания?

beg-in-erМСУ если можно взять решение, которое покроет 100% требований, написав всего пару строк безопасного кода?
всегда найдётся задача, для которой не будет 100% покрытия и парой строк не обойтись.
Рано или поздно встретится элементарное новое требование, которое положить набок твой пионерский код. Лучше писать сразу и хорошо, используя правильные архитектурные подходы.
Мне до сих пор еще никто не привел вменяемое наколеночное решение, оно будет или тут просто бульбы надувают?
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884512
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУbeg-in-erкоддом имеет свой минус. Он медленный - 0.1 сек. там если и гнать , так целый трактат.
Откуда такие феерические замеры, из воспаленного сознания?

замеряли. а сколько у вас? сколько занимает компил+лоадлиб?


Рано или поздно встретится элементарное новое требование, которое положить набок твой пионерский код. Лучше писать сразу и хорошо, используя правильные архитектурные подходы.
именно потому что новое требование может всё завалить и применяется правильное архитектурное пионерское решение.
то , в котором можно заменить всё. без усилий. просто воткнув новое условие.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884528
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

когда писал первую прогу (2002) на (бух формы отчетности и анализ по ФСФО) .нет особо не знал нифига содедом и т.д.
а там одни формулы внешние :)
дык я приспособил для этого ДатаТейбл :)
Функция Евал берет формулу стринг, парсит, создает таблицу с солумнами = именам переменных в формуле и доп солумн вычислимый, где ехпрешн = формула
очень изяшно все получилась и довольно быстро пахала :) и счас пользуюсь иногда

потом когда вышли лямюды и систем.дайнамикс перешел на DynamicExpression (но тут надо заранее знать какие объекты использованы в выражении, да и везде надо знать, но с ДатаТейблом был кайф)
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884533
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
редактор пользую от девок
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884536
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот тут курсовая 3 курс дочки
тут и Eval тот и дайнамикс вместе :)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
  
                        DataRow drr = ds.Tables["Расчетные коэффициенты Сбербанк"].NewRow();
                        drr["Период отчетности"] = r["ИД"];
                        drr["Наименование"] = drk["Наименование"];
                        decimal znach = Eval(drk["Формула"].ToString(), ds, "[Период отчетности] = '" + r["ИД"].ToString() + "'");
                        Expression body = System.Linq.Dynamic.DynamicExpression.Parse(null, drk["1 Категория"].ToString(), symbols);
                        LambdaExpression e = Expression.Lambda(body, new ParameterExpression[] { x });
                        bool k = (bool)e.Compile().DynamicInvoke(znach);
                        if (k) drr["1 Категория"] = znach.ToString();
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884609
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erзамеряли. а сколько у вас? сколько занимает компил+лоадлиб?

У меня нисколько. Замеряли чем, линейкой с кривыми руками? Код в студию.
Во-вторых, один раз загружается код, компилится. Всё остальное - чистое исполнение методов. Так что выкинь свои замеры на свалку.

beg-in-er именно потому что новое требование может всё завалить и применяется правильное архитектурное пионерское решение.
то , в котором можно заменить всё. без усилий. просто воткнув новое условие.
Маленький, рано тебе еще про архитектуру вещать. Два слова связать не можешь

ViPRos, правильно, юзать нужно готовый компилятор. Хорошее решение.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884633
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУbeg-in-erзамеряли. а сколько у вас? сколько занимает компил+лоадлиб?

У меня нисколько.

код в студию. даже пустой проект в VS компилиться какое то время. а у МСУ ничего по времени не занимает. удивительно
авторМаленький, рано тебе еще про архитектуру вещать. Два слова связать не можешь
да мне вообще плевать на понятие "архитектура". это зло с которым надо бороться. Но боюсь МСУ слишком большой , что бы понять такую маленькую и простую истину. Архитектура это кандалы, в которые заворачивает себя разработчик. и потом с этим борется.
ставят всякие костыли да подпорки. всё лишь бы ради целостности "архитектуры".
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884752
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пойдет, не ?
Туту ешо одна функция есть ABS

Код: 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.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
    public class MyCalc
    {
        const int DELIM = 1;
        const int NUMBER = 2;
        
        string prog, token;
        int pr, token_type;

        public MyCalc()
        {
        }

        bool IsDelim(char c)
        {
            bool v = false;
            if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')')
                v = true;
            return v;
        }

        bool IsWhite(char c)
        {
            bool v = false;
            if (c == ' ')
                v = true;
            return v;
        }

        bool IsDigit(char c)
        {
            bool v = false;
            
            v = char.IsDigit(c);
            if (!v)
                if (c == '.' || c == ',')
                    v = true;
            return v;
        }

        int GetToken()
        {
            token_type = 0;
            token = "";
            if (pr >= prog.Length)
            {
                token = "";
                token_type = DELIM;
            }
            else
            {
                while (IsWhite(prog[pr]))
                    pr += 1;
                if (IsDelim(prog[pr]))
                {
                    token = prog[pr].ToString();
                    pr += 1;
                    token_type = DELIM;
                }
                else if (IsDigit(prog[pr]))
                {
                    while(!IsDelim(prog[pr]))
                    {
                        token += prog[pr];
                        pr += 1;
                        if (pr >= prog.Length)
                            break;
                    }
                    token_type = NUMBER;
                }
            }
            return token_type;
        }

        Single ConvertStringToSingle(string s)
        {
            Single v = Single.MaxValue;
            Single tmpF;

            if (float.TryParse(s, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out tmpF))
                v = tmpF;
            else if (float.TryParse(s, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.CurrentCulture, out tmpF))
                v = tmpF;

            return v;
        }

        Single Primitive()
        {
            Single v;
            if (token == "")
                token = "0";
            v = ConvertStringToSingle(token);
            GetToken();
            return v;
        }

        Single Unary(char o, Single r)
        {
            Single v = r;
            if (o == '-')
                v = r * -1;
            return v;
        }

        Single Arith(char op, Single r, Single h)
        {
            Single v = 0;
            switch (op)
            {
                case '-':
                    v = r - h;
                    break;
                case '+':
                    v = r + h;
                    break;
                case '/':
                    v = r / h;
                    break;
                case '*':
                    v = r * h;
                    break;
            }
            return v;
        }

        Single Level6()
        {
            Single v;
            if (token == "(" && token_type == DELIM)
            {
                GetToken();
                v = Level2();
                GetToken();
            }
            else
                v = Primitive();
            return v;
        }

        Single Level5()
        {
            string op = "";
            Single v;
            if (token_type == DELIM && (token == "+" || token == "-"))
            {
                op = token;
                GetToken();
            }
            v = Level6();
            if (op != "")
                v = Unary(op[0], v);
            return v;
        }

        Single Level4()
        {
            return Level5();
        }

        Single Level3()
        {
            Single v, hold;
            char op;
            v = Level4();
            while (true)
            {
                if (token == "")
                    break;
                op = token[0];
                if (!(op == '*' || op == '/'))
                    break;
                GetToken();
                hold = Level4();
                v = Arith(op, v, hold);
            }
            return v;
        }

        Single Level2()
        {
            Single v, hold;
            char op;
            v = Level3();
            while (true)
            {
                if (token == "")
                    break;
                op = token[0];
                if (!(op == '+' || op == '-'))
                    break;
                GetToken();
                hold = Level3();
                v = Arith(op, v, hold);
            }
            return v;
        }

        string GetABS(string s)
        {
            string v = s;
            string n, k = "";
            int i = s.IndexOf("ABS(", StringComparison.CurrentCultureIgnoreCase);
            if (i > -1)
            {
                if (i == 0)
                    n = "";
                else
                    n = s.Substring(0, i);
                string s1 = s.Substring(i + 3);
                int sc = 0;
                i = 0;
                int p = -1;
                while (i < s1.Length)
                {
                    if (s1[i] == '(')
                        sc += 1;
                    else if (s1[i] == ')')
                        sc -= 1;
                    if (sc == 0)
                    {
                        p = i;
                        break;
                    }
                    i += 1;
                }
                if (p > -1)
                {
                    k = s1.Substring(p + 1);
                    string s2 = s1.Substring(1, p - 1);
                    v = Math.Abs(Express(s2)).ToString();
                    k = GetABS(k);
                }
                v = n + v + k;
            }
            return v;
        }

        public Single Express(string s)
        {
            Single v;
            string s1;
            s1 = GetABS(s);
            pr = 0;
            prog = s1;
            GetToken();
            v = Level2();
            return v;
        }
    }
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884754
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
MyCalc cv = new MyCalc();
Single f = cv.Express("(1+2)/3");
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884761
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-er...да мне вообще плевать на понятие "архитектура". это зло с которым надо бороться. Но боюсь МСУ слишком большой , что бы понять такую маленькую и простую истину. Архитектура это кандалы, в которые заворачивает себя разработчик. и потом с этим борется. ставят всякие костыли да подпорки. всё лишь бы ради целостности "архитектуры".
Я х....ею, дорогая редакция! Ну да, процедурный подход, все должно быть видно всем, хаос, анус!
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884774
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LexxxxxЯ х....ею, дорогая редакция! Ну да, процедурный подход, все должно быть видно всем, хаос, анус!
а вот не надо.не надо уеть.
всё ж не просто так. я не с балды пишу такие "крамольные" вещи. наверное что то я под этим подразумеваю. ща пишу прогу, так , когда делать нечего. так вот в ней >95% методов статических (а в дальнейшем >99%). и архитектурой там не пахнет. куда хочу, туда ворочу. волюшка воля.
так что не надо уеть. а вопрос видимости это вопрос выбора, не более. я пишу под конкретную задачу. и там на это наплевать. и никакого хаоса. только строгий порядок.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37884783
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-er,

я у таком стиле программы на 1м курсе писал;) через полгода во-первых тошнило от кода, во-вторых разобраться не мог
P.S. Почему всех так тянет изобретать велосипеды, когда есть готовые и проверенные решения?
...
Рейтинг: 0 / 0
25 сообщений из 116, страница 2 из 5
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / как вычислить выражение?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]