天国にいけるC言語入門 ヘキサ構造体 ver2.2126
配列変数の中に適当に格納されている数値をより高速に最も大きな数値から順に配列変数に入れ替えるプログラムを実行してプログラムが実行されていく過程を鑑賞してみよう。💖💖💖
配列変数の中に適当に格納されている数値をより高速に最も大きな数値から順に配列変数に入れ替えるプログラムを実行してプログラムが実行されていく過程を鑑賞してみよう。💖💖💖
配列変数の中に適当に格納されている数値をより高速に最も大きな数値から順に配列変数に入れ替えるプログラムを実行してプログラムが実行されていく過程を鑑賞してみよう。💖💖💖
ソーラー「
より高速に
配列宣言
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]に格納されている数値は
hairetu[1]に格納されている数値は
hairetu[2]に格納されている数値は
hairetu[3]に格納されている数値は
hairetu[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]
に
どのように
このプログラムを用いれば
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<
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<
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<
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<
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<
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<
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<
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<
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<
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<
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<
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<
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<
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<
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<
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<
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]
に
格納されている数値が
4
3
2
1
0
となる理由が分かったかな」
アレサ「ヒントといいつつ
解答を全部喋っておられますの」
solarplexuss「ほんとだ
もう
目立つの大好きだね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます