В ПРОГРАММЕ
В разработанной программе мы не учли возможные ошибки ввода данных. Во-первых, пользователь может ввести последовательность символов, которая не является числом. Во-вторых, пользователь может ввести значение коэффициента a = 0, что приведет к попытке деления на ноль в операторах, вычисляющих корни уравнения. Обе эти ситуации называются исключительными. Примерами других исключительных ситуаций являются переполнение, попытка открыть несуществующий файл и т.п. Для контроля за подобными ситуациями в системе C++ Builder существует так называемый механизм обработки исключительных ситуаций. При возникновении исключительной ситуации программа генерирует так называемое исключение и выполнение дальнейших вычислений в данном блоке прекращается. Исключение – это объект специального вида, характеризующий возникшую в программе исключительную ситуацию. Особенностью исключений является то, что это сугубо временные объекты. Как только они обрабатываются каким-либо обработчиком, они разрушаются. Если это исключение нигде не перехвачено в программе, то оно обрабатывается стандартным методом Tapplication.HandleException. Данный метод обеспечивает выдачу пользователю краткой информации в окне сообщений и уничтожение экземпляра исключения. Наиболее кардинальный способ борьбы с исключениями – обработка их с помощью логических блоков try и catch: try { //операторы, которые могут вызвать возникновение исключительной //ситуации } catch (Тип &e) { // команды, обрабатывающие данную исключительную ситуацию } Здесь Тип – это тип (класс) исключения. В С++ Builder определен целый ряд классов исключений. Рассмотрим два из них, нужных в нашей программе: класс EConvertError, связанный c ошибкой преобразования строк или объектов (в частности, в функции StrToFloat), класс EZeroDivdide, связанный с попыткой деления на нуль числа с плавающей запятой. Измените текст функции Button1Click в соответствии с приведенным ниже текстом.
void __fastcall TForm1::Button1Click(TObject *Sender) { float a,b,c,d,x1,x2; try { a=StrToFloat(Edit1->Text); b=StrToFloat(Edit2->Text); c=StrToFloat(Edit3->Text); } catch(EConvertError &e) { ShowMessage("Ошибочные данные!"); return; } d=b*b-4*a*c; if (d>=0) { try { x1=(-b-sqrt(d))/(2*a); x2=(-b+sqrt(d))/(2*a); } catch(EZeroDivide &e) { ShowMessage("Коэффициент а не может быть равен нулю!"); return; } Edit4->Text=FloatToStr(x1); Edit5->Text=FloatToStr(x2); } else ShowMessage("Действительных корней нет"); }
Сохраните изменения в тексте модуля и проверьте отсутствие ошибок.
!!! Если вы запустите проект на выполнение и зададите ошибочные данные, то отладчик перехватит исключительную ситуацию и выполнение программы прервется. Нажмите повторно кнопку Run, и вы увидите работу определенного вами обработчика исключения. Однако после того, как вы сделаете законченный проект, исключительные ситуации будут обрабатываться в соответствии с кодом вашей программы.
|