Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Математический калькулятор строки (http://www.flasher.ru/forum/showthread.php?t=148288)

Avrilka 27.12.2010 09:18

Математический калькулятор строки
 
Привет всем! Я тут недавно поднимал на форуме тему "как из строки типа
Код AS1/AS2:

'5*6^3/(x+1))*(-5)'

"
получить значение?
Так вот я немного попарился и написал свою функцию
Я еще новичек и не кидайтесь пожалуста ругательствами и ботинками.
У моей функции много недостатков. Если есть какие-то предложения говорите.

Вот код


Код AS1/AS2:

var  MathObj:Object = new Object();
MathObj.T=[];
MathObj.T['A3']=3;
 
function Mathematic(s:String):Number {{
                kl = 2;
                while (kl>1) {
                        trace(s);
                        r = findMaxS(s);
                        startIndex = r[0];
                        kl = r[1];
                        k = '';
                        i = startIndex;
                        letter = s.charAt(i);
                        while (letter != ')' && i<s.length) {
                                k += letter;
                                letter = s.charAt(++i);
                        }
                        startIndex;
                        endIndex = i-1;
                        s1 = s.substr(0, startIndex-1);
                        s2 = s.substr(startIndex, (endIndex-startIndex+1));
                        s3 = s.substr(endIndex+2, (s.length-endIndex));
                        //trace(s1+'('+s2+')'+s3);
                        trace('Send '+s2);
                        s = s1+breakToOperation(s2)+s3;
                }
        }
        runD(s)
        return runD(s)
        };
function findMaxS(s:String):Array {
        g = 0;
        k = 0;
        startIndex = 0;
        endIndex = 0;
        gmax = 0;
        litter = s.charAt(0);
        for (i=0; i<s.length; i++) {
                letter = s.charAt(i);
                if (letter == '(') {
                        g++;
                        k++;
                        if (g>gmax) {
                                gmax = g;
                                startIndex = i;
                        }
                }
                if (letter == ')') {
                        g--;
                }
        }
        a = [];
        a[0] = gmax;
        a[1] = k;
        return a;
}
function breakToOperation(s:String):String {
        {
                operations = 0;
                for (i=0; i<s.length; i++) {
                        litter = s.charAt(i);
                        if (litter == '[' || litter == '{') {
                                while (litter != ']' && litter != '}') {
                                        litter = s.charAt(++i);
                                }
                        }
                        if (litter == '/' || litter == '^' || litter == '*' || litter == '+' || litter == '-') {
                                operations++;
                        }
                }
                for (n=0; n<operations; n++) {
                        litter = '';
                        str1 = '';
                        str2 = '';
                        str3 = '';
                        startIndex = 0;
                        endIndex = 0;
                        oprIndex = 0;
                        firstP = false;
                        for (i=0; i<s.length; i++) {
                                litter = s.charAt(i);
                                //|| litter == '+' || litter == '-'
                                if (litter == '[' || litter == '{') {
                                        //trace ('I ' +i)
                                        while (litter != ']' && litter != '}') {
                                                litter = s.charAt(++i);
                                        }
                                        //trace ('I ' +i)
                                }
                                if (litter == '/' || litter == '^' || litter == '*') {
                                        firstP = true;
                                        break;
                                }
                        }
                        if (firstP == false) {
                                for (i=0; i<s.length; i++) {
                                        litter = s.charAt(i);
                                        if (litter == '[' || litter == '{') {
                                                //trace ('I ' +i)
                                                while (litter != ']' && litter != '}') {
                                                        litter = s.charAt(++i);
                                                }
                                                //trace ('I ' +i)
                                        }
                                        //|| litter == '+' || litter == '-'     
                                        if (litter == '+' || litter == '-') {
                                                break;
                                        }
                                }
                        }
                        oprIndex = i;
                        //trace('oprIndex: '+i);
                        litter = s.charAt(--i);
                        while (litter != '{' && litter != '[') {
                                litter = s.charAt(--i);
                        }
                        startIndex = i;
                        i = oprIndex;
                        litter = s.charAt(++i);
                        while (litter != '}' && litter != ']') {
                                litter = s.charAt(++i);
                        }
                        endIndex = i;
                        //trace(startIndex+'  |  '+endIndex);
                        //k='';
                        str1 = s.substr(0, startIndex);
                        //trace ('! '+str1)
                        str2 = s.substr(startIndex, (endIndex-startIndex+1));
                        //trace ('! '+str2)
                        str3 = s.substr(endIndex+1, (s.length-endIndex));
                        //trace ('! '+str3)
                        //s='';
                        s = str1+'['+runD(str2)+']'+str3;
                }
                trace('S :'+s);
                return s;
        }
};
function runD(s:String):Number {
        {
                k = '';
                var n1:Number;
                var n2:Number;
                var op:String = '';
                arrayName = '';
                arrayAtr = '';
                for (i=0; i<s.length; i++) {
                        litter = s.charAt(i);
                        if (litter == '{') {
                                i++;
                                litter = s.charAt(i);
                                while (litter != '|') {
                                        arrayName += litter;
                                        litter = s.charAt(++i);
                                }
                                litter = s.charAt(++i);
                                while (litter != '}') {
                                        arrayAtr += litter;
                                        litter = s.charAt(++i);
                                }
                                if (n1 == undefined) {
                                        n1 = getValue(arrayName, arrayAtr);
                                } else {
                                        n2 = getValue(arrayName, arrayAtr);
                                }
                                arrayName = '';
                                arrayAtr = '';
                        }
                        if (litter == '[') {
                                i++;
                                litter = s.charAt(i);
                                while (litter != ']') {
                                        k += litter;
                                        litter = s.charAt(++i);
                                }
                                if (n1 == undefined) {
                                        n1 = Number(k);
                                } else {
                                        n2 = Number(k);
                                }
                                k = '';
                        }
                        if (litter == '/' || litter == '^' || litter == '*' || litter == '+' || litter == '-') {
                                op = litter;
                        }
                }
                //trace(n1+'  | '+n2);
                return count(n1, n2, op);
        }
};
function getValue(ArrayName:String, AttributeName:String):Number {
        return _root.MathObj[ArrayName][AttributeName];
}
function count(n1:Number, n2:Number, op:String):Number {
        if (op == '/') {
                return n1/n2;
        }
        if (op == '*') {
                return n1*n2;
        }
        if (op == '-') {
                return n1-n2;
        }
        if (op == '+') {
                return n1+n2;
        }
        if (op == '^') {
                return Math.pow(n1, n2);
        }
}

Пример:

Код AS1/AS2:

k = '(([1]/{T|A3}-{T|A3})*{T|A3}+[1]-[5])*[1]'; // выводит -12 при {T|A3}=3


И сразу же вопрос как вызвать функцию которая описанна в функции???

Добавлено через 26 минут
И сразу же вопрос как вызвать функцию которая описанна в функции???

Всмысле у меня не получилось слить их в 1 функцию.
Вообще у меня цели такие стоят
1) в одну функцию
2) Обьект передается в функцию а не лежит в root


Часовой пояс GMT +4, время: 19:31.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.