C言語学習ノート(七)--循環プログラム設計


1ループ文
1.1ループ文は主に3種類を含む:while、do-while、for.
2 while文処理サイクル
2.1 while文の基本形式:
While(式)
{循環体文}
2.2実行フロー:まずwhile式の値を計算し、ゼロ以外の場合は循環内の文を実行し、実行後はwhile式の値を判断し続け、ゼロ以外の場合は循環体を実行し続け、式の値がゼロになるまで循環体を実行し、循環を飛び出し、後続の文を実行する.
例コード:
#include "stdio.h"
main (){
 int  i,sum;
 i=1; 
 sum=0;
 while ( i<=100 )       /*     i         n     ,      */
{ sum=sum+i;
       i++;
     }
  printf ("sum=%d
",sum); }

注意:sumとiを使用する場合は、必ず初期値を割り当てます.
2.3 while文使用上の注意:
循環体複数の文が一致する文形式を使用しなければならない場合.ループボディ式には、ループが終了する傾向を制御する文が必要です.そうしないと、ループは無限に行われます.循環体は空であってもよい.
2.4 while例:a+aa+aaa+....
コード:
#include  "stdio.h"
main( )
{
  int a,x;
  long  sum=0,n=1,tn ;
  scanf("%d%d",&a,&x);
  tn=a;
  while(n<=x)                /*n  x   */
  {sum+=tn;
  tn=tn*10+x;
  n++;
  } 
  printf("result is %ld",sum);
}

思考問題:階乗を求める.
3 do while文処理サイクル
3.1 do while文の基本形式:
do{ループ文}
while(式);
3.2実行フロー:まずdoの後の循環体を実行して、それからwhileの中の式の値を計算して、値がゼロでない時にdoの循環体を引き続き実行して、値がゼロの時、循環を飛び出します.
例コード:
#include "stdio.h"
main (){
 int  i,sum;
 i=2;
 sum=0;
 do                                     /*     */
  {
   sum+=i;
   i+=2;
  }while(i<=100);                          /*    */
 printf ("sum=%d
", sum ); }

3.3 whileとdo whileの違い:whileはまずwhileの式が成立するかどうかを判断してから循環体を実行し、do whileはwhileの式が成立するかどうかにかかわらず、先にdoを実行する循環体である.
4 for文処理サイクル
4.1基本文法形式:
for(式1;式2;式3)
循環体
注意:forはc言語のキーワードで、括弧の中の3つの式は任意の式で、体内に複数の文がある場合は、複合文を使用することに注意してください.
4.2まず式1を計算し、式1は一度だけ実行し、一般的に変数を初期化するために付与文である.次に式2を解き、値がゼロであればループを終了し、ゼロでなければループを実行する.次に式3を実行し、式2が成立しないまで式2を判断し続け、ループ体を実行する.
例コード:
#include  "stdio.h"
main( )
{
int i,sum;
sum=0;
for( i=1; i<=100; i++)
  sum+=i;
printf("sum=%d",sum);
}

4.3 for文の特徴:式1、2、3は省略できるが、「;」セミコロンは省略できません.式は任意の形式の式であってもよい.循環体は空であってもよい.forのカッコには、複数の制御ループの変数が使用できます.
判定素数例コード:
#include "stdio.h"
#include "math.h"    
main()
{ int n,m,flag;
  flag=1;                /*flag       ,  1 n   ,      。   1*/
  printf("
enter n:"); /* n*/ scanf("%d",&n); for(m=2;m<n&&flag;m++) /* n 2~n-1 */ if(n%m==0) flag=0; /*n */ if(flag==1) /* flag , */ printf("
%d is a prime number.",n); else printf("
%d is not a prime number.",n); }

4.4思考問題:
1.階乗を求める.
2.フィボナッチ数列を出力します.
3.水仙の数を出力します.
4.次の図を出力します.
*****
 ****
  ***
   **
    *
5プロセス制御文
ループを実行する過程で、ループを途中で中断したり、今回のループをスキップしたりする必要がある場合があります.この場合、プロセス制御文を使用する必要があります.
5.1 break:switch文ではbreakを使用してswitchブランチをスキップすることがよくありますが、breakもループ文でループをスキップするために使用できます.ループでbreakを使用すると、ループ文に複数の出口があり、プログラムをより柔軟にすることができます.
break文は、ループを終了条件に達していないときにループから繰り上げることができます.
例コード:
for(i=0;i<10;i++){
printf("%d",i);
if(i==0) break;
}
思考問題:break文を用いて判断素数問題を修正する.
5.2 continue:ループ中にcontinueを使用すると、条件に基づいて今回のループを実行するかどうかを判断できます.continueを使用すると、後のコードは実行されず、次のループを直接実行します.しかしbreakがブランチでもループでも使用できるように、continueはループ構造でしか使用できません.
例コード:
for(i=0;i<10;i++){
if(i==0) continue;/*i=0の場合はループを実行しません*/
printf("%d",i);
}
思考練習:continueを使って1000内に3、5、7で割り切れる数を求める.
5.3 goto:無条件転向文とも呼ばれる.
その一般的なフォーマットはgoto記号です.
例コード:
#include <stdio.h>
main() { 
  int i,s=0;
  i=1;
  loop:if(i<=100){     /*  ,   goto       */
      s+=i;
      i++;
      goto loop;
  }          
  printf("1+2+3+…100=%d
",s); }

構造化プログラム設計ではgoto文の使用は提唱されていないが、gotoを使用すると便利である場合がある.例えば、多層の循環体では、最外層の循環に飛び出すには複数のbreakを使用するが、gotoを使用すると直接実現できる.