見出し画像

「情報関係基礎」2009年の素因数分解の問題をJavaScriptで書く

Python で書いた と Scratchで書いた の続き。こんどは JavaScript で。

問題(再掲)

まず,2から100までの数について,素数の判別表を作る。
初めはすべて0。

画像1

(b) 0の値に対応する番号のうち,最 も小さい番号を n とする。
 n の倍数の番号に対応する値の欄を,すべて n に書き換える。
(C) 値の欄に0がなくなるまで(b)の手順を繰り返して,判別表を完成させる。

画像2

この判別表を用いて,任意の数を素因数分解する。

プログラムは次のように区分して出題されている。
(1) 判別表の初期化
(2) 判別表の作成
(3) 判別表を用いて素数だけを印刷(表示)する。
(4) 任意の数(ここでは100)を素因数分解する。


(1) 判別表の初期化

画像3

JavaScript は「配列」を使う。まず,変数 Yakusu を宣言しておき,for ループで,値0 を追加していく。初めから 100 個分の配列が用意されているわけではないので,図1の通りにはいかない。JavaScript では配列の要素の追加は push メソッドを使う。

for (var i = 1;  i <=101; i++){
  Yakusu.push(0);
}

ここで,i <=100 でないのは,インデックスが 0 スタートだからだ。表1を2次元の配列として用意するのではなく,上の行は,配列のインデックスの番号を使うから,インデックスが100までなら,配列のサイズは 101 だ。
こういうところ,高校生の実習では結構つまづく可能性がある。 

(2) 判別表の作成

画像4

ほぼ図2の通りにいける。

for (i = 2;  i <=100; i++){
   if( Yakusu[i] == 0){
       j = i;
       while(j <= 100){
           Yakusu[j] = i;
           j = j + i;
       }
   }
}

(3) 判別表を用いて素数だけを印刷(表示)する

画像5

「印刷」は,多くのプログラミング言語では print() だが,JavaScript では,document.write か console.log を使う。console.log は開発者ツールのコンソールに表示するので,ここでは document.write を使った。

for (i = 2 ; i <= 100; i ++){
   if (Yakusu[i] == i){
     document.write(i+' ');   
   }
}
document.write( '<br>');   

for ループの外の document.write( '<br>'); で改行をしている。
<br> は HTML のタグ。'\n' ('¥n') でもよさそうなものだが,'\n' では改行されない。
実は,この改行についてはよくわからないところがある。
この前に,Yakusu の表を作ったところでそれを表示するために
document.write( Yakusu);
とすると,改行されずに,次の document.write による表示がつながってしまう。
document.write( Yakusu+'\n');
と,末尾に改行コードを入れると改行される。
しかし,document.write( '\n'); では改行されないのだ。
授業で JavaScript を扱ったときは,HTMLを学んだあとなので,改行はコントロールコードの \n ではなく,<br> で説明しておいたのでよかったようなものだが。

(4) 任意の数(ここでは100)を素因数分解する

これについては,アルゴリズムの説明がある。

2以上の整数を素因数分解するには,商 が1になるまで,次々と約数である素数で割っていけばよい。
42ページの図2の手続きを実行した結果,配列Yakusuのそれぞれの要素には,添字の約数のうちで (ス) が 入っている。よって, この配列 Yakusu を利用すれば,素因数分解することができる。図4は,100を 素因数分解する 手続きである。

画像6

これもそのまま書ける。
Python ではひっかかったわり算の商の問題はここでは発生しない。

k = 100;
while( k>1){
   document.write(Yakusu[k]);   
   k = k / Yakusu[k];
}

これでよいのだが,素因数分解の結果を 100=5×5×2×2 の形に表示するようにしてみた。

k = 100;
document.write(k + '=');   
while( k>1){
   document.write(Yakusu[k]);   
   k = k / Yakusu[k];
   if(k>1){
     document.write('×');   
   }
}

JavaScriptは簡単か

 JavaScript は現行の情報の教科書(社会と情報:第一学習社)にも載っている。題材は,入力した数の合計を求める,最大値を求める,というもの。

画像7

 一見簡単そうだが,きちんとやるには HTML を書くべきだろう。このとき,スクリプトを ヘッダに書くかボディに書くか,ということや,何気なく書かれている <script> </script> はタグで,開始と終了がペアで必要,ということも理解しておかなければならない。 実際に授業でやらせたとき,このあたりが徹底していないものがあった。
 また,言語仕様についてはほとんど書かれていない。var sum = 0; の意味,つまり,「変数は初めに宣言する」「宣言とともに代入ができる」「= は代入文である」「行末にセミコロンをつける」「半角英数字を使う」などについて,教科書にはまったく書かれていないのだ。「発展」の内容なので,指導するなら授業で,ということなのだろうが,デバッグの方法も書かれていない。当初,私はデバッグの方法 ー ブラウザの開発者ツールを使う を知らなかったので,「何も起こらない ー どこかにまちがいがある ー よく見直そう」としか言えなかった。まあ,短いプログラムであるし。
 では,開発者ツールが使えればいいかというと,それも微妙だ。生徒は英語で書かれたエラーメッセージの意味がわからないのだ。
 つまり,コーディング以外に,HTMLの記法とか,デバッグの方法とかがあって,これが意外に足を引っ張ることになる。

JavaScriptは,文科省の研修用教材にもあるから選択肢の一つになるだろう。
しかし,実際の授業での運用には,言語の扱いやすさとともに他の要素も関係してくる。それについては,別に論じていきたい。