for (i = 1; i == 1;)タイプのfor文の仕組みを学んでみよう
以下 エクセレントC言語入門より
では
次のプログラムをご覧ください
👇
#include <stdio.h>
int main(void) {
int zokkouhantei;
for (zokkouhantei = 1; zokkouhantei == 1;) {
printf("プログラムは実行されました\n");
}
return 0;
}
プログラムの実行結果
プログラムは実行されました
プログラムは実行されました
プログラムは実行されました
・
・
・
・
・
以下 エクセレントC言語入門より
このプログラムは
for (zokkouhantei = 1; zokkouhantei == 1;) {
printf("プログラムは実行されました\n");
}
のブロック{}内の命令文
👇
printf("プログラムは実行されました\n");
👆
を
実行し続けるプログラムなの💖」
マックス「な、なんだ?
いきなり
プログラムの実行結果
プログラムは実行されました
プログラムは実行されました
プログラムは実行されました
・
・
・
・
・
か
なんだ?
for (zokkouhantei = 1; zokkouhantei== 1;)
こんなfor文の使い方
みたことないぞ
以下 エクセレントC言語入門より
仕組みは簡単なの
for (zokkouhantei = 1; zokkouhantei == 1;) {
printf("プログラムは実行されました\n");
}
は
条件式が
zokkouhantei== 1
なので
zokkouhanteiが1の値をとり続ける間は
zokkouhantei== 1
は
1==1
となり
真の値1をとることになるので
for (zokkouhantei = 1; zokkouhantei== 1;)につづくブロック{}内の
命令文
printf("プログラムは実行されました\n");
は
☆繰り返し☆
実行され続けることになるの
マックス「なんだ(*´▽`*)
そんなことか
だが
となると
このタイプのfor文
👇
for (zokkouhantei = 1; zokkouhantei == 1;) {
printf("プログラムは実行されました\n");
}
のブロック{}内の命令文
printf("プログラムは実行されました\n");
は
そのままでは
ずっと繰り返されることにならないか?
以下 エクセレントC言語入門
そうなの
便利でしょう
マックス「・・・・・へえ・・・・・ってなんじゃ?これは・・・」
このプログラムの
int zokkouhantei;
に注目してね
続行判定zokkouhanteiが0の値をもつので
このままでは
for (zokkouhantei = 1; zokkouhantei== 1;)の
zokkouhantei== 1
が満たされることはなく
次回のfor文の繰り返しにおいて
for文のブロック{}内の
命令文
zokkouhantei= 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
}
が実行されることはありませんが
とりあえずは
1回は
zokkouhantei= 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
}
が実行されることになります
マックス「最低1回はブロック{}内の
命令文が実行されるか・・・
どこかで聞いたような・・・」
以下 エクセレントC言語入門より
(それは
do
while文
よ)
マックス「??なんのこと??」
以下 エクセレントC言語入門より
さて
それはともかく
for (zokkouhantei = 1; zokkouhantei== 1;)の働きにより
最低1回は
zokkouhantei= 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
}
が実行されることになります
zokkouhantei= 0;
の次は
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
}
の実行ね
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
は
hairetu[i] <= hairetu[i + 1]
が成立する場合
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
が実行されることになるの
この命令文は
hairetu[i] <= hairetu[i + 1]
が成立する場合
hairetu[i]とhairetu[i + 1]
に格納されている数値データを交換するのね
そして
zokkouhantei = 1;
により
続行判定zokkouhanteiには1が代入されることになるの
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
}
は
if (hairetu[0] <= hairetu[1]) {
int a = hairetu[0];
hairetu[0] = hairetu[1];
hairetu[1] = a;
zokkouhantei = 1;
}
if (hairetu[1] <= hairetu[2]) {
int a = hairetu[1];
hairetu[1] = hairetu[2];
hairetu[2] = a;
zokkouhantei = 1;
}
if (hairetu[2] <= hairetu[3]) {
int a = hairetu[2];
hairetu[2] = hairetu[3];
hairetu[3] = a;
zokkouhantei = 1;
}
if (hairetu[3] <= hairetu[4]) {
int a = hairetu[3];
hairetu[3] = hairetu[4];
hairetu[4] = a;
zokkouhantei = 1;
}
が実行されることになるのだけど
一回でも数値の入れ替えがおこれば
zokkouhantei = 1;
が実行されるの
zokkouhantei = 1;
が実行されれば
続行判定zokkouhanteiに1が代入されるので
for (zokkouhantei = 1; zokkouhantei== 1;) {
zokkouhantei= 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
}
}
の
for (zokkouhantei = 1; zokkouhantei== 1;)
の
条件式
zokkouhantei== 1
は
1==1
となり
for (zokkouhantei = 1; zokkouhantei== 1;) {
zokkouhantei= 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
}
}
内の命令文
zokkouhantei= 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
}
が
再び実行されることになるわけね
マックス「
なるほどな
zokkouhantei = 1;
は?
何の意味があるんだ?」
以下 エクセレントC言語入門より
続行判定zokkouhanteiに1が代入されると
int zokkouhantei;
for (zokkouhantei = 1; zokkouhantei== 1;) {
zokkouhantei= 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
}
}
このプログラムの
zokkouhantei = 0;
に注目して頂戴
for (zokkouhantei= 1; (zokkouhantei== 1;) {
zokkouhantei= 0;
}
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei= 1;
}
}
を取り除くと
for ((zokkouhantei= 1; (zokkouhantei== 1;) {
zokkouhantei= 0;
}
となります
このままだと
このプログラムの実行は一回だけおこなわれて終了してしまうの
でも
for (flag = 1; flag == 1;) {
flag = 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
flag = 1;
}
}
}
のなかの
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei= 1;
}
}
のif文が実行されたなら
zokkouhantei= 1;
となり
for (zokkouhantei= 1; zokkouhantei== 1;)
の条件式
zokkouhantei== 1
は
1==1
となり
真の値をもつことになるので
for (zokkouhantei = 1; fzokkouhantei== 1;){}
の
ブロック{}内の命令文
flag = 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei= 1;
}
}
は実行されることになります
つまり
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
}
を実行したとき
hairetu[0] <= hairetu[1]
hairetu[1] <= hairetu[2]
hairetu[2] <= hairetu[3]
hairetu[3] <= hairetu[4]
のどれかが成立すれば
zokkouhantei= 1;
が実行されることになります
hairetu[0] <= hairetu[1]
hairetu[1] <= hairetu[2]
hairetu[2] <= hairetu[3]
hairetu[3] <= hairetu[4]
が成立すれば
hairetu[0]とhairetu[1]の数値データの入れ替え
hairetu[1]とhairetu[2]の数値データの入れ替え
hairetu[2]とhairetu[3]の数値データの入れ替え
hairetu[3]とhairetu[4]の数値データの入れ替え
がおこります
hairetu[0]とhairetu[1]の数値データの入れ替え
hairetu[1]とhairetu[2]の数値データの入れ替え
hairetu[2]とhairetu[3]の数値データの入れ替え
hairetu[3]とhairetu[4]の数値データの入れ替え
がおこれば
zokkouhantei= 1;
が実行されることになります
ですので
再び
for (zokkouhantei= 1; zokkouhantei == 1;) {
zokkouhantei = 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
}
}
のなかの命令文
zokkouhantei= 1; = 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei= 1;
}
}
が実行されることになります
まったく
hairetu[0]とhairetu[1]の数値データの入れ替え
hairetu[1]とhairetu[2]の数値データの入れ替え
hairetu[2]とhairetu[3]の数値データの入れ替え
hairetu[3]とhairetu[4]の数値データの入れ替え
が起こらないのであれば
すでに
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
hairetu[3]
hairetu[4]
には
数値データ
5
4
3
2
1
が
格納されていることになります
つまり
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei= 1;
}
のなかの命令文
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei= 1;
が実行されることはない場合は
zokkouhantei= 1;
が実行されることはないので
再び
for (zokkouhantei= 1; zokkouhantei == 1;) {
zokkouhantei = 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei = 1;
}
}
}
のなかの命令文
zokkouhantei= 1; = 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
zokkouhantei= 1;
}
}
が実行されることはありません
つまり
hairetu[0]とhairetu[1]の数値データの入れ替え
hairetu[1]とhairetu[2]の数値データの入れ替え
hairetu[2]とhairetu[3]の数値データの入れ替え
hairetu[3]とhairetu[4]の数値データの入れ替え
を
試すようなことは行われません
一回でも
hairetu[0]とhairetu[1]の数値データの入れ替え
もしくは
hairetu[1]とhairetu[2]の数値データの入れ替え
もしくは
hairetu[2]とhairetu[3]の数値データの入れ替え
もしくは
hairetu[3]とhairetu[4]の数値データの入れ替え
がおこれば
その後
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
hairetu[3]
hairetu[4]
には
数値データ
5
4
3
2
1
が
格納されて目的達成されているか
もしくは
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
hairetu[3]
hairetu[4]
には
数値データ
5
4
3
2
1
が
格納されていない
の両方の可能性があります
ですが
zokkouhantei= 1;
が実行されているので
for (zokkouhantei= 1; fzokkouhantei== 1;){}
の
ブロック{}内の命令文
flag = 0;
for (i = 0; i < 4; i++) {
if (hairetu[i] <= hairetu[i + 1]) {
int a = hairetu[i];
hairetu[i] = hairetu[i + 1];
hairetu[i + 1] = a;
flag = 1;
}
}
は実行されることになります
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます