課題 [11] ポインタ①(1/9)

問 1(提出プログラム名:ex1101.c)
(これまでの復習:この問題は今回の「ポインタ」とは関係ありません)

(この問題は前回までに学んできた内容の復習問題であり,今回学んだ「ポインタ」とは関係ない.
解き方は各自の自由だが,
「double 型を使ってはいけない」というルールは必ず守ること.)


まず,このプログラム(ex1101.c)をダウンロードしなさい.
そして,それを編集し,次の動作をするプログラムとして仕上げなさい.

【目的の動作】
ある地方の町では過疎化(人口減少)が問題になっている.
そこで人口が毎年(前年の)2% ずつ減り続けると仮定して,
1 年後から n 年後までの人口をシミュレーションしたい.
ただし,毎年の予測人口は小数点以下を切り捨てた整数値とすること.
この問題では double 型の変数やキャストを使ってはいけません

(計算例)
今年の人口が 4803 人であった場合(実行例2を参照),1 年後は 2% 減って 4706 人と予測される(2% 減は 4706.94 となるが,小数点以下は切り捨てられる).
それゆえ,2 年後は 4706 人に対する 2% 減として 4611 人と予測される(こちらも 2% 減は 4611.88 人であるが小数点以下が切り捨てられる).

以上の例のように,小数点以下の切り捨ては毎年行っていかないと答えが徐々にずれていくので注意せよ.なお,この問題では n は 1 以上の整数であると仮定してプログラムを作って良い.

【ヒント】
この問題では double 型を使えませんので,2% 減を求めるには人口を x とした場合に
 x*98/100
と計算すればよいことになります(すべて int 型なので自動的に小数点以下は切り捨てになります).

ただし,x *= 98/100; と書いてしまうとうまくいかないので注意してください.
なぜなら,この省略形の代入式は x = x * (98/100); という解釈になり,98/100 が先に計算されてしまいます.98/100 0 になってしまうので答えが合わなくなります.

(参考)
計算の順序を変えて 98/100*x と書いてしまうとうまくいかないことも理解してください.
このように書いてしまうと 98/100 が先に計算されて(その値が 0 となり),その後に x をかけることになってしまうからです.このあたりの基礎を分かっていないと(怪しい人は第 2 回の内容を復習してください.例年,第2回で学んだはずの内容をよく理解していないまま先に進んで壁にぶつかる人が珍しくありません.)無駄にキャストを書いたり,無理やり double 型にして動かそうとしたりして泥沼にハマる人がたまにいるので念のために注意しておきます.

  • 【プログラムの実行結果】(その1)赤字は実行時にキーボードから入力する内容
今年の人口を入力してください:7500
何年後までシミュレーションしますか:9
1 年後 7350 人
2 年後 7203 人
3 年後 7058 人
4 年後 6916 人
5 年後 6777 人
6 年後 6641 人
7 年後 6508 人
8 年後 6377 人
9 年後 6249 人
  • 【プログラムの実行結果】(その2)赤字は実行時にキーボードから入力する内容
今年の人口を入力してください:4803
何年後までシミュレーションしますか:3
1 年後 4706 人
2 年後 4611 人
3 年後 4518 人

【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
■ 出力結果が上の実行例と違うきちんと確認していない).
 (例1)予測人口が 1 年ずつずれている.
  (例2)予測人口の値がわずかに違っている.
■ プログラムの中で double 型が登場している.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない)


ミスが無いことを確認したら次の問題へ → [ 問2 (ex1102.c) ]