◆◆◆◆アマゾンで購入する◆◆◆

7.プログラムの実行順序 
           内    容
(1)条件分岐
(2)条件判定の方法
(3)繰返し
(4)IF文
(5)演習


(1)条件分岐

プログラムでは,基本的には,
ソースプログラムの
前から後の方向
実行します。


ただし,条件によっては,
プログラムの流れを変える必要があります。
したがって,
条件判定が必要です。



(2)条件判定の方法

条件判定は,以下の2つの方法,
あるいはこれらの組合せで行います。

 ■関係式
 ■論理式


関係式は,以下のように書きます。

 ● A は B より大きいか?   A > B
 ● A は B より小さいか?   A < B
 ● A は B 以上か?      A >= B
 ● A は B 以下か?      A <= B
 ● A は B と等しいか?    A == B
 ● A は B が等しくいないか? A != B

演算子「>=」,「<=」,「!=」は,
ASCIIに「≧」,「≦」,「≠」の文字がないためです。

演算子「==」は,代入文の「=」と区別するために
こう書きます。

これらは通常の式の記号と異なりますが,
慣れましょう。

これらの式では,

 ●結果が真でないとき0,
 ●真のときゼロでない値(非ゼロ)

になります。

非ゼロを定数として
内部的にどう表現するか(1あるいは−1)は,
処理系によって異なります。

これを確認するには,
以下のようなプログラムを作って
実行してみると良いでしょう。

#include "stdafx.h"
int _tmain()
{ int a; a = 10 ==10;
  printf("\n *** 10 == 10 : %d",a);
}

ただし,真のときの値が−1になっているからといって,
積極的のこの値を使ってはいけません。

例えば,以下のような表現で
A に0の値を期待するような記述は,
もってのほかです。

  A = (B == C) + 1;

同様に,真のときの値が1になっているからといって,
A に0の値を期待するような記述は,
もってのほかです。

  A = (B == C) - 1;

論理式は,以下のように書きます。


 ●論理的AND  A && B
  (AかつBが成り立つとき真,それ以外は偽)
 ●論理的OR   A || B
  (AまたはBが成り立つとき真,それ以外は偽)
 ●論理的否定  ! A
  (Aが成り立つとき偽,成り立たないとき真)

あえて論理的としているのは,ビットハンドリングの

 ●ビットAND A & B
 ●ビットOR  A | B
 ●ビット反転  ~ A

と区別するためです。

関係式と論理式を組み合わせた例を
以下に示します。

[例]Xが10以上20未満を表現するには,
  以下のように書きます。

     X >= 10 && X < 20

  お勧めしませんが,
  好みによっては,次のように書く人もいます。

     10 <= X && X < 20

(3)繰返し

繰返しの処理を考えるときは,

  ■最初に終わりの条件を考えるくせ

をつけましょう。

処理部分を考えたあとで,
終了条件はどうなるかを考えると,
複雑な処理のとき,

  ■永久ループに陥るプログラム

を書きがちです。

これは経験則です。
普通の教科書には書いていませんが
しつけの部類だと思ってください。

[例題1]

整数値が入力されている間,
表示するプログラムを以下に示します。

#include "stdafx.h"
int main(int argc, char* argv[])
{ int a; printf("\n");
 while(scanf("%d",&a)) /* エラーがない間繰り返す */
 printf("*** a = %d \n",a);
}


終わらせるには,数字でない文字を入力して,
[ENTER]キーを押して下さい。

[例題2]
繰り返す部分が複数文からなるとき,
その範囲を{と}で囲みます。
これを複文またはブロックと呼びます。


#include "stdafx.h”
int main(int argc, char* argv[])
{ int a, total; total = 0;/*totalを初期化*/
 printf("\n");
 while(scanf("%d",&a))
 {
  total = total + a; /*totalにaを加算*/
  printf("*** a = %d (累計 %d) \n",
      a, total);

 }
}

なお,以下の部分を

 while(scanf("%d",&a))
 {
   total = total + a; /* totalにaを加算 */
   printf("*** a = %d (累計 %d) \n",a, total);
  }

次のように書くべきだとする伝統的なスタイル論争があります。

 while(scanf("%d",&a)) {
   total = total + a; /* totalにaを加算 */
    printf("*** a = %d (累計 %d) \n",a, total);
 }

しかし,私は書く人の勝手だと思っていますので,
強制はしません。


[例題3]

文字データを用いた繰返しの例を以下に示します。

 #include "stdafx.h"
 int main(int argc, char* argv[])
 {
   char CH;
   CH=getchar(); /* 1文字入力*/
   while(CH != EOF)
   {
     putchar(CH); /* 1文字表示 */
     CH=getchar();/* 1文字入力 */
   }
 }

例題中の関数getchar,putcharは,
1文字ずつ入出力する関数です。

また,EOFという値は,
[CTRL]とZが同時に押されたときの
getcharの返却値です。

ですから,実行を終わらせるときは
[CTRL]とZを同時に押し,[ENTER]を押します。

ただし,実行してみると
プログラムの動きがちょっと変であることに
気がつきませんか?

プログラム上は,1文字ずつ入力して,
すぐ表示しているように見えますが,

プログラムを実行してみると
リターンキーを押してから表示されます。

この理由は,関数getcharでは,
1行のデータをバッファに入れてしまってから
1文字ずつ取り出しているからです。

関数 putcharでも,
キャリッジリターンコード(CR:[ENTER]のコード)を
行の終わりとして,
1行のデータがたまってから出力しています。

このような余計な処理を行いたくないときは,
もっと低レベルの関数を使う必要があります。

以下がそのプログラムですが,
使っている関数は処理系によって異なります。
このプログラムは Visual C++専用です。

 #include "stdafx.h"
 #include <conio.h>
  /* このincludeを忘れないように */
 int main(int argc, char* argv[])
 {
   char CH;
   CH = _getch();
   while(CH != 0x1A)
   {
     _putch(CH);
     if(CH==0x0D) _putch('\n');
     CH = _getch();
   }
 }

関数_getch,_putchは,処理系依存ですので
使っている処理系で調べましょう。

なお,Visual C++の_getchでは
入力された文字をエコー表示しません。
エコー表示させるには,_getcheを使います。

(4)IF文

場合によって,実行する文を変えるときは,
以下のように書きます。

  if (論理式) 文1;
  else     文2;

または,論理式が偽のときの処理(文2)がなければ

  if (論理式) 文1;

の形式で書きます。

たとえば,a,b のいずれか大きい値を
c に代入するには,

    if(a > b) c = a;
   else   c = b;

と書きます。

ところで,以下のような文は,

  if (a > b)
    if(b > c) Z = b;
       else Z = a;

は,次のように解釈されます。

   If(a > b)
   {
     if(b > c) Z = b;
     else Z = a;
   }

分かりづらいので,あえて中括弧を付けて,
下のように記述するほうが良いでしょう。

返しの処理を考えるときは,

  ■最初に終わりの条件を考えるくせ

をつけましょう。

[if文の例題]

2つの整数値を入力し,
大きな方の値を表示するプログラムの例を
示します。

 #include "stdafx.h"
 int main(int argc, char* argv[])
 {
  int a, b,c;
  printf("\n* a=");
  while(scanf("%d",&a))
  {
   printf("* b=");
   scanf("%d", &b);
   /*大きなほうをcに代入する */
   if(a > b) c = a;
   else   c = b;
   printf("\n maximum a, b = %d \n",c);
   printf("\n* a="); /* 次の入力のガイド*/
  }
 }

(5)演習

@ 倍精度浮動小数点のデータを2個入力して,
  乗算結果を表示するプログラムを
  作成してください。

A 2つの整数値を入力して,

    ・最初の数値が大きかったら >
    ・最初の数値が小さかったら <
    ・同じなら            =

  を表示するプログラムを作成してください。

場合によって,実行する文を変えるときは,
以下のように書きます。

 1.C言語の誕生

 2.C言語の仲間たち

 3.新しい言語をすばやく覚えるには

 4.Cでプログラミング

 5.データの入れ物 変数の考え方

 6.注釈・定数

 7.プログラムの実行順序

 8.配列

 9.C言語特有の代入文・制御構造

10.関数の話

11.構造体と共用体

12.ビット演算

13.プログラムの場所をポインタで

14.ファイルの入出力

15.色々な便利な方法