課題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 に作成しなさい。
統計用語については自分で調べて欲しいが、要点だけ箇条書きにする。
- 個々のデータと平均のを差をそのデータの偏差という。
- 偏差の平方の平均を分散という。(偏差の平均は当然0になる。)
- 分散の平方根を標準偏差という。標準偏差は、個々のデータの平均値からの「標準的なずれ」と考えることができる。
偏差値はデータを標準化するというアイデアに基づく。実際は、平均点が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 に作成しなさい。
選択ソートは、最小値を順に求めて(選択して)、それを並べていく方法である。
- 最初に配列data全体の中から最小値を求めて、それを配列の先頭(0番目、すなわちdata[0])に置き、もともと先頭にあったものを最小値があった場所(課題1112ではindexOfMinimum番目)に移す(配列の先頭と最小値を入れ替える)。これで、配列の0番目に最小値が入り、1番目以降にはそれより小さくない値が入る。
- 次に、同じことを配列の1番目以降に対して行って、1番目以降での最小値を1番目に入れる。
- 以下同様のことを繰り返して行って、
- 最後に、配列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以上にして下さい。
注意: この課題に対しては自動テストは用意していない。