第11週目課題基礎固め

課題1111

コンソールから実数型のデータを次々と入力し、総和と平均を表示するプログラム ArrayStatistics1.java をパッケージ j1.lesson11basic に作成しなさい。

mainメソッドの動作を表す擬似コードは以下の通りである。出力する文字列などは以下の擬似コードに従うこと。また、出力における改行の扱いは結果の例に従うこと。

プログラム全体
    print "データ個数を入力:"
    dataSize = コンソール入力 (整数)
    if dataSize が0以下
        print "データ個数は、1以上にして下さい。"
        プログラムの終了
    data = 長さ dataSize の新しい配列 (double[])
    for i を  0 から dataSize - 1 まで
        print "第" + i + "番目のデータを入力:"
        data[i] = コンソール入力(実数)
    total = 0.0
    for i を 0 から dataSize - 1 まで
        total に data[i] を加える
    average = total / data の長さ
    print "データの総和:" + total
    print "データの平均:" + average

これと同じ機能は配列を使わずに実現することができるが、この後の課題で必要になるので擬似コードに従ってください。

結果の例

入力に順に 5, 100, 0, 50.5, 70, 90 を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

データ個数を入力: 5
第0番目のデータを入力: 100
第1番目のデータを入力: 0
第2番目のデータを入力: 50.5
第3番目のデータを入力: 70
第4番目のデータを入力: 90
データの総和:310.5
データの平均:62.1

また、データ個数の入力に -1 を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

データ個数を入力: -1
データ個数は、1以上にして下さい。

課題1112

コンソールから実数型のデータを次々と入力し、最大値と最小値をインデックスと一緒に表示するプログラム ArrayStatistics2.java をパッケージ j1.lesson11basic に作成しなさい。最大値、最小値のインデックスは最も小さいものを表示するものとする。

mainメソッドの動作を表す擬似コードは以下の通りである。出力する文字列などは以下の擬似コードに従うこと。また、出力における改行の扱いは結果の例に従うこと。

プログラム全体
    print "データ個数を入力:"
    dataSize = コンソール入力 (整数)
    if dataSize が0以下
        print "データ個数は、1以上にして下さい。"
        プログラムの終了
    data = 長さ dataSize の新しい配列 (double[])
    for i を  0 から dataSize - 1 まで
        print "第" + i + "番目のデータを入力:"
        data[i] = コンソール入力(実数)
    indexOfMinimum = 0
    minimum = data[0]
    indexOfMaximum = 0
    maximum = data[0]
    for i を  1 から dataSize - 1 まで
        if maximum < data[i]
             indexOfMaximum = i
             maximum = data[indexOfMaximum]
        if data[i] < minimum
             indexOfMinimum = i
             minimum = data[indexOfMinimum]
    print "データの最大値:" + maximum
    print "最大値のデータは、" + indexOfMaximum + "番目に入力されています。"
    print "データの最小値:" + minimum
    print "最小値のデータは、" + indexOfMinimum + "番目に入力されています。"

これと同じ機能は配列を使わずに実現することができるが、この後の課題で必要になるので擬似コードに従ってください。

結果の例

入力に順に 5, 100, 0, 50.5, 70, 90 を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

データ個数を入力:5
第0番目のデータを入力:100
第1番目のデータを入力:0
第2番目のデータを入力:50.5
第3番目のデータを入力:70
第4番目のデータを入力:90
データの最大値:100.0
最大値のデータは、0番目に入力されています。
データの最小値:0.0
最小値のデータは、1番目に入力されています。

また、データ個数の入力に -1 を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

データ個数を入力: -1
データ個数は、1以上にして下さい。

課題1113

コンソールから多角形の頂点データを次々と入力し、多角形の周の長さを表示するプログラム ArrayCircumferenceOfPolygon.java をパッケージ j1.lesson11basic に作成しなさい。

mainメソッドの動作を表す擬似コードは以下の通りである。出力する文字列などは以下の擬似コードに従うこと。また、出力における改行の扱いは結果の例に従うこと。

プログラム全体
    print "頂点数を入力:"
    numberOfVertices = コンソール入力 (整数)
    if numberOfVertices が2以下
        print "頂点数は、3以上にして下さい。"
        プログラムの終了
    x = 長さ numberOfVertices の新しい配列 (double[])
    y = 長さ numberOfVertices の新しい配列 (double[])
    // データの入力  
    for i を  0 から x.length - 1 まで
        print "x[" + i + "]を入力: "
        x[i] = コンソール入力(実数)
        print "y[" + i + "]を入力: "
        y[i] = コンソール入力(実数)
    // 各辺の長さの合計を求める(外周の長さを求める)
    totalLength = 0
    for i を  0 から x.length - 2 まで
        totalLength にi番目の頂点とi+1番目の頂点の間の距離を加える
    totalLength に0番目の頂点と最後の頂点の間の距離を加える
    print "外周の長さ:" + totalLength

結果の例

頂点数に 3, 頂点の座標に (3,0), (0,4), (0,0) を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

頂点数を入力: 3
x[0]を入力: 3
y[0]を入力: 0
x[1]を入力: 0
y[1]を入力: 4
x[2]を入力: 0
y[2]を入力: 0
外周の長さ:12.0

また、頂点数の入力に 2 を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

頂点数を入力: 2
頂点数は、3以上にして下さい。

課題1114(optional)

コンソールから100点満点の成績データを次々と入力し、各データの偏差値を表示するプログラム ArrayStatistics3.java をパッケージ j1.lesson11basic に作成しなさい。

統計用語については自分で調べて欲しいが、要点だけ箇条書きにする。

  1. 個々のデータと平均のを差をそのデータの偏差という。
  2. 偏差の平方の平均を分散という。(偏差の平均は当然0になる。)
  3. 分散の平方根を標準偏差という。標準偏差は、個々のデータの平均値からの「標準的なずれ」と考えることができる。

偏差値はデータを標準化するというアイデアに基づく。実際は、平均点が50点、標準的なずれが10点となるように点数のスケールを1次関数で変換する。詳細は擬似コード内の式を参照して欲しい。

この課題で作成するプログラムにおいては標準偏差が0.01より小さくなった場合、すべてのデータの偏差値を50とみなすことにする。また、データの個数については2以上であることを要請する。

mainメソッドの動作を表す擬似コードは以下の通りである。出力する文字列などは以下の擬似コードに従うこと。また、出力における改行の扱いは結果の例に従うこと。

プログラム全体
    print "データ個数を入力:"
    dataSize = コンソール入力 (整数)
    if dataSize が1以下
        print "データ個数は、2以上にして下さい。"
        プログラムの終了
    data = 長さ dataSize の新しい配列 (int[])
    print "データは0以上100以下で入力して下さい。"
    for i を  0 から dataSize - 1 まで
        print "第" + i + "番目のデータを入力:"
        data[i] = コンソール入力(整数)
    // 総和を集計する
    total = 0
    for i を  0 から dataSize - 1 まで
        total に data[i] を加える
    // 平均を計算する
    average = total / data.length
    // 分散を求める
    v = 0
    for i を  0 から dataSize - 1 まで
        v に data[i]-average の平方を加える
    v を data.length で割る
    // 標準偏差を求める
    sigma = v の平方根
    // 結果の出力
    print "データの総和:" + total
    print "データの平均:" + average
    print "データの分散:" + v
    print "データの標準偏差:" + sigma
    if 標準偏差 < 0.01
        print "すべてのデータの偏差値は50"
    else
        for i を  0 から dataSize - 1 まで
            print i + "番目のデータの偏差値は" + ((data[i] - average) * 10/ sigma +50) )

結果の例

入力に順に 5, 100, 50, 60, 70, 90 を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

データ個数を入力:5
データは0以上100以下で入力して下さい。
第0番目のデータを入力:100
第1番目のデータを入力:50
第2番目のデータを入力:60
第3番目のデータを入力:70
第4番目のデータを入力:90
データの総和:370.0
データの平均:74.0
データの分散:344.0
データの標準偏差:18.547236990991408
0番目のデータの偏差値は64.01826051644699
1番目のデータの偏差値は37.06006721558739
2番目のデータの偏差値は42.45170587575931
3番目のデータの偏差値は47.84334453593123
4番目のデータの偏差値は58.62662185627507

また、データ個数の入力に 1 を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

データ個数を入力:1
データ個数は、2以上にして下さい。

標準偏差が0.01より小さい場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

データ個数を入力:3
データは0以上100以下で入力して下さい。
第0番目のデータを入力:30
第1番目のデータを入力:30
第2番目のデータを入力:30
データの総和:90.0
データの平均:30.0
データの分散:0.0
データの標準偏差:0.0
すべてのデータの偏差値は50

課題1115(optional)

コンソールから実数型のデータを次々と入力し、選択ソートと呼ばれる方法でデータを小さい順に並べ替える過程を表示するプログラム SelectionSort.java をパッケージ j1.lesson11basic に作成しなさい。

選択ソートは、最小値を順に求めて(選択して)、それを並べていく方法である。

  1. 最初に配列data全体の中から最小値を求めて、それを配列の先頭(0番目、すなわちdata[0])に置き、もともと先頭にあったものを最小値があった場所(課題1112ではindexOfMinimum番目)に移す(配列の先頭と最小値を入れ替える)。これで、配列の0番目に最小値が入り、1番目以降にはそれより小さくない値が入る。
  2. 次に、同じことを配列の1番目以降に対して行って、1番目以降での最小値を1番目に入れる。
  3. 以下同様のことを繰り返して行って、
  4. 最後に、配列dataのdata.length-2番目と data.length-1番目の小さなほうをdata.length-2番目に入れたら、ソートが完成する。

mainメソッドの動作を表す擬似コードは以下の通りである。出力する文字列などは以下の擬似コードに従うこと。また、出力における改行の扱いは結果の例に従うこと。

プログラム全体
    print "データ個数を入力:"
    dataSize = コンソール入力 (整数)
    if dataSize が0以下
        print "データ個数は、1以上にして下さい。"
        プログラムの終了
    data = 長さ dataSize の新しい配列 (double[])
    for i を  0 から dataSize - 1 まで
        print "第" + i + "番目のデータを入力:"
        data[i] = コンソール入力(実数)
    // 選択ソートの開始
    for n を 0 から data.length-2 まで
        // 配列のn番目とn番目に小さい値を持つ配列要素を以下のようにして入れ換える
        // (0番目に小さい値は最小値)
            // n-1番目まではソート済みなので、n番目以降の最小値が全体のn番目に小さい値になる。
            // その値 nthMinとインデックスindexOfNthMinを求める(この部分は課題1112参照)
            // n番目のデータがn番目に小さい値になるように,データを入れ換える
            // すなわち、data[n]とdata[indexOfNthMin](=nthMin)を入れ替える。
        (ここの部分、上記6行に渉るコメントに相当する擬似コードを省略した。じっくり考えてみよう。)
        // 様子が分かるようにここで出力
        for i を 0 から data.length-1 まで
            print data[i] + " "

結果の例

データ個数に5、データに順に 5, 9, 3, 8, 7 を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

データの個数を入力:5
第0番目のデータを入力:5
第1番目のデータを入力:9
第2番目のデータを入力:3
第3番目のデータを入力:8
第4番目のデータを入力:7
3.0 9.0 5.0 8.0 7.0 
3.0 5.0 9.0 8.0 7.0 
3.0 5.0 7.0 8.0 9.0 
3.0 5.0 7.0 8.0 9.0 
3.0 5.0 7.0 8.0 9.0 

また、データ個数の入力に -1 を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

データ個数を入力: -1
データ個数は、1以上にして下さい。

注意: この課題に対しては自動テストは用意していない。