K и R обратная польская запись
Невозможно понять, как вызывается функция.
Input 1 2 3 + + [Enter] // Обратите внимание, что между входом есть пробел
Вывод 6 // что правильно
1 -> когда программа компилируется, когда оператор вызывает функцию getop.
2 -> В функции getop() она вызовет функцию getch(), которая, в свою очередь, вызовет getchar(), поэтому на этом шаге она будет читать 1 как ввод и возвращать его.
3 -> Теперь он проверяет, является ли c цифрой или нет, что является истинным, поэтому он снова вызовет getch(), который читает пространство, возвращает его значения, теперь он проверяет, является ли он цифрой или нет, который оценивается как ложный, затем он перемещается в следующее заявление.
4 -> в конце будет выполнена ungetch(), которая сохранит 1 в своем буфере
На этом этапе я не могу понять, как ввод читается и как использовать getch и ungetch
#define MAXOP 100
#define NUMBER '0'
int getop(char[]);
void push(double);
double pop(void);
main()
{
int type;
double op2;
char s[MAXOP];
while((type=getop(s))
{
switch(type)
{
//Here all operation are performed as push pop addition etc.
//This part of code is simple
}
}
определение функции push и pop легко, поэтому я не пишу
#include<ctype.h>
int getch(void);
void ungetch(int);
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;
}
#define BUFSIZE 100
char buf[BUFSIZE];
int bufp=0;
int getch(void) {
return (bufp>0)?buf[--bufp]:getchar();
}
void ungetch(int c) {
if(bufp>=BUFSIZE)
printf("ungetch:too many character\n");
else
buf[bufp++]=c;
}
1 ответ
4 -> в конце будет выполнена ungetch(), которая сохранит 1 в своем буфере
Нет, звонок в ungetch
проходит c
, который в этот момент содержит пробел, ' '
, Так getop
возвращается NUMBER
, s
является "1"
и необработанный ввод " "
в buf
(или скорее buf = { ' ', ... }
, bufp = 1
) а также "2 3 + +\n"
в stdin
,
ungetch
добавляет персонажей buf
, getch
удаляет и возвращает символы из buf
если он не пустой; если buf
пусто, он читает прямо из stdin
(с помощью getchar
).
Цель этих двух функций - уметь "непрочитывать" символы, т. Е. Иметь возможность решить, что после чтения символа вы на самом деле не хотите его обрабатывать, поэтому вы кладете его обратно (для возврата в следующий раз вы читаете вход). Это позволяет вам "заглядывать вперед" при вводе.
Например, при чтении ввода, как "42+..."
сначала нужно извлечь номер 42
, Для этого вы сначала читаете персонаж '4'
, Но вы не можете остановиться на этом, потому что после первой цифры может быть больше цифр. Итак, вы читаете следующий персонаж, '2'
, что хорошо, потому что это тоже цифра. Но тогда вы нажмете +
, который не является цифрой и не является частью числа. Таким образом, в этот момент вы останавливаете обработку ввода, потому что вы знаете, что полное число 42
, но вам нужно что-то о +
Вы только что прочитали. Вам нужно сохранить его, чтобы следующая операция ввода могла вернуть его (в противном случае мы просто молча отбросили бы его, что очень запутало бы пользователя). Так вы звоните ungetch('+')
и продолжить обработку 42
зная, что следующий getch()
подберу +
ты просто положил обратно.
Я не могу сказать вам, как выполняется фактический расчет, потому что вы не показывали нам этот код, но, по вашему мнению, "эта часть кода проста".