/* ACM North Central Region, 1993-94 Problem B, Identifying Legal Pascal Real constants Ed Karrels, March 1996 */ #include int ReadThrough(char *match, int echo, char *dest) { int c, num; num = 0; while (1) { c = getchar(); if (!strchr(match, c)) { ungetc(c, stdin); if (dest) *dest = 0; return num; } if (echo) putchar(c); if (dest) *dest++ = c; num++; } } int IsGood() { int hasdec=0, hasexp=0; int n; char temp[1000]; ReadThrough(" \t", 0, 0); if (ReadThrough("*", 0,0)) return -1; if (ReadThrough("-+",1,0) > 1) return 0; if (ReadThrough("0123456789",1,0) == 0) return 0; n = ReadThrough(".",1,0); if (n>1) return 0; if (n) { hasdec = 1; if (ReadThrough("0123456789",1,0) == 0) return 0; } n = ReadThrough("eE",1,0); if (n>1) return 0; if (n) { hasexp = 1; if (ReadThrough("+-",1,0)>1) return 0; if (ReadThrough("0123456789",1,0) == 0) return 0; } ReadThrough(" \t", 0, temp); n = getchar(); ungetc(n, stdin); if (n != '\n') { printf("%s", temp); return 0; } if (!hasexp && !hasdec) return 0; return 1; } void FinishLine() { int c; c = getchar(); while (c != '\n') { putchar(c); c = getchar(); } } int main() { int isgood; while (-1 != (isgood = IsGood())) { if (isgood) { FinishLine(); printf(" is legal.\n"); } else { FinishLine(); printf(" is illegal.\n"); } } return 0; }