Язык С




Внешние переменные - часть 3


#DEFINE MAXOP 20 /* MAX SIZE OF OPERAND, OPERАTOR * #DEFINE NUMBER '0' /* SIGNAL THAT NUMBER FOUND */ #DEFINE TOOBIG '9' /* SIGNAL THAT STRING IS TOO BIG *

MAIN() /* REVERSE POLISH DESK CALCULATOR */ /( INT TUPE; CHAR S[MAXOP]; DOUBLE OP2,ATOF(),POP(),PUSH();

WHILE ((TUPE=GETOP(S,MAXOP)) !=EOF); SWITCH(TUPE) /( CASE NUMBER: PUSH(ATOF(S)); BREAK; CASE '+': PUSH(POP()+POP()); BREAK; CASE '*': PUSH(POP()*POP()); BREAK; CASE '-': OP2=POP(); PUSH(POP()-OP2); BREAK; CASE '/': OP2=POP(); IF (OP2 != 0.0) PUSH(POP()/OP2); ELSE PRINTF("ZERO DIVISOR POPPED\N"); BREAK; CASE '=': PRINTF("\T%F\N",PUSH(POP())); BREAK; CASE 'C': CLEAR(); BREAK; CASE TOOBIG: PRINTF("%.20S ... IS TOO LONG\N",S) BREAK; /) /) #DEFINE MAXVAL 100 /* MAXIMUM DEPTH OF VAL STACK */

INT SP = 0; /* STACK POINTER */ DOUBLE VAL[MAXVAL]; /*VALUE STACK */ DOUBLE PUSH(F) /* PUSH F ONTO VALUE STACK */ DOUBLE F; /( IF (SP < MAXVAL) RETURN(VAL[SP++] =F); ELSE /( PRINTF("ERROR: STACK FULL\N"); CLEAR(); RETURN(0); /) /)

DOUBLE POP() /* POP TOP VALUE FROM STEACK */ /( IF (SP > 0) RETURN(VAL[--SP]); ELSE /( PRINTF("ERROR: STACK EMPTY\N"); CLEAR(); RETURN(0); /) /)

CLEAR() /* CLEAR STACK */ /( SP=0; /)

Команда C очищает стек с помощью функции CLEAR, которая также используется в случае ошибки функциями PUSH и POP. к функции GETOP мы очень скоро вернемся. Как уже говорилось в главе 1, переменная является внеш- ней, если она определена вне тела какой бы то ни было функ- ции. Поэтому стек и указатель стека, которые должны исполь- зоваться функциями PUSH, POP и CLEAR, определены вне этих трех функций. Но сама функция MAIN не ссылается ни к стеку, ни к указателю стека - их участие тщательно замаскировано. В силу этого часть программы, соответствующая операции = , ис- пользует конструкцию

PUSH(POP());

для того, чтобы проанализировать верхний элемент стека, не изменяя его. Отметим также, что так как операции + и * коммутативны, порядок, в котором объединяются извлеченные операнды, несу- щественен, но в случае операций - и / необходимо различать левый и правый операнды.

Упражнение 4-3

--------------- Приведенная основная схема допускает непосредственное расширение возможностей калькулятора. Включите операцию де- ления по модулю /%/ и унарный минус. Включите команду "сте- реть", которая удаляет верхний элемент стека. Введите коман- ды для работы с переменными. /Это просто, если имена пере- менных будут состоять из одной буквы из имеющихся двадцати шести букв/.




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