プログラミング 中部大学2025年春期

Javascriptによるプログラミング3

配列

変数は数値や文字列など様々なデータをいれておいて、計算に使用することができる。 しかし、多数のデータをそれぞれ違う変数にいれておいたのでは、繰り返し処理することが難しい。 例えば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>
実行結果

Scratchの場合

練習: 素数を求める

ステップ1

自然数nとnより小さい素数の集合sosuが与えられたとき、nが素数であるかは次のように調べることができる。

  1. 配列sosuから一つ素数を取り出す(sとする)。
  2. nをsで割った余りを求める。余りが0だったとき、nは素数でない。
  3. 1に戻って次の既知の素数について調べる。

これをプログラムにすると次のようになる。

<!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>
実行結果

Scratchの場合

ステップ2

ステップ1のプログラムを拡張して、100より小さい素数を全て求める。

  1. 一番小さい素数は2であるのでnは2から始めて順に大きくしていく。
  2. nが素数であることがわかったら、配列sosuに追加していく。
  3. nが100を超えたら終了する(whileを使うので、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>

実行結果

Scratchの場合

ステップ3

ステップ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>
実行結果

Scratchの場合

和、平均を返す関数

与えられた配列の和を求める関数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ファイルを提出すること。