環境会議がいそがしく、なかなかJavaScriptに向き合えなかった
のですが、お盆休みにまた取り組んでみました。少しやらないで
いただけですが、脳が錆びついて動かない感じです。
みなさんのようにプロではないので、毎日どっぷりとJavaScript
に触れることもできませんし、続けるのはむずかしいものです。
ところで、前置きがながくなってしまいましたが、ループで繰り返し
表現をするときのことで、3日間これでつぶれてしまいました。
エルニーニョの周期表を作りたいと思い、ある周期をループさせる
簡単な(コードを節約する)スクリプトを書けないかとやってみたの
ですが、できなくて・・・
A B C D E という文字列の並びをそのまま繰り返えさせるにはど
う書けばよいのでしょうか。
A B C D E A B C D E A B C D E A B C D E A B C D E
という感じです。あるいは
A
B
C
D
E
A
B
C
D
E
A
B
C
D
E
というものがほしいのです。こちらは応用として一つができれば、
document.write()に<br>を入れればできると思いますが。
配列要素をほしい数だけ繰り返し並べて置けばよいのでしょうが、
何十回も繰り返されるときには大変ですし、間違いも入り込むと思
います。それで、
synd = new Array('A','B','C','D','E')
という配列要素だけを使ってA B C D E を仮に30回繰り返させる
にはどう書けばよいのでしょうか。
簡単なのかもしれないのですが、発想が悪いのか、いくらやっても
私にはむずかしくてできませんでした。
いつも初歩的な質問ばかりで申し訳ありません。
よろしくお願いいたします。
--
板橋国男
> synd = new Array('A','B','C','D','E')
> という配列要素だけを使ってA B C D E を仮に30回繰り返させる
> にはどう書けばよいのでしょうか。
1重ループだと
for(var i = 0; i < LIMIT; ++i) {
var c = synd[i%5];
...
}
2重ループだと
for(var i = 0; i < LIMIT/5; ++i) {
for(var j = 0; j < 5; ++j) {
var c = synd[j];
...
}
}
お好きな方でいいんじゃないでしょうか(私は入れ子が深いのは避けた
いという気分があるので、1重ループが好みかも)。
まあ頑張ってください。 久野
/^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^l
l 板橋さん(ITAHASHI Kunio)は、 l
l 日時:Mon, 18 Aug 2003 09:05:30 +0900 に、 l
l 件名:< LOOPスクリプト > l
l として送信されました。 l
l /
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 残暑お見舞い申し上げます。
こちらこそ、残暑お見舞い申し上げます。冷夏といえど、矢張り湿気が大変で
すね。
> 環境会議がいそがしく、なかなかJavaScriptに向き合えなかった
> のですが、お盆休みにまた取り組んでみました。少しやらないで
> いただけですが、脳が錆びついて動かない感じです。
ご繁多な中、ご苦労様です。
そう言えば、以前投稿されたオブジェクトについての私や杉田さんの返信は見
られたでしょうか?杉田さんのは実例もあるので勉強になると思いますよ(私は
理論ばっかり書いてました ^^: とっつきにくいですね)。
> A B C D E という文字列の並びをそのまま繰り返えさせるにはど
> う書けばよいのでしょうか。
> synd = new Array('A','B','C','D','E')
> という配列要素だけを使ってA B C D E を仮に30回繰り返させる
> にはどう書けばよいのでしょうか。
たった今受信し、このメッセージを読みながら考えたコードなので、超即席で
HTMLとしては省略した部分も多く、コードについては効率とかもっと綺麗なコー
ディングがあるんじゃないかという突っ込みもあるとは思いますが、一応そのよ
うな「その場で考えたコード」で宜しければ、掲載しておきます(逆に、このよ
うな何も考えずに書いた駄作コードの方が、アルゴリズムとしては理解し易いか
も)。
<html>
<head>
<script type="text/javascript">
synd = new Array('A','B','C','D','E')
for (i=1; i<=30; i++) {
for (j=0; j < synd.length; j++) {
document.write(synd[j]+" ");
}
document.write("<br>");
}
</script>
</head>
<body>
</body>
</html>
---------------------------------------
Hirotsugu Nakamura <CQE2...@nifty.com>
In message news:RKV%a.678$U8....@news1.dion.ne.jp
"ITAHASHI Kunio" <kunit...@h2.dion.ne.jp> wrote ...
> A B C D E という文字列の並びをそのまま繰り返えさせるにはど
> う書けばよいのでしょうか。
いくつかやり方があると思いますが、テスト用にシンプルにする
場合は、関数化してみるのも手です。
var synd = new Array('A','B','C','D','E');
function loop1() {
var i;
for (i=0; i < synd.length; i++) // synd の要素を書き出す
document.write(synd[i] + ' ');
}
function loop2() {
var i;
for (i=0; i < 30; i++) // loop1() を 30 回呼ぶ
loop1();
}
loop2();
これを少し拡張して、各関数の引数に synd や繰り返し回数を渡して
処理するという手もあります。
function loop1(obj) {
var i;
for (i=0; i < obj.length; i++) // obj の要素を書き出す
document.write(obj[i] + ' ');
}
function loop2(obj, n) {
var i;
for (i=0; i < n; i++) // loop1(obj) を n 回呼ぶ
loop1(obj);
}
var synd = new Array('A','B','C','D','E');
loop2(synd, 30);
または、繰り返し処理で必要な配列のインデックスに注目し、
var synd = new Array('A','B','C','D','E');
は
synd[0] = 'A';
synd[1] = 'B';
~
synd[4] = 'E';
なので、
0 1 2 3 4 0 1 2 3 4 0 …
と(5になるところで0に戻るが)続きますよね。
なので、外のループとは別にインデックス用のカウンタを設けて、
var synd = new Array('A','B','C','D','E')
var n = 30 * synd.length;
var idx = 0;
for (i=0; i < n; i++) {
document.write(synd[idx] + ' ');
idx = idx + 1; // 次回用のインデックスを計算
if (idx == synd.length) // synd.length は 5 なので、
idx = 0; // 5 のとき 0 に戻す
}
という方法もあります。
これは、idx は i を 5 で割った余りとも言えて、
久野さんが示された i % 5 に相当します。
また、ループ処理を分けて関数化したものを1つでやるとしたら、
外のループの内側に関数化した処理を記述することで、
2重のループで処理できることがわかるかと思います。
# 関数化した処理をループ内に展開する際は、変数名が
# ダブらないように注意する必要があります。
for 文は、様々な機能を提供しているわけではなく、
決められたことしか出来ませんので、その他もろもろと組み合わせて
処理することになります。
その際、小さな単位で部分的に処理したものの結果を一つの単位として、
少し広い範囲をまた部分的に考えるといった考え方をすると、
考えやすいかと思います。
おかげで考えかたがよく理解できました。
関数を回数分呼び出すというのもあるんですね。
なるほど、と思いました。
いちばん最後のスクリプトはきれいですね。
私ごのみです ^_^
> var synd = new Array('A','B','C','D','E')
> var n = 30 * synd.length;
> var idx = 0;
> for (i=0; i < n; i++) {
> document.write(synd[idx] + ' ');
> idx = idx + 1; // 次回用のインデックスを計算
> if (idx == synd.length) // synd.length は 5 なので、
> idx = 0; // 5 のとき 0 に戻す
> }
>
ちょっとまた基本的な理解がたりんとどなたかからお叱りを
受けそうですが、少し解せないことがあります。
上のスクリプトで
for (i=0; i < n; i++) {
のfor文に使われている変数 i はその後どこにも出て来な
いのですが、どこへ行って何をしてるんでしょうか?
初期値0で要素を30回繰り返すようにインクリメントしてる
のはわかりますが、普通の場合は、
for (i=0; i < n; i++) {
document.write(i+'<br>');
のようにその後に i が実行される変数として記述されます
よね。ここではなぜ表に出て来ないのでしょう。
でも、ちゃんと動くからふしぎです。
いつもありがとうございます。
またよろしくお願いいたします。
--
板橋 拝
Hirotsugu Nakamura さんwrote in message
<20030818175430...@nifty.com>...
> たった今受信し、このメッセージを読みながら考えたコードなので、超即席で
>HTMLとしては省略した部分も多く、コードについては効率とかもっと綺麗なコー
>ディングがあるんじゃないかという突っ込みもあるとは思いますが、一応そのよ
>うな「その場で考えたコード」で宜しければ、掲載しておきます(逆に、このよ
>うな何も考えずに書いた駄作コードの方が、アルゴリズムとしては理解し易いか
>も)。
私がいうと生意気に聞こえますが、・・・
さっと書けるというのは頭が整理されているんだなあ、と思いま
した。コードをたどって読むと、とても道理にかなっていて、やりた
いのはまさにこのコードの通りなのですが、それがなかなか書けない
です。
> そう言えば、以前投稿されたオブジェクトについての私や杉田さんの返信は見
>られたでしょうか?杉田さんのは実例もあるので勉強になると思いますよ(私は
>理論ばっかり書いてました ^^: とっつきにくいですね)。
>
いえいえ、とんでもございません。親切に説いていただいて本当に
感謝しています。急に忙しくなって、不本意ながら間があいてしまっ
て、中村さんや杉田さんには失礼してしまいました。
ありがとうございました。
データ整理でちょー多忙になってしまい、お返事が遅くなって
しまってすいません。
#明日もまた日曜だというのに仕事です
--
板橋 拝
ku...@gssm.otsuka.tsukuba.ac.jp さんwrote:
>[全略]
2度手間のような気もしたのですが、
var LIMIT=m*n
で%と連繋させてm個の要素をn回繰り返すとい
う設定は応用的におもしろかったです。なるほど、
と思いました。2つ示して頂いて勉強になりました。
またよろしくおねがいします。
お礼が遅くなってすいません。
--
板橋 拝
In message news:YML1b.25$Ce...@news1.dion.ne.jp
"ITAHASHI Kunio" <kunit...@h2.dion.ne.jp> wrote ...
> 上のスクリプトで
> for (i=0; i < n; i++) {
> のfor文に使われている変数 i はその後どこにも出て来な
> いのですが、どこへ行って何をしてるんでしょうか?
あ、すみません。はじめに訂正です。
> for (i=0; i < n; i++) {
ここは、他で i が使われているかもしれませんので、
for (var i=0; i < n; i++) {
の方が良かったでした。
# もしくは、手前で var i; としてください。
i についてですが、n 回のループを行うための判定に使われて
いる以外は、どこにも使われていません。
変数を用いているのは、for 文だと n 回のループを実現する
ためには、n 回繰り返し実行したかどうかを、何らかの方法で
判定する必要があるためです。
n 回繰り返し実行したか調べるためには、適当な変数をカウント
アップして、その変数が n 回に達したかどうかを判定するのが
一般的で、今回の場合、
(1) i を 0 で初期化
(2) i が n より小さければ { } 内を実行し、(3) へ進む。
そうでなかったら(i が n 以上だったら)、(4) へ進む。
(3) i を +1 カウントアップして、(2) へ戻る。
(4) for 文を終了する(ループを抜ける)。
といった制御を for 文で行うための判定に、i が使われています。
# i は n が 30*5=150 なので、0,1,2,...,147,148,149 と進み、
# { } 内が150回実行された時点で 149 ですので、(3) で +1
# されて、(2) に戻って i < n を判定し、150 < 150 となるため
# 条件が成立せずに (4) に制御が移って、ループを抜けます。
今回のケースでは、かならずしも i は使用する必要はなくて、
手前で n を求めていて、以後、ループ回数の判定以外には使わ
れていないことから、この n をカウントダウンすることでも
n 回のループを実現できます。
この場合、n は既に初期化されており、判定条件としては、
n が 初期値 150 から始まって、1回ループを実行してから
1カウントダウンすると149となり、150回ループを繰り返すと、
150回目のループを実行して1カウントダウンすると、
0になります。
つまり、n は初期化済みで、n が 0 より大きいとき処理を
繰り返し、各処理後 1 づつカウントダウンして、0 以下で
抜けるようにすれば、150回のループが実現できるという
ことになり、これを for 文で表現すると
for ( ; n > 0; n--) {
~
}
となります。
もちろん、n の初期化は for 文で行ってもかまわないのですが、
for (var n = 30 * synd.length; n > 0; n--) {
~
}
少し長くなりますので、好みの方で良いかと思います。