配列変数の中に適当に格納されている数値をより高速に最も大きな数値から順に配列変数に入れ替えるプログラムを実行してプログラムの動作する過程を鑑賞してみよう。💖💖💖


ソーラー「



より高速に


配列宣言

int hairetu[5];

により

生成される


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


hairetu[0]に格納されている数値は0

hairetu[1]に格納されている数値は1

hairetu[2]に格納されている数値は2

hairetu[3]に格納されている数値は3

hairetu[4]に格納されている数値は4


と数値が代入されている状態から


hairetu[0]に格納されている数値は4

hairetu[1]に格納されている数値は3

hairetu[2]に格納されている数値は2

hairetu[3]に格納されている数値は1

hairetu[4]に格納されている数値は0


と数値が代入されている状態に


入れ替えることができる


ニュータイプのプログラムは次のようになっていました



#include <stdio.h>


int main(void) {


int hairetu[5];


hairetu[0] = 0;

hairetu[1] = 1;

hairetu[2] = 2;

hairetu[3] = 3;

hairetu[4] = 4;


int i;


for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");

//🌞改行しています



int k;


for (k = 0; k< 4; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}

//🌞👆1回目です


//🌞👇2回目です


//👇k<4からk< 3に変更しました


for (k = 0; k< 3; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}




for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}

//🌞👆2回目です


//🌞👇3回目です


//👇k<4からk<2に変更しました



for (k = 0; k<2; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}


for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}


//🌞👆3回目です


//🌞👇4回目です


//👇k<4からk< 1に変更しました



for (k = 0; k< 1; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}


for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}


//🌞👆4回目です


return 0;

}


ビルド実行結果


01234

10234

12034

12304

12340

21340

23140

23410

32410

34210

43210👈01234から43210に数値を入れ替えることに成功しました



ソーラー「このプログラムでは


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


hairetu[0]に格納されている数値は0💖

hairetu[1]に格納されている数値は1💖

hairetu[2]に格納されている数値は2💖

hairetu[3]に格納されている数値は3💖

hairetu[4]に格納されている数値は4💖


と数値が代入されている状態から


hairetu[0]に格納されている数値は4

hairetu[1]に格納されている数値は3

hairetu[2]に格納されている数値は2

hairetu[3]に格納されている数値は1

hairetu[4]に格納されている数値は0


と数値が代入されている状態に


入れ替えることができました。



皆さん


お気づきですが



もちろん


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


         どのように数値0,1,2,3,4が格納されていても💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖


hairetu[0]に格納されている数値は4

hairetu[1]に格納されている数値は3

hairetu[2]に格納されている数値は2

hairetu[3]に格納されている数値は1

hairetu[4]に格納されている数値は0


と数値が代入されている状態に


入れ替えることができます」



アレサ「なぜなのですか ソーラーさん」


ソーラー「



            ここで質問です



なぜ


このプログラムを用いれば

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


どのように数値0、1,2,3,4が格納されていても


たとえば


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

0

3

1

2

4



4

1

0

3

2

などのように


数値が格納されていたとしても



hairetu[0]に格納されている数値は4

hairetu[1]に格納されている数値は3

hairetu[2]に格納されている数値は2

hairetu[3]に格納されている数値は1

hairetu[4]に格納されている数値は0


と数値が代入されている状態に


入れ替えることができるのでしょうか?」



solarplexuss「たぶん


このプログラムを用いれば


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


どのように数値0、1,2,3,4が格納されていても


hairetu[0]に格納されている数値は4

hairetu[1]に格納されている数値は3

hairetu[2]に格納されている数値は2

hairetu[3]に格納されている数値は1

hairetu[4]に格納されている数値は0


と数値が代入されている状態に


なるとは


思うけど・・・


なんでかといわれても・・・・・・


その理由を説明できませ~~~~ん」




ソーラー「

         😊ヒントは😊



・・・・・・



配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

0

1

2

3

4

数値が格納されていて


1回目の


for文


int k;


for (k = 0; k< 4; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



実行されたときまでのビルド実行結果は

01234

10234

12034

12304

12340

となっていましたね。


01234



配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

0

1

2

3

4

数値が格納されている状態ですね。



この


ビルド実行結果を見てもお分かりになられますように


1回目のfor文が実行されると


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

01234


と数値が格納されている状態から

順次

10234

12034

12304

12340



配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


数値が格納されている状態に変化していきます


ここでの注目ポイントは0の位置です


配列変数


hairetu[0]とhairetu[1]に格納されている数値同士の交換

hairetu[1]とhairetu[2]に格納されている数値同士の交換

hairetu[2]とhairetu[3]に格納されている数値同士の交換

hairetu[3]とhairetu[4]に格納されている数値同士の交換


がおこなわれるごとに


01234

10234

12034

12304

12340


0の位置が移動しています


この1回目のfof文


int k;


for (k = 0; k< 4; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}



が実行されると


最終的には0は


1番右端に移動することになります。




           ところで面白いことに




この1回目のfor文が実行されると


どのように


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

数値0、1、2、3、4が格納されていたとしても・・・


そうだね(´▽`*)


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に数値が格納されてる状態の


すべてのパターンを列挙すると



以下の

120通りのパターンがあります


01234

01243

01324

01342

01423

01432

02134

02143

02314

02341

02413

02431

03124

03142

03214

03241

03412

03421

04123

04132

04213

04231

04312

04321

10234

10243

10324

10342

10423

10432

12034

12043

12304

12340

12403

12430

13024

13042

13204

13240

13402

13420

14023

14032

14203

14230

14302

14320

20134

20143

20314

20341

20413

20431

21034

21043

21304

21340

21403

21430

23014

23041

23104

23140

23401

23410

24013

24031

24103

24130

24301

24310

30124

30142

30214

30241

30412

30421

31024

31042

31204

31240

31402

31420

32014

32041

32104

32140

32401

32410

34012

34021

34102

34120

34201

34210

40123

40132

40213

40231

40312

40321

41023

41032

41203

41230

41302

41320

42013

42031

42103

42130

42301

42310

43012

43021

43102

43120

43201

43210


このうちのどのパターンで


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に数値が格納されていたとしても


1回目のfor文を実行すると


配列変数

hairetu[4]には

0が格納されることになります


ビルド実行結果は


たとえば


12340

34210

のように


0が


右端に到達することになります。


わかりにくい?かな?


もうすこし具体的に言うと


01234

03412

34021

34201

10234


のように


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

数値


0

1

2

3

4

が適当に格納されていたとしても


この1回目のfor文が実行されると


12340

34120

43210

43210

12340

のように


必ず


0が


1番右端に到達することになります。


そのことを確認してみるとしようよ」


solarplexuss「え~なんで?? そうなるのかな?」


ソーラー「


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


数値

0

1

2

3

4

と数値が格納されている状態を



01234



とします


03412では


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


数値

0

3

4

1

2

と数値が格納されている状態となりますね


さて


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

01234

03412

34021

34201

10234


数値が適当に格納されていたとしても


0は必ず


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


うちのどれかに


格納されることになりますね。」


アレサ「0が


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


うちのどれかにですか・・・?」


solarplexuss「それって、普通じゃない?」


ソーラー「


たとえば


パターン1


01234

03412

01324

のように



配列変数

hairetu[0]に0が格納されているとします


すると


1,2,3,4のいかなる数値が


hairetu[1]に格納されていても


hairetu[0] <= hairetu[1]


が成立し


配列変数 hairetu[0]に格納されている数値

配列変数 hairetu[1]に格納されている数値が交換され


配列変数 hairetu[1]には


数値0が格納されることになります。


hairetu[1]に0が格納されているとなると


1,2,3,4のいかなる数値が


hairetu[2]に格納されていても


hairetu[1] <= hairetu[2]


が成立し


配列変数[1]と配列変数 hairetu[2]に格納されている数値が交換され


配列変数 hairetu[2]には


数値0が格納されることになります。


hairetu[2]に0が格納されているとなると


1,2,3,4のいかなる数値が


hairetu[3]に格納されていても


hairetu[2] <= hairetu[3]


が成立し


配列変数[2]と配列変数 hairetu[3]に格納されている数値が交換され


配列変数 hairetu[3]には


数値0が格納されることになります。


hairetu[3]に0が格納されているとなると


1,2,3,4のいかなる数値が


hairetu[3]に格納されていても


hairetu[3] <= hairetu[4]


が成立し


配列変数[3]と配列変数 hairetu[4]に格納されている数値が交換され


配列変数 hairetu[4]には


数値0が格納されることになります。


最終的に配列変数 hairetu[4]に0が格納されていますね


配列変数 hairetu[4]に0が格納されていると


ビルド実行結果で


0が1番右端に表示されることになります


kの値はk<4なので


for文の実行はここで終了です。


パターン2


10234

20341

30124

のように


配列変数

hairetu[1]に0が格納されているとします



1,2,3,4のいかなる数値が


hairetu[0]に格納されていても


hairetu[0] <= hairetu[1]


は成立しないので


配列変数hairetu[0]に格納されている数値と


配列変数 hairetu[1]に格納されている数値0は


交換されないので


配列変数 hairetu[1]に格納されている数値は0のままです


hairetu[1]に0が格納されているとなると


1,2,3,4のいかなる数値が


hairetu[2]に格納されていても


hairetu[1] <= hairetu[2]


が成立し


配列変数hairetu[1]に格納されている数値0と

配列変数 hairetu[2]に格納されている数値が交換され


配列変数 hairetu[2]には


数値0が格納されることになります。


配列変数[2]に0が格納されているとなると


1,2,3,4のいかなる数値が


配列変数hairetu[3]に格納されていても


hairetu[2] <= hairetu[3]


が成立し


配列変数hairetu[2]に格納されている数値0

配列変数 hairetu[3]に格納されている数値が交換され


配列変数 hairetu[3]には


数値0が格納されることになります。


配列変数[3]に0が格納されているとなると


1,2,3,4のいかなる数値が


配列変数[4]に格納されていても


hairetu[3] <= hairetu[4]


が成立し


配列変数hairetu[3]に格納されている数値0

配列変数 hairetu[4]に格納されている数値が交換され


配列変数 hairetu[4]には


数値0が格納されることになります。


最終的に配列変数 hairetu[4]に0が格納されていますね


配列変数 hairetu[4]に0が格納されていると


ビルド実行結果で


0が1番右端に表示されることになります


kの値はk<4なので


for文の実行はここで終了です。


パターン3



13024

21043

31024


のように


配列変数

hairetu[2]に0が格納されているとします


ですので


for文の実行により


配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値同士の比較の後


配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値同士の

交換あるいは非交換


が実行されて


1,2,3,4のいかなる数値が


hairetu[1]に格納されていても


hairetu[1] <= hairetu[2]


は成立しないので


配列変数[1]に格納されている数値と


配列変数 hairetu[2]に格納されている数値0は


交換されないので


配列変数 hairetu[2]に格納されている数値は0のままです


hairetu[2]に0が格納されているとなると


1,2,3,4のいかなる数値が


hairetu[3]に格納されていても


hairetu[2] <= hairetu[3]


が成立し


配列変数hairetu[2]に格納されている数値0と

配列変数 hairetu[3]に格納されている数値が交換され


配列変数 hairetu[3]には


数値0が格納されることになります。


配列変数[3]に0が格納されているとなると


1,2,3,4のいかなる数値が


配列変数[4]に格納されていても


hairetu[3] <= hairetu[4]


が成立し


配列変数hairetu[3]に格納されている数値0

配列変数 hairetu[4]に格納されている数値が交換され


配列変数 hairetu[4]には


数値0が格納されることになります。




最終的に配列変数 hairetu[4]に0が格納されていますね


配列変数 hairetu[4]に0が格納されていると


ビルド実行結果で


0が1番右端に表示されることになります


kの値はk<4なので


for文の実行はここで終了です。


パターン4



41302

32104

12403


のように


配列変数

hairetu[3]に0が格納されているとします


for文の実行により


配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値同士の比較の後

配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値同士の

交換あるいは非交換


配列変数hairetu[1]と配列変数hairetu[2]に格納されている数値同士の比較の後

配列変数hairetu[1]と配列変数hairetu[2]に格納されている数値同士の

交換あるいは非交換


が実行されて


1,2,3,4のいかなる数値が


配列変数[2]に格納されていても


hairetu[2] <= hairetu[3]


は成立しないので


配列変数 hairetu[2]に格納されている数値と


配列変数 hairetu[3]に格納されている数値0は


交換されないので


配列変数 hairetu[3]に格納されている数値は0のままです


配列変数[3]に0が格納されているとなると


1,2,3,4のいかなる数値が


配列変数[3]に格納されていても


hairetu[3] <= hairetu[4]


が成立し


配列変数[3]に格納されている数値0

配列変数 hairetu[4]に格納されている数値が交換され


配列変数 hairetu[4]には


数値0が格納されることになります。


最終的に配列変数 hairetu[4]に0が格納されていますね


配列変数 hairetu[4]に0が格納されていると


ビルド実行結果で


0が1番右端に表示されることになります


kの値はk<4なので


for文の実行はここで終了です。


パターン5


24130

43210

31240


のように


配列変数

hairetu[4]に0が格納されているとします


for文の実行により


配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値同士の比較の後

配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値同士の

交換あるいは非交換


配列変数hairetu[1]と配列変数hairetu[2]に格納されている数値同士の比較の後

配列変数hairetu[1]と配列変数hairetu[2]に格納されている数値同士の

交換あるいは非交換


配列変数hairetu[2]と配列変数hairetu[3]に格納されている数値同士の比較の後

配列変数hairetu[2]と配列変数hairetu[3]に格納されている数値同士の

交換あるいは非交換


が実行されて



1,2,3,4のいかなる数値が


hairetu[3]に格納されていても


hairetu[3] <= hairetu[4]


は成立しないので


配列変数hairetu[3]に格納されている数値と


配列変数 hairetu[4]に格納されている数値0は


交換されないので


配列変数 hairetu[4]に格納されている数値は0のままです


最終的に配列変数 hairetu[4]に0が格納されたままとなります


配列変数 hairetu[4]に0が格納されていると


ビルド実行結果で


0が1番右端に表示されることになります


kの値はk<4なので


for文の実行はここで終了です。



ソーラー「1回目のfor文


int k;


for (k = 0; k< 4🌞; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}


が実行された


この段階では


           💖必ず💖


配列変数 hairetu[4]に格納されている数値は0になっています。


どのように

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に数値が格納されていたとしても



配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

数値が格納されている状態は


配列変数 hairetu[4]に0が格納されている


12340

12430

13240

13420

14230

14320

21340

21430

23140

23410

24130

24310

31230

31420

32140

32410

34120

34210

41230

41320

42130

42310

43120

43210



の24パターンのうちのどれか1つの状態になっています。



さて


この状態では


配列変数 hairetu[4]に格納されている数値は0ですが


残った

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]


のどれかには


必ず


1


格納されることになりますね。


この状態で


2回目の

for文

for (k = 0; k< 3💖; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}


を実行してみたいと思います。


まず


たとえば


パターン1


12340

12430

13240

13420

14230

14320

のように



配列変数

hairetu[0]に1が格納されているとします


すると


2,3,4のいかなる数値が


hairetu[1]に格納されていても


hairetu[0] <= hairetu[1]


が成立し


配列変数hairetu[0]に格納されている数値1

配列変数 hairetu[1]に格納されている数値が交換され


配列変数 hairetu[1]には


数値1が格納されることになります。


hairetu[1]に1が格納されているとなると


2,3,4のいかなる数値が


配列変数[2]に格納されていても


hairetu[1] <= hairetu[2]


が成立し


配列変数[1]に格納されている数値1

配列変数 hairetu[2]に格納されている数値が交換され


配列変数 hairetu[2]には


数値1が格納されることになります。


hairetu[2]に1が格納されているとなると


2,3,4のいかなる数値が


hairetu[3]に格納されていても


hairetu[2] <= hairetu[3]


が成立し


配列変数hairetu[2]と配列変数 hairetu[3]に格納されている数値が交換され


配列変数 hairetu[3]には


数値1が格納されることになります。


kの値はk<3なので


for文の実行はここで終了です。


配列変数 hairetu[3]には


数値1が格納されたままとなります。


最終的に


配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

が格納されていますね


配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

が格納されていると


ビルド実行結果で



0が1番右端に表示されることになります

1が0の左隣に表示されることになります



パターン2


21340

21430

31240

31420

41230

41320

のように


配列変数

hairetu[1]に1が格納されているとします

配列変数

hairetu[4]に0が格納されているとします



2,3,4のいかなる数値が


hairetu[0]に格納されていても


hairetu[0] <= hairetu[1]


は成立しないので


配列変数hairetu[0]に格納されている数値と


配列変数 hairetu[1]に格納されている数値1は


交換されないので


配列変数 hairetu[1]に格納されている数値は1のままです


hairetu[1]に1が格納されているとなると


2,3,4のいかなる数値が


hairetu[2]に格納されていても


hairetu[1] <= hairetu[2]


が成立し


配列変数hairetu[1]に格納されている数値1と

配列変数 hairetu[2]に格納されている数値が交換され


配列変数 hairetu[2]には


数値1が格納されることになります。


配列変数hairetu[2]に1が格納されているとなると


2,3,4のいかなる数値が


配列変数[3]に格納されていても


hairetu[2] <= hairetu[3]


が成立し


配列変数hairetu[2]に格納されている数値1

配列変数 hairetu[3]に格納されている数値が交換され


配列変数 hairetu[3]には


数値1が格納されることになります。


kの値はk<3なので


for文の実行はここで終了です。


配列変数hairetu[3]に格納されている数値は1のままとなります


最終的に

配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

格納されていますね


となると


ビルド実行結果で


0が1番右端に表示されることになります

1が0の左隣に表示されることになります


パターン3


23140

24130

32140

34120

42130

43120

のように


配列変数

hairetu[2]に1が格納されているとします


for文の実行により


配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値同士の比較の後

配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値同士の

交換あるいは非交換


が実行されて



2,3,4のいかなる数値が


配列変数hairetu[1]に格納されていても


hairetu[1] <= hairetu[2]


は成立しないので


配列変数hairetu[1]に格納されている数値と


配列変数 hairetu[2]に格納されている数値1は


交換されないので


配列変数 hairetu[2]に格納されている数値は1のままです


hairetu[2]に1が格納されているとなると


2,3,4のいかなる数値が


hairetu[3]に格納されていても


hairetu[2] <= hairetu[3]


が成立し


配列変数hairetu[2]に格納されている数値1と

配列変数 hairetu[3]に格納されている数値が交換され


配列変数 hairetu[3]には


数値1が格納されることになります。


kの値はk<3なので


for文の実行はここで終了です。



配列変数hairetu[3]に格納されている数値は1のままとなります


最終的に

配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

格納されていますね


となると


ビルド実行結果で


0が1番右端に表示されることになります

1が0の左隣に表示されることになります



パターン4



23410

24310

32410

34210

42310

43210


のように


配列変数

hairetu[3]に1

配列変数

hairetu[4]に0


が格納されているとします


for文の実行により


配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値同士の比較の後

配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値同士の比較の

交換あるいは非交換


配列変数hairetu[1]と配列変数hairetu[2]に格納されている数値同士の比較の後

配列変数hairetu[1]と配列変数hairetu[2]に格納されている数値同士の

交換あるいは非交換


が実行されて


2,3,4のいかなる数値が


配列変数hairetu[2]に格納されていても


hairetu[2] <= hairetu[3]


は成立しないので


配列変数hairetu[2]に格納されている数値と


配列変数 hairetu[3]に格納されている数値1は


交換されないので


配列変数 hairetu[3]に格納されている数値は1のままです



kの値はk<3なので


for文の実行はここで終了です


最終的に


配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

格納されていますね


となると


ビルド実行結果で


0が1番右端に表示されることになります

1が0の左隣に表示されることになります


ソーラー「1回目のfor文


int k;


for (k = 0; k< 4🌞; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}


2回目のfor文


int k;


for (k = 0; k< 3💖; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}




が実行された


この段階では


もともと


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


にどのような数値が代入されていたとしても



           💖必ず💖


配列変数 hairetu[3]に格納されている数値は1

配列変数 hairetu[4]に格納されている数値は0


になっています。


このときの


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

数値が格納されている状態は


配列変数 hairetu[3]に1が格納されている

配列変数 hairetu[4]に0が格納されている


23410

24310

32410

34210

42310

43210


6つのパターンのうちのどれかとなっています。



さて


この状態では


配列変数 hairetu[3]に格納されている数値は1

配列変数 hairetu[4]に格納されている数値は0

ですが


残った

配列変数

hairetu[0]

hairetu[1]

hairetu[2]


のどれかには


必ず


2


格納されることになりますね。」


solarplexuss「OH,YES!」



ソーラー「


この状態で


3回目のfor文


int k;


for (k = 0; k< 2🍋; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}


を実行してみたいと思います。



そうですね。


まずは


たとえば


パターン1


23410

24310

のように


配列変数

hairetu[0]に2

配列変数

hairetu[3]に1

配列変数

hairetu[4]に0


が格納されているとします



この状態で


3回目のfor文


int k;


for (k = 0; k< 2🍋; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}

を実行すると


3,4のいかなる数値が


hairetu[1]に格納されていても


hairetu[0] <= hairetu[1]


が成立し


配列変数hairetu[0]に格納されている数値2

配列変数 hairetu[1]に格納されている数値が交換され


配列変数 hairetu[1]には


数値2が格納されることになります。


hairetu[1]に2が格納されているとなると


3,4のいかなる数値が


hairetu[2]に格納されていても


hairetu[1] <= hairetu[2]


が成立し


配列変数hairetu[1]に格納されている数値2

配列変数 hairetu[2]に格納されている数値が交換され


配列変数 hairetu[2]には


数値2が格納されることになります


kの値はk<2なので


for文の実行はここまでですね。



配列変数 hairetu[2]には


数値2が格納されたままとなります。


最終的に

配列変数 hairetu[2]に2

配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

が格納されていますね


配列変数 hairetu[2]に2

配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

が格納されていると


ビルド実行結果で


0が1番右端に表示されることになります

1が0の左隣に表示されることになります

2が1の左隣に表示されることになります


パターン2


32410

42310


のように


配列変数

hairetu[1]に2

配列変数

hairetu[3]に1

配列変数

hairetu[4]に0


が格納されているとします



3,4のいかなる数値が


配列変数[0]に格納されていたとしても


hairetu[0] <= hairetu[1]


は成立しないので


配列変数hairetu[0]に格納されている数値と


配列変数 hairetu[1]に格納されている数値2は


交換されないので


配列変数 hairetu[1]に格納されている数値は2のままです


hairetu[1]に2が格納されているとなると


3,4のいかなる数値が


hairetu[2]に格納されていても


hairetu[1] <= hairetu[2]


が成立し


配列変数hairetu[1]に格納されている数値2と

配列変数 hairetu[2]に格納されている数値が交換され


配列変数 hairetu[2]には


数値2が格納されることになります。


kの値はk<2なので


for文の実行はここまでですね。



配列変数[2]に格納されている数値は2のままとなります


最終的に


配列変数 hairetu[2]に2

配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

格納されていますね


となると


ビルド実行結果で


0が1番右端に表示されることになります

1が0の左隣に表示されることになります

2が1の左隣に表示されることになります



パターン3


34210

43210

のように


配列変数

hairetu[2]に2が格納されているとします


for文の実行により


配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値同士の比較の後

交換あるいは非交換


が実行されて


3,4のいかなる数値が


配列変数[1]に格納されていても


hairetu[1] <= hairetu[2]


は成立しないので


配列変数hairetu[1]に格納されている数値と


配列変数hairetu[2]に格納されている数値2は


交換されないので


配列変数 hairetu[2]に格納されている数値は2のままです


kの値はk<2なので


for文の実行はここで終了です。



最終的に

配列変数 hairetu[2]に2

配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

格納されていますね


となると


ビルド実行結果で


0が1番右端に表示されることになります

1が0の左隣に表示されることになります

2が1の左隣に表示されることになります



ソーラー「1回目のfor文


int k;


for (k = 0; k< 4🌞; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}


2回目のfor文


int k;


for (k = 0; k< 3💖; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}


3回目のfor文


int k;


for (k = 0; k< 2🍋; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}



が実行された


この段階では



           💖必ず💖


配列変数 hairetu[2]に格納されている数値は2

配列変数 hairetu[3]に格納されている数値は1

配列変数 hairetu[4]に格納されている数値は0


になっています。


1,2,3回のfor文が実行されたこの段階では


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

数値が格納されている状態は


配列変数 hairetu[2]に2が格納されている

配列変数 hairetu[3]に1が格納されている

配列変数 hairetu[4]に0が格納されている


34210

43210


2つのパターンのうちのどれかとなっています。」



アレサ「このビルド実行結果は驚きです。


3回for文を実行すると


どのように


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

数値が格納されていたとしても



配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

格納されている数値は


3

4

2

1

0

4

3

2

1

0


のいずれかになるのですから」



solarplexuss


「わあ ほんとだ


これはすごいな」


ソーラー「ほんと 驚きだね。


そして4回目のfor文の実行だね。


まずは


34210


の状態で


4回目のfor文が実行されると

👇

for (k = 0; k< 1🌻; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}


for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}


hairetu[0]に格納されている数値が3

hairetu[1]に格納されている数値が4


なので


hairetu[0] <= hairetu[1]


が成立し


配列変数hairetu[0]に格納されている数値3

配列変数 hairetu[1]に格納されている数値4


が交換され


配列変数 hairetu[0]には


数値4


配列変数 hairetu[1]には


数値3


が格納されることになります。



kの値はk<1なので


for文の実行はここまでですね。


最終的に

配列変数 hairetu[0]に4

配列変数 hairetu[1]に3

配列変数 hairetu[2]に2

配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

が格納されていますね


配列変数 hairetu[0]に4

配列変数 hairetu[1]に3

配列変数 hairetu[2]に2

配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

が格納されていると


ビルド実行結果で


0が1番右端に表示されることになります

1が0の左隣に表示されることになります

2が1の左隣に表示されることになります

3が2の左隣に表示されることになります

4が3の左隣に表示されることになります


つまり


43210


が表示されることになります


お次は パターン2😊です


43210

のように


配列変数

hairetu[1]に4

配列変数

hairetu[3]に3

配列変数

hairetu[4]に2

配列変数

hairetu[3]に1

配列変数

hairetu[4]に0


が格納されているとします


この状態で


4回目のfor文が実行されると

👇

for (k = 0; k< 1🌻; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}


for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}


hairetu[0]に格納されている数値が4

hairetu[1]に格納されている数値が3


なので


hairetu[0] <= hairetu[1]


は成立しないので


配列変数hairetu[0]に格納されている数値と


配列変数 hairetu[1]に格納されている数値2は


交換されないので


配列変数 hairetu[1]に格納されている数値は4のままです

配列変数 hairetu[2]に格納されている数値は3のままです



kの値はk<1なので


for文の実行はここまでですね。





最終的に

配列変数 hairetu[0]に4

配列変数 hairetu[1]に3

配列変数 hairetu[3]に2

配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

格納されていますね


となると


ビルド実行結果で


0が1番右端に表示されることになります

1が0の左隣に表示されることになります

2が1の左隣に表示されることになります

3が2の左隣に表示されることになります

4が3の左隣に表示されることになります


つまり


43210


が表示されることになります



ソーラー「ヒントはここまでだね。


さあ みなさん


どのような数値が


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

格納されていても


以下のプログラムを実行すると

👇


#include <stdio.h>


int main(void) {


int hairetu[5];


hairetu[0] = 1;

hairetu[1] = 2;

hairetu[2] = 3;

hairetu[3] = 4;

hairetu[4] = 0;


int i;


for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");

//🌞改行しています



int k;


for (k = 0; k< 4; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}



for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}

//🌞👆1回目です


//🌞👇2回目です


//👇k<4からk< 3に変更しました


for (k = 0; k< 3; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}




for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}

//🌞👆2回目です


//🌞👇3回目です


//👇k<4からk<2に変更しました



for (k = 0; k<2; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}


for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}


//🌞👆3回目です


//🌞👇4回目です


//👇k<4からk< 1に変更しました



for (k = 0; k< 1; k++) {


if (hairetu[k] <= hairetu[k + 1]) {


int a;


a = hairetu[k];


hairetu[k] = hairetu[k + 1];


hairetu[k + 1] = a;

}


for (i = 0; i< 5; i++) {


printf("%d", hairetu[i]);

}


printf("\n");


}


//🌞👆4回目です


return 0;

}


ビルド実行結果


01234

10234

12034

12304

12340

21340

23140

23410

32410

34210

43210👈01234から43210に数値を入れ替えることに成功しました


ソーラー「配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

格納されている数値が


となる理由が分かったかな」


アレサ「ヒントといいつつ


解答を全部喋っておられますの」


solarplexuss「ほんとだ」




  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます