Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 11 Программа на языке C.

Работа добавлена на сайт samzan.net:


Программирование на языке C

Лабораторная работа 11

Программа на языке C++. Обработка исключений.

Цель: Изучить принципы обработки исключительных ситуаций на языке 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 - контекст для принятия решения о том, какие обработчики вызываются для установленного исключения. 

try {

...

 throw("SOS");

...

 io_condition eof(argv[i]);

throw(eof);

...

}

catch (const char*) {...}

catch (io_condition& x) {...}

Выражение throw соответствует аргументу catch, если он: 

  1.  Точно соответствует. 
  2.  Общий базовый класс порожденного типа представляет собой то, что устанавливается. 
  3.  Обьект установленного типа является типом указателя, преобразуемым в тип указателя, являющегося аргументом 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 и unexpected.

Обработчик 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]);

}

Ход работы

  1.  Ознакомиться с необходимым теоретическим материалом.
  2.  Запустить DevC++.
  3.  Выбрать команду File->Create->ProjectВ появившемся диалоговом окне выбрать Console Application.
  4.  В открывшемся окне выбратьC++ Project и убедиться в том, что имя проекта не содержит русских символов.
  5.  В появившемся окне кода проконтролировать наличие тела основной функции.
  6.  Схранить проект в своей рабочей папке в каталоге С\Work. Не пытаться сохранять в папке по умолчанию для избежания нарушения прав доступа! Попытка сохранения проекта в папке с наличием знака + в пути приведет к невозможности сборки исполняемого файла (глюк среды).
  7.  Оформить отчет.

Задание

Составить программу циклического вычисления значений функций, определенных из таблицы вариантов заданий. Значения R должны вводиться с клавиатуры. R1 и R2вещественные, R3комплексное. Предусмотреть вывод подсказок в виде (например):

Funkciya sin(x)

QVyihod 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)




1. науковий інститут права та масових комунікації Кафедра адміністративного фінансового та інформаці.html
2. тема делится- на теорию познания; метафизику онтологию философскую антропологию космологию теологию фило
3. Матриц
4. Международный государственный экологический университет имени А
5. Основы НОТ в строительстве
6. Формирование адекватной самооценки младших школьников в учебном процессе через создание воспитывающих ситуаций
7. переживание мистического опыта.html
8. Проведение АВС анализа в среде MS EXCEL
9. Согласно марксистской концепции государство возникает в результате об
10. Роль эмоций в организации поведения студентка
11. Психологія для студентів усіх спеціальностей аграрного університету денної форми навчання
12. гигиеналы~ норма~а с~йкес ~орша~ан ауаны~ тазалы~ын ~амтамасыз етуі керек
13. Буревісник ВАТ Росія 1 Діапазон вимірюваної концентрації моль - кг H2O
14. Реферат- Субъекты административного права
15. туризма. Деловой туризм один из самых перспективных и высокодоходных видов путешествий который хара
16. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата біологічних наук Харків ~ Дисер
17. правовой ответственности Оглавление Введение Глава 1 Что нужно знать об ответственности и понятие нака
18. Классификация жилых объектов недвижимости
19. Формирование социальных взаимосвязей 2
20. Варіант 0 1 2 3 4 5 6 7