ぼんさい塾

ぼんさいノートと補遺に関する素材や注釈です.ミスが多いので初稿から1週間を経た重要な修正のみ最終更新日を残しています.

Cの文法 (5)

2010-08-14 19:11:31 | 暮らし
「まず覚えるCの文法」

P25: for文
//-------------------------------------
#include <stdio.h>
int main(void){
   int i, k=1;
   for(i=1; i<10; i++){k=k*i;}
   printf("k=%d\n", k);
   return 0;
}
//-------------------------------------

P26: break文
//-------------------------------------
#include <stdio.h>
int main(void){
  int k,a,b,c,d,m,n;
  a=b=c=d=m=n=0;
  while(1){
    printf("k="); scanf("%d", &k);
    if(k<0){break;}
    if(k>=80){
      a++; if(k==m){n++;}
      if(k>m){m=k; n=1;}
    }
    else if(k>=70){b++;}
    else if(k>=60){c++;}
    else{d++;}
  }
  printf("%d,%d,%d,%d;", a, b, c, d);
  printf("%d,%d\n", m, n);
  return 0;
}
//-------------------------------------

P27: switch文
//-------------------------------------
#include <stdio.h>
int main(void){
  int k,a,b,c,d,m,n;
  a=b=c=d=m=n=0;
  while(1){
    printf("k="); scanf("%d", &k);
    if(k<0){break;}
    switch(k/10){
      case 10:
      case  9:
      case  8: a++; if(k==m){n++;}
               if(k>m){m=k; n=1;}
               break;
      case  7: b++; break;
      case  6: c++; break;
      default: d++;
    }
  }
  printf("%d,%d,%d,%d;", a, b, c, d);
  printf("%d,%d\n", m, n);
  return 0;
}
//-------------------------------------

P25 のプログラムの 
  for(i=1; i<10; i++){k=k*i;}
の部分は
  i=1; while(i<10){k=k*i; i++;}
と同じ処理を行います.一般に
  式1; while(式2){ 式3;}
は,つねに
  for(式1; 式2; 式3){}
と書き換えることができます.ただし「文」は実行文
を意味します(宣言文は不可)(#11&).

・プログラムを実行すると,1 から 9 までの積が
    k=362880
  と表示されます.
・「i=1」は式,「i=1;」は文です(#15).
・「i=1,k=1」も式で,「k=i=1」と等価です.また,
  文「i=1,k=1;」は「i=1; k=1;」と等価です(@37).
・単純な while 文「while(k>0){k--;}」でも for 文
  で「for(; k>0;){k--;}」と表現できます.

P26 のプログラムでは break文を使って P24 のプロ
グラム中の
  printf("k="); scanf("%d", &k);
の重複を避けています.

・break文は(最も内側の)while文,for文,switch文
  の直後にジャンプします(#26).
・break文ほど使用頻度は高くありませんが,continue
  文で(最も内側の)while文の直前にジャンプさせる
  ことができます.
    for(式1; 式2; 式3){}
  の{}中で continue 文を実行したときは等価な
  while 文の先頭の処理である 式2 の真偽の判定に
  戻ります(#26).

P27 のプログラムでは 0≦k≦100 を前提に P24 のプロ
グラム中の if-else 文による分岐を switch文を使って
書き換えています.

・k/10 の値は小数部を切り捨てます(#12).
.switch文の部分での処理内容は
    if(k/10==10 || k/10==9 || k/10==8){
      a++; if(k==m){n++;} if(k>m){m=k; n=1;}
    }else if(k/10==7){
      b++;
    }else if(k/10==6){
      c++;
    }else{
      d++;
    }
  と等価です.
・k/10==7 のときはジャンプテーブルによって goto文
  と同様に,直接「case 7:」の位置にジャンプします.
  したがって,先頭から条件式の真偽を調べる if-else
  文に比べて高速に分岐できます.
・「case :」のは相異なる整数値の定数式です.
  式の値からジャンプテーブル内の相対アドレスを計算
  します.