Не запускается прога из Керниган и Ритчи - C (СИ)
Формулировка задачи:
программа-калькулятор
проблема в getop.
Что это не знаю, Керниган пишет: Функция GETOP
считывает цифры подряд /возможно с десятичной точкой/ и запоминает их, пока
последовательность не прерывается.
А что за функция, она не стандартная?)
#include <conio.h>
#include <math.h>
#include <stdio.h>
#define MAXOP 20 /* MAX SIZE OF OPERAND, OPERГЂTOR */
#define NUMBER '0' /* SIGNAL THAT NUMBER FOUND */
#define TOOBIG '9'
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");
break;
case '=':
printf("%f",push(pop()));
break;
case 'C':
clear();
break;
case TOOBIG:
printf("%.20s ... IS TOO LONG",s);
break;
}
getch();
}
#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");
clear();
return(0);
}
}
double pop() /* POP TOP VALUE FROM STEACK */
{
if (sp > 0)
return(val[--sp]);
else {
printf( "ERROR: STACK EMPTY");
clear();
return(0);
}
}
clear() /* CLEAR STACK */
{
sp=0;
}Решение задачи: «Не запускается прога из Керниган и Ритчи»
textual
Листинг программы
/* getop: извлекает следующий операнд или знак операции */
int getop(char s[]) {
int i, c;
while ((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if (!isdigit(c) && c != '.') return c; /* Не число */
i = 0;
if (isdigit(c)) /* Накопление целой части */
while (isdigit(s[++i] = c = getch()))
;
if (c == '.') /* Накопление дробной части */
while (isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if (c != EOF) ungetch(c);
return NUMBER;
}
Объяснение кода листинга программы
- Продукт компилируется на языке C.
- Функция getop() предназначена для извлечения следующего операнда или знака операции.
- В функции объявлены следующие переменные:
- i - счетчик для пробелов и табов в строке;
- c - текущий символ ввода;
- s - строка, в которой будет храниться операнд или знак операции.
- В цикле, пока первый символ равен пробелу или табуляции, ничего не происходит.
- После окончания цикла, первый символ сохраняется в переменной c, а строка дополняется до 1 символа нулевым символом.
- Если первый символ не является числом или точкой, функция возвращает этот символ.
- Если первый символ является числом, то в цикле, пока следующий символ также является числом, он добавляется в строку.
- Если в цикле встречается точка, то после неё в цикле, пока следующий символ также является числом, он добавляется в строку.
- После окончания циклов, в переменной c остается последний символ, который добавляется в конец строки.
- Если в процессе ввода была достигнута конечная граница ввода, то вводимый символ не добавляется в строку.
- Функция возвращает значение NUMBER.
- Функция ungetch() используется для возврата последнего введенного символа обратно в буфер ввода.