Нужно заменить функцию ungetc, на другую функцию не связанную с потоком c ci/o c++
#include <stdio.h>
#include <iostream>
double number(){ // считываем число
int res = 0;
for (;;)//бесконечный цикл
{
char c;
scanf_s("%c", &c);//записываем
if (c >= '0' && c <= '9')//условие, что используются только цифры
res = res *10 + c - '0';//для корректной записи числа
else {
ungetc(c, stdin);
break;//прерываем
}
}
return res;//возвращаем результат
}
double plmn();//чтобы компилятор увидел функцию в фактор
double skobki() {//скобки
char c;
scanf_s("%c", &c);
if (c == '(') {
double x = plmn();
return x;
}
else {//если не число,то
ungetc(c, stdin);//возвращаем символ
return number();
}
}
double factor() { // функция деления и умножения
double x =skobki();
for (;;) {
char c;
scanf_s("%c", &c);
switch (c) {
case '*': // если умножение
x *= skobki();
break;
case '/': // если деление
x /= skobki();
break;
default: //если неизвестный символ, то возвращаем в поток
ungetc(c, stdin);// возвращаем символ назад
return x;//возвращаем результат
}
}
}
double plmn() { // функция сложения и вычитания
double x = factor();
for (;;) {
char c;
scanf_s("%c", &c);
switch (c) {
case '+': // если сложение
x += factor();
break;
case '-': // если вычитание
x -= factor();
break;
default: //если неизвестный символ, то возвращаем в поток
ungetc(c, stdin);// возвращаем символ назад
return x; //возвращаем результат
}
}
}
int main()
{
double r = plmn();//вызов функций по порядку
printf("Result= %0.3f", r);//результат
}
преподаватель запретил использовать потоки, то есть ungetc не подходит
Ответы (1 шт):
Автор решения: jokerbot
→ Ссылка
Если задан такой бред (нельзя использовать готовую ungetc()), то надо ее эмулировать. Проще всего без буферизации. Заведите свой "поток" (структуру) в котором храните ссылку на файл из которого читаете очередной символ (например, функцией read) и место под символ, который возвращаете в "поток". Если такой символ есть, то при обращении к потоку из функции Get возвращаете его и ставите признак -- нет такого символа. Если его нет, то вызов Get возвращает очередной символ, поставляемый функцией read. Надеюсь принцип ясен, остальные детали сами додумайте