6.プログラムの制御

6-1. if文 もし…なら~
6-2. while文
6-3. for文
6-4. switch case による選択・分岐
6-5. break ループからの脱出
6-6. continue

6-1. if文 もし…なら~

いままでは、プログラムは上から順に書いていき、実行も順番どおりになっていました。

しかし、『はい・いいえ』で答えてそれぞれに対応した処理を行う時などプロセスを分岐させたい時、または回数を指定して繰り返し処理を行う時はプログラムを構造化して処理・制御する必要があります。

とういことで、プログラムの制御第1回はプロセスの分岐(if)について説明します。

◇If~もし…だったら~

ここで、でてきたIfキーワードをつかって基本的な書式を説明します。

書式1:
if(条件)条件が真の時に実行する1文;

書式2:
if(条件)条件が真のときに実行する1文;
else 条件が偽のときに実行する1文;

の2つです。

ここで1文でなく一連の処理をさせたい時は{中括弧}で囲んで複文にすればOKです。

また、条件の真偽は0か0以外かで判断します。

しかも、if文は2重3重に使うことができるので、分岐の多重化ができます。

今日は、理屈抜きでいきなりプログラムを作ってしまいます。
内容はどれでもいいのですが。判定プログラムにします。

題して『モバイル度判定』

まず、質問内容を決めておきます。

1.ノートパソコンを欲しいと思ったことがある。
2.いつも持ち歩いて使いたい。
3.たとえCDドライブがなくても軽いほうがいい。
4.分離型と一体型選ぶなら分離型だ!
5.HDドライブはいらない?
6.パソコンとの連携は当たり前。
7.メールだけでいい。

の7項目にしてみました。

構造としては、以下のような感じです。
fig6-1

では、実際にプログラミングしていきましょう。

最初に1の質問

printf(“ノートパソコンを欲しいと思ったことがある。\n”);

そして、YかNで答えます。それからifで分かれていきます。

では実際のプログラム、

#include<stdio.h>

main()
{
  char q1,q2,q3,q4,q5,q6,q7,buff;
  printf("ノートパソコンを欲しいと思ったことがある。(y/n):");scanf("%c%*[^ \n]",&q1);buff=getchar();
  if(q1=='y'||q1=='Y'){
    printf("いつも持ち歩いて使いたい。(y/n):");scanf("%c%*[^ \n]",&q2);buff=getchar();
    if(q2=='y'||q2=='Y'){
      printf("たとえCDドライブがなくても軽いほうがいい。(y/n):");scanf("%c%*[^ \n]",&q3);buff=getchar();
      if(q3=='y'||q3=='Y'){
        printf("HDドライブはいらない?。(y/n):");scanf("%c%*[^ \n]",&q5);buff=getchar();
        if(q5=='y'||q5=='Y'){
          printf("パソコンとの連携は当たり前。(y/n):");scanf("%c%*[^ \n]",&q6);buff=getchar();
          if(q6=='y'||q6=='Y')printf("PCと連携してあなたもPDA達人\n");
          else{
            printf("メールだけでいい。(y/n):");scanf("%c%*[^ \n]",&q7);buff=getchar();
            if(q7=='y'||q7=='Y') printf("メールを快適にポケットボード\n");
            else printf("電話帳からスケジュールまで携帯からケーブル一本で個人管理\n");
          }
        }
        else printf("どうしてもパソコンがいいあなたはB5以下の小型PCがお似合い。\n");
      }
      else{
        printf("分離型と一体型選ぶなら分離型だ!(y/n):");scanf("%c%*[^ \n]",&q4);buff=getchar();
        if(q4=='y'||q4=='Y') printf("臨機応変に使うあなたにはベースシステム分離型に決定!\n");
        else printf("薄型CDドライブ内蔵軽量ノートPCがいいでしょう\n");
      }
    }
    else printf("オールインワンノートがお勧めです。\n");
  }
  else printf("モバイル度0、今は特に必要ないでしょう。\n");
}

随分と、はみ出してしまいました。(スミマセン)
しかも、メルマガ用に敷き詰めましたので見ずらいと思います。

入力の判定はyes(y or Y)のみです。それ以外の文字はnoと判断します。

あと文字入力の時変な処理をしているように見えますが、これはバッファに残るごみを一掃するための処理です。

とにかく、C言語の標準入力は苦労する…
中にはscanfを使うからバグが…と言われる方もいそうですが。
scanfに限らずgetcharでも上のプログラムでは同じ不具合が出るので、応用も兼ねてscanfです。getcharのみだとバッファの初期化にwhileを使わないといけなくなるので…(コードが複雑化)