Реализация конечного автомата в C - PullRequest
2 голосов
/ 15 ноября 2011

Я пишу код, который принимает или отклоняет строку входных символов как часть указанного языка.И я написал код для первого языка, но он не принимает правильные вещи, и мне было интересно, если кто-нибудь может дать мне подсказку о том, где я ошибся.спасибо

Вопрос: Почему язык не будет принят или отклонен правильно?

Спасибо

Мой код:

#include <stdio.h>

static final char initial_state = '0';
static final char 0 = '0';
static final char 1 = '1';
static final char 2 = '2';
static final char 3 = '3';

int main(int argc, char* argv[]){
  int x;
  char current_state, next_state, initial_state;
  current_state = initial_state;

  printf("Enter a string of characters: ");
  while(scanf("%d", &x)!=EOF){
     switch(current_state){
      case 0: /*initial state*/
       switch(current_state){
       case'0':next_state=1; break;
       case'1':next_state=0; break;
       }
       break;
     case 1: /*Last input was 0*/
      switch(current_state){
      case'0':next_state=1; break;
      case'1':next_state=2; break;
      }
      break;
     case 2: /*Last input was 1*/
      switch(current_state){
      case'0':next_state=3; break;
      case'1':next_state=0; break;
      }
      break;
     case 3: /*Last input was 0*/
      switch(current_state){
      case'0':next_state=3; break;
      case'1':next_state=3; break;
      }
      break;
     }
     current_state=next_state;
    }
  if((current_state==next_state)){
    printf("Language 1 accepts");
  }else if((current_state!=next_state)){
    printf("Language 1 rejects");
  }
  return 0;
}

Ответы [ 4 ]

2 голосов
/ 15 ноября 2011

Вы включаете только current_state, а не вход.

2 голосов
/ 15 ноября 2011

Вы устанавливаете начальное состояние как ноль символа, а не числовой ноль.Попробуйте вместо этого:

static final char initial_state = 0;
1 голос
/ 15 ноября 2011

Вы определили initial_state дважды, и местный выигрывает "войну разума". Так что в вашем коде каждый раз, когда вы думаете, что ссылаетесь на это initial_state:

static final char initial_state = '0';

вы на самом деле ссылаетесь на это начальное состояние:

char current_state, next_state, initial_state;  // this last guy here

Кроме того, вы делаете некоторые цифры и некоторые символы. Вы хотите, чтобы все символы, так как вы берете ввод с клавиатуры. В любом месте, в котором вы определяете состояние как 1 или 0, заключите в него одинарные кавычки, чтобы это было '1' или '0'.

Затем выньте код, который переопределяет 1 = '1' для всех состояний; Я верю, что вы просите программу переопределить число 0x1, чтобы обозначить число 0x41 - это безумие.

Вот окончательный результат (плохо отформатированный):

#include <stdio.h>

static const char initial_state = '0';
static const char accepting_state = '3';
int main(int argc, char* argv[]){
  int x;
  char current_state;

  current_state = initial_state;
  printf("Enter a series of characters (0 or 1)\n");
  printf("Press <ctrl-d> to finish.\n");
  printf("> ");
  while(scanf("%d", &x)!=EOF){
     x += '0';
         switch(current_state){
      case '0': /*initial state*/
       switch(x){
       case'0':current_state='1'; break;
       case'1':current_state='0'; break;
       default: goto fail;
       }
       break;
     case '1': /*Last input was 0*/
      switch(x){
      case'0':current_state='1'; break;
      case'1':current_state='2'; break;
      default: goto fail;
      }
      break;
     case '2': /*Last input was 1*/
      switch(x){
      case'0':current_state='3'; break;
      case'1':current_state='0'; break;
      default: goto fail;
      }
      break;
     case '3': /*Last input was 0*/
      switch(x){
      case'0':current_state='3'; break;
      case'1':current_state='3'; break;
      default: goto fail;
      }
      break;
     default: goto fail;
     }
     printf("> ");
  }

  if (current_state == accepting_state) {
    printf("Language accepts!\n");
  } else {
    printf("Language rejects.\n");
  }
  return 0;

fail:
  printf("Invalid input\n");
  return 1;
}
1 голос
/ 15 ноября 2011

Поскольку внутренний переключатель является символом, я полагаю, вы имели в виду, что он включен x, а не current_state:

 switch(current_state){
  case 0: /*initial state*/
   switch(x){
   case'0':next_state=1; break;
   case'1':next_state=0; break;
   }
   break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...