【a,b】から「a」で始まり「a」で終わる文字列を判定するDFA構築プログラム
DFA(決定性有限オートマトン)とは
DFA(Deterministic Finite Automata:決定性有限オートマトン)とは、定義された受理条件に基づいて文字列を受理または拒否する有限状態機械です。
本記事では、「a」で始まり「a」で終わる文字列を受理するDFAを作成します。入力として使用できるのは、集合 {a, b} に含まれる文字のみです。この条件をもとにDFAを設計していきます。まず、DFAが受理する有効なケースと拒否する無効なケースについて確認しましょう。
受理される文字列の例
- ababba
- aabba
- aa
- a
拒否される文字列の例
- ab
- b
- aabab
プログラム例
以下のプログラムは、与えられた文字列が「a」で始まり「a」で終わるかどうかを判定します。このDFAは、先頭と末尾がどちらも「a」であるすべての文字列を受理対象とみなします。コードでは、文字列の最初の要素と最後の要素が一致しているかどうかをチェックし、それ以外の間にある文字は {a, b} のいずれであっても構いません。
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char str[] = "ababba";
int length = strlen(str);
if(str[0] == 'a' && str[length-1] == 'a'){
printf("Accepted");
} else {
printf("Rejected");
}
return 0;
}
出力結果
Accepted
このように、DFAの考え方を用いることで、文字列の先頭と末尾の条件を簡潔に判定できます。実際のDFAでは状態遷移図を用いて各状態を明示的に定義しますが、プログラム上では上記のように条件分岐で表現できます。
-
C言語のループ制御文(for・while・do-while)を徹底解説!フローチャートとサンプルコード付き
C言語におけるループ制御文は、同じ処理を何度も繰り返し実行したい場合に使われる重要な構文です。毎回コードを書き連ねる必要がなくなり、プログラムを簡潔かつ効率的に記述できます。 C言語で利用できるループ制御文は、主に以下の3種類です。 for文 while文 do-while文 本記事では、それぞれの構文の書き方、フローチャートによる動作の流れ、実際に動くサンプルプログラムと実行結果まで、初心者にもわかりやすく解説します。 for文とは?基本構文と使い方 for文は、「初期化」「条件式」「増減式」を1行にまとめて記述できる、最もよく使われるループ構文です。繰り返す回数があらかじめ決まっている
-
C言語で連結リストの末尾からn番目のノードを取得するプログラム
n個のノードからなる連結リストが与えられたとき、その末尾からn番目のノードを出力するのが本記事の目的です。プログラムはリスト内のノードの並び順を変更してはならず、あくまで末尾から数えてn番目に位置するノードの値を表示するだけでなければなりません。具体例入力 -: 10 20 30 40 50 60 N = 3 出力 -: 40上記の例では、先頭ノードから順に「count − n」個目までのノード(10, 20, 30, 40, 50, 60)を走査し、末尾から3番目のノードとして 40 が得られます。効率的なアプローチリスト全体を最後まで走査しなくても、以下の手順で目的のノードを見つけられ