Действия в случае ошибки выполнения
В вычислительной математике часто встречаются ошибки Деление на ноль или Переполнение.
Для изучения ошибки Деление на ноль модифицируйте программу: строку ”pr = x * y * z; ” замените строкой ”pr = x * y / z; ” и выполните программу при z = 0.
В окне отладчика Debugger Exception Notification (рис. 6) видим сообщение об ошибке, приведшей к генерации исключения. Исключения (exceptions) генерируются при различных ошибках – исключительных ситуациях. Cообщение отладчика после перевода выглядит так: “Проект Project_MU1.exe вызвал генерацию исключения класса EDivByZero с сообщением ‘Деление на ноль’. Процесс остановлен. Используйте команды Step или Run для продолжения”.
Щелкнув на кнопке OK, попадем в окно Редактора Кода и увидим в коде программы выделенную строку, около которой стоит зеленая стрелка. B операторе этой строки произошла ошибка.
Нажав кл_Ctrl+F2, прерываем выполнение программы. Так поступают в случае, когда понятно, где ошибка и как ее исправить. Если же ошибка непонятна, то, прежде чем прервать сеанс работы с приложением, надо получить дополнительную информацию о состоянии переменных, т.е. провести отладку.
Рис. 6. Выполнение программы с ошибкой Деление на ноль
Далее попытаемся получить сообщение об ошибке переполнения с целочисленными данными типа int (диапазон от -215 …215-1 для 16-разрядного компьютера и -231 …231 -1 – для 32-разрядного компьютера).
Вернитесь к исходному коду программы (рис. 3) и выполните пуск с данными 1000, 1000, 1000, для которых значение переменной pr=109 < 231. Результат получается правильный (рис. 7).
На рис. 8 показаны результаты с исходными данными 104 , 104 , 104 . Произведение чисел должно быть равно 1012, однако результат – отрицательное число – неправильный и нет сообщения об ошибке, приводящей к генерации исключения. При вычислениях с целочисленными данными об этом нужно помнить!
Рис. 7. Окно Output, анализ переполнения диапазона данных типа int
Рис. 8. Окно Output, переполнение диапазона данных типа long int
Задание: выполните программу с другими наборами входных данных и проанализируйте результаты.
Продолжим рассмотрение темы Переполнение для вещественных чисел типа float (диапазон данных по абсолютной величине от 3.4Е-38 до 3.4Е+38). Дополните код программы строками:
float a = 1E+20, b;
b = a * a;
printf( " float a = %e b = %e \n", a, b);
Переменная b должна иметь значение 1040 > 3.4Е+38, поэтому после пуска программы на экране появится окно с сообщением отладчика огенерации исключения класса EOverflow: ‘Переполнение при операции с плавающей запятой’… (рис. 9). Щёлкните кн_ОК и остановите выполнение программы кл_Ctrl + F2.
Рис. 9. Переполнение в выражении с данными типа float
Задание: выполните пуск программы для следующих значений переменной а: 1Е+10, 1Е-10 и 1Е-20. Найдите значение а, при котором значение b будет равно нулю. Сделайте выводы о работе программы.
1.7. Ошибки в форматах ввода/вывода
Изучим работу программы при наличии ошибок в форматной строке функций scanf() и printf() - неправильное указание спецификации типа переменной. Измените форматную строку "%d%d%d" программы (см. рис. 10) на "%d%d%f". Ввод значения переменной z целого типа будет выполняться по формату вещественного числа. При выполнении программы ошибка формата ввода не обнаруживается компилятором, и результаты вычисления будут неверными.
Изучите самостоятельно работу программы с ошибками в спецификациях вывода данных функции printf(). Ввод данных выполните правильно, а вывод результатов с ошибками в форматной строке printf().
Рис. 10. Ошибка в спецификации формата ввода переменной z