2017-07-13 第14回目 最終課題
本日のテーマ
概要
目標
特定の地域の天気予報のデータが与えられる. そのデータを読み,指定の分析を行い,結果を出力するプログラムを作成する. 各ステップで異なる分析を行う.
この課題に必要な内容
- クラス定義の基本形
- 参照の一致性と値の一致性
- 文字列から
Integer
型への変換 - コマンドライン引数
- 文字列から
Double
型への変換 - 配列と
List
- 独自の型を作成する.
- 例外機構
- ファイルを扱う型
- 典型的なファイルからのデータの読み込み方法
- 典型的なファイルへのデータの書き込み方法
Map
- 文字列を特定の文字で区切る(
split
)
課題の進め方
この課題は大きく6つのステップに分けられます.
それぞれのステップで,プログラムを作成します.
各ステップで作成するプログラムのファイル名はWeatherAnalyzer1.java
〜WeatherAnalyzer6.java
とします.
以下のことを念頭に課題を進めてください.
- ステップ1からステップ2,ステップ3 と順番に課題を進めてください. 途中のステップを抜かすことはできません.
- ステップ1で作成した内容を元に,
ステップ2を作成してください.
- ステップ3以降も同様に,前のステップで作成した内容を全て含めて当該ステップに取り組んでください.
- プログラムを作成するとき,一つ前のステップのプログラムをコピーして始めると良いでしょう.
- ただし,
main
メソッドの内容を修正することを忘れないようにしましょう. main
メソッドで異なる型をnew
するバグはなかなか気付きません.
- ただし,
- ステップ3までが必須で,ステップ4,ステップ5,ステップ6がチャレンジ問題です.
課題の提出方法
この課題は6つのステップに分けられています.
各ステップでWeatherAnalyzer1.java
〜WeatherAnalyzer6.java
を作成します.
具体的に指示はしていませんが,独自の型を作成する必要もあるでしょう.
それら全てのソースファイルを zip 圧縮し,zipファイルを Moodle に提出してください.
- 学生証番号(6桁)のディレクトリを作成し,そこに全てのソースファイルをいれてください.
- 自分の学生証番号が
123456
の場合,展開すると次のようになっているようにしてください. *$ ls 123456.zip $ unzip 123456.zip $ ls 123456.zip 123456 $ tree 123456 123456 ... # 必要なファイル ├── WeatherAnalyzer1.java ├── WeatherAnalyzer2.java ... # 必要なファイル └── WeatherAnalyzer6.java
- 提出期限は 2017年7月30日(日)24:00です.
- 提出先は Moodle の【〆切 2017/7/30 24:00】最終課題 です.
- 次のチェックリストを提出前に確認してください.
- zipファイルを空のディレクトリに展開したとき,上記のような構造になっているか.
- その状態でコンパイルに成功するか.
- 全てのソースファイルにコメントとして,自分の学生証番号,名前が記載されているか.
課題のデータ
課題のデータ(天気予報データ)は,次からダウンロードしてください. なお,評価には,ここでダウンロードできるデータとは異なるデータを用います. データの形式は同じですが,記載されているデータや量は異なります. そのため,しっかりとデータを読み,適切な分析を行うようにしてください. 多少の計算誤差は許容されます.
なお,与えられるデータは日付順にソートされているものとして構いません.
- 以下は,京都府京都市の天気データで,気象庁からダウンロードしました.
評価のポイント
以下の点を満たしていれば,加点されます. また,それぞれのステップで確認事項があります.それぞれを満たすことで加点されていきます.
- インデントがずれている部分がないこと.
- 少しでもインデントがずれているとNG.
- ループ制御変数以外で1文字の変数名を利用していないこと.
- 1つのメソッドが10行以内であること.
- メソッド開始の
{
と終了の}
は含まない.
- メソッド開始の
- 3つ以上のネストが存在しないこと.
- 2重ループ内の条件分岐はアウト.別のメソッドに切り出しましょう.
- 配列を使っていないこと.ただし,以下の部分は除きます.
main
メソッドの引数,及びその変数を他のメソッドに渡した時の引数,split
メソッドの返り値.
- クラス定義の基本形に従ってプログラムを書いている.
最終課題の各ステップ
1. 全体の最高気温,最低気温,平均気温
1-A. 問題説明
与えられたデータを読み,最高気温,最低気温,平均気温を求めてください.
プログラムの実行時にコマンドライン引数として,天気データが1つ渡されます.
データは,年,月,日,曜日,平均気温(℃),最高気温(℃),最低気温(℃),天気概況(昼:06時〜18時),天気概況(夜:18時〜翌日06時),降水量の合計(mm),降雨フラグ,日照時間(時間),平均雲量(10分比),平均風速(m/s)
の順に並んでおり,それぞれがコンマ(,)で区切られています.
その中の,平均気温,最高気温,最低気温の項目を読み,統計情報を求めてください.
なお,平均気温は,与えられたデータに含まれる平均気温の平均のこととします.
また,与えられたデータには,空白行やコメントは存在せず,正しいデータのみであることを前提として構いません(不正なデータは存在しない).
1-B. 実行例
$ cat 2016-1st-quarter.csv
2016,1,1,金,5.7,10.6,2.1,晴,晴一時曇,4.0
2016,1,2,土,6.7,12.9,1.8,曇時々晴,曇後時々晴,9.0
# 途中省略
2016,3,30,水,14.0,20.3,8.2,薄曇一時晴,晴時々薄曇,9.0
2016,3,31,木,15.6,22.3,8.8,薄曇一時晴,曇後時々雨,8.8
$ java WeatherAnalyzer1 2016-1st-quarter.csv
22.300000,-4.100000,7.354945
$ java WeatherAnalyzer1 2015-2nd-half.csv
39.100000,0.600000,20.013043
1-C. ヒント
1-D. 評価ポイント
- データを変更しても,例外なく実行結果を出力できるか.
2. 晴の日,雨の日の最高気温,最低気温,平均気温
2-A. 問題説明
プログラムの実行時にコマンドライン引数として,天気データが1つ以上渡されます. この時,晴の日,雨の日の最高気温,最低気温,平均気温を求めてください.
ここでは,
晴の日とは,昼,夜の天気概況に晴
という文字が,
雨の日とは,昼,夜の天気概況に雨
という文字が
含まれているものとします.
そのため,天気概況が晴一時雨
の場合は,晴れの日,雨の日の両方に含まれます
2-B. 実行例
$ java WeatherAnalyzer2 2016-1st-quarter.csv
全体,22.300000,-4.100000,7.354945
晴,22.300000,-4.100000,7.004938
雨,22.300000,-1.700000,8.200000
$ java WeatherAnalyzer2 2016-1st-quarter.csv 2016-3rd-quarter.csv
全体,37.900000,-4.100000,17.436612
晴,37.900000,-4.100000,16.998710
雨,37.900000,-1.700000,18.933333
2-C ヒント
- 最高気温,最低気温,平均気温を扱う型(気温型,
Temperature
)を作成しましょう. Temperature
型では,フィールドに 最高気温,最低気温,平均気温を持ちます.Temperature
型にupdate
のようなメソッドを用意して,最低気温,最高気温,平均気温を受け取りましょう.update
メソッド内で必要であれば,フィールドの最高気温,最低気温,平均気温に代入しましょう.
- 平均を求めるために,今まで確認した数を保持する変数(例えば,
count
)もフィールドに用意すると良いでしょう.- 平均を出力するとき,今まで加算を続けていた平均気温を
count
で割ると平均気温の平均が求められます. - 平均を返すメソッド
average
を用意すると良いでしょう.
- 平均を出力するとき,今まで加算を続けていた平均気温を
2-D 評価ポイント
- 独自の型を作成できるか.
- 独自の型にフィールドが宣言できるか.
- 独自の型にメソッドが宣言できるか.
- 独自の型を別のプログラムから利用できるか.
- 複数のファイルがコマンドライン引数で渡されたとしても,問題なく結果を出力できるか.
3. 天気概況の頻度
3-A. 問題説明
プログラムの実行時にコマンドライン引数として,天気データが1つ以上渡されます. ステップ2に加えて,与えられたデータの天気概況(昼:06時〜18時)の頻度を調べてください.
3-B. 実行例
$ java WeatherAnalyzer3 2016-1st-quarter.csv
曇,7
曇後一時雨、あられを伴う,1
# 途中省略
雪後雨一時晴、みぞれを伴う,1
晴一時雨、あられを伴う,1
全体,22.300000,-4.100000,7.354945
晴,22.300000,-4.100000,7.004938
雨,22.300000,-1.700000,8.200000
$ java WeatherAnalyzer3 2016-1st-quarter.csv 2016-4th-quarter.csv
曇後一時雨、あられを伴う,1
曇時々晴一時雨,1
晴後時々曇一時雨,1
# 途中省略
晴,18
晴時々薄曇,1
曇時々雨後晴,1
全体,31.000000,-4.100000,10.424590
晴,31.000000,-4.100000,10.007742
雨,31.000000,-1.700000,10.815068
3-C. 参考資料
3-D. 評価ポイント
Map
を使えているか.Map
のループが書けるか.
- 複数のファイルがコマンドライン引数で渡されたとしても,問題なく結果を出力できるか.
4. 月ごとの最高気温,最低気温,平均気温
4-A. 問題説明
プログラムの実行時にコマンドライン引数として,天気データが1つ以上渡されます. ステップ3に加えて,月ごとの最高気温,最低気温,平均気温を求めてください. 求めた情報は,ステップ3よりも前に出力してください.
4-B. 実行例
$ java WeatherAnalyzer4
$ java WeatherAnalyzer4 2016-1st-quarter.csv
2016-3,22.300000,-0.700000,9.896774
2016-2,21.800000,-2.000000,6.434483
2016-1,16.000000,-4.100000,5.674194
曇,7
曇後一時雨、あられを伴う,1
曇時々みぞれ後晴、あられを伴う,1
# 途中省略
雪後雨一時晴、みぞれを伴う,1
晴一時雨、あられを伴う,1
全体,22.300000,-4.100000,7.354945
晴,22.300000,-4.100000,7.004938
雨,22.300000,-1.700000,8.200000
$ java WeatherAnalyzer4 2015-1st-half.csv 2015-2nd-half.csv
2015-8,39.100000,21.900000,28.335484
2015-11,25.300000,4.100000,14.450000
2015-7,36.500000,19.400000,27.206452
2015-10,28.000000,8.400000,18.112903
2015-9,31.600000,16.300000,22.883333
2015-4,28.800000,4.500000,15.550000
2015-3,24.500000,-1.200000,9.416129
2015-6,32.900000,14.400000,22.760000
2015-5,33.600000,10.700000,21.235484
2015-12,18.900000,0.600000,9.003226
2015-2,15.900000,-1.000000,5.625000
2015-1,13.000000,-1.700000,4.916129
曇時々雪後時々雨、みぞれを伴う,1
雨一時曇後晴,1
晴後一時雨、雷を伴う,2
# 途中省略
晴,40
晴時々薄曇,4
曇時々雨、みぞれを伴う,1
曇時々雨後晴,1
雨後時々曇,6
全体,39.100000,-1.700000,16.689863
晴,39.100000,-1.700000,16.022305
雨,38.100000,-0.500000,16.260622
4-C. ヒント
4-D. 評価ポイント
- ステップ2で作成した型を再利用できるか.
Map
を使えているか.- ステップ3で使った
Map
型の変数とは別のMap
型の変数を利用する. - キーを
"2016-7"
のような年-月
の文字列として表し,バリューをTemperature
型にすれば良い.
- ステップ3で使った
- 複数のファイルがコマンドライン引数で渡されたとしても,問題なく結果を出力できるか.
5. 天気概況ごとの最高気温,最低気温,平均気温
5-A. 問題説明
プログラムの実行時にコマンドライン引数として,天気データが1つ以上渡されます. ステップ2の出力は削除し,天気概況ごとの頻度,最高気温,最低気温,平均気温を求めてください. なお,天気概況は,天気概況(昼:06時〜18時)を利用してください. 天気概況(夜:18時〜翌日06時)は含めなくて良いです.
5-B. 実行例
$ java WeatherAnalyzer5 2016-1st-quarter.csv
2016-3,22.300000,-0.700000,9.896774
2016-2,21.800000,-2.000000,6.434483
2016-1,16.000000,-4.100000,5.674194
曇,7,21.700000,0.800000,8.314286
曇後一時雨、あられを伴う,1,8.200000,0.900000,4.000000
曇時々みぞれ後晴、あられを伴う,1,8.000000,0.300000,3.600000
# 途中省略
晴後時々曇,3,14.400000,0.700000,5.500000
雪後雨一時晴、みぞれを伴う,1,5.400000,-1.700000,1.600000
晴一時雨、あられを伴う,1,14.700000,6.000000,9.700000
全体,22.300000,-4.100000,7.354945
$ java WeatherAnalyzer5 2016-1st-quarter.csv 2015-1st-half.csv
2016-3,22.300000,-0.700000,9.896774
2015-4,28.800000,4.500000,15.550000
2016-2,21.800000,-2.000000,6.434483
2015-3,24.500000,-1.200000,9.416129
2015-6,32.900000,14.400000,22.760000
2015-5,33.600000,10.700000,21.235484
2016-1,16.000000,-4.100000,5.674194
2015-2,15.900000,-1.000000,5.625000
2015-1,13.000000,-1.700000,4.916129
曇時々雪後時々雨、みぞれを伴う,1,6.200000,1.300000,3.600000
雨一時曇後晴,1,11.300000,4.500000,7.300000
# 途中省略
曇時々雨後晴,1,8.600000,2.800000,5.000000
雨後時々曇,6,24.200000,5.700000,15.733333
全体,33.600000,-4.100000,11.318750
5-C. ヒント
ステップ3では頻度を求めるのにMap
のバリューとして,Integer
を利用したと思います.
今回は,頻度のほか,その時の気温の最大,最小,平均をも求める必要がありますので,
そのための型を作成しましょう.
フィールドとして,頻度のInteger
と
ステップ2で作成した気温型を持ちましょう.
以下のような型を利用すると良いでしょう.
public class WeatherFrequency{
Integer count = 0;
Temperature temp = new Temperature();
}
5-D. 評価のポイント
- 複数のファイルがコマンドライン引数で渡されたとしても,問題なく結果を出力できるか.
6. 週単位の平均気温のグラフ描画のためのデータ出力
6-A. 問題説明
プログラムの実行時にコマンドライン引数として,天気データが1つ以上渡されます. ステップ5に加えて,週単位の平均気温,最高気温,最低気温を グラフに描画するためのデータをファイルに出力してください.
以下の条件を満たすように出力してください.
- 1週間は月曜日に始まり,日曜日に終わります.
- 1週間に満たないデータは出力に含めないようにしてください.
- 出力先のファイルは,
weekly-temperatures.csv
とします. - 出力ファイルの形式は,次の通りとします.
1週間の最初の日付(年-月-日の形式)温,週の最高気温,週の最低気温,週の平均気温
- 例えば,2016年7月4日(月)の週の平均気温が28.5,最高気温が32.0,最低気温が24.6であれば,次のような出力となります.
2016-7-4,32.0,24.6,28.5
- グラフの描画は,Excel を利用するか,このページで確認してください.
6-B. 実行例
$ wc -l weekly-temperatures.csv # 実行前はファイルは存在しない.
wc: weekly-temperatures.csv: open: No such file or directory
$ java WeatherAnalyzer6 2015-1st-half.csv # 実行する.
2015-3,24.500000,-1.200000,9.416129 # 実行結果はステップ5と同一
2015-6,32.900000,14.400000,22.760000
2015-5,33.600000,10.700000,21.235484
2015-2,15.900000,-1.000000,5.625000
2015-1,13.000000,-1.700000,4.916129
曇時々雪後時々雨、みぞれを伴う,1,6.200000,1.300000,3.600000
雨一時曇後晴,1,11.300000,4.500000,7.300000
曇時々晴一時雪,1,5.800000,-1.700000,1.800000
# 途中省略
曇時々雨後晴,1,8.600000,2.800000,5.000000
雨後時々曇,6,24.200000,5.700000,15.733333
全体,33.600000,-1.700000,13.311602
$ wc -l weekly-temperatures.csv # ファイルが出力されている.
25 weekly-temperatures.csv
$ cat weekly-temperatures.csv
2015-1-5,11.100000,1.900000,5.157143
2015-1-12,9.900000,0.100000,4.985714
# 以降省略
$ java WeatherAnalyzer6 2016-1st-quarter.csv 2015-2nd-quarter.csv # 連続した2つのファイルを与えて実行する.
2016-6,33.500000,12.600000,23.210000
2016-3,22.300000,-0.700000,9.896774
2016-2,21.800000,-2.000000,6.434483
2016-5,33.100000,10.600000,21.006452
2016-4,28.600000,3.500000,16.090000
2016-1,16.000000,-4.100000,5.674194
曇後一時雨、あられを伴う,1,8.200000,0.900000,4.000000
# 以降省略
$ wc -l weekly-temperatures.csv
25 weekly-temperatures.csv
$ cat weekly-temperatures.csv
2016-1-4,16.000000,1.600000,7.742857
# 以降省略
2016-3-21,19.100000,1.700000,8.728571
2016-3-28,22.300000,4.000000,14.071429 # 連続したファイルの場合,この週が有効になる.
2016-4-4,24.700000,8.500000,15.871429
# 以降省略
2016-6-20,31.000000,18.500000,23.942857
- Excelで作成したグラフ
- グラフ描画ページで作成したグラフ
6-C. ヒント
- ファイルの出力が行えるか.
6-D. 評価ポイント
- 複数のファイルがコマンドライン引数で渡されたとしても,問題なく結果を出力できるか.
- 1ファイルのみの場合は切り捨てた情報が必要となる場合がある.
- 適切に可読性を保ったまま機能追加が行えるか.