2014-02-16 1 views
-1

В настоящее время работает над простой программой классификатора треугольников на C++ и работает хорошо, за исключением одной или двух вещей.Остановить программу полностью, если условие выполнено в функции C++

Итак, у меня есть четыре функции, одна из которых предназначена для обработки ошибок, таких как введенные значения менее нуля, или введенные длины, которые не позволяют физически возможному треугольнику; один для классификатора, который определяет, какой тип треугольника он зависит от предоставленных значений; один, чтобы вычислить область, которая использует стороны как двойные значения, чтобы вычислить область с помощью формулы Херона, и, наконец, главную функцию, которая вызывает все эти функции в этом порядке, когда стороны передаются им в качестве своих аргументов, так что оператор if может следовать за ними.

Моя проблема заключается в том, что, когда пользователь вводит длины сторон 0, он печатает сообщение об ошибке, что пользователь ввел значения, равные нулю, но затем он печатает его равносторонний треугольник. Что мне нужно изменить, чтобы программа полностью остановилась, когда условие выполнено в инструкции if? Я думаю, проблема в том, что условие работает правильно, но поскольку я вызываю функцию Classifier сразу после ExceptionHandling, он печатает ее равносторонний треугольник.

Я также хочу настроить цикл, который позволит пользователю попробовать снова ввести значение, если они ввели значение, которое вызвало условие, которое должно выполняться в функции ExceptionHandling, однако я попытался настроить цикл while, который просто вызывает бесконечный цикл.

Ниже приведены некоторые фрагменты кода, однако я не могу опубликовать полный код, потому что его назначение и я не хочу, чтобы кто-либо еще его нашел. : Р

... 

void ExceptionHandling(double side1, double side2, double side3) 
{ 
    if (side1 < 1 || side2 < 1 || side3 < 1) 
    { 
     cout << "Error: All values must be greater than zero." << endl; 
    } 
} 

double Classifier(double side1, double side2, double side3) 
{ 
    if (side1 == side2 && side2 == side3) 
    { 
     cout << "This would be classified as an equilateral triangle." << endl; 
    } 

... 

int main() 
{ 
    double side1; 
    cout << "Enter the longest side: "; 
    cin >> side1; 

     ... 

    ExceptionHandling(side1, side2, side3); 
    Classifier(side1, side2, side3); 
    Area(side1, side2, side3); 
} 

бы оценить упрощенное вниз объяснение, так как я очень заинтересован знать .. Спасибо заранее.

+0

Сделайте процедуру 'exceptionHandling' возвращением значения. 'if (exceptionHandling (side1, side2, side3) == -1) return -1;' будет одним способом. Выясните подробности здесь, не так ли? – Floris

+0

Вызовите ['_exit()'] (http://man7.org/linux/man-pages/man2/exit.2.html) –

+0

@Floris Простите мое невежество, но я не совсем понял, что вы имели в виду, поскольку процедура обработки исключений возвращает значение ... вы имеете в виду изменение фактической функции ExceptionHandling или вызов функции? – user2942863

ответ

0

Если вы хотите выйти на недопустимом вводе (в отличие от решений пользователя попробовать еще раз), то, что вы должны сделать, это что-то вроде:

int main() { 
    ... 
    if (not ValidInput(side1, side2, side3)) 
    { 
    std::cerr << "error: invalid input.\n"; 
    return EXIT_FAILURE; 
    } 
    Classifier(side1, side2, side3); 
    Area(side1, side2, side3); 
} 

Если вы хотите петлю, то вы можете сделать:

int main() { 
    double side1, side2, side3; 
    GetInput(side1, side2, side3); 
    while (not ValidInput(side1, side2, side3) 
    { 
    std::cout << "invalid input. Try again.\n"; 
    GetInput(side1, side2, side3); 
    } 
    Classifier(side1, side2, side3); 
    Area(side1, side2, side3); 
} 

Второй пример цикла:

int main() { 
    double side1 = 0.0, side2 = 0.0, side3 = 0.0; 
    while (not ValidInput(side1, side2, side3) 
    { 
    GetInput(side1, side2, side3); 
    if (not ValidInput(side1, side2, side3)) 
    { 
     std::cout << "invalid input. Try again.\n"; 
    } 
    } 
    Classifier(side1, side2, side3); 
    Area(side1, side2, side3); 
} 

Здесь GetInput вызывается только в одном месте, так что вы дона Не нужно использовать отдельную функцию.

+0

Для фрагмента кода кода, предполагается ли вход для значений как отдельная функция? Поскольку я хотел бы иметь обработку ошибок как отдельную функцию и ввод значений в основной функции (если, конечно, это не плохая практика! Тогда, пожалуйста, сообщите мне :)) – user2942863

+0

@ user2942863 Да, у меня есть GetInput как для получения ввода (он принимает свои аргументы по ссылке, поэтому может устанавливать свои значения). Я использую отдельную функцию, поэтому могу просто называть ее в двух местах, а не повторять ее код в двух местах. Однако вы можете структурировать вещи по-разному. Я добавлю еще один пример. – bames53

0

Это нетрадиционное разделение - но если вы хотите, вы можете сделать это следующим образом: ExceptionHandling функция проверяет, является ли «все в порядке», и возвращает истину, только если все в порядке:

bool ExceptionHandling(double side1, double side2, double side3) 
{ 
    if (side1 < 1 || side2 < 1 || side3 < 1) 
    { 
     cout << "Error: All values must be greater than zero." << endl; 
     return false; 
    } 
    return true; 
} 

double Classifier(double side1, double side2, double side3) 
{ 
    if (side1 == side2 && side2 == side3) 
    { 
     cout << "This would be classified as an equilateral triangle." << endl; 
    } 

... 

int main() 
{ 
    double side1; 
    cout << "Enter the longest side: "; 
    cin >> side1; 

     ... 

    if(ExceptionHandling(side1, side2, side3)) { 
     Classifier(side1, side2, side3); 
     Area(side1, side2, side3); 
    } 
} 

в звонки в классификатор и зону выполняются только в том случае, если «все в порядке».

Именование теперь немного clumpsy, но вы можете легко изменить, например. ИсключениеHandling можно было бы назвать preconditionsMet.

Смежные вопросы