Язык программирования C



         

Область действия - часть 2


в файле 1: ----------

int sp = 0; /* stack pointer */ double val[maxval]; /* value stack */

в файле 2: ----------

extern int sp; extern double val[];

double push(f) {...}

double pop() {...}

clear() {...}

так как описания extern 'в файле 1' находятся выше и вне трех указанных функций, они относятся ко всем ним; одного набора описаний достаточно для всего 'файла 2'.

Для программ большого размера обсуждаемая позже в этой лекции возможность включения файлов, #include, позволяет иметь во всей программе только одну копию описаний extern и вставлять ее в каждый исходный файл во время его компиляции.

Обратимся теперь к функции getop, выбирающей из файла ввода следующую операцию или операнд. Основная задача проста: пропустить пробелы, знаки табуляции и новые строки. Если следующий символ отличен от цифры и десятичной точки, то возвратить его. В противном случае собрать строку цифр /она может включать десятичную точку/ и возвратить number как сигнал о том, что выбрано число.

процедура существенно усложняется, если стремиться правильно обрабатывать ситуацию, когда вводимое число оказывается слишком длинным. функция getop считывает цифры подряд /возможно с десятичной точкой/ и запоминает их, пока последовательность не прерывается. Если при этом не происходит переполнения, то функция возвращает number и строку цифр. Если же число оказывается слишком длинным, то getop отбрасывает остальную часть строки из файла ввода, так что пользователь может просто перепечатать эту строку с места ошибки; функция возвращает toobig как сигнал о переполнении.

getop(s, lim) /* get next oprerator or operand */ char s[]; int lim; { int i, c;

while((c=getch())==' '\!\! c=='\t' \!\! c=='\n') ; if (c != '.' && (c < '0' \!\! c > '9')) return(c); s[0] = c; for(i=1; (c=getchar()) >='0' && c <= '9'; i++) if (i < lim)

s[i] = c; if (c == '.') { /* collect fraction */ if (i < lim) s[i] = c; for(i++;(c=getchar()) >='0' && c<='9';i++) if (i < lim) s[i] =c; } if (i < lim) { /* number is ok */ ungetch(c); s[i] = '\0'; return (number);




Содержание  Назад  Вперед