1
							名前:k
							日付:2010/07/02(金)22:30:44
							ID:9kJEWPZA4knz
						
						こんにちは。
テキストエリアにユーザーが入力した数式を、
グラフにして表示するFlashをas3.0で組みたいのですが、
テキストで入力された数式をどのように処理すればいいか、見当がつきません。
たとえば、"x+y"(String)とテキストで入力されたら、x=1,y=2などの数を代入して、
3(Number)を返すような処理をしたいのです。
足し算のみならず、sinやlogなども実装したいと思っています。
as1.0でしたら、evalを使ってできると思うのですが…。
お知恵をお借りできたらと思います。
							
						テキストエリアにユーザーが入力した数式を、
グラフにして表示するFlashをas3.0で組みたいのですが、
テキストで入力された数式をどのように処理すればいいか、見当がつきません。
たとえば、"x+y"(String)とテキストで入力されたら、x=1,y=2などの数を代入して、
3(Number)を返すような処理をしたいのです。
足し算のみならず、sinやlogなども実装したいと思っています。
as1.0でしたら、evalを使ってできると思うのですが…。
お知恵をお借りできたらと思います。
							2
							日付:2010/07/02(金)22:58:50
							ID:yDl4tzgDJCHR
						
						x と y という2つの変数がありますがこれは2つだけでなく無制限に増えますか?
変数名は自由に付けれますか?
対応する演算は + - * / ですか?
() はありますか?
							
						変数名は自由に付けれますか?
対応する演算は + - * / ですか?
() はありますか?
							3
							日付:2010/07/02(金)23:14:15
							ID:9kJEWPZA4knz
						
						xyz立体のグラフを絵画する予定なので、x,y以外に変数は使いません。
演算は+ - * /と、累乗の意味として ^ を入れようと思っています。
()もつけたいと思っています。
また、sin,cos,logなど、基本的な数学の関数も使えるようにしようと思っています。
							
						演算は+ - * /と、累乗の意味として ^ を入れようと思っています。
()もつけたいと思っています。
また、sin,cos,logなど、基本的な数学の関数も使えるようにしようと思っています。
							4
							名前:1/2
							日付:2010/07/03(土)08:13:12
							ID:yDl4tzgDJCHR
						
						まずは文字列から式の解析でしょうか。
var str:String = " (x + 5) / ((y - 2) * 10.123) + sin(x)";
var dictionary:Array = [
{word:"x",comment:"変数 x"},
{word:"y",comment:"変数 y"},
{word:"+",comment:"加算"},
{word:"-",comment:"減算"},
{word:"*",comment:"乗算"},
{word:"/",comment:"除算"},
{word:"^",comment:"累乗"},
{word:"(",comment:"("},
{word:")",comment:")"},
{word:"sin",comment:"サイン"},
{word:"cos",comment:"コサイン"},
{word:"log",comment:"自然対数"},
];
var i:uint = 0;
var p:uint = 0;// 文字の検索位置
var c:uint = 0;// 文字コード
var l:uint = str.length;// 文字のサイズ
while(true){
if(l <= p)break;
// 一文字取り出す
c = str.charCodeAt(p);
// 空白無視
if(c == 32){
p ++;
continue;
}
							
						var str:String = " (x + 5) / ((y - 2) * 10.123) + sin(x)";
var dictionary:Array = [
{word:"x",comment:"変数 x"},
{word:"y",comment:"変数 y"},
{word:"+",comment:"加算"},
{word:"-",comment:"減算"},
{word:"*",comment:"乗算"},
{word:"/",comment:"除算"},
{word:"^",comment:"累乗"},
{word:"(",comment:"("},
{word:")",comment:")"},
{word:"sin",comment:"サイン"},
{word:"cos",comment:"コサイン"},
{word:"log",comment:"自然対数"},
];
var i:uint = 0;
var p:uint = 0;// 文字の検索位置
var c:uint = 0;// 文字コード
var l:uint = str.length;// 文字のサイズ
while(true){
if(l <= p)break;
// 一文字取り出す
c = str.charCodeAt(p);
// 空白無視
if(c == 32){
p ++;
continue;
}
							5
							名前:2/2
							日付:2010/07/03(土)08:13:31
							ID:yDl4tzgDJCHR
						
						// 数字検出
if(c >= 0x30 && c <= 0x39){
var b:uint = p;
p++;
while(true){
// 一文字取り出す
c = str.charCodeAt(p);
// 数字とピリオドを検出
var check:Boolean = false;
if(c >= 0x30 && c <= 0x39)check = true;
if(c == 46)check = true;
if(check){
p++;
continue;
}
break;
}
trace("数字:" + str.substring(b,p));
continue;
}
// 単語検出
for(i=0;i<dictionary.length;i++){
var page:Object = dictionary[i];
if(str.indexOf(page.word,p) == p){
p += page.word.length;
trace(page.comment);
break;
}
}
if(i < dictionary.length)continue;
trace("エラー");
break;
}
							
						if(c >= 0x30 && c <= 0x39){
var b:uint = p;
p++;
while(true){
// 一文字取り出す
c = str.charCodeAt(p);
// 数字とピリオドを検出
var check:Boolean = false;
if(c >= 0x30 && c <= 0x39)check = true;
if(c == 46)check = true;
if(check){
p++;
continue;
}
break;
}
trace("数字:" + str.substring(b,p));
continue;
}
// 単語検出
for(i=0;i<dictionary.length;i++){
var page:Object = dictionary[i];
if(str.indexOf(page.word,p) == p){
p += page.word.length;
trace(page.comment);
break;
}
}
if(i < dictionary.length)continue;
trace("エラー");
break;
}
							6
							名前:k
							日付:2010/07/03(土)12:03:43
							ID:9kJEWPZA4knz
						
						なるほど…道筋が見えてきました。
これを手がかりに、まずは自分で作成してみようと思います。
また分からないところがあったときは、ご指導よろしくお願いします。
							
						これを手がかりに、まずは自分で作成してみようと思います。
また分からないところがあったときは、ご指導よろしくお願いします。
このスレッドについて
						
						| 質問の状態 : | 未解決  | 
							
| 投稿開始日 : | 2010/07/02(金)22:30:44  | 
							
| 投稿終了日 : | 2010/07/03(土)12:03:43  | 
							
| 投稿者 : | k  | 
							
| レス総数 : | 6  | 
							
| スレッド番号 : | 32  |