for (zokkouhantei = 1; zokkouhantei == 1;) 文を用いて配列変数の中に適当に格納されている数値を最も大きな数値から順に配列変数に入れ替えてみよう


以下 エクセレントC言語入門


さあっ


今日はさらに応用よ


for (zokkouhantei = 1; zokkouhantei == 1;) 文を使って


配列変数に適当に格納されている数値データを


大きい数値データから順に


配列変数に


入れ替え直してみましょう



マックス「いったい、にゃんのことお?」




以下 エクセレントC言語入門より


具体的にはね



配列宣言

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



大きな数値から順に数値が代入されている状態に


入れ替えるのよ


それを


for (zokkouhantei = 1; zokkouhantei == 1;) 文を使っておこなってみるわね


そのプログラムはこちらです


👇

#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 zokkouhantei;



for (zokkouhantei = 1; zokkouhantei == 1;) {


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}//👈🌞ここまでがfor (k = 0; k < 4; k++) のブロック{}内の命令文です

}//👈🌞ここまでがfor (zokkouhantei = 1; zokkouhantei == 1;) のブロック{}内の命令文です

return 0;

}



プログラムの実行結果


01234

10234☆

12034☆

12304☆

12340☆

21340□

23140□

23410□

23410□

32410〇

34210〇

34210〇

34210〇

43210▽

43210▽

43210▽

43210▽

43210◎

43210◎

43210◎

43210◎


C:\Users\solar\source\repos\Project2\Debug\Project2.exe (プロセス 2420) は、コード 0 で終了しました。

このウィンドウを閉じるには、任意のキーを押してください...



マックス「な、なんだ?このプログラムは?


なにがおこなわれているかわからにゃ~い😸



以下 エクセレント言語入門より



このプログラムは


(kの値を

0,1,2,3と変えながら)


配列変数

hairetu[k]に格納されている数値が hairetu[k + 1]より同じか小さければ


hairetu[k]とhairetu[k + 1]に格納されている数値を交換するプログラムなのよ



マックス「はいぃ? もっと優しくぅ」



以下 エクセレント言語入門より


このプログラムではまず


int hairetu[5];


hairetu[0] = 0;

hairetu[1] = 1;

hairetu[2] = 2;

hairetu[3] = 3;

hairetu[4] = 4;


の実行により


int hairetu[5];

により


配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


が生成され



配列変数に


数値データ

0

1

2

3

4


hairetu[0] = 0;

hairetu[1] = 1;

hairetu[2] = 2;

hairetu[3] = 3;

hairetu[4] = 4;


と代入されているの


マックス「まずは


配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]



に数値データ


0

1

2

3

4



を代入してきたか」




以下 エクセレントC言語入門より



次に


int i;


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


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

}


を実行することにより



配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


に格納されている数値データ

0

1

2

3

4



横に並べて


01234


と表示しているの



マックス「ここまでは簡単じゃないか


幸先いいじゃないか」



以下 エクセレントC言語入門より


次に


printf("\n");

//🌞改行しています



を実行して


改行を行っています


次は


int zokkouhantei;



for (zokkouhantei = 1; zokkouhantei == 1;) {


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}//👈🌞ここまでがfor (k = 0; k < 4; k++) のブロック{}内の命令文です

}//👈🌞ここまでがfor (zokkouhantei = 1; zokkouhantei == 1;) のブロック{}内の命令文です



の実行ね



マックス「これが なんだかよくわからないぞ」


以下 エクセレントC言語入門より


まず


int zokkouhantei;


を実行して


int型の変数zokkouhantei


を作製しているの


そうでないと


for (zokkouhantei = 1; zokkouhantei == 1;)


のなかで


int型の変数zokkouhantei


を用いることはできないの


マックス「それは そのとおり


分かりやすい」



以下 エクセレントC言語入門より



では いよいよ

👇

for (zokkouhantei = 1; zokkouhantei == 1;) {


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}//👈🌞ここまでがfor (k = 0; k < 4; k++) のブロック{}内の命令文です

}//👈🌞ここまでがfor (zokkouhantei = 1; zokkouhantei == 1;) のブロック{}内の命令文です



👆

の実行に移っていくわけね


for (zokkouhantei = 1; zokkouhantei == 1;) {}


条件式

zokkouhantei == 1


を満たす限り


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

を実行する命令文なの



マックス「


条件式

zokkouhantei == 1


を満たす限り


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

を繰り返し実行するのか?



for (zokkouhantei = 1; zokkouhantei == 1;)



zokkouhantei = 1


が記述されているので


ずっと


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

ずっと

繰り返し実行されることにならないか?


以下 エクセレントC言語入門より


そうなの


ただし


それは



zokkouhantei



1が代入されたまま変化しない場合のお話なの


もし



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内で




zokkouhantei に


1以外の数値データが代入されたなら



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}



繰り返し実行がおわることになるの



マックス「


なるほどお




1回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}

👆


の繰り返し実行がはじまるのか



??

おや



いきなり


zokkouhantei = 0;


の実行か



あれえ


このままだと


zokkouhanteiに1以外の数値データ0が代入されるので


もう


次の2回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆


の繰り返し実行はおこらないんじゃないか?




以下 エクセレントC言語入門より


そのとおりなの


このまま


zokkouhanteiに1以外の数値データ0が代入されたままだと



2回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行はおこらないの


だけど


再びブロック{}内で


zokkouhantei = 0;


のあとに


zokkouhantei = 1;


が実行されて


zokkouhanteiに1が代入されたなら


2回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


の実行か


これ分かった(*´▽`*)


int k;



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


のなかで


kが使用できるようにするために


実行されているんだろう




以下 エクセレントC言語入門より


そのとおり!



マックス「



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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


の実行だが


k=0

k=1

k=2

k=3


の場合ごとに



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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


のブロック{}内の命令文


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei = 1;

}


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


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

}


printf("\n");





繰り返し実行されることになるんだろう?



以下 エクセレントC言語入門より



そう



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;


zokkouhantei = 1;



}


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


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

}


printf("\n");


}



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;


zokkouhantei = 1;


}


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


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

}


printf("\n");

👆


kの値を

0

1

2

3


と変化させながら


4回繰り返すプログラムなのよ


具体的には


k=0のとき


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


hairetu[k] <= hairetu[k + 1]

hairetu[0] <= hairetu[1]

となるのだけど


hairetu[0] <= hairetu[1]


が成立するなら


hairetu[0]と hairetu[1]に格納されている数値を交換し


そのときの


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納されている数値を


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


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

}


をつかって横に並べて表示し


次に


k=1のとき


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


hairetu[k] <= hairetu[k + 1]

hairetu[1] <= hairetu[2]

となるのだけど


hairetu[1] <= hairetu[2]


が成立するなら



hairetu[1]と hairetu[2]に格納されている数値を交換し


そのときの


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納されている数値を


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


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

}


をつかって横に並べて表示し


次に


k=2のとき


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


hairetu[k] <= hairetu[k + 1]

hairetu[2] <= hairetu[3]

となるのだけど


hairetu[2] <= hairetu[3]


が成立するなら



hairetu[2]と hairetu[3]に格納されている数値を交換し


そのときの


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納されている数値を


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


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

}


をつかって横に並べて表示し


次に


k=3のとき

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


hairetu[k] <= hairetu[k + 1]

hairetu[3] <= hairetu[4]

となるのだけど


hairetu[3] <= hairetu[4]


が成立するなら


hairetu[3]と hairetu[4]に格納されている数値を交換し


そのときの


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納されている数値を


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


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

}


をつかって横に並べて表示するというものなのよ



まず


このプログラムでは


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

数値

0

1

2

3

4

が代入されています。


そして


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;


zokkouhantei = 1;


}


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


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

}


printf("\n");


}


の実行が行われます


if (hairetu[k] <= hairetu[k + 1])が注目ポイントなのよ



まず


k=0のとき


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



if (hairetu[0] <= hairetu[1])


となるわね



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

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


より


小さいので


hairetu[0] <= hairetu[1]


が成立し


int a;


a = hairetu[0];


hairetu[0] = hairetu[1];


hairetu[1] = a;


が実行されることになります


ですので


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

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


が交換されて


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

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


になり


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納されている数値

1

0

2

3

4

になります



次に


zokkouhantei = 1;


の実行により


zokkouhanteiに1が代入されるのね


これで


もう


2回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行は確定ね


なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの



そして


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

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

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

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

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


を横に並べて表示する命令文


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


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

}


が実行されることにより


10234


が表示されています。



ビルド実行結果のこの部分

👇

01234

10234👈


をみても


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

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


が交換されて


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

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


になっているのがわかります。


次に


k=1のとき


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

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


より


小さいので


hairetu[1] <= hairetu[2]


が成立し


int a;


a = hairetu[1];


hairetu[1] = hairetu[2];


hairetu[2] = a;


が実行されることになるわね


ですので


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

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


が交換されて


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

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


になります


次に


zokkouhantei = 1;


の実行により


zokkouhanteiに1が代入されるのね


これで


もう


2回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行は確定ね


なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの



そして


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

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

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

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

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


を横に並べて表示する命令文


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


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

}


が実行されることにより


12034


が表示されます。



ビルド実行結果のこの部分

👇

01234

10234👈

12034👈

12304

12340

21340

23140

23410

32410

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210



をみても


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

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


が交換されて


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

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


になっているのがわかります。



次に


k=2のとき


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

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


より


小さいので


hairetu[2] <= hairetu[3]


が成立し


int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[3] = a;


が実行されることになります


ですので


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

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


が交換されて


hairetu[2] <= hairetu[3]


が成立し


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

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


になります


次に


zokkouhantei = 1;


の実行により


zokkouhanteiに1が代入されるのね


これで


もう


2回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行は確定ね


なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの



そして


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

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

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

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

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


を横に並べて表示する命令文


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


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

}


が実行されることにより


12304


が表示されます。



ビルド実行結果のこの部分

👇

01234

10234

12034👈

12304👈

12340

21340

23140

23410

32410

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210



をみても


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

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


が交換されて


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

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


になっているのがわかります。



次に


k=3のとき



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

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


より


小さいので


hairetu[3] <= hairetu[4]


が成立し


int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[4] = a;


が実行されることになるよね


ですので


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

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


が交換されて


hairetu[3] <= hairetu[4]


が成立し


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

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


になります


次に


zokkouhantei = 1;


の実行により


zokkouhanteiに1が代入されるのね


これで


もう


2回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行は確定ね


なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの



そして


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

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

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

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

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


を横に並べて表示する命令文


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


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

}


が実行されることにより


12340


が表示されます。


ビルド実行結果のこの部分

👇

01234

10234

12034

12304👈

12340👈

21340

23140

23410

32410

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210



をみても


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

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


が交換されて


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

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


になっているのがわかります。


お話をまとめると


このようにして


このプログラム

👇

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;


zokkouhantei=1;

}


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


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

}


printf("\n");


}


return 0;

}


が実行されると


プログラムの実行結果


01234

10234👈

12034👈

12304👈

12340👈

21340

23140

23410

32410

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210



の👈の部分が表示されることになるの


4回数値交換が行われて


1番小さな数値0を1番右端に移動させて表示することができました


👇

01234

10234

12034

12304

12340👈1番小さな数値0が右端に来ました

👆



このとき

配列変数

hairetu[0] 😊

hairetu[1] 😊

hairetu[2] 😊

hairetu[3] 😊

hairetu[4] 😊

に格納されている数値は


0

1

2

3

4

から

1

2

3

4

0

になっています。


少し変化したね(´▽`*)



            😊ここで😊



配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納されている数値が


1

2

3

4

0

と格納されている


この状態で


1回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行は終了となります


zokkouhantei = 1;


が実行されて


zokkouhanteiに1が代入されているので


for (zokkouhantei = 1; zokkouhantei == 1;) の


条件式


zokkouhantei ==1



1==1となり


真の値1


をもつことになり



2回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行が始まることになります




配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納されている数値が


1

2

3

4

0

と格納されている状態で



2回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行が始まるとどうなるのかしら



まず


zokkouhantei = 0;


により


zokkouhanteiに0が代入されることになるわね



次に


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;


zokkouhantei = 1;

}


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


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

}


の実行となるの


kの値を


0,1,2,3と変えながら


”hairetu[k]に格納されている数値が hairetu[k + 1]より小さければ


hairetu[k]とhairetu[k + 1]に格納されている数値を交換するプログラム”


が実行されるのね


まず


k=0のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


  zokkouhantei=0;


}


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


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

}


printf("\n");


}



kに0が代入された


if (hairetu[0] <= hairetu[1]) {


int a;


a = hairetu[0];


hairetu[0] = hairetu[1];


hairetu[1] = a;


zokkouhantei=1;


}


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


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

}


printf("\n");


}


が実行されることになります





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

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


より


小さいので


if (hairetu[0] <= hairetu[1])


hairetu[0]<=hairetu[1]


が成立し


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

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


が交換されて


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

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


になっているのが


ビルド実行結果のこの部分

👇


01234

10234

12034

12304

12340👈

21340👈

23140

23410

23410

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210




をみてもわかります。


次に


zokkouhantei=1;


の実行により


zokkouhanteiには1が代入されることになります


この時点でもう



             3回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行の確定なの


なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの




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


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

}


により


プログラムの実行結果

👇

01234

10234

12034

12304

12340

21340👈

23140

23410

23410

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210



の👈の部分が表示されるのね



次に



k=1のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;


}


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


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

}


printf("\n");


}



kに1が代入された


if (hairetu[1] <= hairetu[2]) {


int a;


a = hairetu[1];


hairetu[1] = hairetu[2];


hairetu[2] = a;


zokkouhantei=1;


}


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


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

}


printf("\n");


}


が実行されることになります





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

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


より


小さいので


if (hairetu[1] <= hairetu[2])


hairetu[1]<=hairetu[2]


が成立し


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

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


が交換されて


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

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


になっているのが


ビルド実行結果のこの部分

👇


01234

10234

12034

12304

12340

21340👈

23140👈

23410

23410

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210




をみてもわかります。


次に


zokkouhantei = 1;


の実行により


zokkouhanteiに1が代入されるのね


この時点でもう



             3回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行の確定なの


なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの




そして


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


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

}


の実行により


プログラムの実行結果

👇

01234

10234

12034

12304

12340

21340

23140👈

23410

23410

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210




の👈の部分が表示されるのね





次に


k=2のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;


}


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


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

}


printf("\n");


}



kに2が代入された


if (hairetu[2] <= hairetu[3]) {


int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[3] = a;


zokkouhantei=1;


}


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


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

}


printf("\n");


}


が実行されることになります





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

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


より


小さいので


if (hairetu[2] <= hairetu[3])


hairetu[2]<=hairetu[3]


が成立し


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

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


が交換されて


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

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


になっているのが


ビルド実行結果のこの部分

👇

01234

10234

12034

12304

12340

21340

23140👈

23410👈

23410

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210




をみてもわかります。


次に


zokkouhantei = 1;


の実行により


zokkouhanteiに1が代入されるのね


この時点でもう



             3回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行の確定なの


なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの





そして


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


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

}


により


プログラムの実行結果

👇

01234

10234

12034

12304

12340

21340

23140

23410👈

23410

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210



の👈の部分が表示されるのね




さてさて


このとき


配列変数

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

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

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

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

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


となっています


次に


k=3のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=0;


}


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


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

}


printf("\n");


}



kに3が代入された


if (hairetu[3] <= hairetu[4]) {


int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[3] = a;


zokkouhantei=1;


}


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


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

}


printf("\n");


}


が実行されることになる・・・のですが




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

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


を比較してみると


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

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


より小さくないので


if (hairetu[3] <= hairetu[4])



hairetu[3]<=hairetu[4]は成立せず


if (hairetu[3] <= hairetu[4]){}のブロック{}内の命令文

👇



int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[3] = a;


zokkouhantei=1;


}




は実行されないので



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

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


は交換されません。


zokkouhantei=1;

も実行されませんが


zokkouhanteiには1が代入されたままですね


ですので


             3回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行の確定なの






なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの




そして


配列変数

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

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

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

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

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


のまま変化しないことが


続く


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

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

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

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

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


を並べて表示する命令文


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


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

}


の実行結果をみてもわかります


プログラムの実行結果は


01234

10234

12034

12304

12340

21340

23140

23410👈

32410👈

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210



となっていますね。


確かに


配列変数

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

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

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

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

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


のまま変化していませんね。



1回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行により



1番小さな数値0を


1番右端に移動させることができましたが



2回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行により




0につづいて


2番目に小さな数値1を


右端から2番目に


移動させて表示することができました


このとき

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納されている数値は


2

3

4

1

0

になっています。


いいところまできたじゃない(( ̄ー ̄)ニヤリ)


この


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納されている数値が


2

3

4

1

0

の状態で


3回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行が始まるわよ


まずは


恒例の


zokkouhantei = 0;


の実行ね


これで


zokkouhantei には0が代入されることになるの


次に


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


の実行ね



kの値を


0,1,2,3と変えながら


hairetu[k]に格納されている数値が hairetu[k + 1]より小さければ


hairetu[k]とhairetu[k + 1]に格納されている数値を交換するプログラムが実行されるのね


まず



k=0のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;


}


のkに0が代入された


if (hairetu[0] <= hairetu[1]) {


int a;


a = hairetu[0];


hairetu[0] = hairetu[1];


hairetu[1] = a;


zokkouhantei=1;


}


が実行されることになります




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



if (hairetu[0] <= hairetu[1])


を表すことになります


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

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


より


小さいので


hairetu[0]<=hairetu[1]


が成立し


if (hairetu[0] <= hairetu[1])に続くブロック内 {}の命令文


int a;


a = hairetu[0];


hairetu[0] = hairetu[1];


hairetu[1] = a;


zokkouhantei=1;


が実行されることになります


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

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


が交換されて


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

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


になっているのが


ビルド実行結果のこの部分

👇

01234

10234

12034

12304

12340

21340

23140

23410👈

32410👈

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210


をみてもわかります。


次に


zokkouhantei=1;


により


zokkouhanteiに1が代入されることになります


これで


もう


4回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行は確定ね



なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの



次に


k=1のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;


}


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


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

}


printf("\n");


}



kに1が代入された


if (hairetu[1] <= hairetu[2]) {


int a;


a = hairetu[1];


hairetu[1] = hairetu[2];


hairetu[1] = a;


zokkouhantei=1;


}


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


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

}


printf("\n");


}


が実行されることになります




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



if (hairetu[1] <= hairetu[2])


を表すことになります



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

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


より


小さいので


hairetu[1]<=hairetu[2]


が成立し


if (hairetu[1] <= hairetu[2])に続くブロック{}内の命令文

👇

int a;


a = hairetu[1];


hairetu[1] = hairetu[2];


hairetu[1] = a;


zokkouhantei=1;


が実行されることになります


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

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


が交換されて


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

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


になっているのが


ビルド実行結果のこの部分

👇

01234

10234

12034

12304

12340

21340

23140

23410👈

32410👈

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210


をみてもわかります。


zokkouhantei=1;


の実行により


zokkouhanteiに1が代入されることになります


これで


もう


4回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

繰り返し実行は確定ね



なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの



このとき


配列変数

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

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

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

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

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


となっています


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


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

}

の実行により



プログラムの実行結果の

👇

01234

10234

12034

12304

12340

21340

23140

23410

32410

34210👈

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210



👈で示す部分が表示されるのね



次に


k=2のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;


}


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


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

}


printf("\n");


}



kに2が代入された


if (hairetu[2] <= hairetu[3]) {


int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[2] = a;


zokkouhantei=1;


}


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


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

}


printf("\n");


}


が実行されることになります



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



if (hairetu[2] <= hairetu[3])


を表すことになります


このとき


if (hairetu[2] <= hairetu[3])に続くブロック{}内の命令文

👇

int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[2] = a;


zokkouhantei=1;

👆

は実行されません


なぜなら



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

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


を比較してみると


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

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


より小さくないので


hairetu[2]<=hairetu[3]


が成立しないからです

ですので



if (hairetu[2] <= hairetu[3])に続くブロック{}内の命令文

👇

int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[2] = a;


zokkouhantei=1;

👆

は実行されず



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

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


は交換されません。





ですので


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

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

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

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

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


のまま変化しないことが


続いて実行される


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

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

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

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

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


を並べて表示する命令文


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


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

}


の実行結果をみてもわかります


ビルド実行結果は

01234

10234

12034

12304

12340

21340

23140

23410

32410

34210👈

34210👈

34210

43210

43210

43210

43210

43210

43210

43210

43210


となります


配列変数hairetu[0]

配列変数hairetu[1]

配列変数hairetu[2]

配列変数hairetu[3]

配列変数hairetu[4]


に格納されている数値データは変化していませんね


このとき


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

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

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

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

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


となっています


zokkouhantei=1;


も実行されませんが


すでに


zokkouhanteiには1が代入されていますね


ですので


4回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

繰り返し実行は確定ね



なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの


次に


k=3のとき


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}



ブロック{}内の命令文

👇

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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;


}


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


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

}


printf("\n");

👆

が実行されることになります


kに3が代入された


if (hairetu[3] <= hairetu[4]) {


int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[2] = a;


zokkouhantei=1;


}


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


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

}


printf("\n");


}


が実行されることになるの




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



if (hairetu[3] <= hairetu[4])


を表すことになります



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

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


を比較してみると


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

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


より小さくないので



if (hairetu[3] <= hairetu[4]) {


int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[2] = a;


zokkouhantei=1;


}



のブロック{}内の命令文


int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[2] = a;


zokkouhantei=1;


が実行されることはありません



ですので



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

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


は交換されません。



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

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

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

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

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


のまま変化しないことが


続いて実行される


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

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

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

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

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


を並べて表示する命令文


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


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

}


の実行結果をみてもわかります


ビルド実行結果は


01234

10234

12034

12304

12340

21340

23140

23410

32410

34210

34210👈

34210👈

43210

43210

43210

43210

43210

43210

43210

43210




となっていますね


配列変数hairetu[0]

配列変数hairetu[1]

配列変数hairetu[2]

配列変数hairetu[3]

配列変数hairetu[4]


に格納されている数値は


3

4

2

1

0


のまま変化していないことがわかります


現時点で


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}

のブロック}内の命令文を


3回も実行してきました


kの値を


0,1,2,3と変えながら


hairetu[k]に格納されている数値が hairetu[k + 1]より小さければ


hairetu[k]とhairetu[k + 1]に格納されている数値を交換するプログラムを



             🌞3回も🌞



繰り返して実行してきましたが


1回目の繰り返しのときは


12340


のように


1番小さな数値0を1番右端に移動させることができました。


そののち


2回目の繰り返しのときは


23410


のように


2番目に小さな数値1を


0の左隣の


右端から2番目に移動させることができました。


そののち


3回目の繰り返しのときは


34210


のように


3番目に小さな数値2を


1の左隣の


右端から3番目に


移動させて

表示することができました


このとき

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納されている数値は


3

4

2

1

0

になっています。


ふふっ


おやおや~?


だんだん


配列変数

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



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行が始まることになります


まずは


zokkouhantei = 0;


の実行ですね


zokkouhanteiには0が代入されることになるの


次に


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");



の実行ね



まず


k=0のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei = 1;

}


のkに0が代入された


if (hairetu[0] <= hairetu[1]) {


int a;


a = hairetu[0];


hairetu[0] = hairetu[1];


hairetu[1] = a;


zokkouhantei = 1;

}


が実行されることになります



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



if (hairetu[0] <= hairetu[1])


を表すことになります


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

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


より


小さいので


hairetu[0]<=hairetu[1]


が成立し


if (hairetu[0] <= hairetu[1])につづくブロック{}内の命令文

👇

int a;


a = hairetu[0];


hairetu[0] = hairetu[1];


hairetu[1] = a;


zokkouhantei = 1;

👆


が実行されることになります


ですので


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

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


が交換されて


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

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


になっているのが


プログラムの実行結果のこの部分

👇


01234

10234

12034

12304

12340

21340

23140

23410

32410

34210

34210

34210👈

43210👈

43210

43210

43210

43210

43210

43210

43210



をみてもわかります。


____________________________________________________

この時点で


配列変数

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

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

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

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

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

なっています。


4回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行により


すなわち


kの値を


0,1,2,3と変えながら


"hairetu[k]に格納されている数値が hairetu[k + 1]より小さければ


hairetu[k]とhairetu[k + 1]に格納されている数値を交換するプログラム"



4回実行することにより


配列変数

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


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


数値の大きな順に


配列変数に格納されている数値を入れ替えることができました。




____________________________________________________




まだ


k=0,1,2,3と数値を変えていく中の


k=0


の段階で


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

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

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

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

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


になったね


次に実行される命令文は


zokkouhantei = 1;


なので



5回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行確定ね



なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの




そして



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


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

}


の実行により


プログラムの実行結果のこの部分

👇

01234

10234

12034

12304

12340

21340

23140

23410

32410

34210

34210

34210

43210👈

43210

43210

43210

43210

43210

43210

43210







43210👈


が表示されることになるの


k=1のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;


}


のkに1が代入された


if (hairetu[1] <= hairetu[2]) {


int a;


a = hairetu[1];


hairetu[1] = hairetu[2];


hairetu[2] = a;


zokkouhantei=1;


}


が実行されることになります



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



if (hairetu[1] <= hairetu[2])


を表すことになります


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

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


より


大きいので


hairetu[1]<=hairetu[2]


は成立しないので


if (hairetu[1] <= hairetu[2])に続くブロック{}内の命令文

👇

int a;


a = hairetu[1];


hairetu[1] = hairetu[2];


hairetu[2] = a;


zokkouhantei=1;

👆

が実行されることはありません


ですので


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

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


が交換されることはありませんし


zokkouhantei=1;

👆

が実行されることもありませんが


すでに


zokkouhanteiには1が代入されています


ですので


5回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行は確定ね



なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの



それとは関係なく


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


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

}


は実行されるので



プログラムの実行結果のこの部分

👇


01234

10234

12034

12304

12340

21340

23140

23410

32410

34210

34210

34210

43210

43210👈

43210

43210

43210

43210

43210

43210





43210👈


が表示されることになるの









k=2のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;

}


のkに2が代入された


if (hairetu[2] <= hairetu[3]) {


int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[3] = a;


zokkouhantei=1;

}


が実行されることになります



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



if (hairetu[2] <= hairetu[3])


を表すことになります


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

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


より


大きいので


hairetu[2]<=hairetu[3]


は成立しないので


if (hairetu[2] <= hairetu[3])に続くブロック{}内の命令文

👇

int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[3] = a;


zokkouhantei=1;

👆

が実行されることはありません


ですので


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

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


が交換されることはありません



zokkouhantei=1;

👆

が実行されることもありませんが


すでに


zokkouhanteiには1が代入されています


ですので


5回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行は確定ね



なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの




それとは関係なく


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


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

}


は実行されるので



プログラムの実行結果のこの部分

👇



01234

10234

12034

12304

12340

21340

23140

23410

32410

34210

34210

34210

43210

43210

43210👈

43210

43210

43210

43210

43210






43210👈


が表示されることになるの



次に


k=3のとき



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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;

}


のkに3が代入された


if (hairetu[3] <= hairetu[4]) {


int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[4] = a;


zokkouhantei=1;


}


が実行されることになります



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



if (hairetu[3] <= hairetu[4])


を表すことになります


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

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


より


大きいので


hairetu[3]<=hairetu[4]


は成立しないので


if (hairetu[3] <= hairetu[4])に続くブロック{}内の命令文

👇

int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[4] = a;


zokkouhantei=1;

👆

が実行されることはありません



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

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


が交換されることはありません


zokkouhantei=1;

👆

が実行されることもありませんが


すでに


zokkouhanteiには1が代入されています



ですので


5回目の



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

繰り返し実行は確定ね



なぜなら


zokkouhanteiに1が代入されると


for (zokkouhantei = 1; zokkouhantei == 1;)


の条件式

zokkouhantei == 1



1==1となり


真の値1をもつことになるからなの




それとは関係なく


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


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

}


は実行されるので



プログラムの実行結果のこの部分

👇

01234

10234

12034

12304

12340

21340

23140

23410

32410

34210

34210

34210

43210

43210

43210

43210👈

43210

43210

43210

43210



43210👈


が表示されることになるの



k=1

k=2

k=3


の場合は


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

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

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

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

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


のままです



とりあえず


               4回


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行により



いいかえるなら


           4回



kの値を0,1,2,3と変えながら


hairetu[k]に格納されている数値が hairetu[k + 1]より小さければ


hairetu[k]とhairetu[k + 1]に格納されている数値を交換するプログラム


を実行することにより



最初の目的だった

               

配列変数


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


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


変更することができました


なにはともあれ


これで


               4回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行の終了です


ついいまの


            4回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し


において


kの値を

0

1

2

3

と変えながら


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei = 1;

}


が実行されましたが


k=0のときの実行において


zokkouhantei=1;


が実行されていたので



               5回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行が開始されます



まず


zokkouhantei = 0;


により


zokkouhantei には0が代入されることになります



        💖ここがあとで効いてくるのよ💖



次に



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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}



が実行されることになります


kが


0

1

2

3

と値を変えながら


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei = 1;

}


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


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

}


printf("\n");


が実行されるのね


まず


k=0のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;

}


のkに0が代入された


if (hairetu[0] <= hairetu[1]) {


int a;


a = hairetu[0];


hairetu[0] = hairetu[1];


hairetu[0] = a;


zokkouhantei=1;

}


が実行されることになります



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



if (hairetu[0] <= hairetu[1])


を表すことになります


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

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


より


大きいので


hairetu[0]<=hairetu[1]


は成立しないので


if (hairetu[0] <= hairetu[1])に続くブロック{}内の命令文

👇

int a;


a = hairetu[0];


hairetu[0] = hairetu[1];


hairetu[1] = a;


zokkouhantei=1;

👆

が実行されることはありません


ですので


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

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


が交換されることはありません



zokkouhantei=1;

👆

が実行されることもありませんが


すでに


       💖zokkouhanteiには0が代入されています💖



それとは関係なく


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


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

}


は実行されるので



プログラムの実行結果のこの部分

👇

01234

10234

12034

12304

12340

21340

23140

23410

32410

34210

34210

34210

43210

43210

43210

43210

43210👈

43210

43210

43210




43210👈


が表示されることになるの



次に


k=1のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;

}


のkに1が代入された


if (hairetu[1] <= hairetu[2]) {


int a;


a = hairetu[1];


hairetu[1] = hairetu[2];


hairetu[1] = a;


zokkouhantei=1;

}


が実行されることになります



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



if (hairetu[1] <= hairetu[2])


を表すことになります


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

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


より


大きいので


hairetu[1]<=hairetu[2]


は成立しないので


if (hairetu[1] <= hairetu[2])に続くブロック{}内の命令文

👇

int a;


a = hairetu[1];


hairetu[1] = hairetu[2];


hairetu[2] = a;


zokkouhantei=1;

👆

が実行されることはありません


ですので


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

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


が交換されることはありません



zokkouhantei=1;

👆

が実行されることもありませんが


すでに


       💖zokkouhanteiには0が代入されています💖



それとは関係なく


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


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

}


は実行されるので



プログラムの実行結果のこの部分

👇


01234

10234

12034

12304

12340

21340

23140

23410

32410

34210

34210

34210

43210

43210

43210

43210

43210

43210👈

43210

43210




43210👈


が表示されることになるの




次に


k=2のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;

}


のkに2が代入された


if (hairetu[2] <= hairetu[3]) {


int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[2] = a;


zokkouhantei=1;

}


が実行されることになります



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



if (hairetu[2] <= hairetu[3])


を表すことになります


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

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


より


大きいので


hairetu[2]<=hairetu[3]


は成立しないので


if (hairetu[2] <= hairetu[3])に続くブロック{}内の命令文

👇

int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[3] = a;


zokkouhantei=1;

👆

が実行されることはありません


ですので


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

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


が交換されることはありません



zokkouhantei=1;

👆

が実行されることもありませんが


すでに


       💖zokkouhanteiには0が代入されています💖



それとは関係なく


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


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

}


は実行されるので



プログラムの実行結果のこの部分

👇

01234

10234

12034

12304

12340

21340

23140

23410

32410

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210👈

43210



43210👈


が表示されることになるの




次に


k=3のとき


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;


zokkouhantei=1;

}


のkに2が代入された


if (hairetu[3] <= hairetu[4]) {


int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[3 = a;


zokkouhantei=1;

}


が実行されることになります



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



if (hairetu[3] <= hairetu[4])


を表すことになります


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

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


より


大きいので


hairetu[3]<=hairetu[4]


は成立しないので


if (hairetu[3] <= hairetu[4])に続くブロック{}内の命令文

👇

int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[4] = a;


zokkouhantei=1;

👆

が実行されることはありません


ですので


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

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


が交換されることはありません



zokkouhantei=1;

👆

が実行されることもありませんが


すでに


       💖zokkouhanteiには0が代入されています💖



それとは関係なく


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


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

}


は実行されるので



プログラムの実行結果のこの部分

👇

01234

10234

12034

12304

12340

21340

23140

23410

32410

34210

34210

34210

43210

43210

43210

43210

43210

43210

43210

43210👈




43210👈


が表示されることになるの



そして


zokkouhanteiには0が代入されているので


for (zokkouhantei = 1; zokkouhantei == 1;) の


条件式


zokkouhantei == 1


は偽の値1をもつことになるので


               6回目の


for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行はおこなわれません


ですので


プログラムの実行は終了となるの







ぶっちゃけ




          何も考えなくても



             このようにひたすら😊😊😊😊😊



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行をおこなえば




すなわち



kの値を


0,1,2,3


と変えながら



hairetu[k] hairetu[k + 1]


hairetu[k]hairetu[k + 1]



              やがて


          (*´▽`*)いつかは(*^▽^*)


配列変数

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]


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

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

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

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

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


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


例えば


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

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

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

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

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


のように数値が格納されている状態でも



for (zokkouhantei = 1; zokkouhantei == 1;) {}のブロック{}内の命令文

👇


zokkouhantei = 0;


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;


zokkouhantei = 1;

}


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


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

}


printf("\n");


}


👆

の繰り返し実行をおこなえば



すなわち






kの値を0,1,2,3と変えながら



hairetu[k] hairetu[k + 1]


hairetu[k]hairetu[k + 1]




          いつかは😊😊😊


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

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

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

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

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



大きいほうの数値から配列変数に順に数値が格納されている状態に変更することができます
















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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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