Вычисление произведения или частного двух
level3(&hold);
arith(op,result,&hold);
/* Вычисление произведения или частного двух фвкторов */
void level3(result)
int *result;
register char op;
int hold;
level4(result);
while((op = *token) == '+' || op == '/' || op == '%')
get_token();
level4(&hold);
arith(op,result,&hold);
/* Обработка степени числа (целочисленной) */
void level4(result)
int *result;
int hold;
level5(result);
if(*token== '^')
get_token();
level4(&hold);
arith('^', result, &hold);
/* Унарный + или - */
void level5(result)
int *result;
register char op;
op = 0;
if((token_type==DELIMITER) && *token=='+' || *token=='-')
op = *token;
get_token();
level6(result);
if(op)
unary(op, result);
/* Обработка выражения в круглых скобках */
void level6(result)
int *result;
if((*token == '(') && (token_type == DELIMITER))
get_token();
level2(result);
if(*token != ')')
serror(1);
get_token();
else
primitive(result);
/* Определение значения переменной по ее имени */
void primitive(result)
int *result;
switch(token_type)
case VARIABLE:
*result = find_var(token);
get_token();
return;
case NUMBER:
*result = atoi(token);
get_token();
return;
default:
serror(0);
/* Выполнение специфицированной арифметики */
void arith(o, r, h)
char o;
int *r, *h;
register int t, ex;
switch(o)
case '-':
*r = *r-*h;
break;
case '+':
*r = *r+*h;
break;
case '*':
*r = *r * *h;
break;
case '/':
*r = (*r)/(*h);
break;
case '%':
t = (*r)/(*h);
*r = *r-(t*(*h));
break;
case '^':
ex =*r;
if(*h==0)
*r = 1;
break;
for(t=*h-1; t>0; --t) *r = (*r) * ex;
break;
/* Изменение знака */
void unary(o, r)
char o;
int *r;
if(o=='-') *r = -(*r);
/* Поиск значения переменной */
int find_var(s)
char *s;
if(!isalpha(*s))
serror(4); /* не переменная */
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий