練習 [11] ポインタ①(5/5)

練習 5(提出プログラム名:p1105.c)※必須ではない

この練習問題は必須ではない(提出しなくてもよい)が適切に解けていれば加点の対象とする.

まず,このプログラム(p1105.c)をダウンロードしなさい.
そして,p1105.c を編集して四捨五入を行う関数 round_n を完成させなさい.

練習 3 では 1 の位を四捨五入する関数 round1 を作ったが,
この問題ではこれを 1 の位に限定せずn の位を四捨五入する関数 round_n に拡張しようとしている.
ただし,n は 10 のべき乗(1, 10, 100, 1000, ….)であると仮定してプログラムを作ってよい.

なお,関数 round_n の宣言は次の通りとする:
    void round_n( int *px, int n )

例えば,x = 98765 であった場合,round_n(&x, 100); を実行すると
「100 の位が四捨五入」されて x = 99000 となる.

【注意】
この問題では main 関数の内容は一切書き換えないこと.
また,実行例では n = 1, 10, 100 の 3 通りしか登場していないが,n = 1000, 10000, …. 等,10 のべき乗であればすべて対応できるプログラムに仕上げること.ただし,int 型で表現可能な範囲を超えて大きな値になる場合は考えなくてよい.

【ヒント】
x = 98765, n = 100 の場合を例にヒントを出します.

まず,n = 100 であることから 100 の位より下の数字は見なくてもよいことになります.
そこでいったん元の xn で割ってしまいます(x /= n; あるいは x = x / n;
そうすると,小数点以下は切り捨てになるので 98765/100 = 987 が新たな x となります.

この場合,1 の位は元々の 100 の位であり,ここで練習 3 と同じように 1 の位を四捨五入してあげます.
つまり x = 987 は四捨五入によって x = 990 になります.
その後,再び xn 倍してあげれば元の桁数に戻ります(x *= n; あるいは x = x * n;).
つまり x = 99000 が得られるわけです.

  • 【プログラムの実行例】(その1)赤字は実行時にキーボードから入力する内容
整数を 1 つ入力してください:12345
どの位を四捨五入しますか:100
100 の位を四捨五入した値 = 12000
  • 【プログラムの実行例】(その2)赤字は実行時にキーボードから入力する内容
整数を 1 つ入力してください:950
どの位を四捨五入しますか:100
100 の位を四捨五入した値 = 1000
  • 【プログラムの実行例】(その3)赤字は実行時にキーボードから入力する内容
整数を 1 つ入力してください:999
どの位を四捨五入しますか:10
10 の位を四捨五入した値 = 1000

【過去にあったミス(減点となり,やり直しを命じられる)】
3 種類の実行例を確認せずに提出してしまっている.
 つまり,四捨五入された値が微妙に違っている
■ 対応できる n1, 10, 100 の 3 パターンに限定されてしまっている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


第 11 回(Cプログラミング;3 限目の方)の練習問題は以上の5問です.
p1101.c ~ p1105.c を Moodle から提出してください.※ただし,p1105.c は必須ではないです.
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.
なお,コンパイルエラーや無限ループになるプログラムを 1 個でも提出した場合は総合評価を 0 点とするので十分に注意すること.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.