Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ1_Си_Builder.doc
Скачиваний:
20
Добавлен:
02.06.2015
Размер:
4.54 Mб
Скачать

1.6. Действия в случае ошибки выполнения

В вычислительной математике часто встречаются ошибки Деление на ноль или Переполнение.

Для изучения ошибки Деление на ноль модифицируйте программу: строку ”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