C言語で書いてみました

過去の情報処理技術者試験の出題をもとにして、Cのソースを起こしてみました。

■ 状態遷移図(平成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;
}