最終課題
ステップ0
以下のステップを実行する前に,概要の 課題のデータから必要なデータをダウンロードしておいてください.
ステップ1
1-A. 問題説明
与えられたデータを読み,最高気温,最低気温,平均気温を求めてください.
プログラムの実行時にコマンドライン引数として,天気データが1つ渡されます.
データは,年,月,日,曜日,平均気温(℃),最高気温(℃),最低気温(℃),天気概況(昼:06時〜18時),天気概況(夜:18時〜翌日06時),降水量の合計(mm),降雨フラグ,日照時間(時間),平均雲量(10分比),平均風速(m/s)
の順に並んでおり,それぞれがコンマ(,)で区切られています.
その中の,平均気温,最高気温,最低気温の項目を読み,統計情報を求めてください.
なお,平均気温は,与えられたデータに含まれる平均気温の平均のこととします.
また,与えられたデータには,空白行やコメントは存在せず,正しいデータのみであることを前提として構いません(不正なデータは存在しない).
1-B. 実行例
$ cat 2020-1st-quarter.csv
2020,1,1,水,5.5,9.7,1.6,曇時々晴,晴,0,0,3.5,8.3,1.7
2020,1,2,木,6.1,12.3,1.2,晴,晴,0,1,7.8,4,1.4
# 途中省略
2020,3,30,月,10.2,14,6.5,曇時々雨,曇一時雨,0,0,0.6,,1.3
2020,3,31,火,14.1,17.6,10.3,曇時々雨,雨時々曇,0,0,1.1,,2.5
$ java WeatherAnalyzer1 2020-1st-quarter.csv
23.100000,-1.100000,8.371429
$ java WeatherAnalyzer1 2019-2nd-half.csv
38.600000,1.900000,20.529891
1-C. ヒント
1-D. 評価ポイント
- データを変更しても,例外なく実行結果を出力できるか.
ステップ2
2-A. 問題説明
プログラムの実行時にコマンドライン引数として,天気データが1つ以上渡されます. この時,晴の日,雨の日の最高気温,最低気温,平均気温を求めてください.
ここでは,
晴の日とは,昼,夜の天気概況に晴
という文字が,
雨の日とは,昼,夜の天気概況に雨
という文字が
含まれているものとします.
そのため,天気概況が晴一時雨
の場合は,晴れの日,雨の日の両方に含まれます
2-B. 実行例
$ java WeatherAnalyzer2 2020-1st-quarter.csv
全体,23.100000,-1.100000,8.371429
晴,23.100000,-1.100000,8.075000
雨,23.100000,-1.100000,8.889831
$ java WeatherAnalyzer2 2020-1st-quarter.csv 2020-3rd-quarter.csv
全体,38.800000,-1.100000,17.866120
晴,38.800000,-1.100000,17.295745
雨,37.000000,-1.100000,17.917500
2-C ヒント
- 最高気温,最低気温,平均気温を扱う型(気温型,
Temperature
)を作成しましょう. Temperature
型では,フィールドに 最高気温,最低気温,平均気温を持ちます.Temperature
型にupdate
のようなメソッドを用意して,最低気温,最高気温,平均気温を受け取りましょう.update
メソッド内で必要であれば,フィールドの最高気温,最低気温,平均気温に代入しましょう.
- 平均を求めるために,今まで確認した数を保持する変数(例えば,
count
)もフィールドに用意すると良いでしょう.- 平均を出力するとき,今まで加算を続けていた平均気温を
count
で割ると平均気温の平均が求められます. - 平均を返すメソッド
average
を用意すると良いでしょう.
- 平均を出力するとき,今まで加算を続けていた平均気温を
2-D 評価ポイント
- 独自の型を作成できるか.
- 独自の型にフィールドが宣言できるか.
- 独自の型にメソッドが宣言できるか.
- 独自の型を別のプログラムから利用できるか.
- 複数のファイルがコマンドライン引数で渡されたとしても,問題なく結果を出力できるか.
ステップ3
3-A. 問題説明
プログラムの実行時にコマンドライン引数として,天気データが1つ以上渡されます. ステップ2に加えて,与えられたデータの天気概況(昼:06時〜18時)の頻度を調べてください.
3-B. 実行例
$ java WeatherAnalyzer3 2020-1st-quarter.csv
晴時々曇一時雨,1
晴後時々雨、みぞれを伴う,1
# 途中省略
曇時々晴後雨、みぞれを伴う,1
雨後時々曇,1
全体,23.100000,-1.100000,8.371429
晴,23.100000,-1.100000,8.075000
雨,23.100000,-1.100000,8.889831
$ java WeatherAnalyzer3 2020-1st-quarter.csv 2020-4th-quarter.csv
曇時々晴一時雨,4
雨後一時曇,1
晴後時々曇一時雨,1
# 途中省略
雨後時々曇,1
曇時々雨後晴,1
全体,28.600000,-1.100000,10.650273
晴,28.600000,-1.100000,10.476687
雨,28.600000,-1.100000,10.786111
3-C. 参考資料
3-D. 評価ポイント
Map
を使えているか.Map
のループが書けるか.
- 複数のファイルがコマンドライン引数で渡されたとしても,問題なく結果を出力できるか.
ステップ4
4-A. 問題説明
プログラムの実行時にコマンドライン引数として,天気データが1つ以上渡されます. ステップ3に加えて,月ごとの最高気温,最低気温,平均気温を求めてください. 求めた情報は,ステップ3よりも前に出力してください.
4-B. 実行例
$ java WeatherAnalyzer4 2020-1st-quarter.csv
2020-3,23.100000,0.100000,10.612903
2020-1,16.800000,1.200000,7.535484
2020-2,21.300000,-1.100000,6.868966
晴時々曇一時雨,1
晴後時々雨、みぞれを伴う,1
# 途中省略
晴一時薄曇,1
曇時々晴後雨、みぞれを伴う,1
雨後時々曇,1
全体,23.100000,-1.100000,8.371429
晴,23.100000,-1.100000,8.075000
雨,23.100000,-1.100000,8.889831
$ java WeatherAnalyzer4 2019-1st-half.csv 2019-2nd-half.csv
2019-4,26.800000,2.200000,13.860000
2019-3,21.200000,0.900000,9.616129
2019-6,33.200000,16.900000,23.600000
2019-5,34.200000,6.500000,20.664516
2019-12,16.100000,1.900000,8.322581
2019-2,18.000000,-0.400000,6.903571
2019-1,12.100000,-0.900000,5.106452
2019-11,23.400000,3.800000,12.923333
2019-10,33.600000,11.100000,19.970968
2019-8,38.600000,21.200000,29.293548
2019-7,36.800000,20.400000,26.367742
2019-9,36.900000,15.900000,26.240000
晴後一時雨、雷を伴う,1
雨時々晴一時曇,1
曇後大雨、雷を伴う,1
# 途中省略
曇時々晴一時雪、みぞれを伴う,1
晴時々薄曇,4
雨後時々曇,2
全体,38.600000,-0.900000,16.963288
晴,38.600000,-0.900000,15.771587
雨,36.500000,-0.900000,16.820000
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 2020-1st-quarter.csv
2020-3,23.100000,0.100000,10.612903
2020-1,16.800000,1.200000,7.535484
2020-2,21.300000,-1.100000,6.868966
晴時々曇一時雨,1,11.100000,4.300000,7.500000
晴後時々雨、みぞれを伴う,1,10.100000,1.200000,4.500000
曇時々晴後雨,1,14.800000,7.600000,11.100000
# 途中省略
晴一時薄曇,1,12.600000,2.500000,6.800000
曇時々晴後雨、みぞれを伴う,1,7.800000,-1.100000,3.000000
雨後時々曇,1,11.200000,5.400000,8.400000
全体,23.100000,-1.100000,8.371429
$ java WeatherAnalyzer5 2020-1st-quarter.csv 2020-2nd-quarter.csv
2020-5,30.400000,11.000000,20.561290
2020-6,33.200000,15.700000,24.743333
2020-3,23.100000,0.100000,10.612903
2020-4,26.700000,4.300000,12.910000
2020-1,16.800000,1.200000,7.535484
2020-2,21.300000,-1.100000,6.868966
晴時々雨一時曇,1,16.400000,7.200000,11.400000
晴一時雨後曇,1,15.600000,5.300000,10.400000
曇時々晴一時雨、雷を伴う,1,30.700000,20.400000,24.100000
# 途中省略
雨後晴一時曇,1,11.300000,3.900000,7.000000
曇時々晴後雨、みぞれを伴う,1,7.800000,-1.100000,3.000000
雨後時々曇,2,21.500000,5.400000,14.500000
全体,33.200000,-1.100000,13.894505
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 2019-2nd-half.csv # 実行する.
2019-12,16.100000,1.900000,8.322581 # 実行結果はステップ5と同一
2019-11,23.400000,3.800000,12.923333
2019-10,33.600000,11.100000,19.970968
2019-8,38.600000,21.200000,29.293548
2020-3,23.100000,0.100000,10.612903
2019-7,36.800000,20.400000,26.367742
2020-1,16.800000,1.200000,7.535484
2019-9,36.900000,15.900000,26.240000
2020-2,21.300000,-1.100000,6.868966
晴後一時雨、雷を伴う,1,36.200000,26.600000,29.700000
雨時々晴一時曇,1,12.000000,3.800000,8.100000
# 途中省略
晴時々薄曇,2,23.200000,2.500000,13.150000
曇時々晴後雨、みぞれを伴う,1,7.800000,-1.100000,3.000000
雨後時々曇,2,19.700000,5.400000,13.050000
全体,38.600000,-1.100000,16.506545
$ wc -l weekly-temperatures.csv # ファイルが出力されている.
26 weekly-temperatures.csv
$ cat weekly-temperatures.csv
2019-7-1,30.700000,21.200000,25.000000
2019-7-8,31.600000,20.400000,24.257143
2019-7-15,33.800000,20.800000,26.314286
# 途中省略
2019-12-16,15.000000,2.300000,9.228571
2019-12-23,14.400000,2.200000,7.885714
$ java WeatherAnalyzer6 2019-2nd-half.csv 2020-1st-quarter.csv # 連続した2つのファイルを与えて実行する.
2019-12,16.100000,1.900000,8.322581
2019-11,23.400000,3.800000,12.923333
2019-10,33.600000,11.100000,19.970968
2019-8,38.600000,21.200000,29.293548
2020-3,23.100000,0.100000,10.612903
2019-7,36.800000,20.400000,26.367742
2020-1,16.800000,1.200000,7.535484
2019-9,36.900000,15.900000,26.240000
2020-2,21.300000,-1.100000,6.868966
晴後一時雨、雷を伴う,1,36.200000,26.600000,29.700000
雨時々晴一時曇,1,12.000000,3.800000,8.100000
曇後大雨、雷を伴う,1,33.600000,24.900000,28.400000
# 以降省略
$ wc -l weekly-temperatures.csv
39 weekly-temperatures.csv
$ cat weekly-temperatures.csv
2019-7-1,30.700000,21.200000,25.000000
2019-7-8,31.600000,20.400000,24.257143
2019-7-15,33.800000,20.800000,26.314286
2019-7-22,35.600000,24.100000,27.857143
2019-7-29,38.200000,25.800000,31.385714
# 途中省略
2019-12-23,14.400000,2.200000,7.885714
2019-12-30,12.300000,1.200000,7.028571 # 2019-2nd-half.csv の指定だけではこの週は7日間存在しないため,現れない.連続した2つのファイルを与えることで出力される.
2020-1-6,16.800000,1.300000,7.628571
# 途中省略
2020-3-16,23.100000,0.100000,11.171429
2020-3-23,23.100000,2.800000,11.428571
- Excelで作成したグラフ
- グラフ描画ページで作成したグラフ
6-C. ヒント
- ファイルの出力が行えるか.
6-D. 評価ポイント
- 複数のファイルがコマンドライン引数で渡されたとしても,問題なく結果を出力できるか.
- 1ファイルのみの場合は切り捨てた情報が必要となる場合がある.
- 適切に可読性を保ったまま機能追加が行えるか.