動的な変数
投稿者 : Fauby(i121-115-111-183.s04.a013.ap.plala.or.jp)
- 2007/11/06(Tue) 19:44
No.11584
|
|
|
|
|
i=0;
a=i*5+10
while(1) { i++; print(a); update(); }
これでは、永遠に変数aの値は10のままになりますが、 これを変数iに応じて変数aの値が変わる(例えば、i=3のときはa=25、i=-3のときはa=-5)ようにするにはどうすればいいのでしょうか。
ただし、変数aの式はプレイヤーが決めるものとします。
|
Re: 動的な変数
投稿者 : tomo(112.133.244.43.ap.yournet.ne.jp)
- 2007/11/08(Thu) 07:31
No.11586
|
|
|
|
i=0;
while(1) { a=i*5+10 i++; print(a); update(); }
このように変数aの式をwhile文の中に書けばよいのではないでしょうか。 (i++の前に入れるか、後ろに入れるかで、結果は変わると思います)
|
Re: 動的な変数
投稿者 : Umintyu-(nthkid092062.hkid.nt.ftth.ppp.infoweb.ne.jp)
- 2007/11/08(Thu) 07:34
No.11587
|
|
|
|
i=0;
while(1) { i++; a=i*5+10; print(a); update(); }
こんな感じですね。 多分i++;の後ろのほうが適切じゃないかと。
|
Re: 動的な変数
投稿者 : tomo(112.133.244.43.ap.yournet.ne.jp)
- 2007/11/08(Thu) 07:43
No.11589
|
|
|
|
i=0のときのaの値を利用したいかどうかによるかと。
|
Re: 動的な変数
投稿者 : 昔の人(c107.applc.keio.ac.jp)
- 2007/11/09(Fri) 19:53
No.11590
|
|
|
|
>ただし、変数aの式はプレイヤーが決めるものとします。 a=i*5+10;のような式を動的に変更したい、ということでしょうか。
現状、計算式を自由に変更するというのは非常に難しいと思います。 様々な式の形を関数として用意しておき、プレイヤーにどれを使うかを決めさせるのが現実的です。 あるいは、式を決めるとiに応じたaの値も自動的に決まるので、 aを配列にして式の値をあらかじめ入れておき、a.get(i)として 式をいじったように見せるのが早いかもしれません。
|
Re: 動的な変数
投稿者 : Fauby(i121-115-111-183.s04.a013.ap.plala.or.jp)
- 2007/11/09(Fri) 22:50
No.11591
|
|
|
|
やりたいことについては、昔の人さんの言うとおりです。
とりあえず、後者の方法を試してみます。出来なければ前者の方法を使います。ありがとうございました。
|
Re: 動的な変数
投稿者 : RAY(softbank219035159021.bbtec.net)
- 2007/11/10(Sat) 19:19
No.11592
|
|
|
|
逆ポーランド記法を利用した四則演算プログラムを 変数iを使用可能に改良したもの。
つかえるもの:+ - * / 括弧 少数 つかえないもの: 負の数(-1など)
--------------------------------------------------
extends TextChar;
r=waitInput("計算式の入力","aを求める式を入力して下さい\n+ - * / () 少数が利用できます\n負の数は使えません","i*5+10");
k=r;
siki=""; en="";
//計算式を逆ポーランド記法に変換↓↓ for(l=0;l<r.length();l++){ if(r.substring(l,l+1)=="0"||r.substring(l,l+1)=="1"||r.substring(l,l+1)=="2"||r.substring(l,l+1)=="3"||r.substring(l,l+1)=="4"||r.substring(l,l+1)=="5"||r.substring(l,l+1)=="6"||r.substring(l,l+1)=="7"||r.substring(l,l+1)=="8"||r.substring(l,l+1)=="9"||r.substring(l,l+1)=="."||r.substring(l,l+1)=="i"){ siki=siki+r.substring(l,l+1); } if(r.substring(l,l+1)=="+"||r.substring(l,l+1)=="-"){ siki=siki+","; if(en.substring(en.length()-1)=="*"||en.substring(en.length()-1)=="/"){ siki=siki+en.substring(en.length()-1)+","; en=en.substring(0,en.length()-1); } en=en+r.substring(l,l+1); } if(r.substring(l,l+1)=="*"||r.substring(l,l+1)=="/"){ siki=siki+","; en=en+r.substring(l,l+1); } if(r.substring(l,l+1)=="("){ en=en+r.substring(l,l+1); } if(r.substring(l,l+1)==")"){ siki=siki+","; for(i=en.length()-1;i>0;i--){ if(en.substring(i,i+1)!="("){ siki=siki+en.substring(en.length()-1); en=en.substring(0,en.length()-1); }else{ en=en.substring(0,en.length()-1); break;} } } } siki=siki+","; for(i=en.length()-1;i>-1;i--){ siki=siki+en.substring(i,i+1)+","; } //変換終わり↑
i=0;
print(siki); //デバック用
while(1){ i++; kei=siki.split(); //計算式読み込み
//実計算↓↓ for(l=0;l<kei.size();l++){ if(kei.get(l)=="("){kei.delete(l);l=0;} if(kei.get(l)=="i"){kei.set(l,i);l=0;} if(kei.get(l)=="+"){kei.set(l-1,(valueOf(kei.get(l-2))+valueOf(kei.get(l-1))));kei.delete(l);kei.delete(l-2);l=0;} if(kei.get(l)=="-"){kei.set(l-1,(valueOf(kei.get(l-2))-valueOf(kei.get(l-1))));kei.delete(l);kei.delete(l-2);l=0;} if(kei.get(l)=="*"){kei.set(l-1,(valueOf(kei.get(l-2))*valueOf(kei.get(l-1))));kei.delete(l);kei.delete(l-2);l=0;} if(kei.get(l)=="/"){kei.set(l-1,(valueOf(kei.get(l-2))/valueOf(kei.get(l-1))));kei.delete(l);kei.delete(l-2);l=0;} } //計算終わり↑
text=kei.get(0); //結果を表示
wait(); //デバック用 上記wait()を削除すれば毎フレーム計算されます。 update();}
--------------------------------------------------
|
|