ログイン
kid's world

多分岐を実現するswitch文

多分岐を実現するswitch文

if文が使いこなせればいろんなことができるようになる。では腕試しとして,ユーザが「y」か「n」を入力したときに「はい」や「いいえ」を表示し,それ以外のときに「yかnを入力してください」と表示するようにしよう。

各自でいろいろなやり方を考えていただ

きたいが,たとえば,List 7のように書く

ことができるだろう。

List 7: if文による入力選択の処理

#include <stdio.h>

main()
{
  char c;

  c=getchar();
  
  if (c=='y') 
    printf("はい\n");
  else
    if (c=='n')
      printf("いいえ\n");
    else
      printf("yかnを入力してください");
}

さて,yとnだけでよかったので今回はこれだけで済んだが,処理しなければならない文字がどんどんと増えていったらどうすればよいのだろうか。どんどんとif文は複雑になっていって,非常に読みにくくなってしまう。

こんなときに便利な制御文がある。それがこれから解説するswitch文だ。switch文はif文とは違って条件を指定するのではなく,指定した式の値によって分岐する制御文である。

switch文はFig. 2のような構造をしている。これだけを見ると,何のことやらよくわからないが,List 8の例を見ればわかるはずだ。

Fig. 2 switch文の構文

switch(式) {
  case 定数式1: 文1a 文1b ...
  case 定数式2: 文2a 文2b ...
  ...
  case 定数式n: 文na 文nb ...
  default: 文da 文db ...
}

List 8: switch文による入力選択の処理(誤り)

#include <stdio.h>

main()
{
  char c = getchar();

  switch(c) {
    case 'y':
      printf("はい\n");
    case 'n':
      printf("いいえ\n");
    default: 
      printf("yかnを入力してください\n");
  }
}

この場合,yを入力すると「はい」,nを入力すると「いいえ」,そしてそれ以外のときは「yかnを入力してください」と表示される。……といいたいところなのだが,実はそうはいかない。「y」を入力したときの結果はFig. 3のようになる。

Fig. 3: 「y」を入力したときの結果

y
はい
いいえ
yかnを入力してください

すべてのメッセージが表示されてしまった。また壊れたか! 怒らないでいただきたい。これもやはり正常だ。いったい何が起きたのかというと,変数cに’y’が入っているとき,制御は「case ’y’:」以降に移されるのは確かなのだが,実はそのあとにcase文がきても,関係なく順番に処理を続行してしまうのだ。そのため,「ここで終わりかswitch文を抜けろ」と指示を出さなければならない。

その指示は,break文で出すことができる。break文を実行すると,switch文から直ちに抜け出す(List 9)。

List 9: switch文による入力選択の処理

#include <stdio.h>

main()
{
  char c = getchar();

  switch(c) {
    case 'y':  
      printf("はい\n");
      break;
    case 'n': 
      printf("いいえ\n");
      break;
    default:
      printf("yかnを入力してください\n"); 
  }
}

このことを逆手に利用すれば,ユーザがyやnを大文字で入力してきた場合にも対処することができる。実際にこのような書き方はよくされている(List 10)。

List 10:大文字の入力にも対処する

#include <stdio.h>

main()
{
  char c = getchar();

  switch(c) {
    case 'y':  
    case 'Y':
      printf("はい\n");
      break;
    case 'n':
    case 'N': 
      printf("いいえ\n");
      break;
    default:
      printf("yかnを入力してください\n"); 
  }
}

今月は何日まである?」へ進む

広告


©Toshio Koide 1996-2007.

目次

リンクについて

リンクは御自由にどうぞ。

メール

mail.gif

広告