Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удаление пробелов в выражении 
:(
    Опции темы
Linchx
Дата 25.8.2011, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 31.7.2011

Репутация: нет
Всего: нет



Привет, всем!

Собственно проблема, написал программу по вычислению выражения, все работает, только есть но, когда вводишь выражения с пробелами программа разбирает его  на новые строки, т.е. входное выражение 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". В чем проблема не могу понять.
PM MAIL ICQ Jabber   Вверх
Linchx
Дата 26.8.2011, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 31.7.2011

Репутация: нет
Всего: нет



Цитата(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 на исправленное выражение?
PM MAIL ICQ Jabber   Вверх
bsa
Дата 31.8.2011, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




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


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

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0873 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.