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

練習 4(提出プログラム名:p1004a.c)

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

練習 2 では 1 の位を四捨五入する関数 round1 を作ったが,
この問題ではこれを 1 の位に限定せずn の位を四捨五入する関数 round_n に拡張しようとしている.
ただし,n は 1 以上の 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 のべき乗であればすべて対応できるプログラムに仕上げること.3 通りだけにしか対応できないプログラムは不正解と見なす.
ただし,n が int 型で表現可能な範囲を超えて大きな値になる場合は考えなくてよい.

【ヒント】
この問題でもやり方はいくつかありますが,例えば以下の方法があります:

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

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

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

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


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