アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のようなプログラムを、いきなり結果を出すのではなくて
ソートさせたい数字を入力できるようにさせたいのですが…。
できれば、ソート中の途中経過も表示できればいいかなと思います。
よろしくお願いします。
#include <stdio.h>

#define ARRAY_SIZE (8) /* 配列の要素数 */

int main(void)
{
int array[ARRAY_SIZE] = { 7, 14, 33, 10, 2, 19, 37, 20 };
int i, j, h, work;

/* 交換処理の間隔を決めるループ */
for(h=1; h<ARRAY_SIZE; h=h*3+1)
;

for( ;h>0; h/=3) /* hは交換処理の間隔を表す */
{
for(i=h; i<ARRAY_SIZE; ++i) /* iは今回の交換処理で対象となる最後尾の添字 */
{
j = i; /* jは交換対象となる要素の若い方の添字 */
while(j >= h && array[j-h] > array[j])
{
/* 大小関係が逆なら交換処理 */
work = array[j];
array[j] = array[j-h];
array[j-h] = work;
/* 交換処理の間隔分だけ添字を後退させる */
j -= h;
}
}
}

/* 結果表示 */
for(i=0; i<ARRAY_SIZE; ++i)
{
printf( "%2d ", array[i] );
}
printf( "\n" );

return 0;
}

A 回答 (1件)

変数名のつけ方や、コメント文のつけ方、


Webでの表示なのでインデントはしょうがないとしても記述の作法などなど
突っ込みだしたらきりが無いですが、
修正、調整、追加などすべき部分を挙げていきたいと思います。
なお指摘事項は、質問文に記載されているコーディングの
「#include <stdio.h>」を1行目として数え始め、
最後付近の「return 0;」が38行目となっている状態のままでの
行数で数え、追加する場面ではその追加開始位置の行数で答えていきます。

[入力できるようにする件]
10行目:「入力処理」の追加・・・のみ・・・でしょうか。
  入力する要素数が、現在の8個固定なら
  単純にscanfなりをfor文で回せばよいでしょう。
  その際の変数まで考慮するなら9行目にも追加が入りますね。
  入力される内容が数字であるか否かとか、
  数字であっても桁数はどこまでかなど
  入力時の「御約束事」次第で追加されるコーディング量は
  かなり変動します。
  要素数を可変にするところまで対応するとなると
  3行目、7行目、(10)、11、16、32、34行目あたりまで
  修正が必要となってくることでしょう。

[途中経過表示の件]
31行目から始まるfor文句を、
表示させたいタイミング(「交換毎」とか「交換間隔毎」とか)に合わせて
16行目のfor文や19行目のwhile文の上なり下なりに移植すれば良いでしょう。
単純に移植すると、いわゆる「拒絶反応」を起こすのが明らかですが、
それが分かるかどうかも期待通りの動きをさせるための課題になるでしょう。
    • good
    • 0
この回答へのお礼

大変参考になりました。プログラムもうまくいきました。
どうもありがとうございました!

お礼日時:2005/11/21 19:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!