Операционная система UNIX. Руководство программиста


Более сложный пример - часть 4


/* проглотить цифры, точки, экспоненты */

if (isdigit (c) c == '.') { char buf [BSZ + 1], *cp = buf; int dot = 0, exp = 0;

for (; (cp - buf) < BSZ; ++cp, c = getchar ()) { *cp = c; if (isdigit (c)) continue; if (c == '.') { if (dot++ exp) return ('.'); /* приводит к синт. ошибке */ continue; } if (c == 'e') { if (exp++) return ('e'); /* приводит к синт. ошибке */ continue; } /* конец числа */ break; } *cp = ' '; if (cp - buf >= BSZ) (void) printf ("константа слишком длинная\n"); else /* возврат последнего прочитанного символа */ ungetc (c, stdin); yylval.dval = atof (buf); return (CONST); } return (c); }

INTERVAL hilo (a, b, c, d) double a, b, c, d; { /* вычисляет минимальный интервал, содержащий a, b, c и d */

/* используется процедурами, вычисляющими * и / */ INTERVAL v;

if (a > b) { v.hi = a; v.lo = b; } else { v.hi = b; v.lo = a; }

if (c > d) { if (c > v.hi) v.hi = c; if (d < v.lo) v.lo = d; } else { if (d > v.hi) v.hi = d; if (c < v.lo) v.lo = c; } return (v); }

INTERVAL vmul (a, b, v) double a, b; INTERVAL v; { return (hilo (a*v.hi, a*v.lo, b*v.hi, b*v.lo)); }

dcheck (v) INTERVAL v; { if (v.hi >= 0. && v.lo <= 0.) { (void) printf ("интервал-делитель содержит 0.\n"); return (1); } return (0); }

INTERVAL vdiv (a, b, v) double a, b; INTERVAL v; { return (hilo (a / v.hi, a / v.lo, b / v.hi, b / v.lo)); }




Начало  Назад  Вперед