制御文

プログラムの実行の流れを、そのときの色々な条件によって変えたいときがあります。そんなときはif文を使います。

以下の例を見てください。

//プロジェクト名: control1
//メイン関数
//実行は必ずここから始まる。
int main(int argc, char* argv[])
{

    printf("あなたはうそつきですか?[y/n]\n");

    int ans = getc(stdin);
   
    if(ans == 'y')
    {
        //yキーを押された場合
        printf("あなたはうそつきです。");
    }
    else
    {
        //それ以外のキーが押された場合
        printf("あなたは正直者です。\n");
    }

    getc(stdin);
//Enterキーを読み飛ばす。
    getc(stdin);//Enterキーが押されるまで待つ

    return 0;
}

 

このプログラムは、「キーボードから一文字入力してその内容を変数ansに入れて、ansの内容によって表示する内容を変える」ということを行います。

if文は

if(条件式 )
{
    条件式が成り立つ場合に実行すること
}
else
{
    条件式が成り立たなかった場合に実行すること
}
 

という形式で記述します。

else以降は省略することが出来ます。次のプログラムがその例です。

//プロジェクト名: control2
int
main(int argc, char* argv[])
{

    printf("あなたの目の前にトラがいます。\n");
    printf("戦いますか?[y/n]\n");

    int ans = getc(stdin);
   
    if(ans == 'y')
    {
        //yキーを押された場合
        printf("あなたは戦いましたが、");
    }

    printf("トラに食べられました。\n");

    getc(stdin);
//Enterキーを読み飛ばす。
    getc(stdin);//Enterキーが押されるまで待つ

    return 0;
}

条件式

条件式には色々な書き方がありますが、よく使うのは、まず第一に==です。代入の=と混同しないでください。条件として等しいという意味を表現するときは==です。これは、始めに代入を=で書くと決めてしまったので仕方なく「等しい」を==に 決めたんだと覚えてください。

ところで、もしも

int a = 1;
if( a = 2)
{
    ....
}
のような書き方をすると条件式でaに代入するという動作をしてしまいます。

CやC++以外の言語では=が等式に解釈されるものもありますので複数の言語を同時に使うとき(職業プログラマでは良くあることです)はうっかりミスに注意してください。

条件式はその内容が成り立つかどうかを数字で表します。成り立つときは1(又は0以外の数字)、成り立たないときは0になります。1のことをtrue、0のことをfalseと書くこともあります。

int a = (1 == 1);
int b = (2 == 1);
printf("a = %d, b = %d", a, b);

のようなプログラムを書いて変数の値がどうなるか調べてください。

条件式は結局0か1になるので、

if(0)
{
    printf("こちらは実行されません。");
}
else
{
    printf("常にこちらが実行されます。");
}

このように書くとelseの中の文が必ず実行されます。逆に条件式の中に0以外の数を書くとifの直後の括弧の中が実行されます。試してみてください。

上の

if( a = 2)

はaに2を入れから、その値である2がif文の条件として解釈されます。よって、0以外の数を与えたことになり、条件は成り立ったと解釈されます。

条件式に関する言葉の使い方として、評価するという言葉が良く出てきます。上の文章を評価という言葉を使って書き換えると、

「aに2を入れから、その値である2がif文の条件として解釈されます。」≒「aに2を代入した後、if文によってその変数の内容が評価される。」

となります。

条件式の代表的なものは、

== 等しい != 等しくない
> 大小関係  
>= 左辺は右辺と等しい又は大きい  
< 大小関係  
<=  

もちろんこれだけではなく結果が数字になれば何でも条件として書けます。何でもかける分、分かりづらくなったり、==と=のような間違いを犯しやすいので注意してください。

複数の条件を書きたい場合もあります。

if( a == 1 && b == 2)
{
}

の例ではaが1で、かつ、bが2のとき条件式は成り立ちます。

if(a == 1 && b == 2 && c == 3 && d == 4)のようにいくつでもかけます。また、

if( a == 1 || b == 2)
{
}

はaが1、又は、bが2のとき条件式は成り立ちます。&&同様にいくつでもかけます。

&&と||を組み合わせて

if( (a == 1 || a == 2) && b <= 1 || c >1 )のように書けます。 カッコが優先順位を表すのは数学で習った数式のカッコと同様です。

条件式に関数も書けます。

//control2を修正する。
int
main(int argc, char* argv[])
{

    printf("あなたの目の前にトラがいます。\n");
    printf("戦いますか?[y/n]\n");
   
    if(getc(stdin) == 'y')
    {
        //yキーを押された場合
        printf("あなたは戦いましたが、");
    }

    printf("トラに食べられました。\n");

    getc(stdin);
//Enterキーを読み飛ばす。
    getc(stdin);//Enterキーが押されるまで待つ

    return 0;
}

上のプログラムでは、変数ansへの代入が省略され、関数の返り値が条件文で直接評価されています。

繰り返し

繰り返し同じことをしたり、少し違ったことを繰り返すという場面はよく出てきます。

繰り返しを行う文の代表はfor文でしょう。以下の例を見てください。

//プロジェクト名: control3

int main(int argc, char* argv[])
{
    int a[] = {5,4,3,2,1};
    for(int i = 1; i < 6; i++)// i++はi = i + 1と同じ意味(iを1増やす)
    {
        printf("%d\n", a[i-1]);
    }


    getc(stdin);//Enterキーが押されるまで待つ
    return 0;
}

for文は

for(文1; 条件式; 文2)
{
    繰り返す内容
}

という書き方をします。条件式はif文と同じです。条件が成り立つ間繰り返します。文1は最初に一回だけ実行されます。上のプログラムのように、変数の宣言と代入が記述されることが殆どです。文2は2回目以降の 各繰り返しの最初に実行されます。 言い換えると、文1は一回だけ実行され、文2は0回以上実行される可能性があります。文2の0回以上という意味ですが、for文は、はじめから条件式が満たされない場合、繰り返しが起こらないこともありうるのでこのような書き方になります。

for文の実行の流の手順を言葉で説明すると、
(1). 始めに文1が実行され、条件式が成り立つならば繰り返す内容を実行します。
(2). 次に文2が実行され条件式が成り立つならば繰り返す内容を実行します。移行は(2)を繰り返します。

条件式が成り立たなくなると繰り返しは終了します。

もう一度上の例題を見て(そして実行して)意味をよく理解してください。

それ以外の繰り返し文についても例を挙げておきます。これも実行して結果を確かめてください。

//プロジェクト名: control4

int main(int argc, char* argv[])
{
    int a[] = {5,4,3,2,1};
    printf("for文の例\n");
   
    for(int i = 1; i < 6; i++)
    {
        printf("%d\n", a[i-1]);
    }
   
    printf("while文の例\n");
    int t = 0;
    while(t < 5)
    {
        printf("%d\n", a[t]);
        t++;
    }

    printf("do-while文の例\n");
    t = 0;
    do
    {
        printf("%d\n", a[t]);
        t++;
    }
    while(t < 5);

    printf("全部同じ結果になります。\n");

    getc(stdin);
//Enterキーが押されるまで待つ

    return
0;
}
 

whileとdo-whileの違いは、whileが始めから条件をチェックするのに対して、do-whileは一度カッコの中を実行してから条件をチェックすることです。更に詳しいことを知りたい場合はインターネットやHELPを使って調べてください。活用していますか?

また、補足説明も見てください。

それでは、ここで課題に挑戦しましょう。