【C言語】配列(決定表)を利用して冗長なIF文を一気に削減

はじめに

こんにちは、野村です。

今回は、プログラムを勉強し始めた頃に知ったことを紹介してみます。
全然大したことじゃありません。でも当時は感動したのですよ。

じゃんけんプログラムを何も考えずに書く

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int judgement(int a, int b){
  if (a == b) return 2;
  if (a == 0 && b == 1) return 0;
  if (a == 1 && b == 2) return 0;
  if (a == 2 && b == 0) return 0;
  return 1;
}

int main(){
  int a, b, c;
  srand(time(NULL));

  printf("guu:0, choki:1, paa:2 ");
  scanf("%d", &a);
  if (a<0 || a>2) a=0;

  b = rand() % 3;

  c = judgement(a, b);

  if (c == 0) printf("Win\n");
  if (c == 1) printf("Lose\n");
  if (c == 2) printf("Draw\n");

  return 0;
}

その昔、実際こんな感じで組んだもんです。
で、「じゃんけんは作れたけど、ブロック崩しを作るにはどうしたもんだろ?」と途方に暮れました。
いちいちIF文で処理を分岐しなきゃいかんのか?

決定表を使って書き直してみる

そんなとき「決定表」の存在を知ったのですよ。
予測できる事態をすべて表にまとめ、配列として組み込む方法です。

自分\相手 グー チョキ パー
グー Draw Win Lose
チョキ Lose Draw Win
パー Win Lose Draw
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int judgement(int a, int b){
  static const int result[3][3] = {
    {2, 0, 1},
    {1, 2, 0},
    {0, 1, 2}
  };
  return result[a][b];
}

int main(){
  int a, b, c;
  srand(time(NULL));

  printf("guu:0, choki:1, paa:2 ");
  scanf("%d", &a);
  if (a<0 || a>2) a=0;

  b = rand() % 3;

  c = judgement(a, b);

  static const char message[3][5] = {"Win", "Lose", "Draw"};
  printf("%s\n", message[c]);

  return 0;
}

8箇所あったIF文が1つに減った!

最後に

以上、配列(決定表)を利用して冗長なIF文を一気に削減する方法を紹介しました。

こんな感じで、2次元、3次元、4次元と決定表の次元を増やすことで、より複雑な処理を実現できる。

実際にこの方法を駆使してブロック崩しを作りましたよ。いい思い出です。

というわけで、今回はこれにて。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

野村 野村のプロフィール
メインPCはWindows10のVirtualBox上のFreeBSD。Linux/Unixの小ネタを求めて日々右往左往してたりする。