Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Программирование на языке C
Лабораторная работа 11
Программа на языке C++. Обработка исключений.
Цель: Изучить принципы обработки исключительных ситуаций на языке C++. Научится разрабатывать программы, использующие безопасный код.
С++ имеет чуствительный к контексту механизм обработки особых ситуаций. Он может быть более информирован, чем обработчик из signal.h и может обеспечить более сложное восстановление. Он не предназначен для обработки асинхронных исключений, определенных в signal.h.
Контекст для установки исключения - это блок try. Обработчики обьявлены в конце блока try с использованием ключегого слова catch.
Простой пример:
vect::vect(int n)
{
if(n < 1)
throw(n);
p = new int[n];
if(p == 0)
throw("FREE STORE EXHAUSED");
}
void g()
{
try {
vect a(n), b(n);
...
}
catch(int n) {...} //отслеживает все неправильные размеры
catch(char* error) {...} //отслеживает превышение свободной
//памяти
}
Синтаксически выражения throw возникает в двух формах:
throw
throw выражение
Выражение throw устанавливает исключение. Выражение throw без аргумента повторно устанавливает текущее исключение. Обычно оно используется, когда для дальнейшей обработки исключения необходим второй обработчик, вызываемый из первого.
void foo()
{
int i;
...
throw (i);
}
main()
{
try {
foo();
}
catch(int i) {...}
}
}
Если пользователь хочет выводить дополнительную или использовать ее для принятия решения относительно действий обработчика, то допустимо формирование в виде обьекта.
enum error {bounds, heap, other};
class vect_error {
private:
error e_type;
int ub, index, size;
public:
vect_error(error, int, int); //пакет вне пределов
vect_error(error, int); //пакет вне памяти
}
Теперь выражение throw может быть более информативным
...
throw vect_error(bounds, i, ub);
...
Синтаксически блок try имеет такую форму
try
составной оператор
список обработчиков
Блок try - контекст для принятия решения о том, какие обработчики вызываются для установленного исключения.
try {
...
throw("SOS");
...
io_condition eof(argv[i]);
throw(eof);
...
}
catch (const char*) {...}
catch (io_condition& x) {...}
Выражение throw соответствует аргументу catch, если он:
Синтаксически обработчик catch имеет следующую форму
catch (формальный аргумент)
составной оператор
Пример:
catch (char* message)
{
cerr << message << endl;
}
catch (...) //действие по умолчанию
{
cerr << "THAT'S ALL FOLKS." << endl;
abort();
}
Синтаксис
заголовок функции throw(список типов)
Пример
void foo() throw(int, over_flow);
void noex(int i) throw();
Обработчик terminate() вызывается, когда для обработки исключения не поставлен другой обработчик. По умолчанию вызывается функция abort().
Обработчик unexpected() вызывается, когда исключения не было в списке спецификации исключения
Пример:
#include "vect.h"
void g(int n)
{
try { // блок try - контекст для принятия решения о том, какие
// обработчики вызываются для установленного исключения
vect a(n);
}
catch (int n) // обработчик
{
cerr << "SIZE ERROR " << n << endl;
g(10);
}
catch (const char* error) // обработчик
{
cerr << error << endl;
abort();
}
}
main()
{
extern void g(int n);
g(-1);
}
Файл vect.h:
#include <iostream.h>
class vect {
private:
int* p;
int size;
public:
vect() { size = 11; p = new int[size]; }
vect(int n);
~vect() { delete [] p; }
int& element(int i);
int ub() const { return (size - 1); }
};
vect::vect(int n)
{
if(n < 1) // оговоренное предусловие
throw (n); // устанавливается исключение
p = new int[n];
if(p == 0) // оговоренное постусловие
throw ("FREE STORE EXHAUSTED"); // устанавливается исключение
}
int& vect::element(int n)
{
if(n < 0 || n > size-1)
throw ("ILLEGAL NUMBER OF ELEMENT"); // устанавливается
//исключение
return (p[n]);
}
Составить программу циклического вычисления значений функций, определенных из таблицы вариантов заданий. Значения R должны вводиться с клавиатуры. R1 и R2 вещественные, R3 комплексное. Предусмотреть вывод подсказок в виде (например):
Funkciya sin(x)
Q Vyihod iz programmyi
Vvedite chislo ili Q:
Для вычисления значений функции написать функцию, вычисляющую требуемые по заданию значения. При разработке функции разрешается использовать функции модуля math.h.
Предусмотреть анализ всей введенной информации на ошибки, обработку ошибок реализовать с использованием с использованием обработчиков try… в зависимости от варианта задания. Предусмотреть вывод имени функции, в которой произошла ошибка. Вывод на экран и чтение с клавиатуры организовать при помощи стандартных потоков ввода/вывода/ошибки. Вывести исходные данные и результат в виде (например):
Sin(R) = rez;
Где rez результаты вычисления (вещественный).
Вариант задания рассчитывается по номеру студента в журнале преподавателя.
Вариант |
Функция |
Обработчики |
Вариант |
Функция |
Обработчики |
1 |
Sin(R1)*(pi)/R2-R3 |
Потеря разряда Деление на 0 |
Tan(R2%R1)/R1+Cmod(R3) |
Переполнение Деление на 0 |
|
2 |
Sin(R2)/pi*R1+R3 |
Потеря разряда Переполнение |
Arctan(R1*Sqrt(R2))/R2-Cmod(R3) |
Обл.опр.арг. Исчезновение порядка |
|
3 |
Tan(R1)/R3+Cmod(R3) |
Потеря разряда Прерывание |
Sqrt(Sin(R1)+R2)+R3 |
Обл.опр.арг. Прерывание |
|
4 |
Arctan(R1)*R2+ R3 |
Потеря разряда Переполнение |
Ln(Cos(R1)-R2)/R2-R3 |
Сингулярность Исчезновение порядка |
|
5 |
Ln(R1-R2)*R2-R3 |
Обл.опр.арг. Исчезновение порядка |
19 |
Tan(R1)+Pow(R1,R2)+Cmod(R3) |
Сингулярность Переполнение |
6 |
Sqrt(R1)*R2-Cmod(R3) |
Обл.опр.арг. Переполнение |
Ln(R1)-Exp(R2)+R3 |
Обл.опр.арг. Прерывание |
|
7 |
Tan(R1)+R2+R3 |
Потеря разряда Прерывание |
Sin(Pow(R1,R2))/R2-R3 |
Переполнение Деление на 0 |
|
8 |
Arctan(R1)+R2-R3 |
Потеря разряда Исчезновение порядка |
Cos(R1)/Pow(R2,R1)-Cmod(R3) |
Сингулярность Исчезновение порядка |
|
9 |
Sin(R2)/R1+Cmod(R3) |
Переполнение Деление на 0 |
Mod(R1,R2)/Exp(R1)+R3 |
Сверхмалый рез. Исчезновение порядка |
|
10 |
Cosh(R1)/R2+R3 |
Обл.опр.арг. Точность |
Arctan(R1)/(R2)-R3 |
Обл.опр.арг. Деление на 0 |
|
11 |
Tanh(R1)/R2-R3 |
Обл.опр.арг. Исчезновение порядка |
25 |
Sin(R1*R1)+R1/R2+Cmod(R3) |
Переполнение Точность |
12 |
Arctan(R2)/R1-Cmod(R3) |
Переполнение Прерывание |
Cos(R1)/arctan(R2/R1)+R3 |
Потеря разряда Прерывание |
|
13 |
Sin(R2)*Cos(R1)+R3 |
Потеря разряда Переполнение |
Tan(R1)/(R1+R2)-R3 |
Переполнение Деление на 0 |
|
14 |
Exp(R1)*Arctan(R2)-R3 |
Сверхмалый рез. Переполнение |
Arctan(R1)/R1+R2+Cmod(R3) |
Переполнение Исчезновение порядка |
Содержание отчета. Содержание отчета совпадает с указанным в указаниям к лабораторной работе 1.
Бьярн Страуструп Введение в язык С++.
Язык программирования С++. Руководство программиста.
Турбо С++. Начальное руководство.
Borland C++ Builder. Руководство программиста.
Марченко А.Л. C++. Бархатный путь.
Microsoft Developer Network.
Джеффри Рихтер Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows. (раздел 5)