Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Avrilka

Оценить эту запись

Сложный калькулятор строки

Запись от Avrilka размещена 27.12.2010 в 01:12

Привет всем! Я тут недавно поднимал на форуме тему "как из строки типа
Код AS1/AS2:
s=(5*6^3/(x+1))*(-5)
"
получить значение s?

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

Вот код

Код 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}
Всего комментариев 7

Комментарии

Старый 27.12.2010 12:55 alatar вне форума
alatar
 
Аватар для alatar
Напишите комментарии к функциям и свойствам, дайте им внятные имена. Сделайте это в виде класса.
Старый 27.12.2010 12:57 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
Особо не всматривался, но удивлен, что сделал без регэкспов - думаю было бы удобней.
Старый 27.12.2010 13:03 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
Особо не всматривался, но удивлен, что сделал без регэкспов - думаю было бы удобней.
Автор на AS1/2 пишет
Старый 27.12.2010 13:45 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
Цитата:
Автор на AS1/2 пишет
И то верно.
Avrilka, давно пора переходить на ас3
Старый 28.12.2010 00:12 dimarik вне форума
dimarik
 
Аватар для dimarik
Пинать не буду. Бред полный. Вполне возможно, что Вы хотели заняться разработкой компиляторов.
Старый 28.12.2010 15:34 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Да, очень похоже на конечный автомат с глубиной в 1 символ.
Старый 14.01.2011 11:25 Avrilka вне форума
Avrilka
щас пишу новый. приближенный к флешу. Классы я еще не прошел в универе. У нас препод кул. Хорошо обьясняет. И тем более я думаю можно написать все это сначала как функцию. а потом перевести в класс))
 
Последние записи от Avrilka

 


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


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