===================================================
プログラム例題9
二次方程式 において、a = 1, b = 4, c = 3 のときの
解をもとめよ。また、 a = 1, b = 3, c = 4 のときは虚数解となるが、判
別式 を求め、d < 0
のときは虚数解と表示せよ。
=========================================================
<HTML>
<HEAD>
<TITLE>例題9</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
var
d, x1, x2;
// 入力データ
var a = 1;
var b = 4;
var c
= 3;
// 判別式 d の計算
d =
Math.pow(b,2) - 4*a*c;
// 解の判断と表示
document.write
("<br>");
if
(d < 0) {
document.write
("虚数解");
}
else {
x1
= (-b + Math.sqrt(d))/(2*a);
x2
= (-b - Math.sqrt(d))/(2*a);
document.write
("x1=",x1,"<BR>");
document.write
("x2=",x2);
}
// -->
</SCRIPT>
</BODY>
</HTML>
a = 1, b = 4, c = 3 のときの、実行結果は、次のようになります。
x1=-1
x2=-3
a = 1, b = 3, c = 4 のときの、実行結果は、次のようになります。
虚数解
二次方程式の解は、
です。
もし、√の中が負のときはエラーになります。これを回避するために
判別式を先に計算し、d<0
のときは虚数解と表示させる
のです。
if (d < 0) {
document.write
("虚数解");
}
else {
x1 = (-b + Math.sqrt(d))/(2*a);
x2 = (-b - Math.sqrt(d))/(2*a);
document.write
("x1=",x1,"<BR>");
document.write
("x2=",x2);
}
判断文です。もし( if ) d<0 のときは、虚数解と表示します。そうでな
ければ( else )、2つの解を計算しそれらを表示し、判断を終了します。
判断文の基本の形は、次のようになります。
if ( 条件 ) {
条件にあてはまるとき実行される文
}
else {
条件にあてはまらないとき実行される文
}
条件判断の関係演算子には、次の6つがあります。
関係演算子 意味
> 大きい
< 小さい
>= 大きいか等しい
<= 小さいか等しい
== 等しい
!= 等しくない
if 文の中で実行される文はいくつあっても構いません。if 文では、始ま
りを示す( { )と、終わりを示す( } )を書きます。また、( { )や( } )の後
には( ; )は必要ありません。
また、次のように( { } )や else を書かないこともあります。
If ( a = 0 ) b = 1;
もし、a = 0 ならば b = 1 とせよという文です。このときは、( ; )が必要
です。
7.for文(繰り返し文) [もくじへ] [トップページへ]
===================================================
プログラム例題10
10の階乗(10!)を求めよ。
10! = 10×9×8×7×6×5×4×3×2×1
である。
=========================================================
<HTML>
<HEAD>
<TITLE>例題10</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
// 入力データ
var n
= 10;
// 計算
var
i;
var nk=1;
for (i = 1; i <= n; i++)
{
nk = nk*i;
}
document.write
("<BR>");
document.write (n," の階乗 = ",nk);
// -->
</SCRIPT>
</BODY>
</HTML>
実行結果は、次のようになります。
10 の階乗 = 3628800
for (最初の値; 終わりの値; 数え方) {
繰り返し実行される文
}
( { )と( } )にはさまれた文を、最初の値から、終わりの値になるまで繰り
返します。「数え方」は通常1つずつ数えるので、i++ になっています。これ
は、変数 i を使って1つずつカウントするカウンタの働きをします。「最初の
値」は、変数 i に数え始めの数値を設定します。「終わりの値」は、変数 i
がいくつになるまで繰り返させるのかを設定します。
繰り返しをループともいいます。
nk = nk*i;
nk に最初 1 が代入されていますので、
i = 1 のとき、nk = 1 * 1 = 1
i = 2 のとき、nk = 1 * 2 = 2
i = 3 のとき、nk = 2 * 3 = 6
i = 4 のとき、nk = 6 * 4 = 24
i = 5 のとき、nk = 24 * 5 = 120
・・・・・
のようにして、nk に n の階乗が計算されていきます。
7.2 その2(2重ループ) [もくじへ] [トップページへ]
===================================================
プログラム例題11
次のような表を作れ。
i j
1 1
1 2
2 1
2 2
3 1
3 2
=========================================================
<HTML>
<HEAD>
<TITLE>例題11</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
var
i, j;
// 表示
document.write
("<BR>");
document.write
(" i j","<BR>");
document.write
("<BR>");
for ( i = 1; i <= 3;
i++) {
for ( j = 1; j <=2; j++)
{
document.write (i, " ",
j, "<BR>");
}
document.write
("<BR>");
}
document.write
("<BR>");
// -->
</SCRIPT>
</BODY>
</HTML>
実行結果は、次のようになります。
i j
1 1
1 2
2 1
2 2
3 1
3 2
for
( i = 1; i <= 3; i++ ) {
for ( j
= 1; j <= 2; j++ ) {
document.write
(i, " ",
j, "<BR>");
}
document.write
("<BR>");
}
i のループの中に j のループが入った入れ子の構造になっています。
このプログラムでは for 文が2重になっているので、2重ループといい
ます。
i = 1 のまま、j = 1
j = 2
i = 2 のまま、j = 1
j = 2
i = 3 のまま、j = 1
j = 2
i が 3 回繰り返す間に、j はそれぞれ 2 回繰り返します。
このように、for 文の中に入れる文は、少し頭下げ(インデント)した方
が見やすくなります。
===================================================
プログラム例題12
次の10個のデータの、合計と平均をもとめよ。
123.43, 123.48, 123.42, 123.40, 123.44
123.41, 123.49, 123.45, 123.47, 123.46
=========================================================
<HTML>
<HEAD>
<TITLE>例題12</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
var i,
s, av;
var
n = 10;
d = new
Array(10);
// 入力データ
d[1]=123.43;
d[2]=123.48;
d[3]=123.42;
d[4]=123.40;
d[5]=123.44;
d[6]=123.41;
d[7]=123.49;
d[8]=123.45;
d[9]=123.47;
d[10]=123.46;
// 計算
s =
0;
for (i = 1; i<=n; i++) {
s = s + d[i];
}
av = s/n;
document.write
("<BR>");
document.write ("合計
= ",s);
document.write
("<BR>");
document.write ("平均
= ",av);
// -->
</SCRIPT>
</BODY>
</HTML>
実行結果は、次のようになります。
合計 = 1234.45
平均 = 123.44500000000001
※ 平均で、コンピュータの変換誤差が出ています。
d = new Array(10);
配列とは、添え字のついた変数のことです。添え字が一個の配列を一次
元配列といいます。配列を用いるにはあらかじめ、いくつ用いるかの宣言
をしなくてはなりません。この場合 d[0] 〜 d[10] まで11個の変数が使え
るようになります。ここでは、d[0] は使用していません。
s = 0;
JavaScriptでは、変数の宣言をするとデータはクリアされ、数値変数の場
合 0 になるのですが、安全のため合計する変数 s に初期値として 0 を代
入しておきます。
for
(i = 1; i<=n; i++) {
s = s +
d[i];
}
配列の便利なところは、一つの変数名で多くのデータが扱えるということ
と、添え字に変数が使えるということです。
s = s + d[1], s = s + d[2], ・・・ などとデータの個数の数だけ書かなけ
ればならないところを、このように for 文と組み合わせてわずか3行で書
けます。データの個数がこれ以上になっても同じ行数で済みます。
s = s + d[i] は d[i] の合計のプログラムです。よく使われますので次の
表で理解しておきましょう。
i d[i] s(旧) + d[i] = s(新)
1 123.43 0 + 123.43 = 123.43
2 123.48 123.43 + 123.48 = 246.91
3 123.42 246.91 + 123.42 = 370.33
av = s/n;
合計をデータの個数 n で除して、平均を求めます。
8.2 その2(二次元配列) [もくじへ] [トップページへ]
===================================================
プログラム例題13
次の行列AとBの和をもとめよ。
=========================================================
考え方
JavaScript には、今のところ二次元配列がサポートされていません。ここ
では、一次元配列を二次元配列のように使ってみます。
まず、3行3列の配列を例にとると、二次元配列の1行1列目を一次元配
列の1番目に、以下1行2列目を2番目、1行3列目を3番目のように割り
当てます。全体は次の表のようになります。
これを、 n行m列で一般化します。次の表の3行1列目は、 2m + 1 ですが、
m の係数 2 は i - 1 で、また +1 は j で表されることがわかります。した
がって、二次元配列の i 行 j 列目は、一次元配列の ( i - 1 )× m + j
番目になります。
以上の変換式を、考えてプログラミングすると次のようになります。
<HTML>
<HEAD>
<TITLE>例題13</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
var
i, j, ij;
var
n = 3;
var
m = 3;
a =
new Array(3*3);
b =
new Array(3*3);
c =
new Array(3*3);
// 入力データ
a[1]=3;
a[2]=6;
a[3]=9;
a[4]=2;
a[5]=4;
a[6]=4;
a[7]=6;
a[8]=3;
a[9]=5;
b[1]=4;
b[2]=3;
b[3]=6;
b[4]=0;
b[5]=6;
b[6]=8;
b[7]=3;
b[8]=7;
b[9]=2;
// 計算
for (i = 1; i<=n; i++) {
for (j = 1; j<=m; j++) {
ij=(i-1)*m + j;
c[ij]=a[ij] + b[ij];
}
}
// 表示
document.write
("<BR>");
for (i = 1; i<=n; i++) {
for (j = 1; j<=m; j++) {
ij=(i-1)*m + j;
document.write (c[ij],
" ");
}
document.write
("<BR>");
}
// -->
</SCRIPT>
</BODY>
</HTML>
実行結果は、次のようになります。
7 9 15
2 10 12
9 10 7
a = new Array(3*3);
3行3列の行列のデータ 3 × 3 = 9 個を格納する配列を、一次元配列 a
で宣言します。
二次元配列は、この例題のような行列計算でよく用います。測量でも、観
測方程式の厳密解を求める計算などに応用できるでしょう。
for
(i = 1; i<=n; i++) {
for (j =
1; j<=m; j++) {
ij=(i-1)*m
+ j;
c[ij]=a[ij]
+ b[ij];
}
}
i と j の二重ループになっています。外側の i のループは行のループで、
内側の j のループは列のループです。変数 ij には、二次元配列の添え字
i と j を一次元配列の添え字に変換した値が入ります。
順に追いかけてみると、次のようになります。
i = 1 で j = 1 のとき ij = (1-1)*3 + 1 = 1
c[1] = a[1] + b[1]
j = 2 のとき ij = (1-1)*3 + 2 = 2
c[2] = a[2] + b[2]
j = 3 のとき ij = (1-1)*3 + 3 = 3
c[3] = a[3] + b[3]
i = 2 で j = 1 のとき ij = (2-1)*3 + 1 = 4
c[4] = a[4] + b[4]
j = 2 のとき ij = (2-1)*3 + 2 = 5
c[5] = a[5] + b[5]
j = 3 のとき ij = (2-1)*3 + 3 = 6
c[6] = a[6] + b[6]
i = 3 で j = 1 のとき ij = (3-1)*3 + 1 = 7
c[7] = a[7] + b[7]
j = 2 のとき ij = (3-1)*3 + 2 = 8
c[8] = a[8] + b[8]
j = 3 のとき ij = (3-1)*3 + 3 = 9
c[9] = a[9] + b[9]
document.write
("<BR>");
for (i = 1; i<=n;
i++) {
for (j =
1; j<=m; j++) {
ij=(i-1)*m
+ j;
document.write
(c[ij], " ");
}
document.write
("<BR>");
}
配列 c を画面出力させていますが、c[ij] の後の " " は、数値間にスペー
スをとるためです。また、document.write ("<BR>") で一行分出力した後、
改行します。