|
|
|||||
Математический калькулятор строки
Привет всем! Я тут недавно поднимал на форуме тему "как из строки типа
" получить значение? Так вот я немного попарился и написал свою функцию Я еще новичек и не кидайтесь пожалуста ругательствами и ботинками. У моей функции много недостатков. Если есть какие-то предложения говорите. Вот код 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); } } И сразу же вопрос как вызвать функцию которая описанна в функции??? Добавлено через 26 минут И сразу же вопрос как вызвать функцию которая описанна в функции??? Всмысле у меня не получилось слить их в 1 функцию. Вообще у меня цели такие стоят 1) в одну функцию 2) Обьект передается в функцию а не лежит в root |
Часовой пояс GMT +4, время: 03:25. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|