Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > удаление пробелов в выражении


Автор: Linchx 25.8.2011, 21:32
Привет, всем!

Собственно проблема, написал программу по вычислению выражения, все работает, только есть но, когда вводишь выражения с пробелами программа разбирает его  на новые строки, т.е. входное выражение 5 + 5 на выходе получается 
5 = 5
+ = error
5 = 5

хотел написать ограничение на ввод таких выражений, а именно если на вход идет выражение с пробелами то его пропустить. Начал искать как можно это сделать, наткнулся на манипулятор 
Код
 skipws 
 и оператор 
Код
isspace
:

Код

#include <fstream> //подключение стандартной библиотеки для работы с файлами
#include <cmath> //подключение стандартной библиотеки математических операций
#include "syntax.cpp" //подключение анализатора выражения

char *prog; // содержит анализируемое выражение
void eval_exp(double *answer); // функция обработки выражения

int main(void)
{
  std::ifstream fin("input.txt",std::ios::in); // входной файл
  std::ofstream fout("output.txt",std::ios::out); // выходной файл
  fin.setf(std::ios::skipws);

  double answer;
  static char buff[100]; // объявление статического символьного массива
  static char *p = buff; // объявление указателя на массив
  char uncalc[100];
  
  
  
  if ( fin == NULL ){
     perror( "Error opening file" ); // проверка существования файла
  }
  else {
  do {
    fin >> uncalc;
    if(!fin.fail()) fout << p << " = error" << std::endl; // исключение выражения с пробелом
    if else(*p>='a' && *p<='z') fout << p << " = error" << std::endl; // (собственно это условие не нужно,если присутствует skipws) условие отсеивания входного выражения на предмет ввода некорректных данных
    else{
    prog = p;
    if(!*prog) break;
    eval_exp(&answer); // вызов функции для вычисление входного выражения
    }
    if(std::isnan(answer)) fout << p << " = error" << std::endl; // проверка результата обработки выражения на предмет ошибки вычисления (Not-a-number)
    else{
        fout << p << " = " << answer << std::endl; // запись результата в файл
    }
  } while(!fin.eof());
}
  fout.close();
  return 0;
}



но увы не работает, программа попросту начинает дублировать выражения в файл с ответом подставляя то "error" то "0". В чем проблема не могу понять.

Автор: Linchx 26.8.2011, 03:50
Цитата(Linchx @ 25.8.2011,  21:32)
Привет, всем!

Собственно проблема, написал программу по вычислению выражения, все работает, только есть но, когда вводишь выражения с пробелами программа разбирает его  на новые строки, т.е. входное выражение 5 + 5 на выходе получается 
5 = 5
+ = error
5 = 5

хотел написать ограничение на ввод таких выражений, а именно если на вход идет выражение с пробелами то его пропустить. Начал искать как можно это сделать, наткнулся на манипулятор 
Код
 skipws 
 и оператор 
Код
isspace
:

Код

#include <fstream> //подключение стандартной библиотеки для работы с файлами
#include <cmath> //подключение стандартной библиотеки математических операций
#include "syntax.cpp" //подключение анализатора выражения

char *prog; // содержит анализируемое выражение
void eval_exp(double *answer); // функция обработки выражения

int main(void)
{
  std::ifstream fin("input.txt",std::ios::in); // входной файл
  std::ofstream fout("output.txt",std::ios::out); // выходной файл
  fin.setf(std::ios::skipws);

  double answer;
  static char buff[100]; // объявление статического символьного массива
  static char *p = buff; // объявление указателя на массив
  char uncalc[100];
  
  
  
  if ( fin == NULL ){
     perror( "Error opening file" ); // проверка существования файла
  }
  else {
  do {
    fin >> uncalc;
    if(!fin.fail()) fout << p << " = error" << std::endl; // исключение выражения с пробелом
    if else(*p>='a' && *p<='z') fout << p << " = error" << std::endl; // (собственно это условие не нужно,если присутствует skipws) условие отсеивания входного выражения на предмет ввода некорректных данных
    else{
    prog = p;
    if(!*prog) break;
    eval_exp(&answer); // вызов функции для вычисление входного выражения
    }
    if(std::isnan(answer)) fout << p << " = error" << std::endl; // проверка результата обработки выражения на предмет ошибки вычисления (Not-a-number)
    else{
        fout << p << " = " << answer << std::endl; // запись результата в файл
    }
  } while(!fin.eof());
}
  fout.close();
  return 0;
}



но увы не работает, программа попросту начинает дублировать выражения в файл с ответом подставляя то "error" то "0". В чем проблема не могу понять.

Так с пробелами я справился, вот теперь другое, как можно из string передать выражение в указатель массива, массив является константой или же есть возможность перезаписи файла input.txt на исправленное выражение?

Автор: bsa 31.8.2011, 17:18

 ! 
bsa
Пожалуйста, один топик - один вопрос.


M
bsa
Если ответ на вопрос найден, то пометь тему решенной

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)