有穷自动机()

#include <stdio.h>
 //s为初态,z为终态
 int in(int s,int z)
{
    if(s == z)
     {
        printf("\n这个状态属于 Z");
        return 1;
     }
     else
     {
         return 0;
     }
 }
 //s为状态,t为输入的字符
 int step(int s,char t)
 {
     if(t == ‘a‘)
         switch(s)
         {
             case 0:return 1;
             case 1:return 3;
             case 2:return 1;
             case 3:return 3;
         }
     else if(t == ‘b‘)
         switch(s)
         {
             case 0:return 2;
             case 1:return 2;
             case 2:return 3;
             case 3:return 3;
         }
 }

 int realize(char *input)
 {
     int z = 3;
     int s,i;
     s = 0;
     for(i=0;input[i]!=‘\n‘;i++)
     {
         printf("%2d",s);
         s = step(s,input[i]);
     }
         if(in(s,z))
         {
             return 1;
         }
         else
         {
             return 0;
         }
 }

 main()
 {
     int i;
     int a;
     int x=1;
     char input[40];
     printf("FA=({0,1,2,3},{a,b},M,0,{3})\n");
     printf("M:\n");
     printf("    M(0,a)=1    M(0,b)=2\n");
     printf("    M(1,a)=3    M(1,b)=2\n");
     printf("    M(2,a)=1    M(2,b)=3\n");
     printf("    M(3,a)=3    M(3,b)=3\n");

     printf("请输入你要检查的串:\n");

 lop:    for(i=0;input[i-1] != ‘\n‘;i++)
         {
             scanf("%c",&input[i]);
         }
         for(i=0;input[i-1]!=‘\n‘;i++)
         {
             if(input[i] != ‘a‘&&input[i] != ‘b‘&&input[i] != ‘\n‘)
             {
                 printf("错误,重新输入字符串:\n");
                 goto lop;
             }

         }
         printf("这个状态序列 :\n");
         a = realize(input);
         if(a == 1)
             printf("\n这个字符串可以识别\n");
         else
             printf("\n这个字符串不能识别\n");
         printf("按回车退出系统\n");
         getchar();

 }

  参考了网上的,还不是很理解。

时间: 2024-10-05 07:27:10

有穷自动机()的相关文章

(1)从正则表达式到有穷自动机,识别字符串(算法思想及代码实现)

正则表达式: 正则表达式是当前主流的字符串识别机制之一,另外一种是文法识别. 和文法相比,正则表达式具有构造相对简单,运行效率较高的特点,所以一般的字符串识别会使用正则表达式. 正则表达式有三种主要运算符是我们在构造词法分析器生成器LEX需要用到的:*.|.连接 *代表闭包运算,假如有一个字符串a,那么a*就代表由任意个字符串a组合成的字符串,包括空串(0个字符串a组合成的字符串),如 *={空串,a,aa,aaa.....} |代表或运算,不同于*闭包运算,|是针对两个字符串的,假如有两个字符

什么是有穷自动机

有穷自动机的非形式化定义 非形式化定义,即非数学语言的定义. 自动机是一种抽象的机器,它有很多个状态,用圆圈来表示.状态与状态之间有箭头,箭头上有所需要的条件, 也即只有满足箭头上的条件时才能从一个状态走到另一个状态.状态的目的是记住系统历史的有关部分,也即记住所 输入的字符串都满足了自动机系统的哪些条件,这就是所说的记住历史.而有穷就是说这个自动机的状态是有限的, 这样才能够编程来实现它.下面是一个简单的有穷自动机,它扫描所给的字符串,判断其中是否包含字符串then. 有穷自动机的形式化定义

使用状态机(有穷自动机)实现 printf功能

有穷自动机是编译原理讲的,在词法分析中使用比较广泛.因为它仅仅能分析正则规则的语言,因此使用起来比较简单.现在我们使用它来实现printf printf 的原理是 输入: 一个格式串 不定个数的参数 在控制台上输出. 我们这里实现这个函数不在控制台输出,而是得到一个串,然后这个串可以任意的处理. char* myprint(char* format,...) 从状态0开始(初始状态) --->状态0 当遇到%,--->状态0--->状态1 这个时候处于接收后续的myprint的参数类型的

SCUT 2014 B题 Numbers (DFA有穷自动机)

题目链接:   SCUT 2014 题目大意:   判断给出的字符串中是否是正确的科学计数法 A+1.5Be+8C,可以是实数或者含有指数的实数,ABC三个部分表示空格,可有可无,正负号可有可无 指数部分只能是整数 解题思路:   建立有穷自动机状态转移表,一共是10种状态 -1表示无法不合法,最终状态为0 2 4 5 8 9五种状态均为合法,其余的都为非法 代码: #include <stdio.h> #include <stdlib.h> #include <string

有穷自动机(NFA、DFA)&amp;正规文法&amp;正规式之间的相互转化构造方法

在编译原理(第三版清华大学出版社出版)中第三章的词法分析中,3.4.3.5.3.6小节中分别讲解了 1.什么是NFA(不确定的有穷自动机)和DFA(确定的有穷自动机) 2.如何将  不确定的有穷自动机(NFA)  转化为  确定的有穷自动机(DFA); 3.如何化简DFA; 4.正规式和有穷自动机的等价性(根据给出的正规式构造有穷自动机); 5.正规文法和有穷自动机的等价性(根据给出的正规式构建有穷自动机): 个人在开始学习这一章节的时候,课上听得有些迷惑,并且看书也是感觉没有头绪,后来花了一些

[Computation]有穷自动机

有穷自动机 *太简单辽,可以跳过* 有穷自动机:受到严格限制的实际计算机的模型 字符串被送入称作输入带的设备,带被划分成方格,每个方格写一个符号.机器的主要部分是一个带有内部结构的"黑盒子"(有穷控制器),在任一特定的时刻它处于有穷个不同的内部状态中的一个,通过可移动的读头能够了解输入带的任何位置上写着什么符号.开始时候,读头放在带的最左边的方格上,有穷控制器处于一个指定的初始状态.每隔一定时间有穷自动机从输入带上读一个符号,然后进入一个新的状态,与当前状态和刚读到的符号有关(确定型有

有穷自动机的转换

1 #include<stdio.h> 2 main() 3 { 4 int i=0,j=0,x=0,y; 5 int number=2; 6 int count=0; 7 char ch; 8 char a[100][100]; 9 printf("请输入正规式以#结束 :\n"); 10 printf("^代表空\n"); 11 printf("|代表或\n"); 12 ch=getchar(); 13 do 14 { 15 if

1203有穷自动机

#include<string.h>#include<stdio.h>#include<stdlib.h>int main(){    char p[30][30];//存放文法    char q[30][30];    int line=0;    int n;    int i,j;    int count=0;    int k,t=0;    int flag=0;    int l,m=0;    char VN[30]={'\0'};//存放非终结符号 

131-有确定性的有穷自动机

#include <stdio.h> //s为初态,z为终态 int in(int s,int z) { if(s == z) { printf("3\nlook!the last status belongs to Z"); return 1; } else { return 0; } } //s为状态,t为输入的字符 int step(int s,char t) { if(t == 'a') switch(s) { case 0:return 1; case 1:ret