■ 状態遷移図(平成16年午前問22)
/*
* AN/PM/AE 共通
* 平成16年午前問22
* 状態遷移図
*
* 漢字は扱いづらいので
* アルファベットで代用した
*
*/
#include <stdio.h>
#define isalpha(x) (((x)>='a'&&(x)<='z')||((x)>='A'&&(x)<='Z'))
#define isdigit(x) (((x)>='0'&&(x)<='9')||((x)=='-'))
#define NG(n) printf("異常:状態%d:文字[%c]\n",n,*s)
#define OK() printf("正常:終了\n")
void status1(char *s);
void status2(char *s);
void status3(char *s);
void status4(char *s);
void status5(char *s);
char *input[] = {
"yamada /1111-2222/tayama //111-3333 /1111-2222 23\n",
"yamada 1111-2222/tayama 111-3333 //1111-2222 23\n",
"yamada 1111-2222 //tayama 111-3333 ///1111-2222 23\n",
"yamada 1111-2222 ////tayama 111-3333 //1111-2222 23\n",
};
void kaishi(char *s)
{
if (isalpha(*s)) status1(++s);
else NG(0);
}
void status1(char *s)
{
if (*s == ' ') status2(++s);
else if (isalpha(*s)) status1(++s);
else if (*s == '/') kaishi(++s);
else NG(1);
}
void status2(char *s)
{
if (isdigit(*s)) status3(++s);
else if (*s == '/') status1(++s);
else NG(2);
}
void status3(char *s)
{
if (*s == ' ') status4(++s);
else if (isdigit(*s)) status3(++s);
else if (*s == '/') status2(++s);
else NG(3);
}
void status4(char *s)
{
if (isdigit(*s)) status5(++s);
else if (*s == '/') status3(++s);
else NG(4);
}
void status5(char *s)
{
if (isdigit(*s)) status5(++s);
else if (*s == '\n') OK();
else if (*s == '/') status4(++s);
else NG(5);
}
int main()
{
int i;
for (i = 0; i < 4; i++)
kaishi(input[i]);
return 0;
}