Problem A (String starting with 0 and ending with 1) bool ex3_5(const char s[]) { int state = 0; for(int i=0;s[i] != TERM; i++) { if(TRACE)cout << state; switch(state) { case 0: if(s[i] == '0')state = 2; else if(s[i] == '1')state = 1; break; case 1: if(s[i] == '0')state = 1; else if(s[i] == '1')state = 1; break; case 2: if(s[i] == '0')state = 2; else if(s[i] == '1')state = 3; break; case 3: if(s[i] == '0')state = 2; else if(s[i] == '1')state = 3; break; } if(TRACE)cout << " " << s[i] << " " << state << endl; } return state==3; // returns true, if state == 3, else false } -- Problem B (String containing 10 but not 101) bool ex3_9(const char s[]) { int state = 0; for(int i=0;s[i] != TERM; i++) { if(TRACE)cout << state; switch(state) { case 0: if(s[i] == '0')state = 0; else if(s[i] == '1')state = 1; break; case 1: if(s[i] == '0')state = 2; else if(s[i] == '1')state = 1; break; case 2: if(s[i] == '0')state = 4; else if(s[i] == '1')state = 3; break; case 3: if(s[i] == '0')state = 3; else if(s[i] == '1')state = 3; break; case 4: if(s[i] == '0')state = 4; else if(s[i] == '1')state = 5; break; case 5: if(s[i] == '0')state = 6; else if(s[i] == '1')state = 5; break; case 6: if(s[i] == '0')state = 4; else if(s[i] == '1')state = 3; break; } if(TRACE)cout << " " << s[i] << " " << state << endl; } if (state==2 || state == 4 || state == 5 || state == 6) return true; else return false; } --- Problem C (password) bool ispassword(const char s[]) { int state = 0; for(int i=0;s[i] != TERM; i++) { if(TRACE)cout << state; switch(state) { case 0: if(islower(s[i]))state = 0; else if(isupper(s[i]))state = 1; else if(ispunct(s[i]))state = 2; else state = 4; break; case 1: if(islower(s[i]))state = 1; else if(isupper(s[i]))state = 1; else if(ispunct(s[i]))state = 3; else state = 4; break; case 2: if(islower(s[i]))state = 2; else if(isupper(s[i]))state = 3; else state = 4; break; case 3: if(islower(s[i])) state = 3; else if(isupper(s[i])) state = 3; else if(ispunct(s[i])) state = 4; else state = 4; break; case 4: // fail state state = 4; break; } if(TRACE)cout << " " << s[i] << " " << state << endl; } return state==3; // returns true, if state == 3, else false } ---- Problem D (email): bool isemail(const char s[]) { int state = 0; for(int i=0;s[i] != TERM; i++) { if(TRACE)cout << state; switch(state) { case 0: if (isdigit(s[i])) state = 1; else if (isalpha(s[i])) state = 1; else state = -1; break; case 1: if ((int)s[i] == (int)'.') state = 4; else if ((int)s[i] == (int)'-') state = 4; else if ((int)s[i] == (int)'_') state = 4; else if ((int)s[i] == (int)'@') state = 3; else if (isalnum(s[i])) state = 2; else state = -1; break; case 2: if ((int)s[i] == (int)'.') state = 4; else if ((int)s[i] == (int)'-') state = 4; else if ((int)s[i] == (int)'_') state = 4; else if ((int)s[i] == (int)'@') state = 3; else if (isalnum(s[i])) state = 2; else state = -1; break; case 3: if ((int)s[i] == (int)'.') state = -1; else if ((int)s[i] == (int)'-') state = -1; else if ((int)s[i] == (int)'_') state = -1; else if (isalnum(s[i])) state = 5; else state = -1; break; case 4: if ((int)s[i] == (int)'.') state = -1; else if ((int)s[i] == (int)'-') state = -1; else if ((int)s[i] == (int)'_') state = -1; else if (isalnum(s[i])) state = 2; else state = -1; break; case 5: if (isalnum(s[i])) state = 5; else if ((int)s[i] == (int)'.') state = 6; else if ((int)s[i] == (int)'-') state = 6; else if ((int)s[i] == (int)'_') state = 6; else state = -1; break; case 6: if (isdigit(s[i])) state = 5; else if (isalpha(s[i])) state = 7; else if ((int)s[i] == (int)'.') state = -1; else if ((int)s[i] == (int)'-') state = -1; else if ((int)s[i] == (int)'_') state = -1; else state = -1; break; case 7: if ((int)s[i] == (int)'.') state = 6; else if ((int)s[i] == (int)'-') state = 6; else if ((int)s[i] == (int)'_') state = 6; else if (isalpha(s[i])) state = 8; else if (isdigit(s[i])) state = 10; else state = -1; break; case 8: if ((int)s[i] == (int)'.') state = 6; else if ((int)s[i] == (int)'-') state = 6; else if ((int)s[i] == (int)'_') state = 6; else if (isalpha(s[i])) state = 9; else if (isdigit(s[i])) state = 10; else state = -1; break; case 9: if ((int)s[i] == (int)'.') state = 6; else if ((int)s[i] == (int)'-') state = 6; else if ((int)s[i] == (int)'_') state = 6; else if (isalpha(s[i])) state = 10; else if (isdigit(s[i])) state = 10; else state = -1; break; case 10: if ((int)s[i] == (int)'.') state = 6; else if ((int)s[i] == (int)'-') state = 6; else if ((int)s[i] == (int)'_') state = 6; else if (isalnum(s[i])) state = 10; else state = -1; break; case -1: // fail state state = -1; break; } if(TRACE)cout << " " << s[i] << " " << state << endl; } if (state==8 || state == 9) return true; else return false; //return state==3; // returns true, if state == 3, else false }