C言語のきほん「オートマトンの動作をシミュレートする」

スポンサーリンク
C言語

本ブログの前々回で「基本情報技術者試験のサンプル問題を解こう!(4)(科目A)「状態遷移図」」をご紹介した。

状態遷移図は、オートマトンの状態遷移を視覚的に表現した図のことである。

入力記号は左から順に読み込まれるものとする。また,S1 は初期状態を表し,遷移の矢印のラベルは,入力/出力を表している。

今回は、この問題に対応するオートマトンの動作をシミュレートする C言語のプログラムをご紹介しよう。

//オートマトンの動作をシミュレートするプログラム

#include <stdio.h>
#include <string.h>

// 状態を列挙型で定義
typedef enum { S1, S2, S3 } State;

int main() {
    char input[] = "0011001110";
    char output[sizeof(input)] = "";
    State state = S1;

    for (int i = 0; i < strlen(input); i++) {
        char symbol = input[i];

        switch (state) {
            case S1:
                if (symbol == '0') {
                    output[i] = '0';
                    state = S1;
                } else if (symbol == '1') {
                    output[i] = '0';
                    state = S2;
                }
                break;

            case S2:
                if (symbol == '0') {
                    output[i] = '0';
                    state = S1;
                } else if (symbol == '1') {
                    output[i] = '1';
                    state = S3;
                }
                break;

            case S3:
                if (symbol == '0') {
                    output[i] = '0';
                    state = S1;
                } else if (symbol == '1') {
                    output[i] = '1';
                    state = S3;
                }
                break;
        }
    }

    printf("入力列: %s\n", input);
    printf("出力列: %s\n", output);

    return 0;
}


実行結果

入力列: 0011001110
出力列: 0001000110
  • enum で状態 S1, S2, S3 を定義する
  • 入力文字を1文字ずつ処理し、状態と出力を更新する
  • switch 文を用いて、状態ごとの分岐を記述する
  • 出力は char output[] に蓄積して、最後に表示する

このコードは、他の入力列でも使える。
char input[] = "..." を変更すれば任意の入力で出力列を確認できる。

コメント

タイトルとURLをコピーしました