📘

JavaScript 練習 02

2023/03/31に公開

コメントアウト

答えの前に・・・
プログラムのコードには「コメントアウト」と呼ばれる実行されない行を記述しておくことができる。

JavaScriptの場合は2パターンのコメントアウトがあり、
// の場合には//の後部分1行がコメントになる

// 1行コメント
let a // この部分がコメント

/* */で括った範囲は複数行にわたる場合でも全てコメントアウトされる

/* この部分はコメント
この部分はコメント
この部分はコメント */

必要に応じてソースコード書くときには記述しておくと見返したときにわかりやすくなる

練習2-1

以下のプログラムの穴を埋めて、とある変数numberの値が偶数ならば”even”、奇数ならば”odd”と表示しなさい
<>の部分をJavaScriptで記述しなさい

let number = 10;     // この値を変える

if ( number % 2 == 0 ){
    console.log('even');
}
else {
    console.log('odd');
}

number = 10の時

even

number = 11の時

odd

練習2-2

問1で作成したプログラムの一部をEvenOddという名前の関数にして実行しなさい

function EvenOdd( number ){
    if ( number % 2 == 0 ){
        console.log('even');
    }
    else {
        console.log('odd');
    }
}

let num = 10;
// 関数の呼び出し
EvenOdd(num);

結果自体は練習2-1と同じになるはずなので省略

練習2-3

3つの変数a,b,cの値がa > b >= cの関係である場合はOK、そうでない場合はNGを出力するプログラムを作成せよ

// a, b, c の値は変更して良い
let a = 30;
let b = 20;
let c = 10;

if ( a > b && b > c ) {
	console.log("OK");
}
else {
	console.log("NG");
}

a,b,cと答えが以下のパターンになれば概ね正しいプログラムになる

a b c 答え
30 20 10 OK
10 20 30 NG

数学的には a > b > cと書いて比較したいところだが、演算子としては2入力1出力を想定されているためそのままではJavaScriptの構文エラーになる。

そのため、a > b とb > cの両方が成り立っていれば a > b > cが成り立つと言う風に考える。

&&は「前後の両方の指揮が成り立っていれば真」の演算をしてくれるため、 a > b && b > cと言う条件文になる。

練習2-4

じゃんけんに必勝できるプログラムを作成しなさい

if文を使った場合

// 自分の手を変数に代入しておく
let own = "グー"
// let own = "パー"
// let own = "チョキ"

console.log('自分の手は' + own);

if ( own == "グー" ){
    console.log('相手の手はパーでした');
}
else if( own == "パー" ){
    console.log('相手の手はチョキでした');
}
else if(own == "チョキ"){
    console.log('相手の手はグーでした');
}
/* 以下はできればの部分
else{
    console.log('エラーです')
}
*/

swtich文を使った場合

// 自分の手を変数に代入しておく
let own = "グー"
// let own = "パー"
// let own = "チョキ"

console.log('自分の手は' + own);
switch(own){
    case "グー":
        console.log('相手の手はパーでした');
        break;
    case "パー":
        console.log('相手の手はチョキでした');
        break;
    case "チョキ":
        console.log('相手の手はグーでした');
        break;
    default:
        console.log('エラーです')
}

今回の場合は固定の値との比較のため、switch文の方がスマートかもしれない

練習2-5

1 以下の数値が順に格納された配列を宣言し5番目の要素を6に変更しなさい

[6, 3, 6 ,7 ,8 ,5 ,3, 1, 6, 4]
let ary = [6, 3, 6 ,7 ,8 ,5 ,3, 1, 6, 4];

console.log(ary);
ary[5] = 6;
console.log(ary);

答え

[ 6, 3, 6, 7, 8, 5, 3, 1, 6, 4 ]
[ 6, 3, 6, 7, 8, 6, 3, 1, 6, 4 ]

5個目の要素に6が代入されている。

配列の添字は0からカウントすることに注意

添字 0 1 2 3 4 5 6 7 8 9
編集前 6 3 6 7 8 5 3 1 6 4
編集後 6 3 6 7 8 6 3 1 6 4

2 以下の数値が順に格納された配列を宣言し、総和(全ての値の和)を求めよ

[5, 6, 7, 8, 3, 5, 6, 2, 7, 8]

総和を行うには配列の各要素にアクセスする必要があるため、ループを使用する

let ary = [5, 6, 7, 8, 3, 5, 6, 2, 7, 8];
console.log('入力配列:' + ary);

let sum = 0;
for( let i = 0 ; i < 10; i++ ){
    sum = sum + ary[i];
}
console.log('合計: ' + sum);
入力配列:5,6,7,8,3,5,6,2,7,8
合計: 57

ポイントとしてはループの前で合計用の変数を宣言しておいて、ループの中では値を加算していく処理を記述すること。
sum = sum + ary[i]sumary[i]を加算したものをsumに保存すると言う意味になる。

sum += ary[i]と書いても同じ意味になる。

3 以下の2つの配列の要素ごとの和を求めよ(ノートにヒントあり)

配列1:[5, 6, 7, 8, 3, 5, 6, 2, 7, 8]
配列2:[3, 1, 8, 8, 9, 1, 0, 4, 6, 9]
let ary1 = [5, 6, 7, 8, 3, 5, 6, 2, 7, 8]
let ary2 = [3, 1, 8, 8, 9, 1, 0, 4, 6, 9]

console.log('配列1: '+ ary1);
console.log('配列2: '+ ary2);

let ary_ans = Array(10);
for(let i = 0; i < ary1.length; i++){
    ary_ans[i] = ary1[i] + ary2[i];
}
console.log('答え: '+ ary_ans);

答え:

配列1: 5,6,7,8,3,5,6,2,7,8
配列2: 3,1,8,8,9,1,0,4,6,9
答え: 8,7,15,16,12,6,6,6,13,17

ポイントは総和の場合と同じで変数をループの前に初期化しておく必要があることである。
Array(10)は10個の配列を用意する関数

4 以下の配列の最小の数値と最大の数値を求めよ.

[10, 10, 23, 4, 43, 92, 3, 1, 0, 1]
let ary = [10, 10, 23, 4, 43, 92, 3, 1, 0, 1]

let max = ary[0];
let min = ary[0];

console.log('入力: ' + ary);

// 最大値の検索
for ( let i = 0; i < ary.length; i++){
    if(max < ary[i]){
        max = ary[i];
    }
}

console.log('最大値: ' + max);

// 最小値の検索
for ( let i = 0; i < ary.length; i++){
    if(ary[i] < min){
        min = ary[i];
    }
}

console.log('最小値: ' + min);
入力: 10,10,23,4,43,92,3,1,0,1
最大値: 92
最小値: 0

初めにmaxminの値をaryの最初の要素で初期化しておけばループで比較していくき、小さい値、大きい値があったときに更新されるので求めることができる。

今回は最小値と最大値を別々のループで求めたけど、別に1つのループでも可能。

5 1024の約数を全て求めよ

let number = 1024
for(let i = 0; i <= number; i++){
    if (number % i == 0){
        console.log(i);
    }
}

答え

1
2
4
8
16
32
64
128
256
512
1024

約数は「その値が割り切れる値」であるため、「AをBで割ったときあまりが0」であると言える

そのため、「%」であまりを計算して、0のときが約数になる

練習2-6

1 f(x) = 4x^2 + 4x + 5 について、関数f(x)を作成し、x が 0 から 10までのf(x)の結果を出力しなさい

function f(x){
    return (4 * x * x) + (4 * x) + 5
}

for(let i = 0; i <= 10; i++){
    console.log(f(i));
}
5
13
29
53
85
125
173
229
293
365
445

結果をグラフにしてみると4x^2 + 4x + 5のグラフと重なっている。
シミュレーションとかはこんな感じでグラフ化したりする


(+印がプログラムの結果、緑の線が4x^2 + 4x + 5のグラフ)

2 f(x) = x^2 + x - 6 について、関数f(x)を作成し、x が -10 から 10までのf(x)の結果を出力しなさい

function f(x){
    return (x * x) + x - 6
}


for(let i = -10; i <= 10; i++ ){
    console.log(f(i));
}

答え

84
66
50
36
24
14
6
0
-4
-6
-6
-4
0
6
14
24
36
50
66
84
104

3 問2の結果の値の総和を求めよ

function f(x){
    return (x * x) + x - 6
}

let sum = 0
for(let i = -10; i <= 10; i++ ){
    sum += f(i);
}
console.log(sum);

答え

644

総和のパターンを応用すれば可能

4 二次方程式ax^2 + bx + c = 0の係数a,b,cを入力として二次方程式の解が「2つの実数解」か、「重解」か、「2つの虚数解」かを判別するプログラムを作成せよ

function D(a, b ,c){
    return ( b * b ) - ( 4 * a * c ) 
}

let a = 1;
let b = 0;
let c = -4;

if ( D(a,b,c) > 0 ){
    console.log('2つの実数解');
}
else if ( D(a,b,c) ==  0){
    console.log('重解');
}
else if (D(a,b,c) <  0 ){
    console.log('2つの虚数解');
}

以下のパターンで正しく動けば一旦OK

a b c 結果
1 0 4 重解
2 -10 12 2つの実数解
4 -4 4 2つの虚数解

重解、実数解、虚数解の判定には判別式を使用すれば判定可能である

判別式↓

D = b^{2} - 4ac

これを関数として実装して、結果を使って分岐してあげればよい。

Discussion