Реферат: Правильно для маленькой программы и недопустимо для большой системы. • Аналогия: строительство будки для собаки и строительство небоскрёба


1)Понятия системного программного продукта(РИС)

• Современные задачи и их сложность. Один разработчик не в состоянии

охватить все аспекты такой программы.

• Простая программа и её назначение: пригодна для запуска автором и его

знакомыми на той же системе, где была разработана.

• Программа → программный продукт. Требования к программному

продукту (ПП): обобщённый стиль, надёжность, документация,

сопровождение.

• Программа → программный комплекс. Требования к программному

комплексу (ПК): набор взаимодействующих программ (компонент),

согласование по функциям и по форматам данных, системное тестирование.

• .Системный программный продукт – комплекс взаимодействующих

программ, надлежащим образом написанный, протестированный и

задокументированный с обеспечением сопровождения в процессе его

применения пользователями.

• Системное программирование – процесс разработки сложных

программных систем в целом или их отдельных компонент .РИС

2)Стадии разработки программного обеспечения(РИС)

• Типичная ошибка: после получения задания немедленное написание кода.

Правильно для маленькой программы и недопустимо для большой системы.

• Аналогия: строительство будки для собаки и строительство небоскрёба.

• Основные стадии разработки: постановка задачи, анализ требований и

исследование проблемы, проектирование, написание и тестирование

компонент, системное тестирование, документирование и сопровождение.

• Разработка ПО – итеративный процесс.

^ 3)Основные идеи инкрементального программирования(РИС)

1.Технологии программирования

• Знание большого числа языков или сред программирования ничуть не

помогает быстрее справиться с проблемой. Необходимо знание принципов

разработки.

• Результат программирования – продукт определённого качества.

• Технология программирования – наука о производстве программного

продукта.

• Виды технологий: процедурно-ориентированное, модульное, «сверху-

вниз», функциональное, логическое, инкрементальное, абстрактные типы

данных, объектно-ориентированное.

• Допустимо применение различных технологий в одном проекте для

различных подсистем.

2.Принципы инкрементального программирования

• Программа не пишется – она строится – ещё точнее наращивается путём

пошаговой разработки.

• Этап №1: заставить выполняться (пустая программа).

• Этап №2: создание каркаса системы, реализующего схему работы системы

на самом верхнем уровне. Используются функции-заглушки (фиктивные

подпрограммы) и определяются необходимые переменные.

• Этап №3,4,...: обрастание системы «мясом». Реализация заглушек,

возможно с использованием других заглушек и дополнительных временных

переменных. Последовательное добавление новой функциональности

(наращивание каркаса).

• Преимущества технологии: на каждом шаге имеем работающую систему,

быстрое макетирование системы, положительный психологический эффект.

• Отличие от технологии «сверху-вниз» – осуществляется «движение» не

только вниз но и вширь (добавление функциональности по горизонтали в

структуре модулей)

5)Понятия объекта:состояние,поведение,методы. Понятие класса и

идентичность объектов.(РИС)

1.Понятие объекта и класса

• Базовые единицы в ООП – объекты. Объекты это элементы проблемной

области и их представление в области реализации. ООП описывает проблему

в терминах самой проблемы, а не компьютера. Пример: продажа напитков

торговым автоматом.

• Всё является объектом. Пример: прием и анализ сигналов из окружающей

среды.

• Программа есть набор объектов, взаимодействующих путем посылки

сообщений.

• Объект – нечто, обладающее состоянием, поведением и

индивидуальностью.

• Индивидуальность – свойство, позволяющее объекты отличать друг от

друга. Объект может иметь имя.

• Состояние объекта характеризуется перечнем (обычно статическим) всех

свойств объекта и текущими (обычно динамическими) значениями каждого

из этих свойств. Значения – количественные характеристики и ссылки на

другие объекты. Любой объект занимает определенное пространство в

памяти компьютера.

• Поведение – это то, как объект действует и реагирует, поведение

выражается в терминах состояния объекта и передачи сообщений.

• Структура и поведение схожих объектов определяют общий для них класс.

Термины «экземпляр класса» и «объект» – синонимы.

^ 7)Проблема создания и уничтожение объектов.

1.Проблема инициализации

• Для всех объектов должна быть выполнена инициализация (задание их

начального состояния).

• Способ решения проблемы: определение обычного метода для

инициализации. Недостаток подхода: можно забыть его вызвать или вызвать

несколько раз.

• Решение в ООП: использование конструктора – специального метода,

вызываемого для объекта автоматически при его создании.

• Инструкция объявления переменной – инструкция действия.

• Конструкторы глобальных объектов выполняются до начала работы

функции main().

• Синтаксис конструктора: имяКласса(списокПараметров)

• Конструктор без параметров называется конструктором по умолчанию.


2.Проблема уничтожения

• Деструктор – специальный метод класса, который вызывается для объекта

автоматически при его уничтожении.

• Главная задача деструктора – освобождение ресурсов, которые находятся

во владении объектом.

• Синтаксис деструктора: ~имяКласса()

• Для автоматических объектов деструктор вызывается при выходе из их

области видимости, а для остальных объектов при завершении программы.

• Пример определения деструктора в классе SlotMachine.

9)Статические и постоянныечлены класса.Встраевыемые методы.

• Задача: учет количества торговых автоматов. Требуется в любой момент

времени иметь возможность узнать текущее количество существующих

объектов класса SlotMachine.

• Решение: поддержка счетчика объектов. При создании в конструкторе

увеличивать, а при уничтожении в деструкторе уменьшать его значение.

• Проблемы использования глобальной переменной для счетчика –

вероятность конфликта имен и отсутствие инкапсуляции.

• Решение первой проблемы – использование статической переменной

состояния. Она разделяется между экземплярами класса. Не является частью

объекта, но является частью класса.

• Объявление статической переменной состояния выполняется в

определении класса: static тип имяПеременной; Статическая переменная

состояния определяется в файле-реализации класса: тип

имяКласса::имяПеременной;

• Решение второй проблемы – использование статического метода для

выполнения требуемой операции. Объявление статического метода в

определении класса: static тип имяМетода(параметры);

2.Свойство постоянности

• Объекты и переменные, которые после инициализации не должны менять

своего состояния, необходимо объявлять константными: const тип

имяПеременной(параметры);

• Допустимые операции над постоянными объектами – те, которые не

меняют его состояния.

• Объявление метода не меняющим состояния объекта, для которого он

вызван, выполняется в определении класса: тип имяМетода(параметры)

const;. В определении метода также указывается ключевое слово const.

• Пример: объявление цены напитка в постоянной переменной состояния.

• Пример: метод canDrink не должен менять состояние объекта, для

которого вызывается. Поэтому объявляем его постоянным.

3.Встраивание функций и методов

• Проблема эффективности реализации «коротких» методов: canDrink,

getCount и деструктора.

• Решение проблемы без нарушения инкапсуляции – использование

встраиваемых методов.

• Отличие встраиваемых методов от обычных – подстановка тела метода в

точке его вызова.

• Варианты определения метода встраиваемым:

– включение реализации метода в определение класса;

– приведение реализации метода в файле, содержащем определение

класса, со спецификатором inline.

• Недостатки использования встраиваемых методов – объем исполняемой

программы и открытая реализация.

• Рекомендации по использованию: очень короткие и приводить реализацию

вне определения класса. В противном случае смешиваются акценты «что»

делает класс с «как» делает класс.

10)Дружественные функции

• Задача: изымание дохода из автомата.

• Данную операцию можно рассматривать не как запрос к автомату, а как

действие над ним. В этом случае правильный подход – реализация в виде

функции, а не метода класса SlotMachine.

• Проблема: инкапсуляция и необходимость доступа к закрытым членам.

Решение – определение дружественной функции.

• Объявление дружественной функции в определении класса: friend тип

имя(параметры);

• Определение дружественной функции размещается в любом удобном

модуле – обычно в файле-реализации соответствующего класса.

• Дружественная функция является частью интерфейса класса. Поэтому она

не нарушает инкапсуляции. Расширенные права ей делегирует класс, а не его

пользователи.

• Дружественными могут быть целые классы или отдельные методы

классов.

11) Понятие полиморфизма в программировании.Виды полиморфизма

В языке с++.

• Полиморфизм. Одно и тоже имя можно использовать для обозначения

нескольких действий, решающих:

– подобные, но не одинаковые задачи;

– одну задачу разными способами.

• Основной принцип: один интерфейс, множество методов. Выбор

конкретного действия выполняется автоматически одним из двух способов:

– на этапе компиляции (статический полиморфизм)

– на этапе выполнения программы (динамический полиморфизм).

• Проявления полиморфизма в C++: перегрузка функций и методов,

перегрузка операторов, виртуальные методы, шаблоны.


^ 12.13)Иерархические отношения между объектами:обьекты как переменные

состояния.

Иерархические отношения между классами:механизм наследования.

1.Категории иерархических отношений

• Для построения модели, адекватной реальному миру, требуется отражение

отношений, существующими между понятиями реального мира.

• Прагматические мотивы: повторное использование программного кода без

переработки уже существующего, высокоуровневое представление понятий.

• Основные категории иерархических отношений между объектами и

классами: композиция («часть-целое») и наследование свойств.

• Примеры иерархических отношений:

– материнская плата компьютера состоит из набора компонент:

процессор, гнёзда для модулей с оперативной памятью, разъёмы шины

PCI (композиция);

– «книга», «журнал», «газета» являются конкретными видами

абстрактного понятия «печатная продукция».

2.Композиция объектов

• Элементарные понятия – их состояние выражается в виде совокупности

элементарных величин (числа, символы, строки). Пример: «точка на

плоскости».

• Составные понятия – их состояние включает в себя другие объекты.

Пример: «отрезок» как совокупность двух точек.

• Идеи композиции:

– представление сложных понятий в виде совокупности более простых;

– объединение существующих понятий в новую конструкцию.

• В качестве переменной состояния может выступать объект некоторого

класса. Правила объявления и использования объектов-переменных ничем

не отличаются от правил для обычных переменных состояния.

• Синтаксис определения составного класса и определения конструкторов.

• При создании составного объекта сначала вызываются конструкторы

переменных-состояния, а затем конструктор самого составного объекта.

• При уничтожении сначала выполняется деструктор составного объекта, а

затем автоматически вызываются деструкторы его составных частей.


3.Наследование свойств

• Индикатор названия напитка является текстовым индикатором и

отображает текст. Индикаторы исправности и готовности выдачи –

бинарные индикаторы состояния вида «да/нет».

• Модели информационного индикатора и бинарного индикатора состояния

имеют много общего. Они оба являются представителями понятия

«индикатор» и обладают свойствами, присущими всем индикаторам.

• Многие понятия наследуют свойства других понятий. Примеры: медведь

есть млекопитающее, дом есть недвижимость. Пример общих свойств

недвижимости: местоположение, стоимость, владелец, план. Недвижимость

можно продать, сменить владельца, напечатать план.

• Понятие-потомок к свойствам понятия-родителя добавляет свои новые

свойства. Примеры новых свойств дома: жители дома, количество этажей,

количество комнат. В доме можно объединить или разделить комнаты,

выполнить прокладку коммуникаций.

• Каждый вид индикатора добавляет новые свойства – команды управления

и состояние:

– текстовый – задание текста и сам текст;

– бинарный – установка признака «да/нет» и значение признака.

14)Виртуальные методы и позднее связывание.

• Раннее связывание – определение адреса вызываемой функции во время

компиляции программы.

• Позднее связывание – определение адреса вызываемой функции во время

выполнения программы.

• При позднем связывании адрес функции определяется по типу объекта,

для которого осуществляется вызов через указатель.

• Позднее связывание применяется для виртуальных (полиморфных)

методов.

• Синтаксис объявления метода виртуальным: virtual объявлениеМетода;

• Вызов виртуального метода осуществляется несколько медленнее, чем

вызов простого метода.

• Метод должен быть объявлен виртуальным, только если производные

классы реализуют действие базового класса по своему.

• Позднее связывание позволяет корректно выполнять действия с

объектами, тип которых неизвестен на этапе компиляции программы.

• Для индикатора метод control требуется объявить виртуальным.

15)Понятие абстрактного класса.

• В реальном мире экземпляров типа «Индикатор» в чистом виде не

существует. Существуют текстовые индикаторы, световые и проч.

Аналогично с понятием «Печатная продукция» – реально существуют книги,

журналы, газеты и т. д.

• Понятия «Печатная продукция» и «Индикатор» – абстрактные понятия.

• Для выражения данного свойства в ООП используют абстрактные

классы.

• Нельзя создавать объекты абстрактного класса.

Пример абстрактного класса

• В реальном мире экземпляров типа «Индикатор» в чистом виде не

существует. «Индикатор» является абстрактным понятием.

• Абстрактная операция – отображение состояния.

• В базовом классе Viewer метод control – чисто виртуальный.

• Реализация метода Viewer::control не приводится.

class Viewer {

//...

private:

virtual void control(std::ostream& os) =0;

//...

};

16) Использование потокового ввода-вывода.

1.Введение в потоковый ввод-вывод

• Стандартная библиотека содержит удобные объектно-ориентированные

средства ввода-вывода.

• Ввод-вывод организован посредством потоков – логических устройств,

выдающих и принимающих пользовательскую информацию.

• В распоряжение предоставляется единый удобный интерфейс работы с

потоками. Это обеспечивается использованием наследования и

динамического полиморфизма.

• Предопределённые потоки: cin, cout, cerr, clog.

• Базовый класс: ios. Производные: iostream (поток для ввода и вывода),

istream (поток ввода), ostream (поток вывода).

• Операции ввода-вывода реализуются через перегруженные операторы >>

(ввод) и << (вывод).

• Чтение всей строки целиком из потока выполняется функцией getline.

• Пример построчного чтения.

//считывание всей строки

#include

int main()

{

std::string line;

std::getline(std::cin,line);

std::cout << line.length() << std::endl;

return 0;

}

2.Средства форматирования

• Потоки ввода-вывода позволяют форматировать данные и изменять

параметры ввода.

• Управление форматированием информации может осуществляться с

помощью флагов формата.

• Примеры флагов: left (right), dec (oct, hex), scientific (fixed), boolalpha.

Флаги определены внутри класса ios. Доступ к ним через оператор

расширения области видимости ::

• Управление установкой флагов выполняется через методы потоков: setf,

unsetf, flags.

unsigned value;

cin >> value;

cout.unsetf(ios::dec);

cout.setf(ios::hex);

cout << value << endl;

cout.setf(ios::boolalpha);

cout << true << ' ' << false << endl;

• Управление шириной поля (метод width), точностью для чисел с

плавающей точкой (метод precision) и символом-заполнителем (метод fill).

• Управление форматированием информации может осуществляться с

помощью манипуляторов. Манипулятор – специальная функция, которая

может располагаться внутри инструкций ввода/вывода.

• Некоторые манипуляторы могут иметь параметры. Для их использования

необходимо подключить .

• Примеры манипуляторов: left (right), dec (oct, hex), setw(int w), scientific

(fixed), boolalpha (noboolalpha).

#include

//...

unsigned value;

cin >> value;

cout.fill('0');

cout << setw(8) << hex << value << endl;

cout.precision(4);

cout << 123.45 << endl;


3.Файловый ввод-вывод

• Всё что применимо к консольному вводу-выводу, справедливо и для

файлового. Это достигается наследованием.

• Классы: fstream (поток для ввода и вывода), ifstream (поток ввода),

ofstream (поток вывода).

• Открытие файла: через конструктор или методом open.

• Проверка успешности открытия файла: преобразование объекта-потока к

булевскому типу.

• Закрытие файла: метод close.

• Проверка достижения конца файла: метод eof.

• Пример программы копирования текстовых файлов.

4.Строковые потоки

• Всё что применимо к консольному вводу-выводу, справедливо и для

строкового. Это достигается наследованием.

• Классы: istringstream (поток для чтения из строки), ostringstream (поток

для записи в строку).

• Для их использования необходимо подключение .

• Получение сформированной строки: метод str() класса ostringstream.

• Пример использования строкового потока вывода.

17) Порождаемые функции в обобщенном программировании.

• Порождаемая функция определяет реализацию алгоритма, независимого

от типов обрабатываемых данных.

• Порождаемая функция – это функция, которая может автоматически

перегружаться.

• Функция становится порождаемой при указании в начале её определения

(объявления): template <список параметров шаблона>

• Указанные в списке имена параметров можно использовать внутри

определения функции.

• Пример объявления, определения порождаемой функции и её

использования.

• В приведённом примере компилятор создаст две версии функции с

соответствующими типами данных.

//пример порождаемой функции swap

#include

//объявление порождаемой функции swap

template void swap(T& first, T& second);

//определение порождаемой функции swap

template void swap(T& first, T& second)

{

T temp = first;

first = second;

second = temp;

return;

}

//пример использования порождаемой функции swap

int main()

{

int value1;

int value2;

std::cin >> value1 >> value2;

swap(value1, value2);

std::cout << value1 << ' ' << value2 << std::endl;

double value3;

double value4;

std::cin >> value3 >> value4;

swap(value3, value4);

std::cout << value3 << ' ' << value4 << std::endl;

return 0;

}

18)Порождаемые классы в обобщенном программировании.

• В порождаемом классе все алгоритмы определены, а типы

обрабатываемых данных определяются позже, при создании объектов

класса.

• Класс становится порождаемым при указании в начале его определения

(объявления): template <список параметров шаблона>

• Указанные в списке имена параметров можно использовать внутри

определения класса.

• Инстанцирование шаблона выполняется при создании объектов

порождаемого класса.

• При инстанцировании шаблона автоматически создаётся новый класс.

• Реализация методов порождаемого класса может быть приведена извне

определения класса путём использования инструкции template.

• Реализация методов шаблонного класса приводится в заголовочном файле.

Это допустимо, поскольку такие реализации – правила генерации кода для

компилятора.

19)Использование основных контейнеров стандартной библиотеки.

Контейнеры. Вектор

• Контейнеры – это объекты, предназначенные для хранения совокупностей

других объектов.

• Виды контейнеров: вектор (vector), список (list), очередь (queue), стек

(stack), ассоциативный массив (map), множество (set).

• Для элементов контейнера должны быть определены конструктор по

умолчанию и операторы < и ==.

• Вектор является наиболее часто используемым контейнером.

Обеспечивает поддержку динамических массивов.

• Спецификация вектора:

template < class T, class Allocator = allocator > class vector;

T – тип предназначенных для хранения в контейнере данных;

Allocator – задаёт распределитель памяти.

• Для большинства случаев распределитель памяти не указывается

(используется стандартный).

• Для vector определены операторы сравнения и оператор индексирования.

• Пример использования контейнера vector : задача заполнения вектора

считанными со стандартного устройства ввода целыми числами до ввода

заданного значения или до достижения конца файла.

Контейнеры. Список

• Список – последовательность элементов данных, оптимизированная для их

вставки и удаления. Обеспечивает представление двунаправленного

линейного списка.

• Спецификация списка:

template < class T, class Allocator = allocator > class list;

T – тип предназначенных для хранения в контейнере данных;

Allocator – задаёт распределитель памяти.

• Для большинства случаев распределитель памяти не указывается

(используется стандартный).

• Для list определены операторы сравнения и отсутствует оператор

индексирования. Обеспечивает доступ к обоим концам списка.

• Пример использования контейнера list: задача сортировки и слияния двух

списков фамилий сотрудников. Тестовая программа должна напечатать

фамилию сотрудника, оказавшегося в начале результирующего списка.

Контейнеры. Ассоциативный контейнер

• В ассоциативном контейнере каждому значению соответствует

уникальный ключ (не обязательно целочисленный).

• Спецификация ассоциативного контейнера:

template < class Key, class T, class Comp = less, class Allocator =

allocator > class map;

Key – тип ключа;

T – тип предназначенных для хранения в контейнере данных;

Comp – функция для сравнения двух ключей;

Allocator – задаёт распределитель памяти.

• Для большинства случаев распределитель памяти и функция сравнения

ключей не указываются (используются стандартные).

• Для map определен оператор индексирования. В качестве индекса

указывается значение ключа.

• Пример использования контейнера map: в прайс-листе товаров

требуется найти цену товара с указанным именем.

• Проблема в программной реализации: не отслеживается отсутствие

запрошенного товара.

• Её решение: использование итераторов.

Итераторы

• Итератор – компонент для доступа к отдельным элементам контейнеров и

их перебора.

• Итератор является обобщением указателя.

• Итератор указывает на некоторый элемент контейнера или за последний

элемент контейнера.

• Доступ к значению элемента осуществляется операцией *, применённой к

итератору.

• Категории итераторов: ввода, вывода, последовательный,

двунаправленный, произвольного доступа.

• Перемещение итератора к следующему или предыдущему элементу

осуществляется операциями ++, -- (определены не для всех видов

итераторов).

• Каждый вид контейнера определяет свой набор видов итераторов.

• Пример: перебор элементов списка с использованием итератора.

• Пример: доработка задачи выдачи цены товара с учётом ситуации

отсутствия товара с указанным названием.

20)Использования алгоритмов стандартной библиотеки.

• Алгоритмы предназначены для выполнения операций над содержимым

контейнеров.

• Алгоритмы являются порождаемыми функциями.

• Группы алгоритмов:

– поэлементная обработка,

– заполнение и порождение,

– подсчёт,

– манипулирование последовательностями,

– поиск и замена,

– удаление,

– сортировка и обработка отсортированных последовательностей,

– численные алгоритмы.

• В качестве параметров алгоритмы, как правило, принимают итераторы и

функциональные объекты.

• Рассмотренную задачу в примере использования класса Thresholder

можно изящно решить с помощью алгоритма transform:

transform( data.begin(), data.end(), data.begin(), Thresholder(0) );

Примеры алгоритмов

• Алгоритмы поэлементной обработки применяют функциональный объект

к каждому элементу последовательности.

OutIter transform(InIter first, InIter last, OutIter result, UnFunction f);

UnFunction for_each(InIter first, InIter last, UnFunction f);

• Алгоритмы заполнения и порождения позволяют заполнить элементы

последовательности по определённому правилу.

void fill(ForIter first, ForIter last, const T& value);

void generate(ForIter first, ForIter last, Generator gen);

• Алгоритмы манипулирования перемещают элементы контейнеров. При

этом элементы не добавляются, а замещают уже имеющиеся.

• При необходимости добавления в качестве приёмника требуется указывать

итератор back_inserter(имяКонтейнера)

OutIter copy(InIter first, InIter last, OutIter dest);

OutIter reverse_copy(BiIter first, BiIter last, OutIter dest);

• Алгоритмы поиска используются для поиска элементов в

последовательности.

InIter find_if(InIter first, InIter last, Predicate pred);

ForIter min_element(ForIter first, ForIter last);

• Численные алгоритмы предназначены для решения вычислительных задач.

T accumulate(InIter first, InIter last, T init);

T inner_product(InIter first1, InIter last1, InIter first2, T init);

• Примеры использования алгоритмов.

vector v(10);

//...

fill(v.begin(),v.end(),1.0);

//...

list l;

reverse_copy(v.begin(), v.end(),back_inserter(l));

list::iterator firstPositive =

find_if(l.begin(),l.end(), bind2nd( greater(), 0 ));

vector v2(10);

//...

double product = inner_product( v.begin(), v.end(), v2.begin(), 0 );

4) Защитное программирование.

Семантические ошибки и утверждения

• Категории ошибок — синтаксические и семантические.

• Синтаксическая ошибка — неправильное использование конструкций

языка. Она выявляются компилятором.

• Семантическая ошибка – ошибка сделанная разработчиком при создании

программы. В корректной программной системе семантических ошибок

быть не должно!

• Поиск семантических ошибок осуществляется с помощью отладчиков и

проверки утверждений. Утверждение – высказывание, являющееся

истинным в течение всего времени выполнения всей программы или какой-

либо её части.

• С помощью утверждений нужно отслеживать наступление всех ситуаций,

которые «ну никак не могут произойти».

• Для проверки утверждений удобно использовать макрос assert(). Если

результат вычисления аргумента макроса false, то программа аварийно

завершается с выдачей диагностической информации.

• Пример утверждения – инвариант класса, свойство делающее состояние

объекта класса чётко определённым. Цель конструктора – привести объект в

такое состояние. Инвариант должен быть истинным вначале выполнения

каждой операции над объектом и по её завершении.

• Предусловия и постусловия функций и методов – виды утверждений.

Выражают предположения о правильном состоянии мира при входе в

функцию и при выходе из неё.

• Пример функции для вычисления скалярного произведения двух векторов:

в качестве предусловия выступает совпадение размерности векторов.

Исключения и их порождение

• В любой гипотетически безошибочной программе всё равно возможно

возникновение особых ситуаций: деление на 0, переполнение разрядной

сетки, отсутствие свободной памяти, чтение недопустимого значения

переменной из потока и т. д.

• Более общая ситуация – вследствие каких-либо причин некоторая часть

системы не смогла сделать то, что от неё требовалось.

• Отличие таких ситуаций от программных ошибок: мы знаем, что они

могут наступить в любом случае. Для работы с такими ситуациями

используются исключения.

• Исключение – средство C++ для отделения генерации информации о

возникновении ошибки от её обработки.

• Порождение исключения осуществляется компонентой программной

системы при обнаружении ошибки оператором throw исключение

• Исключение является объектом какого-либо класса. Тип объекта

определяет вид ошибки, а состояние объекта содержит уточняющую

информацию об этой ошибке.

• Пример: реализация функции toChar для надёжного преобразования

значения целого типа в значение типа char. При выходе исходного значения

за пределы возможных значений переменных типа char порождается

исключение ToCharError.


Перехват и обработка исключений

• Часть программной системы, знающая, что делать с ошибками, должна

иметь возможность зафиксировать факт порождения исключения.

• Для отслеживания порождения исключений в некотором фрагменте

программы он помещается в блок try { фрагмент программы }

• Обработка перехваченных исключений выполняется обработчиками

исключений, представляемыми оператором catch (параметр) {...} Параметр

определяет тип исключения, перехватываемого данным обработчиком.

• Для одного блока try может быть указано несколько обработчиков catch,

располагающихся друг за другом.

• После завершения обработки исключения выполнение программы

продолжается обычным образом, начиная с оператора, следующего за

списком обработчиков.

• Порождённое, но не обработанное исключение приводит к завершению

выполнения программы.

Стандартные исключения

• Стандартная библиотека включает определённый набор исключений. Все

они являются классами, производными от std::exception

• При невозможности динамического выделения памяти требуемого размера

генерируется исключение std::bad_alloc

• При возникновении ошибки преобразования типа оператором

dynamic_cast генерируется исключение std::bad_cast

• При доступе к несуществующему элементу контейнера std::vector через

метод at генерируется исключение std::out_of_range

• При указании недопустимых значений параметров функций генерируется

исключение std::invalid_argument

• При возникновении переполнения (полученный результат не помещается в

разрядную сетку) генерируется исключение std::overflow_error.


21)Понятие операционной системы,ее назначения и функции.

• Все пользователи используют операционные системы, но у многих

затруднения с чётким определением этого понятия.

• Понятие операционной системы (ОС) с нескольких точек зрения.

• ОС как виртуальная машина, с которой проще иметь дело, чем

непосредственно с оборудованием компьютера. Скрывает детали реализации

и внутренние требования и ограничения.

• ОС как менеджер ресурсов осуществляет упорядоченное и контролируемое

распределение процессоров, памяти и других ресурсов между программами.

• ОС как защитник пользователей и программ обеспечивает систему

безопасности, на которую возложены полицейские и контрразведывательные

функции – предупреждать (предвидеть) действия, контролировать и

наказывать.

• ОС как постоянно функционирующее ядро, постоянно работающее в

вычислительной системе и взаимодействующее со всеми прикладными

программами.

• ^ Операционная система – набор программ, которые обеспечивают

возможность использования аппаратуры компьютера. При этом

аппаратура предоставляет «сырую» вычислительную мощность, а задача

ОС заключается в том, чтобы сделать аппаратуру доступной и удобной

для пользователей, а также обеспечить рациональное и координированное

управление ей для достижения высокой производительности.

Функции операционной системы

• Главное назначение операционной системы – управление ресурсами.

• Реализует множество функций, объединяемых в несколько групп

(подсистем). Приведены на рис 4.

• Определяет интерфейс пользователя для взаимодействия с системой и

прикладными программами.

• Обеспечивает планирование заданий и использования процессора для

эффективного использования ресурсов вычислительной системы.

• Предоставляет программам средства коммуникации и синхронизации для

совместного решения задач.

• Реализует управление памятью для удовлетворения запросов программ и

надёжности их выполнения.

• Обеспечивает управление файловой системой для долговременного

хранения пользовательских данных и доступа к общим программам и

данным.

• Реализует эффективное управление операций ввода-вывода.

• Обеспечивает безопасность и конфиденциальность работы пользователя в

вычислительной системе.

22)Этапы развития операционной системы.

Все операционные системы можно отнести к одной или нескольким

группам.

• Мультипрограммные ОС – позволяют одновременное выполнение

нескольких пользовательских программ.

• Мультипроцессорные ОС – обеспечивают поддержку вычислительных

систем с несколькими процессорами.

• ОС с разделением времени – обеспечивают возможность одновременной

работы с системой нескольких пользователей через терминалы (рис 5).

• ОС реального времени – обеспечивают предсказуемость времени реакции

системы на непредсказуемое появление внешних событий.

• Многорежимные ОС – реализуют несколько режимов работы системы (с

разделением времени, реальное время и т. д.).

• ^ Сетевые ОС – обеспечивают поддержку работы пользователей в сети.

• Распределённые ОС – реализуют возможность выполнения распределённой

обработки информации.

Изучение операционных систем невозможно без работы с ними «в живую».

• Выбор «материала для изучения» – ОС GNU/Linux – современная,

интересная, полезная, доступная.

• GNU/Linux – операционная система GNU, основной компонентой которой

является ядро Linux.

• Характеристика GNU/Linux – 32-х разрядная, многозадачная,

многопользовательская, мощная поддержка сети, средства обеспечения

безопасности, многоплатформенная.

• Ядро Linux – феномен Интернета, обладающий надёжностью,

эффективностью, успехом.

• Первые версии Linux появились в 1991 г. Автор – студент университета

Хельсинки – Линус Торвальд
еще рефераты
Еще работы по разное