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

練習 3(提出プログラム名:p1003a.c)

まず,このプログラム(p1003a.c)をダウンロードしなさい.
p1003a.c では,実数を 3 つ(ただし,いずれも異なる値とする)を読み込んで
double 型変数 x, y, z に格納した後,
関数 sort を使って 3 つの変数の内容を大きい順(降順)に書き換え
最後に書き換え後の x, y, z を表示させている.

関数 sort を以下の指示に従って完成させなさい
ただし,sort の宣言は void sort( double *px, double *py, double *pz ) で始めるものとし,これを変更してはいけません
あわせて,main 関数の内容と別の関数 swap の内容を変更してもいけません

【関数 sort で実現すべき内容】
この問題で実現しようとしている x, y, z の値の書き換え(入れ替え)を
もしも main 関数内で実現しようとすれば次のようになる
else if ではなく3 つの if 文を独立して上から順番に実行させる点に注意)
 if ( x < y ){
  swap(&x, &y);  ← x < y ならば x と y を入れ替え
 }
 if ( x < z ){
  swap(&x, &z);  ← 上の処理が終わった後,さらに x < z ならば x と z を入れ替え
 }
 if ( y < z ){
  swap(&y, &z);  ← 上の処理が終わった後,さらに y < z ならば y と z を入れ替え
 }

上の処理を関数 sort の中で行うようにしなさい
ただし,sort の中では必ず関数 swap を呼出すこととする.

【ヒント】
まず,変数 x と変数 y の値の入れ替えは,main 関数の中であれば swap(&x, &y); で実現できます.
しかし,x, y という変数はあくまでも main 関数の中で宣言されている変数なので,関数 sort の中ではこのまま書いても動きません
そこでポインタを使うわけですが,swap(&(*px), &(*py)); と書くのは無駄が多いです.
この場合は pxx のアドレスを表しており,同様に pyy のアドレスを表しています.
つまり,pxpy はそれぞれ &x&y と同じです.したがって,swap(&x, &y); は関数 sort の中では swap(px, py); とだけ書けばよいことになるわけです.

  • 【プログラムの実行例】(その1)赤字は実行時にキーボードから入力する内容
実数を 3 つ入力してください:3.14 2.71 8.8

関数 sort 実行前
(x, y, z) = (  3.14,   2.71,   8.80)

関数 sort 実行後
(x, y, z) = (  8.80,   3.14,   2.71)
  • 【プログラムの実行例】(その2)赤字は実行時にキーボードから入力する内容
実数を 3 つ入力してください:-1 -2.9 3.5

関数 sort 実行前
(x, y, z) = ( -1.00,  -2.90,   3.50)

関数 sort 実行後
(x, y, z) = (  3.50,  -1.00,  -2.90)
  • 【プログラムの実行例】(その3)赤字は実行時にキーボードから入力する内容
実数を 3 つ入力してください:-1.11 -1.23 0.95

関数 sort 実行前
(x, y, z) = ( -1.11,  -1.23,   0.95)

関数 sort 実行後
(x, y, z) = (  0.95,  -1.11,  -1.23)

【過去にあったミス(減点となり,やり直しを命じられる)】
3 種類の実行例を確認せずに提出してしまっている.
 例えば,数値が大きい順(降順)になっていない
sort引数や戻り値の型を変更してしまっている.
main 関数や swap を書き換えてしまっている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


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