
- •Курс лекций по дисциплине “Основы программирования и алгоритмические языки” Бондарев в.М., Марченко ю.С. Введение
- •Основы алгоритмизации
- •1 Основные этапы решения задачи на эвм
- •1.1 Постановка задачи
- •1.2 Проектирование программы
- •1.3 Разработка алгоритма
- •1.4 Кодирование
- •1.5 Отладка и тестирование программы
- •2 Элементарные алгоритмические структуры
- •2.1 Последовательная алгоритмическая структура
- •2.2 Алгоритмическая структура выбора
- •2.3 Алгоритмическая структура повторения
- •2.4 Комбинация структур
- •2.5 Пошаговая детализация алгоритма
- •2.6 Разработка алгоритма вычисления Sin X
- •2.7 Разработка алгоритма подсчета простых чисел
- •3 Алгоритмы поиска
- •3.1 Поиск наибольшего среди вводимых чисел
- •3.2 Поиск наибольшего числа в массиве
- •3.3 Поиск заданного числа в массиве
- •3.4 Поиск с порогом
- •3.5 Двоичный поиск
- •4 Алгоритмы сортировки
- •4.1 Обменная сортировка
- •4.2 Сортировка слиянием
- •4.3 Сравнение двух алгоритмов сортировки
- •5 Рекурсивные алгоритмы
- •5.1 Простая рекурсия
- •5.2 Ханойские башни
- •5.3 Быстрая обменная сортировка
- •6.2 Простейшая программа
- •6.3 Составление простой программы
- •6.4 Программа сложение двух чисел
- •6.5 Организация повторений
- •6.6 Условный оператор
- •If (выражение) оператор [else оператор].
- •6.7 Оператор цикла for
- •7 Указатели и массивы
- •7.1 Указатели
- •7.2 Разыменование и разадресация
- •7.3 Операции new и delete
- •7.4 Массивы
- •7.5 Многомерные массивы
- •7.6 Связь между массивами и указателями
- •7.7 Массивы в динамической памяти
- •8 Строки и структуры
- •8.1 Встроенный тип char
- •8.2 Строки символов как массивы
- •8.3 Строковые библиотечные функции
- •8.4 Структуры
- •8.5 Объявление структур
- •8.6 Битовые поля
- •8.7 Объединения
- •9 Функции
- •9.1 Функция для сложения чисел
- •9.2 Ссылки
- •9.3 Выходные параметры функции
- •9.4 Ссылка — возвращаемое значение
- •9.5 Одномерные массивы как параметры
- •9.6 Двумерные массивы как параметры
- •10 Еще о функциях
- •10.1 Параметры по умолчанию
- •10.2 Произвольное число параметров
- •10.3 Неиспользуемые параметры
- •10.4 Перегруженные функции
- •10.5 Указатель на функцию
- •Void error(char* p) { /*тело ф-ции*/} ,
- •10.6 Спецификатор inline
- •Inline void error(char* p) { /*тело ф-ции*/}
- •10.7 Макросы
- •11 Ввод и вывод
- •11.1 Разновидности ввода и вывода
- •11.2 Открытие и закрытие потока
- •11.3 Ввод и вывод символов
- •11.4 Ввод и вывод строк
- •11.5 Ввод и вывод записей
- •11.6 Управление указателем файла
- •11.7 Состояние потока
- •11.8 Форматированный вывод
- •11.9 Форматированный ввод
- •11.10 Другие функции форматного ввода и вывода
- •12 Уточнение понятий языка
- •12.1 Объявление, определение, инициализация
- •12.2 Область видимости и время жизни
- •12.3 Типы
- •12.4 Производные типы
- •12.5 Числовые константы
- •12.6 Именные константы
- •12.7 Перечисление
- •12.8 Порядок вычисления выражений
- •13 Операции и операторы
- •13.1 Сводка операций
- •13.2 Сводка операторов
- •13.3 Оператор выражения
- •13.4 Оператор switch
- •13.5 Операторы break и continue
- •13.6 Оператор goto и метки
- •14 Классы
- •14.1 Определение класса
- •14.2 Инкапсуляция
- •14.3 Конструктор
- •14.4 Деструктор
- •14.5 Пример класса — список в динамической памяти
- •14.6 Указатель на себя
- •15 Производные классы
- •15.1 Простое наследование
- •15.2 Списки инициализации
- •15.3 Ключи доступа
- •15.4 Виртуальные функции
- •15.5 Реализация виртуальных функций
- •15.6 Полиморфизм
- •16 Еще о класcах
- •16.1 Статические элементы
- •16.2 Друзья класса
- •16.3 Перегрузка операций
- •16.4 Множественное наследование
- •17.1 Библиотека потоков
- •17.2 Предопределенные потоки
- •17.3 Операции помещения в поток и извлечения из потока
- •17.4 Форматирующие функции-элементы
- •17.5 Флаги форматирования
- •17.6 Манипуляторы
- •18 Еще о потоках
- •18.1 Ошибки потока
- •18.2 Опрос состояния потока
- •18.3 Файловый ввод-вывод с применением потоков
- •18.4 Конструкторы файловых потоков
- •18.5 Функции для открытия и закрытия файлов
- •18.6 Замена буфера потока
- •18.7 Текстовый и бинарный ввод-вывод
- •18.8 Бесформатный ввод и вывод
- •18.9. Часто применяемые функции потока
- •18.10 Форматирование в памяти
- •18.11 Дополнительные возможности ostrstream
- •19 Шаблоны
- •19.1 Шаблоны функций
- •19.2 Перегрузка и специализация шаблонов
- •19.3 Шаблоны классов
- •20 Директивы препроцесора
- •20.1 Директива #define
- •20.2 Директива #include
- •20.3 Условная компиляция
- •20.4 Директива #error
- •20.5 Директива #line
- •20.6 Директива #pragma
- •21.1 Адресация памяти
- •21.2 Модели памяти
- •21.3 Спецификация указателей
- •Int near* var_name;
- •Int* near var_name;
- •21.4 Макросы для указателей
- •21.5 Модификаторы переменных
- •21.6 Модификаторы функций
- •21.7 Соглашения о вызове
- •21.8 Встроенный код ассемблера
- •21.9 Псевдорегистры
- •Литература
- •Содержание
- •21.8 Встроенный код ассемблера ........................................................
- •21.9 Псевдорегистры ............................................................................
14.2 Инкапсуляция
Инкапсуляция в объектно-ориентированном программировании — это сокрытие деталей реализации. Спецификации доступа public, protected и private регулируют видимость компонент извне. Вот как они применяются:
class date {
private:
int d, m, y;
public:
void set (int,int,int);
...
};
По умолчанию все компоненты class описаны как private (недоступные извне), а все компоненты struct и union — как public (общедоступные).
14.3 Конструктор
Конструктор — это функция, специально предназначенная для инициализации объекта. Конструктор носит то же имя, что и класс. Класс может иметь несколько конструкторов.
class date {
int d,m,y;
public:
date(int,int,int); // создает дату из аргументов
date(char*); // создает дату из строки
date() {}; // пустой конструктор
...
};
Примеры инициализации объектов:
void main ( ){
date d1 = date (10,20,30);
date d2(1,2,3); // сокращенная форма инициализации
date d3 = d2; // инициализация присваиванием
date d4; // инициализация пустым конструктором
date d5 = date(d4); // инициализация конструктором
// копирования
}
Если программист не определил конструктор, транслятор сам строит пустой конструктор без параметров. То же касается конструкторов присваивания и копирования.
З а м е ч а н и е. При наличии других конструкторов пустой конструктор требует явного определения.
Конструктор не возвращает значения, не наследуется, не может быть объявлен как const, virtual, volatile или static.
14.4 Деструктор
Деструктор решает задачу, обратную задаче конструктора. Он вызывается всякий раз, когда объект уничтожается. Имя деструктора состоит из знака “~” и имени класса. Например, ~date() .
Деструктор не имеет аргументов, не возвращает значения, не наследуется, не может быть объявлен как const, volatile или static. Деструктор может быть объявлен как virtual.
Компилятор сам генерирует деструктор, если программист его не определяет. Когда объект выходит из области видимости, деструктор вызывается автоматически.
14.5 Пример класса — список в динамической памяти
#include <alloc.h>
class list {
void *info;
list *next;
public:
list (void*);
list ();
~list ();
void add (void*);
};
Данный класс реализует рекурсивную структуру данных. Рекурсивность его в том что список рассматривается как указатель на некоторую информацию в динамической памяти (поле info) и указатель на список же, только более короткий (поле next) . В частном случае одноэлементного списка этот указатель равен NULL.
list::list () {info = 0; next = 0;}
Это конструктор, в котором поля получают нулевые значения по правилам присваивания.
list::list (void* p) : info (p), next (0) {}
В этом конструкторе в поле info вносится указатель на некоторую информацию, уже расположенную в памяти. В отличие от первого конструктора здесь поля получают значения по правилам инициализации. В данном случае это сделано только для демонстрации такой возможности и не вызвано какой-то необходимостью.
list::~list () {
delete info;
delete next;
}
Это деструктор, который освобождает всю динамическую память, занимаемую списком. Деструктор рекурсивный, так как оператор delete next; автоматически вызовет деструктор класса для списка, на который указывает next и т.д., пока не настанет момент, когда в очередном поле next не окажется NULL. В этом случае операция delete закончится неудачей, и деструктор вызван не будет.
void list::add(void* p) {
list *l = new list (p);
l->next = next;
next = l;
}
Этот метод добавляет один элемент в список. Сначала оператор
list *l = new list (p);
создает список из одного элемента, а затем пара операторов
l->next = next;
next = l;
“встраивают” этот элемент сразу за головным элементом списка.
void main (){
list *L = new list("123456789");
int *q = new int, *q = 10;
L->add (q);
delete L;
}
Главная программа демонстрирует создание одноэлементного списка,
list *L = new list (“123456789”);
добавление к нему второго элемента
int *q = new int, *q = 10;
L->add (q);
и удаление списка из памяти
delete L;