2016-05-26 2 views
0

я работаю на классе фракции в C++ и у меня возникли проблемы с этим блоком кода:программы C++ вылетает без ошибок

ostream& operator << (ostream &out , Fraction &cfraction) 
{ 
    int gcd = normalize (cfraction) ; 
    cfraction.numerator /= gcd ; 
    cfraction.denominator /= gcd ; 

    try 
    { 
     if (cfraction.denominator < 0) 
     { 
      cfraction.numerator *= -1 ; 
      cfraction.denominator *= -1 ; 
     } 
     //needs editing 

     if (cfraction.denominator == 0) 
      throw "Not defined" ; 

     if (cfraction.numerator == 0 && cfraction.denominator != 0) 
      out << cfraction.numerator ; 

     if (cfraction.denominator == 1) 
     { 
      out << cfraction.numerator ; 
     } 

     else 
      out << cfraction.numerator << "/" << cfraction.denominator ; 
    } 

    catch (const char* error) 
    { 
     cerr << "ERROR: " << error << " " ; 
    } 

    return out ; 
} 

Моего сбоем программой, если cfraction.numerator или cfraction.denominator равен 0.

Может кто-нибудь помочь мне, сообщив, в чем проблема с моим кодом?

Обновление - Решено, должно было проверить, было ли gcd равным нулю. Спасибо всем, кто ответил.

+1

Разделить на ноль! – CinCout

+0

На какой линии он падает? – Sean

+0

Спросите своего учителя математики или калькулятора: что-то деленное на ноль. – NathanOliver

ответ

3

Если вы делите на ноль, ваша программа сработает. Это лучшее, что он может сделать, потому что деление на ноль не может дать значимого результата. Только думаю, что вы можете делать это, чтобы проверить нули перед делением, например .:

int a = 1; 
int b = 0; 
assert(b != 0); 
int c = a/b; 

Обычно вы хотели бы заменить assert с некоторыми более разумной обработки ошибок. В некоторых редких случаях может быть даже целесообразным избежать деления на ноль, добавив некоторый эпсилон перед делением. Например.

double d = 1.0; 
double e = 0.0; 
double eps = 1.0e-10; 
double f = d/(e + eps); 

Однако, это может быть опасно, так как она скрывает некоторые проблемы в коде (деление на ноль почти всегда проблема).

+0

Да, я делясь на ноль. Проблема была в моей функции нормализации. Спасибо за помощь . –