Сложный калькулятор строки
Запись от Avrilka размещена 27.12.2010 в 01:12
Привет всем! Я тут недавно поднимал на форуме тему "как из строки типа "
получить значение s?
Так вот я немного попарился и написал свою функцию
Я еще новичек и не кидайтесь пожалуста ругательствами и ботинками.
У моей функции много недостатков. Если есть какие-то предложения говорите.
Вот код
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); } }
Всего комментариев 7
Комментарии
27.12.2010 12:55 | |
Напишите комментарии к функциям и свойствам, дайте им внятные имена. Сделайте это в виде класса.
|
27.12.2010 12:57 | |
Особо не всматривался, но удивлен, что сделал без регэкспов - думаю было бы удобней.
|
27.12.2010 13:03 | |
Цитата:
Особо не всматривался, но удивлен, что сделал без регэкспов - думаю было бы удобней.
|
27.12.2010 13:45 | |
Цитата:
Автор на AS1/2 пишет
Avrilka, давно пора переходить на ас3 |
28.12.2010 00:12 | |
Пинать не буду. Бред полный. Вполне возможно, что Вы хотели заняться разработкой компиляторов.
|
28.12.2010 15:34 | |
Да, очень похоже на конечный автомат с глубиной в 1 символ.
|
Последние записи от Avrilka
- Новая функция EXE (18.01.2011)
- Сложный калькулятор строки (27.12.2010)