①正しい表示順 | ②間違った表示順 |
01 | <!DOCTYPE html> |
---|---|
02 | <html lang="ja"> |
03 | <head> |
04 | <meta charset="utf-8"> |
05 | <title>JavaScriptのテストプログラム</title> |
06 | </head> |
07 | <body> |
08 | <input type="button" value="3個の配列" onclick="makeAry(3)"> |
09 | <input type="button" value="5個の配列" onclick="makeAry(5)"> |
10 | <input type="button" value="7個の配列" onclick="makeAry(7)"> |
11 | <input type="button" value="10個の配列" onclick="makeAry(10)"> |
12 | <hr> |
13 | <div id="mytable"></div> |
14 | <hr> |
15 | <input type="button" value="バブルソート" onclick="sort()"> |
16 | <hr> |
17 | <textarea rows="24" cols="70" id="tarea"></textarea> |
18 | |
19 | <script> |
20 | var ary = []; |
21 | var N = 0; |
22 | |
23 | function makeAry( max ) { |
24 | N = max; |
25 | var i; |
26 | for( i = 0; i < N; i ++ ) ary[i] = parseInt( Math.random()*100 ); |
27 | |
28 | //テーブルを表示する |
29 | var TBL = "<table><tr>"; |
30 | for( i = 0; i < N; i ++ ) TBL = TBL + "<td> [" + i + "] </td>"; |
31 | TBL += "</tr><tr>"; |
32 | for( i = 0; i < N; i ++ ) TBL = TBL + "<td style='background-color:#ccc;'>" + ary[i] + "</td>"; |
33 | TBL += "</tr></table>"; |
34 | eID("mytable").innerHTML = TBL; |
35 | } |
36 | |
37 | function sort() { |
38 | var i, j, k, t; |
39 | var n = 0; |
40 | var SPRO = ""; |
41 | |
42 | for( i = 0; i < N-1; i ++ ) { |
43 | for( j = 0; j < N-1-i; j ++ ) { |
44 | if( ary[j] > ary[j+1] ) { |
45 | t = ary[j]; ary[j] = ary[j+1]; ary[j+1] = t; |
46 | } |
47 | |
48 | //↓ここから ソートする過程を表示するための処理 |
49 | n ++; |
50 | SPRO = SPRO + "(" + n + ") i=" + i + " j=" + j + " : "; |
51 | for( k = 0; k < N; k ++ ) SPRO = SPRO + ary[k] + " / "; |
52 | SPRO += "\n";//改行 |
53 | //↑ここまで ソートのアルゴリズムとは無関係 |
54 | } |
55 | } |
56 | eID("tarea").value = SPRO + n + "回の比較で並べ替え完了"; |
57 | } |
58 | |
59 | function eID( id ) { return document.getElementById( id ); } |
60 | |
61 | </script> |
62 | </body> |
63 | </html> |
for( i = 0; i < N-1; i ++ ) {
for( j = 0; j < N-1-i; j ++ ) {
if( ary[j] > ary[j+1] ) {
t = ary[j]; ary[j] = ary[j+1]; ary[j+1] = t;
}
}
}
バブルソートのforループとifについて
インターネットでバブルソートを調べると、多くのサイトで、
for( i = 0; i < N-1; i ++ ) {
for( j = N-1; j > i; j -- ) {
if( a[j] < a[j-1] ) ‥‥‥
と j のループを減算( j-- )にして、左隣の値(a[j-1])と比較していく例が載っています。
私がC言語のアルゴリズムを学んだ良書(インターネット普及前に書かれた古い本)には、
まさにこれと同じソースコードが載っていますので、書籍の知識がネット上で普及したと考えています。
さて本講座の解説では、iもjも加算で右隣の値(a[j+1])と比較するようにしました。
これは本講座の目標である“プログラム初心者の方にできるだけ判りやすく”という観点から、
二重ループを加算と減算ではなく加算だけにして、上図のように左から右に向かって行くほうが感覚的に判りやすいと考えたからです。
どちらの方法でもアルゴリズムは何ら変わりませんので(検索回数も一緒です)、念のためその旨記しておきます。
01 | <!DOCTYPE html> |
---|---|
02 | <html lang="ja"> |
03 | <head> |
04 | <meta charset="utf-8"> |
05 | <title>JavaScriptのテストプログラム</title> |
06 | </head> |
07 | <body> |
08 | <input type="button" value="10人分のキャラクター配列" onclick="makeAry(10)"> |
09 | <hr> |
10 | <div id="mytable"></div> |
11 | <hr> |
12 | <input type="button" value="体力が一番低いキャラを探す" onclick="search()"> |
13 | <hr> |
14 | <input type="text" id="tbox" size="50"> |
15 | |
16 | <script> |
17 | var ary = []; |
18 | var N = 0; |
19 | |
20 | function makeAry( max ) { |
21 | N = max; |
22 | var i; |
23 | for( i = 0; i < N; i ++ ) ary[i] = parseInt( Math.random()*100 ); |
24 | |
25 | //テーブルを表示する |
26 | var TBL = "<table><tr><td>番号</td>"; |
27 | for( i = 0; i < N; i ++ ) TBL = TBL + "<td> [" + i + "] </td>"; |
28 | TBL += "</tr><tr><td>体力</td>"; |
29 | for( i = 0; i < N; i ++ ) TBL = TBL + "<td style='background-color:#cfc;'>" + ary[i] + "</td>"; |
30 | TBL += "</tr></table>"; |
31 | eID("mytable").innerHTML = TBL; |
32 | } |
33 | |
34 | function search() { |
35 | var i; |
36 | var min = 100; |
37 | var chr = -1; |
38 | for( i = 0; i < N; i ++ ) { |
39 | if( ary[i] < min ) { |
40 | min = ary[i]; |
41 | chr = i; |
42 | } |
43 | } |
44 | eID("tbox").value = "体力が一番低いキャラは [" + chr + "] です"; |
45 | } |
46 | |
47 | function eID( id ) { return document.getElementById( id ); } |
48 | |
49 | </script> |
50 | </body> |
51 | </html> |
◇コラム◇ ソートとサーチには色々なアルゴリズムがあります
ここで解説したソートとサーチは、それぞれ最もスタンダードな方法で、複雑なソースコードを書かなくて実現できるアルゴリズムです。
一般的なゲームソフトで同時に登場するキャラは数体から十数体、どんなに多くても数十体ですから、解説した方法で難なく対応できます。
一方、数万、数十万という莫大なデータを並べ替えたり、調べるソフトでは処理の高速化という考えが必要になることがあります。
ここで解説したソートとサーチは効率的なアルゴリズムかというと、そうではありません。
バブルソートは配列の要素数が増えると比較回数はどんどん多くなり、数字が順に並んでいた場合でも無条件に(つまり無駄に)比較を繰り返すことになります。
逐次探索も無条件に全ての数を調べています。
ソートとサーチには効率を追求したアルゴリズムがありますので、興味をもたれた方はネットや書籍でお調べ頂ければと思います。
<form action="*****" method="post">
<input type="*****">
:
<textarea id="*****"></textarea>
</form>
<input type="button" value="ボタンに表示する文字" onclick="ボタンが押された時の処理">
・テキストボックス(1行の入力部)<input type="text" size="何文字入力できるか" value="初期の文字列">
<textarea rows="行数" cols="幅(文字数)">(初期の文字列を表示したい場合ここに記述)</textarea>
UI、GUI、コントロール
パソコンやスマートフォンの画面でユーザー入力を受け付ける部分を
UI(ユーザーインターフェイス)やGUI(グラフィカルユーザーインターフェイス)といいます。
HTMLではinputやtextareaをコントロールと呼びます。
ここで解説したものはそれらのほんの一部です。
他にもinputのtype属性でチェックボックスを配置したり、select要素で選択式のメニューを表示できます。
またHTML5では便利なコントロールが追加されました。
例えば色を選択する<input type="color">や、日付を入力する<input type="date">です。
それらをJavaScriptと組み合わせれば高度な処理を行うソフトウェアが制作できますし、ゲームの開発ツールなども作ることができます。
フォームやコントロールに関する詳しい解説は本講座の目指すところではございませんので割愛しますが、
興味を持たれた方はぜひネットでお調べ頂ければと思います。