Вы определили 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;
}