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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычисление выражений из файла, неверное считывается выражение 
V
    Опции темы
Linchx
Дата 1.8.2011, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Linchx @ 1.8.2011,  13:34)
Спасибо, но я код изменил, теперь считаю инфиксные выражения.

Пытаюсь присвоить переменной answer значение sn в случае ошибки она бы выводила сигнал, чтобы увидеть надпись wrong example, выводит но надпись "nan". Как можно изменить эту надпись? Может кто встречался с подобным!?

Код

//main.cpp
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "syntax.cpp"
#include <fstream>

char *prog;
void eval_exp(double *answer);

int main(void)
{
  double answer;
  char *p;
  p = (char *) malloc(100);
  if(!p) {
    printf("Memory allocation error.\n");
    exit(1);
  }

  std::ifstream fin("input.txt");
  std::ofstream fout("output.txt");
  if ( fin == NULL )
     perror( "Error opening file" );
  else {
  do {
    fin >> p;
    if(*p>='a' && *p<='z'){
        fout << p << '=' << "can't calculate" << std::endl;continue;
    }
    else{
    prog = p;
    if(!*prog) break;
    eval_exp(&answer);
    }
    if(answer==sn){
        fout << p << '=' << "can't calculate" << std::endl;continue;
    }
    else{
    fout << p << '=' << answer << std::endl;
    }
  } while(!fin.eof());
}
  return 0;
}


в syntax.cpp передается prog и answer, так же в syntax.cpp объявлено, что в случае недопустимых операций и арифметических выражений возвращать NaN для типа double. Но вот почему он вместо can't calculate записывает nan непонятно.

Код

//в syntax.cpp
#include <limits>

double sn = std::numeric_limits<double>::signaling_NaN();

void eval_exp(double *answer)
{
  get_token();
  if(!*token) {
      *answer=sn;
    return;
  }
  eval_exp2(answer);

  if(*token) *answer=sn;

Решил проблему, видно неправильно сравнивал условие:

было:
Код

if(answer==sn){
        fout << p << '=' << "can't calculate" << std::endl;continue;
    }


поменял:
Код

if(std::isnan(answer)){
        fout << p << '=' << "can't calculate" << std::endl;continue;
    }

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

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

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

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

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


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

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


 




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


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

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