lC言語 繰り返し処理(FOR) '96.11.14  
l.お知らせ 内容 LINK FILE   HTML Win PC Unix MS-DOS C C++ Mfc Java 
.C言語_ 3 フォ-マットコ-ド 6 演算子 9 FOR  集合デ-タ  目的別
1 表示してみる 4 変数と定数 7 条件判断 10 WHIILE  ポインタ     
2 エスケ-プ コ-ド 5 デ-タ入力 8 分岐   未使用  関数   ★ 
FOR  継続(continue)と中断(break)  用例  大きなル-プ  強制終了 
for は C++ でも重要です。 

繰り返し処理(ループ) for
指定された回数だけ、同じ処理を繰返します。
その処理が終了すると、その後に書かれている別な処理に移ります。

次のような書式が有ります。
for(初期設定;継続条件;終了処理){ 処理; }

for(初期設定;継続条件;終了処理){処理1;処理2;処理3...;}


for(初期設定1,2,3...; 継続条件1,2,3...;終了処理1,2,3...) {処理1;2;3...; }
for( ; ; )処理; ...これは無限ループになります。

初期設定は、最初に一回だけ行われます。
処理1 処理2 処理3...終了処理 は、1回のループ毎に全部処理されます。
処理の順番は、処理1 処理2 処理3...終了処理 の順です。
継続条件が不成立になったときは、終了処理のみを実行してループを終了します。
{ } の中の処理が一個だけのときは、{ } の記述を省略できます。
例 二番目の例が違っていました。訂正 '98. 5
int i, x;
for ( i=0; i < 5; i=i+1 ) printf( "%d ", i ) ; /* 0 1 2 3 4 と表示されます。*/
printf("\n");
for ( i=0, x=10; i < 5 ; i++, x++)
{
printf("%d:",i); printf("%d ",x); } /* 0:10 1:11 2:12 3:13 4:14 と 〃 */
for() の、( )の中の処理には、; を付けません。

中断(break)と継続(continue)
中断(break) は、for(){ } のループを終了します。
継続(continue) は、一回の処理をそこで中止して 次の処理に移ります。
for(初期設定;継続条件;終了処理)
{ /* 継続条件が成立しているなら、以下の処理が順番に行なわれます。*/
 処理1;
 continue; /* 処理2 と 処理3 をパスして { } に行きます。*/
 処理2;
 break;   /* 処理3 をパスして{ }の外に出ます。*/
 処理3;
} /* ここで 終了処理が行われた後、{ } に行きます。*/
実際は次のように、条件判断と組み合わせて使います。
int i;
for(i=0; i<100; i++)
{ printf("%d ",i);
  if(i == 10) /* i=10 になったときは、*/
  { i=59;     /* i=59 にして、*/
    continue; /* ループを継続します。*/
  }
  if(i == 70) break; /* i=70 になったときは、ループを終了します。*/
}
0 1. . . . 10 60 . . . 70 が表示されます。



プログラム例
キーボードから数を入力し、その累計を表示します。
#include<stdio.h>		/* ここに stdio.h を挿入します。OK */
void main()			/* 以下、処理の内容。*/
{
  int i;			/* ループを数えるための変数を宣言します。*/
  int N;			/* 数を格納するための変数を宣言します。*/
  int M=0;			/* 累計を格納するための変数を宣言します。*/

  printf("数を累計します。: ");	/* メッセージを表示します。*/
  scanf("%d",&N);		/* キーボードから数を入力します。*/
  for(i=1;i<=N;i=i+1)		/* 0〜N までの、N 回のループを設定します。*/
  {
    M=M+i;			/* M に、0,1,2,3..N を加算します。*/
  }
    printf("Σ%d=%d\n",N,M);	/* 最後に表示します。*/
}
このループは i=1,2,3...,N の間、{ }の中の仕事を繰返します。
ループの終了時には、i は +1 されているので、i=N+1 になっています。
scanf は、データの型(%d=10進数)を指定してキーボードから入力します。
データの代入先は、変数の ポインタ で指定します。

変数の値 i を 97〜106 まで変化させ、文字コードとして表示します。
複数の初期設定や、複数の終了処理を行います。
#include<stdio.h>		/* ここに stdio.h を挿入します。OK */
void main()			/* 以下、処理の内容。*/
{
  int i,j;			/* 変数 i,j を宣言します。*/
  for(i=97,j=65;i<107;i++,j++)	/* 10 回(97〜106)のループを設定します。*/
  {
    printf("%c%c ",i,j);	/* aA〜jJを表示します。*/
  }
    printf("\n");		/* 最後に改行します。*/
}

無限ループの例です。
#include<stdio.h>		/* ここに stdio.h を挿入します。OK */
void main()			/* 以下、処理の内容。*/
{
  int i=65;			/* 変数を宣言します。*/
  for(;;)			/* 無限ループを設定します。*/
  {
    printf("%c ",i++);		/* A〜Jを表示します。*/
    if(i>=75)break;		/* J(75)なら、ループを終了します。*/
  }
    printf("\n");		/* 最後に改行します。*/
}
break でループを終了させています。



大きなループ
メモ : int 型のデータは -32,768〜32,767 の範囲の数しか表わすことができません。
32767 に 1 を加えると -32,768 になります。
 十進数表示    二進数表示
     1    0000 0000 0000 0001
  32,766    0111 1111 1111 1110
  32,767    0111 1111 1111 1111
  -32,768    1000 0000 0000 0000
  -32,767    1000 0000 0000 0001
    -1    1111 1111 1111 1111
従って、変数 i が int 型変数なら、
for( i=0; i<40000; i++ )  . . . これは
i の値は 32767 以上にはならないので、無限ループになります。

大きなループを作るには
ループのカウンタに使う変数(上記の例では i ) の型を大きくします。
i を unsigned 型にすれば、0〜65,536 まで扱えます。
i を long 型にすれば、-2,147,483,650〜2,147,483,649 まで扱えます。
i を unsigned long 型にすれば、0〜4,294,967,300 まで扱えます。

キーボードから数を入力し、その累計を表示します。
最初の例と同じですが、無限ループと組み合わせ、何回も入力できるようにします。
また、変数に unsigned long 型を使用して 4,294,967,300(2の16乗) まで計算できるようにします。
#include<stdio.h>		/* ここに stdio.h を挿入します。OK */
void main()			/* 以下、処理の内容。*/
{  unsigned long i;		/* ループを数えるための変数を宣言します。*/
  unsigned long N;		/* 数を格納するための変数を宣言します。*/
  unsigned long M;		/* 累計を格納するための変数を宣言します。*/  printf("1000 以上の入力で終了します。\n");
  for( ; ; )			/* 繰り返し実行するための無限ループの設定です。 */  { M=0;
    printf("数を累計します。: ");	/* メッセージを表示します。*/
    scanf("%ld",&N);		/* キーボードから数を入力します。*/
    for(i=1;i<=N;i=i+1)		/* 0〜N までの、N 回のループを設定します。*/    {
      M=M+i;			/* M に、0,1,2..N を加算して行きます。*/    }
    printf("Σ%ld=%ld\n",N,M);	/* 最後に表示します。*/
    if(N > 999)break;		/* N が 1,000 以上だった場合は終了します。*/  }
} 
for() には 継続条件を指定してないので、break がなければ永久に終りません。

もっと大きなループ
1,000×8,000 =8,000,000 回のループの例です。
大きくしすぎると、一生かかっても終了しなくなります。
  long i, j, k;
  for( i=3; i>0 ;i-- )
  { printf("%d \n",i);
    for( j=0; j<1000 ;j++ ) { for( k=0; k<20000 ;k++ ); }
  }
  printf("終了\n");
1,000 回のループで、一回毎に 8,000 回のループを実行します。
8,000 回のループは、処理内容を指定していませんから、 j を数えるだけです。
3 2 1 終了 と、時間を空けて表示するための、時間潰しにループを使っています。
( 75MHz のパソコンでは、約一秒間隔で表示されます。)



備考 : 強制終了
実行中のプログラムを終了させるには、Ctrl+C を実行します。(Ctrlキーを押しながら、Cキーを押します。)
Ctrl+C で終了できるプログラムの場合は、パソコンへの被害はまずありません。

Ctrl+C で終了できない場合は、Ctrl+Alt+Del で終了します。
Ctrl+Alt+Del→終了をクリック→終了をクリック の順です。
この場合は、メモリの内容が壊れている可能性があります。

それでも終了できない場合は、....
パソコンのリセットスイッチを押します。
この場合は、完全にメモリの内容が壊れています。
(コンピュータのノートにめちゃくちゃな内容が書かれてしまい、でたらめな仕事を繰り返しいてる状態。)

T


C言語 8 分岐 9 FOR 10 WHIILE
 
  mtoga@sannet.ne.jp   登録日 '96. 6.15
URL : http://www.page.sannet.ne.jp/mtoga/index.html