練習 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)); と書くのは無駄が多いです.
この場合は px が x のアドレスを表しており,同様に py が y のアドレスを表しています.
つまり,px と py はそれぞれ &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 上でインデントを自動で揃える作業をやっていない).
← [ 練習2 (p1002a.c) ]
ミスが無いことを確認したら次の問題へ → [ 練習4 (p1004a.c) ]