Цитата(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; }
|
|