Будь умным!


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

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

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

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 6.11.2024

Программирование на языке 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. чистого времени
2. Тема- ldquo;Сплавыrdquo; Ученика Кудашева Алексея Москва
3. Документний потік з питань сільського господарства
4. Именно он выступает в качестве ключевого ее звена
5. темах связи с подвижными объектами
6. Реформы центральных органов власти и управления- царская власть, сенат, коллегии
7. Управление развитием физической культуры и спорта в субъекте Российской Федерации (на примере Краснодарского края)
8. . Историческая эволюция организационных структур систем управления организаций Мировой опыт теории управ
9. Предмет экономической социологии как отрасли социологии Метод социометрических измерений Сущность и область применения
10. Літературна спадщина Григорія Сковороди
11. 17 УКРАЇНА ОЛЕВСЬКА МІСЬКА РАДА ЖИТОМИРСЬКОЇ ОБЛАСТІ В и к о н а в ч и й
12. Bsed tem selection procedure for the tems re members ppointed or elected the decisionmking mechnism to be used by the tem re decisions reched by voting or by consensus Does nyone
13. Исследование девиантного поведения в молодежной среде
14. Ловкий делец от журналистики на бесчестную голову которого были обрушены десятки беспощадных эпиграмм луч
15. Детский сад 185 Ленинского района г
16. Реферат- Статус правительства Российской Федерации
17. Управление денежными потоками ТОО
18. Виктор Викторович Конецкий
19. Виды дисциплинарных взысканий и порядок их применения
20. Київська Русь- діяльність київських князів Олега, Ігоря, Ольги