- •А.П. Новоселов программирование на языке Си
- •1.1. Порядок создания программы
- •1.2. Ввод и выполнение программы
- •1.3. Модификация программы
- •1.4. Пошаговое выполнение программы
- •1.5. Сообщения компилятора и компоновщика
- •1.6. Действия в случае ошибки выполнения
- •1.7. Ошибки в форматах ввода/вывода
- •1.8. Вычисления с вещественными числами
- •2.1. Лексемы
- •2.2. Идентификаторы
- •2.3. Ключевые слова
- •2.4. Константы
- •3.2. Арифметические операции
- •3.3. Операции отношения и логические операции
- •3.4. Операции присваивания
- •3.5. Поразрядные операции
- •3.6. Библиотека функций
- •1. Вычисление площади и периметра геометрической фигуры
- •2. Вычисления по формулам с вещественными числами
- •3. Арифметические операции для целочисленных данных
- •4. Циклы с заданным числом повторений
- •5. Алгоритмы с разветвлениями
- •6. Циклы с условием окончания
- •7. Последовательная обработка данных
- •8. Поразрядные операции
- •9. Обработка массивов
- •10. Обработка матриц
- •11. Сортировка массивов
- •12. Сортировка матриц
- •1.1. Математическая постановка
- •1.4.2. Содержание результатов работы программы на экране
- •Выполнил: Иванов и.П., гр. Ут – 11, вариант 13(2)
- •1.4.3. Текст программы
- •Выводы по работе
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