(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.色々な便利な方法
|