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



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




ソーラー「



より高速に


配列宣言

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に数値を入れ替えることに成功しました


(ちょこっと解説


01234は


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

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

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

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

hairetu[4]に格納されている数値は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]


に格納されている数値を


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



皆さん


もう


お気づきだとおもいますが



もちろん


配列変数

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回目の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");


}



が実行されると


最終的には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が格納されることになります


ビルド実行結果は


たとえば


14320

23410

34210

42310

のように


0が


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


わかりにくい?かな?


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


01234

03412

34021

34201

10234


のように


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

数値


0

1

2

3

4

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


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


12340👈0が右端に到達しています

34120👈0が右端に到達しています

43210👈0が右端に到達しています

43210👈0が右端に到達しています

12340👈0が右端に到達しています

のように


必ず


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回目の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");


}



がおこなわれるとします


kの値は0,1,2,3,4と変化していきますが


まずk=0の場合ですね


このとき


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


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


hairetu[0] <= hairetu[1]


が成立し


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

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


配列変数 hairetu[1]には


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


次にk=1の場合です


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


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


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


hairetu[1] <= hairetu[2]


が成立し


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


配列変数 hairetu[2]には


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


次にk=2の場合ですね


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


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


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


hairetu[2] <= hairetu[3]


が成立し


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


配列変数 hairetu[3]には


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


次にk=3の場合ですね


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


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


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


hairetu[3] <= hairetu[4]


が成立し


配列変数hairetu[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回目の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");


}

が実行されるとします


kの値は0,1,2,3と変化していきます


まずk=0の場合ですね


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


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


hairetu[0] <= hairetu[1]


は成立しないので


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


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


交換されないので


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



次にk=1の場合ですね


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


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


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


hairetu[1] <= hairetu[2]


が成立し


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

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


配列変数 hairetu[2]には


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


次にk=2の場合ですね


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


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


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


hairetu[2] <= hairetu[3]


が成立し


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

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


配列変数 hairetu[3]には


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


次にk=3の場合ですね


配列変数[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なので


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



パターン3



13024

21043

31024


のように


配列変数

hairetu[2]に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");


}


を実行してみたいとおもいます


kの値は0,1,2,3と変化していきます


まず

k=0の場合ですね


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


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

交換あるいは非交換


が実行されています


次にk=1の場合ですね


hairetu[2]に0が格納されているので


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


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


hairetu[1] <= hairetu[2]


は成立しないので


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


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


交換されないので


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


次にk=2の場合ですね


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


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


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


hairetu[2] <= hairetu[3]


が成立し


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

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


配列変数 hairetu[3]には


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


次にk=3の場合ですね


配列変数[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が格納されているとします


ここで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");


}

を実行してみたいとおもいます


kの値は0,1,2,3と変化していきます


k=0の場合

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

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

交換あるいは非交換がおこなわれます


次に

k=1の場合


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

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

交換あるいは非交換がおこなわれます


このとき

配列変数[2]には


1,2,3,4いずれかの数値が格納されることになりますね


次に

k=2の場合


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


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


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


hairetu[2] <= hairetu[3]


は成立しないので


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



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



交換されないので


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


次に

k=3の場合


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


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


配列変数hairetu[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文の実行はここで終了です。


パターン5


24130

43210

31240


のように


配列変数

hairetu[4]に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");


}



実行してみたいとおもいます


kの値は0,1,2,3と変化していきます


k=0の場合


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

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

交換あるいは非交換がおこなわれます


k=1の場合

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

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

交換あるいは非交換がおこなわれます


k=2の場合

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

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

交換あるいは非交換がおこなわれます



k=3の場合


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


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


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


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");


}


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


kの値は1,2,3と変化していくことになります


まず


たとえば


パターン1


12340

12430

13240

13420

14230

14320

のように



配列変数

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


k=0のとき


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


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


hairetu[0] <= hairetu[1]


が成立し


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

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


配列変数 hairetu[1]には


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


k=1のとき


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


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


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


hairetu[1] <= hairetu[2]


が成立し


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

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


配列変数 hairetu[2]には


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


k=2のとき


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


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


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


hairetu[2] <= hairetu[3]


が成立し


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


配列変数 hairetu[3]には


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


kの値はk<3なので


2回目の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回目の

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");


}


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


kの値は1,2,3と変化していくことになります


k=0のとき


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


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


hairetu[1]に格納されている値はなので


hairetu[0] <=hairetu[1]


は成立しないので


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



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



交換されないので


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


k=2のとき


hairetu[1]に1が格納されているので


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


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


hairetu[1] <= hairetu[2]


が成立し


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

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


配列変数 hairetu[2]には


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


k=3のとき


配列変数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が格納されているとします


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");


}


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


kの値は1,2,3と変化していくことになります


k=0のとき

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

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

交換あるいは非交換


が実行されます


次に


k=1のとき


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


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


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


hairetu[1] <= hairetu[2]


は成立しないので


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



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



交換されないので


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


k=2のとき


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


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


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");


}


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


kの値は0,1,2と変化していくことになります


k=0のとき


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

配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値同士の交換あるいは非交換が行われます


k=1のとき


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

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

交換あるいは非交換が行われます


k=2のとき


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


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


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


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");


}


が実行されると


k=0のとき


3,4のいかなる数値が


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


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


hairetu[0] <= hairetu[1]


が成立し


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

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


配列変数 hairetu[1]には


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


つづいて


k=1のとき


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


3,4のいかなる数値が


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


hairetu[1] <= hairetu[2]


が成立し


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

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


配列変数 hairetu[2]には


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


kの値はk<2なので


3回目の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回目の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");


}

が実行されるとします


kの値が0,1と変化しながら3回目のfor文が実行されることになります


k=0のとき


3,4のいかなる数値が


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


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


hairetu[0] <= hairetu[1]


は成立しないので


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



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



交換されないので


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


k=1のとき


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


3,4のいかなる数値が


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


hairetu[1] <= hairetu[2]


が成立し


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



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


配列変数 hairetu[2]には


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


kの値はk<2なので


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



最終的に


配列変数 hairetu[2]に2

配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

格納されていますね


となると


ビルド実行結果で


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

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

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



パターン3


34210

43210

のように


配列変数

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


この状態で


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");


}



実行されるとします


kの値が0,1と変化しながら3回目のfor文が実行されることになります


k=0のとき


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

交換あるいは非交換


が実行さます


つづいて


k=1のとき


3,4のいかなる数値が


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


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


hairetu[1] <= hairetu[2]


は成立しないので


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



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



交換されないので


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


kの値はk<2なので


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



最終的に

配列変数 hairetu[2]に2

配列変数 hairetu[3]に1

配列変数 hairetu[4]に0

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


となると


1回目のfor文

2回目のfor文

3回目のfor文


の実行が行われた後は


ビルド実行結果で


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つのパターンのうちのどれかとなっています。」



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


1回目のfor文

2回目のfor文

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");


}


が実行されるとします


k=0のとき


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なので


4回目の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");


}


が実行されるとします


k=0のとき


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

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


なので


hairetu[0] <= hairetu[1]


は成立しないので


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



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



交換されないので


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

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



kの値はk<1なので


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





最終的に


1回目のfor文

2回目のfor文

3回目のfor文

4回目のfor文

実行が行われた後は


どのような値が


配列変数 hairetu[0]

配列変数 hairetu[1]

配列変数 hairetu[2]

配列変数 hairetu[3]

配列変数 hairetu[4]


に格納されていたとしても


必ず

配列変数 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



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



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


さあ みなさん


どのような数値が


配列変数

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で共有
  • はてなブックマークでブックマーク

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る