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

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.12.2010, 09:18
Avrilka вне форума Посмотреть профиль Отправить личное сообщение для Avrilka Найти все сообщения от Avrilka
  № 1  
Ответить с цитированием
Avrilka

Регистрация: Jun 2010
Адрес: A(undefined,undefined)
Сообщений: 87
Записей в блоге: 2
По умолчанию Математический калькулятор строки

Привет всем! Я тут недавно поднимал на форуме тему "как из строки типа
Код 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, время: 03:25.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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