問 8(提出プログラム名:ex0908.h)
※ex0908.c ではなく ex0908.h を提出なので注意!
このプログラム(ex0908.c)とヘッダ(ex0908.h)をそれぞれダウンロードし,
ヘッダの中の関数 accuracy_rate を完成させなさい.
(書き換えるのは ex0908.h のみであり,ex0908.c はコンパイルと実行に使うだけなので間違えないこと)
この問題では N 日分の天気予報と実際の天気データを読み込んで(N はマクロで定義されている),
天気予報のデータを配列 forecast へ,実際の天気データを配列 actual へそれぞれ格納している.
なお,登場する天気データはいずれも整数であり,
晴れ = 1,曇り = 0,雨または雪 = -1,
とする.
そして,関数 accuracy_rate を使って天気予報の的中率を求めている.
関数 accuracy_rate は,引数として与えられた 2 つの int 配列 forecast, actual について,
2 つの配列の間でデータが一致していた日数の割合をパーセンテージ(小数点以下を切り捨てた整数)で返すものとする(実行例を参照のこと).
それゆえ,この関数の中では double 型の変数を使ってはいけませんし,double 型へのキャストも使ってはいけません.
【注意】
この問題では ex0908.h を提出しなさい(ex0908.c ではない).
また,マクロの定義部分以外に 7 と直接書いてはいけません.
【ヒント】
天気予報と実際の天気の間で一致していた日数を cnt とした場合(※ cnt の値を求めるにあたって, 0 で初期化するのを忘れないこと!),100*cnt/N として計算すれば整数どうしの計算なので自動的に小数点以下は切り捨てられます.つまり,キャストは不要です.
※計算の順序を変えるとうまくいきませんので間違えないようにしてください.
例えば,cnt/N*100 とやってもうまくいきません(先に計算される cnt/N が 0 になってしまうため)
- 【プログラムの実行結果】(その1)※赤字は実行時にキーボードから入力する内容
7 日分の天気予報データを入力してください:1 1 0 -1 0 1 1 7 日分の実際の天気データを入力してください:1 0 -1 -1 1 0 1 的中率は 42% でした⏎※この例の場合は一致する割合は 3/7 = 0.42857… (≒42.857%) となり,小数点以下を切り捨てて 42% となっています.
- 【プログラムの実行結果】(その2)※赤字は実行時にキーボードから入力する内容
7 日分の天気予報データを入力してください:1 1 0 -1 0 1 1 7 日分の実際の天気データを入力してください:1 1 0 -1 0 1 1 的中率は 100% でした⏎
- 【プログラムの実行結果】(その3)※赤字は実行時にキーボードから入力する内容
7 日分の天気予報データを入力してください:1 1 0 -1 0 1 1 7 日分の実際の天気データを入力してください:0 0 1 0 1 0 0 的中率は 0% でした⏎
【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
■ 実行の画面出力が上の例と違う(きちんと確認していない).
(例1)的中していた日数を数え間違えていたり,変数を 0 に初期化するのを忘れていたりして
的中率が違っている.
(例2)的中率の計算を間違えていて常に 0% と表示されてしまっている.
■ マクロを使わずに 7 と直接書いてしまっているところがある.
■ インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).
← [ 問 7 (ex0907.h) ]
ミスが無いことを確認したら次の問題へ → [ 問9 (ex0909.c) ]