本ブログの前々回で「基本情報技術者試験のサンプル問題を解こう!(4)(科目A)「状態遷移図」」をご紹介した。
状態遷移図は、オートマトンの状態遷移を視覚的に表現した図のことである。

今回は、この問題に対応するオートマトンの動作をシミュレートする 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[] = "..."
を変更すれば任意の入力で出力列を確認できる。
コメント