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

Вид материалаПрограмма
Операционная система – набор программ, которые обеспечивают
Сетевые ОС – обеспечивают поддержку работы пользователей в сети. • Распределённые
Подобный материал:
1   2   3   4
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 г. Автор – студент университета

Хельсинки – Линус Торвальдс. В качестве основы взято ядро одного из

клонов ОС Unix – Minix.

• ОС GNU/Linux – яркий представитель семейства открытого ПО. Всем

желающим доступен исходный текст как самой ОС, так и многочисленного

программного обеспечения для неё.

• General Public License – право на свободное распространение,

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

• Интернет – локомотив развития GNU/Linux. Разработка проектов

осуществляется по инициативе пользователей GNU/Linux.

23)Основные