変数は数値や文字列など様々なデータをいれておいて、計算に使用することができる。 しかし、多数のデータをそれぞれ違う変数にいれておいたのでは、繰り返し処理することが難しい。 例えば5, 2, 4というデータがあって、それぞれ変数a, b, cにいれておいたとする。 このとき、全てのデータを2倍しようとすると、それぞれに対して命令する必要がある。
var a = 5; var b = 2; var c = 4; a = a * 2; b = b * 2; c = c * 2;
繰り返しに適したデータの保持方法が配列である。 配列は一つの名前に対して複数のデータを保持することができる。 配列に含まれる個々のデータは配列名に添え字をつけることで読んだり、書いたりすることができる。
<!DOCTYPE HTML>
<html lang='ja_JP'>
<body>
<script type='text/javascript'><!--
/*
* 配列の使い方
*/
var data = [5, 2, 4]; // 5, 2, 4をデータに持つ配列
document.write(data[0] + "<br>"); // 1番目のデータ
document.write(data[1] + "<br>"); // 2番目のデータ
document.write(data[2] + "<br>"); // 3番目のデータ
/* 配列と繰り返し */
for(var n = 0 ; n < 3 ; n ++){
document.write(data[n] + "<br>"); // 配列の添え字に変数を使う
}
/* 全ての数値を2倍する */
for(var n = 0 ; n < 3 ; n ++){
data[n] = data[n] * 2;
}
for(var n = 0 ; n < data.length ; n ++){ // 配列に.lenghtをつけるとデータ数になる
document.write(data[n] + "<br>");
}
data = []; // 空の配列を定義する。
for(var n = 0 ; n < data.length ; n ++){ // 全て表示させる。何も起きない。
document.write(data[n] + "<br>");
}
--></script>
</body>
</html>
自然数nとnより小さい素数の集合sosuが与えられたとき、nが素数であるかは次のように調べることができる。
これをプログラムにすると次のようになる。
<!DOCTYPE HTML>
<html lang='ja_JP'>
<body>
<script type='text/javascript'><!--
/*
* nとnより小さい素数の集合sosuが与えられたとき、nが素数であるかどうかを調べるプログラム
*/
var sosu = [2, 3, 5];
var n = 6;
var is_sosu = true; // 既知の素数で割り切れたときにfalseにする
var a, s; // 複数の変数を一度に宣言
for(a = 0 ; a < sosu.length ; a ++){
s = sosu[a];
if(0 == n % s){
is_sosu = false;
}
}
if(is_sosu){
document.write(n + "は素数");
}else{
document.write(n + "は素数でない");
}
--></script>
</body>
</html>
ステップ1のプログラムを拡張して、100より小さい素数を全て求める。
<!DOCTYPE HTML>
<html lang='ja_JP'>
<body>
<script type='text/javascript'><!--
/*
* 100より小さい素数を個求める
*/
var sosu = []; // sosuを空の配列として定義する。
var n = 2;
var a, s, is_sosu; // 複数の変数の使用を宣言する。
while(n < 100){
is_sosu = true; // 素数判定を初期化する。素数でないときにfalseにするために、ここではtrueにする。
for(a = 0 ; a < sosu.length ; a ++){
s = sosu[a];
if(0 == n % s){
is_sosu = false;
}
}
if(is_sosu){
sosu[sosu.length] = n; // nを素数として配列に追加する。sosu.lengthで配列の個数になることを思い出そう。
document.write(n + "は素数<br>");
}
n ++;
}
--></script>
</body>
</html>
ステップ1のプログラムを拡張して、素数を100個求める。
繰り返しおこなう手続きは関数として定義するとよい。
function 関数名 (引数1, 引数2, ...){
関数が呼ばれたときに実行される命令;
return 返り値;
}
以下の例では素数でないと判定されたとき、残りの繰り返しが実行されないので、計算速度が上がる。
<!DOCTYPE HTML>
<html lang='ja_JP'>
<body>
<script type='text/javascript'><!--
/*
* 素数の判定を関数にする
*/
function isSosu(n, sosu){
for(var s = 0 ; s < sosu.length ; s ++){
if(0 == n % sosu[s]){
return false; // 素数でないことがわかったら、falseを返す。
}
}
return true; // いずれの素数でも割り切れなかったときtrueを返す。
}
var sosu = [];
var n = 2;
while(sosu.length < 100){
if(isSosu(n, sosu)){
sosu[sosu.length] = n; // nを素数として配列に追加する
document.write(sosu.length + "番目の素数" + n + "<br>");
}
n ++;
}
--></script>
</body>
</html>
与えられた配列の和を求める関数sum、平均を求める関数meanを定義し、使用する。
<!DOCTYPE HTML>
<html lang='ja_JP'>
<body>
<script type='text/javascript'><!--
/*
* 和を求める関数
*/
function sum(data){
var sum = 0;
for(var n = 0 ; n < data.length ; n ++){
sum = sum + data[n];
}
return sum;
}
/*
* 平均値を求める関数
*/
function mean(data){
if(0 == data.length) return false;
return sum(data) / data.length;
}
var data = [1,2,3,4,5,6,7,8,9,10];
document.write("合計: " + sum(data) + "<br>");
document.write("平均: " + mean(data) + "<br>");
--></script>
</body>
</html>
配列に含まれる数値の合計を計算する関数sumを作成し、それを使って100未満の全ての素数の合計を計算するJavascriptを作成せよ。 作成したJavascriptを含むHTMLファイルを提出すること。