lC言語 条件判断 '96.11.15  
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 分岐   未使用  関数   ★ 
if else は C++ でも重要です。 

条件判断 if〜else〜
if(条件){処理T;}   例 if(x < 10){ printf("10 未満です。\n"); }

if(条件){処理T1;処理T2;処理T3;...;}

if(条件){処理T;} else{ 処理E;}

if(条件){処理T1;処理T2;処理T3;...;} else{処理E1;処理E2;処理E3;...;}

if(条件){処理T;処理T2;処理T3;...;}
else { if(条件){処理T1;処理T2;処理T3;...;}
       else   {
処理E1;処理E2;処理E3;...;}
     }
{ } の中の処理が 一個だけのときには、{ } の記述は省略できます。
if else は、最後の書式例のように、ネストすることができます。
条件の部分には X>5 のように、条件式を書きます。
7>5 のように、条件が成立するとき、その値は 1 になります。
3>5 のように、成立しない場合は 0 になります。
3+7 のような 0 以外の値はすべて 1 と見なされます。

条件の値が 1(True:真)ならば処理T が実行されます。処理E は実行されません。
条件の値が 0(False:偽)ならば処理E が実行されます。処理T は実行されません。
if(5) や if('A') の場合は、0 以外の値なので、処理T が実行されます。

処理T や処理E の中では、さらに if や else を使用できます。
このページの後半に、プログラム例があります。

if else を使ったプログラムの例(1)
#include<stdio.h>
main()
{
  int x=5;

  if(x>4)printf("4を越えます。\n");     /*  4 より大?       */

  if(x==5)printf("5です。\n");          /*  5 のとき        */
  else printf("5ではありません。\n");   /*    5 以外のとき */

  if(x<4)     printf("4未満です。\n");  /*  4 未満?         */
  else if(x<5)printf("5未満です。\n");  /*    5 未満?       */
  else if(x<6)printf("6未満です。\n");  /*      6 未満?     */
}

if else を使ったプログラムの例(2)
キーボードから入力された文字が、1バイトコードか、2バイトコードかを判定します。
#include<stdio.h>			/* ここに stdio.h を挿入します。OK */
void main()				/* 以下、処理の内容。*/
{
  char IN[128];				/* 文字を入力する為の配列を宣言します。*/
  printf("1文字目の種類を判定します。");	/* メッセージを表示します。*/
  printf("文字を入力して下さい。: ");
  gets(IN);					/* キーボードから入力します。*/

  if(IN[0] < 0x20) printf("Controlコード\n");  	/*  0←1F                      */
  else if(IN[0] < 0x80) printf("1Bytコード\n");	/*      20←7F                 */
  else if(IN[0] < 0xA0) printf("2Bytコード\n");	/*            80←9F           */
  else if(IN[0] < 0xE0) printf("1Bytコード\n");	/*                 A0←DF      */
  else			printf("2Bytコード\n");	/*                      E0←FF */
}

参考 : if else を使ったプログラムの例(3)
上記(2)と同じ処理をします。
上記の場合は、瑶(シフトJISコードEAA2)と入力した場合、4回の比較判定を受けます。
次の方法では、比較対象を順次2分割していくので、最大3回で済みます。
この方法は2分法検索と呼ばれ、大きなデータの場合ほど効果があります。
N個(N種類)の整列されたデータの中から一致するデータを検索する場合の比較回数をNとすると、
(2)の方法の場合 ... 最大N回。Nが 1,000,000 なら 1,000,000 回。
(3)の方法の場合 ... 最大約 log2N+1 回。Nが 1,000,000 なら約 21 回。

#include<stdio.h>			/* ここに stdio.h を挿入します。OK */
void main()				/* 以下、処理の内容。*/
{
  char IN[128];		/* */
  printf("1文字目の種類を判定します。");	/* メッセージを表示します。*/
  printf("文字を入力して下さい。: ");
  gets(IN);					/* キーボードから入力します。*/
  if(IN[0] < 0x80)				/*          ←80               */
  {
     if(IN[0] < 0x20)printf("Controlコード\n");	/*  0←1F                      */
     else	     printf("1Bytコード\n");	/*      20→7F                 */
  }
  else						/*            80→             */
  { if(IN[0] < 0xDF)				/*                   ←DF      */
    {  if(IN[0] < 0xA0)printf("2Bytコード\n");	/*            80←9F           */
        else	       printf("1Bytコード\n");	/*                 A0→DF      */
    }
    else	       printf("2Bytコード\n");	/*                      E0→FF */
  }
}
備考 : 2分法の原理
2分法の関数は、自分で作らなくてもCに用意されています。
特殊な形式のデータをソートしたい場合には、例えば次のようにします。

最大N個(例えば10個) の整列されたデータがあると仮定します。
まず、Nより大きい、最小の 1まで2分して行ける数M(16)を求めます。
Nを2進法で表わすと、
00001010
1を引くと、
00001001
カウントしながら右シフト( >> )します。(または2で割ります。)
0までシフトすると、シフト回数から 桁数(4) が得られます。
2を4乗すると、元の数10よりも大きいM(16)という数が得られます。
16は、2の整数乗ですから、1になるまで順次2分できる数です。
比較したいデータを、M個の中央のデータと比べます。
一致しなかった場合は、M個のデータを順次半分にしながら比べて行きます。

整列
半分にできないところまで調べても等しくなかった場合は、そのデータが存在しなかったのですから、その位置にデータを挿入します。
データを挿入するには、それよりも大きいデータ全体をシフトして、挿入できるスペースを作ってやります。
最初は? . . . 最初は1個のデータですから、整列する必要はありません。

大きなデータのとき
個々のデータが大きいと、整列のためのシフトに時間がかかります。
ポインタ配列で個々のデータをポイントするようにし、ポインタの方をシフトすれば時間が節約できます。


T


C言語 6 演算子 7 条件判断 8 分岐
 
  mtoga@sannet.ne.jp   登録日 '96. 6.15
URL : http://www.page.sannet.ne.jp/mtoga/index.html