C program for DFA accept binary string which decimal equivalent is divisible by 5
DFA accept binary string which decimal equivalent is divisible by 5
Binary string decimal equivalent(a) We need that the number of a's will be only multiple of 5, mod(5)=0 e.g 0mod(5)=0,5mod(5)=0,10mod(5)=0
#include <stdio.h>
#define TOTAL_STATES 5
#define FINAL_STATES 1
#define ALPHABET_CHARCTERS 2
#define UNKNOWN_SYMBOL_ERR 0
#define NOT_REACHED_FINAL_STATE 1
#define REACHED_FINAL_STATE 2
enum DFA_STATES{q0,q1,q2,q3,q4};
enum input{a,b};
int Accepted_states[FINAL_STATES]={q0};
char alphabet[ALPHABET_CHARCTERS]={'0','1'};
int Transition_Table[TOTAL_STATES][ALPHABET_CHARCTERS];
int Current_state=q0;
void DefineDFA()
{
Transition_Table[q0][0] = q0;
Transition_Table[q0][1] = q1;
Transition_Table[q1][0] = q2;
Transition_Table[q1][1] = q3;
Transition_Table[q2][0] = q4;
Transition_Table[q2][1] = q0;
Transition_Table[q3][0] = q1;
Transition_Table[q3][1] = q2;
Transition_Table[q4][0] = q3;
Transition_Table[q4][1] = q4;
}
int DFA(char current_symbol)
{
int i,pos;
for(pos=0;pos<ALPHABET_CHARCTERS; pos++)
if(current_symbol==alphabet[pos])
break;//stops if symbol is defferent
if(pos==ALPHABET_CHARCTERS)
return UNKNOWN_SYMBOL_ERR;
for(i=0;i<FINAL_STATES;i++)
if((Current_state=Transition_Table[Current_state][pos])==Accepted_states[i])
return REACHED_FINAL_STATE;
return NOT_REACHED_FINAL_STATE;
}
int main(void)
{
char current_symbol;
int result;
DefineDFA();
printf("Enter a string with '0' s and '1's:\n\n");
while((current_symbol=getchar())!= '\n')
if((result= DFA(current_symbol))==UNKNOWN_SYMBOL_ERR)
break;
switch (result) {
case UNKNOWN_SYMBOL_ERR:printf("Unknown Symbol %c",current_symbol);
break;
case NOT_REACHED_FINAL_STATE:printf("Not accepted"); break;
case REACHED_FINAL_STATE:printf("Accepted");break;
default: printf("Unknown Error");
}
printf("\n\n\n");
return 0;
}
Comments
Post a Comment