配列変数の中に適当に格納されている数値を最も大きな数値から順に配列変数に入れ替えるプログラムを実行してみよう。 より高速にビルド実行が行われるようプログラムを改良してみます💖💖💖

ソーラー「




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




4回用いることにより


配列宣言


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] = 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回目です


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


}


//🌞👆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;

}


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


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

}


printf("\n");


}


//🌞👆4回目です


return 0;

}


ビルド実行結果


01234

10234

12034

12304

12340

21340

23140

23410

23410

32410

34210

34210

34210

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

43210

43210

43210


ソーラー「ところで


このプログラムのビルド実行結果を


よくご覧ください


ビルド実行結果

01234

10234

12034

12304

12340

21340

23140

23410

23410

32410

34210

34210

34210

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

43210

43210

43210


アレサ「(´▽`*)見ましたですの」


ソーラー「なんか


ビルド実行結果に


同じ数値がならんでいると思わない?


23410

23410

34210

34210

34210

43210

43210

43210

43210

部分だよ🌞」


アレサ「そうですね(´▽`*)


なぜ


同じ数値がビルド実行結果にならんでいるのですの?」



ソーラー「


このプログラムのビルド実行結果が


なぜこうなっているのかについて


解説をくわえてみると・・・


まず


ビルド実行結果の


先頭の行の


01234

ですね


01234👈最初に

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納した数値です



ここから


以下の命令文

👇

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


}




4回用いて配列変数に格納されている数値の交換を行っていくというわけです



この命令文を


1回用いるごとに


k=0

k=1

k=2

k=3

k=4

のkの値に応じて


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

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


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

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

が入れ替わるというわけです



詳しく述べると


この命令文を


1回用いるごとに


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

hairetu[1]に格納されている数値を比較して


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

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


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

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

が入れ替わり



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

hairetu[2]に格納されている数値を比較して


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

hairetu[2]に格納されている数値より小さければ


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

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

が入れ替わり



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

hairetu[3]に格納されている数値を比較して


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

hairetu[3]に格納されている数値より小さければ


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

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

が入れ替わり




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

hairetu[4]に格納されている数値を比較して


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

hairetu[4]に格納されている数値より小さければ


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

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

が入れ替わるというわけです




まずは



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

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


に格納されている数値同士の入れ替えが始まります


ここでは


ビルド実行結果をみながら解説を加えてみます。



1回目の

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


に格納されている数値同士の入れ替えはこちら👇

🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻


10234👈上記01234の配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値を入れ替えた結果となっています

12034👈上記10234の配列変数hairetu[1]と配列変数hairetu[2]に格納されている数値を入れ替えた結果となっています

12304👈上記12034の配列変数hairetu[2]と配列変数hairetu[3]に格納されている数値を入れ替えた結果となっています

12340👈上記12304の配列変数hairetu[3]と配列変数hairetu[4]に格納されている数値を入れ替えた結果となっています


ここまでが1回目ですね

🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻




次に

2回目の


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



21340👈上記12340の配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値を入れ替えた結果となっています

23140👈上記21340の配列変数hairetu[1]と配列変数hairetu[2]に格納されている数値を入れ替えた結果となっています

23410👈上記23140の配列変数hairetu[2]と配列変数hairetu[3]に格納されている数値を入れ替えた結果となっています


そして


23410👈23410の配列変数hairetu[3]と配列変数hairetu[4]に格納されている数値を入れ替えようとしていますが入れ替わりません😋


ですね


配列変数hairetu[3]と配列変数hairetu[4]に格納されている数値を入れ替えようとしていますが入れ替わっていません


なぜこのようなことがおこるのかというと


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


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

となっている状態では


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;

}



if (hairetu[k] <= hairetu[k + 1])の部分は


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


となります


if文のブロック{}内は


int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[4] = a;


となります



if (hairetu[k] <= hairetu[k + 1])の部分は


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


となるということは


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

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


なので


if (1 <= 0)

となります


すると


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


int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[4] = a;


は実行されず


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

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


は交換されませんね。



ここまでが2回目ですね



🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻



次に

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;

}


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


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

}


printf("\n");


}


を用いた



配列変数に格納されている数値同士の入れ替えの開始です。




3回目🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻



32410👈上記23410の配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値を入れ替えた結果となっています

34210👈上記32410の配列変数hairetu[1]と配列変数hairetu[2]に格納されている数値を入れ替えた結果となっています

34210👈上記34210の配列変数hairetu[2]と配列変数hairetu[3]に格納されている数値を入れ替えようとしていますが入れ替わっていません😋

34210👈上記34210の配列変数hairetu[3]と配列変数hairetu[4]に格納されている数値を入れ替えようとしていますが入れ替わりません😋



まずは

34210👈上記34210の配列変数hairetu[2]と配列変数hairetu[3]に格納されている数値を入れ替えようとしていますが入れ替わっていません😋


の場合ですね




なぜ

34210の配列変数hairetu[2]と配列変数hairetu[3]に格納されている数値を入れ替えようとして入れ替わっていないのかというと


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

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

となっている状態では


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;

}



if (hairetu[k] <= hairetu[k + 1])の部分は


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


となります


if文のブロック{}内は


int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[3] = a;


となります



if (hairetu[k] <= hairetu[k + 1])の部分は


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


となるということは


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

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


なので


if (2 <= 1)

となります


すると


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


int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[3] = a;


は実行されず


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

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


は交換されませんね。


次に


34210👈上記34210の配列変数hairetu[3]と配列変数hairetu[4]に格納されている数値を入れ替えようとしていますが入れ替わりません😋


の場合ですね


なぜ


上記34210の配列変数hairetu[3]と配列変数hairetu[4]に格納されている数値を


入れ替えようとしていますが入れ替わらないのかというと


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


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

となっている状態では


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;

}



if (hairetu[k] <= hairetu[k + 1])の部分は


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


となります


if文のブロック{}内は


int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[4] = a;


となります



if (hairetu[k] <= hairetu[k + 1])の部分は


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


となるということは


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

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


なので


if (1 <= 0)

となります


すると


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


int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[4] = a;


は実行されず


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

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


は交換されませんね。


ここまでが3回目ですね




🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻


次に

4回目の


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


}


を用いた



配列変数に格納されている数値同士の入れ替えの開始です。


43210👈上記34210の配列変数hairetu[0]と配列変数hairetu[1]に格納されている数値を入れ替えた結果となっています

😊😊😊


ついに

配列変数に数値が格納されている状態を

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



おめでとう!



43210👈上記43210の配列変数hairetu[1]と配列変数hairetu[2]に格納されている数値を入れ替えようとしていますが入れ替わりません😋


なぜこのようなことが起こるのかというと


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


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

となっている状態では


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;

}



if (hairetu[k] <= hairetu[k + 1])の部分は


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


となります


if文のブロック{}内は


int a;


a = hairetu[1];


hairetu[1] = hairetu[2];


hairetu[2] = a;


となるはずです



if (hairetu[k] <= hairetu[k + 1])の部分は


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


となるということは


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

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


なので


if (3 <= 2)

となります


すると


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


int a;


a = hairetu[1];


hairetu[1] = hairetu[2];


hairetu[2] = a;


は実行されず


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

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


は交換されませんね。



お次の(´▽`*)


43210👈上記43210の配列変数hairetu[2]と配列変数hairetu[3]に格納されている数値を入れ替えようとしていますが入れ替わりません😋


の場合も


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

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

となっている状態では


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;

}



if (hairetu[k] <= hairetu[k + 1])の部分は


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


となります


if文のブロック{}内は


int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[3] = a;


となるはずです



if (hairetu[k] <= hairetu[k + 1])の部分は


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


となるということは


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

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


なので


if (2 <= 1)

となります


すると


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


int a;


a = hairetu[2];


hairetu[2] = hairetu[3];


hairetu[3] = a;


は実行されず


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

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


は交換されませんね。



お次の


43210

👈上記43210の配列変数hairetu[3]と配列変数hairetu[4]に格納されている数値を入れ替えようとしていますが入れ替わりません😋


の場合も


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

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

となっている状態では


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


int a;


a = hairetu[k];


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


hairetu[k + 1] = a;

}



if (hairetu[k] <= hairetu[k + 1])の部分は


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


となります


if文のブロック{}内は


int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[4] = a;


となるはずですね



if (hairetu[k] <= hairetu[k + 1])の部分は


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


となるということは


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

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


なので


if (1 <= 0)

となります


すると


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


int a;


a = hairetu[3];


hairetu[3] = hairetu[4];


hairetu[4] = a;


は実行されず


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

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


は交換されませんね。




🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻


ソーラー「ところで


1回目の


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


}


をもちいた


配列変数に格納されている数値同士の交換が行われると


01234

から

10234

12034

12304

12340




配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


に格納されている数値が変化していますね。




            ここで大注目!!!!!!



1回目の


配列変数に格納されている数値同士を交換する過程では


01234

から

10234

12034

12304

12340



0と1

0と2

0と3

0と4

が交換されていき


0が1つずつ右へ移動して


最後に1番右端まで移動していっていますね。


なぜなら


配列変数に格納されている数値が


右隣の配列変数に格納されている数値より小さければ


配列変数に格納されている数値同士が交換されるからでしたね。


0は他の数値

1

2

3

4

より

小さいから


0が配列変数に格納されていると


常に右隣の配列変数に格納されている数値


と交換がおこなわれるというわけです。




2回目の


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


}


が実行されて


配列変数に格納されている数値を交換する過程では


12340

から

21340

23140

23410

23410


へと


1と2

1と3

1と4


が交換されていき


1が1つずつ右へ移動していくのがわかります


最後に0の左隣まで移動していっていますね。


ですが


ビルド実行結果の


21340

23140

23410

23410


をみてもお分かりになられますように


0の左隣の


23410の位置まで1が到達した時点で止まり


0と1

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


なぜなら


配列変数に格納されている数値が


右隣の配列変数に格納されている数値より小さければ


配列変数に格納されている数値同士が交換されるのですが


1が配列変数に格納されている場合は


1

2

3

4

より

小さいから


右隣の配列変数に格納されている数値が

2

3

4

なら


配列変数に格納されている数値同士が交換されるのですが


右隣の配列変数に格納されている数値が


0なら


配列変数に格納されている数値同士は交換されないというわけです




ですから



12340

から

23410の位置まで


1を到達させるだけなら


for文の条件式は


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


ではなく


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


でも


よいということになりますね。


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


の場合は


k = 0

k = 1

k = 2

k = 3

のときの4回


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


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



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


と記述してしまえば


k = 0

k = 1

k = 2

のときの3回だけ


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


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


1回分


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


の実行を行わなくてすむようになり


より高速にビルド実行が行われることになります。




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;

}


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


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

}


printf("\n");


}


により


配列変数に格納されている数値を交換する過程では


23410

から

32410

34210

34210

34210


へと


2と3

2と4


が交換されていき


2が1つずつ右へ移動していくのがわかります


最後に1の左隣まで移動していっていますね。


ですが


ビルド実行結果の


32410

34210

34210

34210

をみても

お分かりになられますように


1の左隣の


34210の位置まで2が到達した時点で止まり


それ以上


2と1

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


なぜなら


2の方が1より大きいからですね


配列変数に格納されている数値が


右隣の配列変数に格納されている数値より小さければ


配列変数に格納されている数値同士が交換されるのですが



2が配列変数に格納されていると


2

3

4

より

小さいから



右隣の配列変数に格納されている数値が

3

4

なら


配列変数に格納されている数値同士が交換されるのですが


右隣の配列変数に格納されている数値が


0

1

なら


配列変数に格納されている数値同士は交換されないというわけです



ですから


23410

から

34210の位置まで


2を到達させるだけなら


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


ではなく


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


でも


よいということになりますね。


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


の場合は


k = 0

k = 1

k = 2

k = 3

のときの4回


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


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



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


と記述してしまえば


k = 0

k = 1


のときの2回だけ


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


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


2回分の実行を行わなくてすむようになり


より高速にビルド実行が行われることになります。



4回目の


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


}


により


配列変数に格納されている数値を交換する過程では


34210

から

43210

43210

43210

43210


へと


3と4


が交換されていき


3の位置が1つ右へ移動していくのがわかります


最終的に2の左隣まで移動していっていますね。


ですが


43210の位置まで3が到達した時点で止まり


3と2

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


なぜなら


3の方が2より大きいからですね


配列変数に格納されている数値が


右隣の配列変数に格納されている数値より小さければ


配列変数に格納されている数値同士が交換されるのですが



3が配列変数に格納されていると


3

4

より

小さいから


右隣の配列変数に格納されている数値が

4

なら


配列変数に格納されている数値同士が交換されるのですが


右隣の配列変数に格納されている数値が


0

1

2

なら


配列変数に格納されている数値同士は交換されないというわけです





ですから


34210

から

43210


の位置まで


3を到達させるだけなら


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


ではなく


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


でも


よいということになりますね。


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


の場合は


k = 0

k = 1

k = 2

k = 3

のときの4回


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


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



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


と記述してしまえば


k = 0


のときの1回だけ


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


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


3回分の実行を行わなくてすむようになり


より高速にビルド実行が行われることになります。



というわけで


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


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


命令文


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;

}


を使って


入れ替えるプログラム


のプロトタイプは以下のようなプログラムでしたが


👇

#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回目です


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


}


//🌞👆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;

}


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


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

}


printf("\n");


}


//🌞👆4回目です


return 0;

}


ビルド実行結果


01234

10234

12034

12304

12340

21340

23140

23410

23410

32410

34210

34210

34210

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

43210

43210

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;

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


交換するプログラムは


以下のようになります。」

👇


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




ソーラー「ビルド実行結果もプロトタイプに比べて


行数が短く表示されました(´▽`*)


つまり


より高速に


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


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


入れ替えることができるようになったっていうわけだね。」


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

作者を応援しよう!

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

応援したユーザー

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