Добрый день, уважаемые участники форума!
Сейчас я занимаюсь написанием программы-калькулятора(для выражений вроде 2^2+3*(6-4)/5.2) и у меня возникли некоторые трудности, с разрешением которых я прошу вас мне помочь.
Программа должна адекватно реагировать на исключения, и то первое, с чем я столкнулся - это деление на ноль.
Предположим у нас есть зверская функция для замены произведений и частных в строке(её досконально проверять нет особой необходимости, она здесь просто для ясности):
char *remove_md(char *expression)
{
char *p = expression, *left, *right, op1, op2, *DOUBLE; //BUFFER FOR double
int i = 0, shift;
double result, right_op;
op1 = '*', op2 = '/';
while(p[i])
if(p[i] == op1 || p[i] == op2)
{
if(is_null(right_op = make_double(p + i + 1, &shift)) && p[i] == op2)//(make_double в shift сохраняет cколько символов прочитала)
{
//do something!!!
}
DOUBLE = calloc(MAX_DOUBLE, 1);
right = p + i + shift, left = p + i - 1;
while(left > p)
{
if((*(left - 1) == 'e' || *(left - 1) == 'E') && left > p)
--left;
if(isop(*left))
break;
--left;
}
if(left != p)
++left;
if(p[i] == op2)
result = bin_op(make_double(left, &shift), right_op, 4);
else
result = bin_op(make_double(left, &shift), right_op, 3);
sprintf_s(DOUBLE, MAX_DOUBLE, "%.20g", result);
p = insert(expression, left, right + 1, DOUBLE);
expression = p;
free(DOUBLE);
i = 0;
}
else
++i;
return p;
}
и тут у меня вопрос по непосредственной
проверке числа double на равенство нулю
Как лучше всего реализовать is_null? Понятно, что проверять == не дело с double. Может что-то с битами?
Второй вопрос на будущее: что делать, когда этот 0 найдется? Дело в том, что программа довольно большая получается, для начинающего вроде меня(700-800 строк уже сейчас) и обработка ошибок сделана в самом начале(анализ формата введенного выражения). Ошибка с нулем же - совсем другого рода, она в ходе вычислений получается и нужно как-то выкарабкаться из нагромождения функций. Как тут грамотней поступить?