
- •Курс лекций по дисциплине “Основы программирования и алгоритмические языки” Бондарев в.М., Марченко ю.С. Введение
- •Основы алгоритмизации
- •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 Псевдорегистры ............................................................................
13.4 Оператор switch
Оператор switch передает управление одному из нескольких операторов в зависимости от значения выражения. Он имеет вид
switch (выражение) оператор,
где оператор — обычно составной. Тип выражения — арифметический или указатель. Любой оператор в пределах оператора switch можно пометить одной или несколькими метками
case константное_выражение :
Константное_выражение должно быть того же типа, что выражение в операторе switch с точностью до обычных преобразований. Ни одна пара констант в пределах одного оператора switch не должна иметь одинаковое значение. Допускается не более одной метки вида
default :
При выполнении оператора switch выражение вычисляется, и управление передается оператору с соответствующей меткой case. Если ни одна из констант не совпадает со значением выражения и нет метки default, то не выполняется ни один из операторов.
Сами по себе метки case и default не меняют управления, которое просто пропускает эти метки. Для выхода из оператора switch используется оператор break.
П р и м е р.
switch (val){
case 1:
cout<<1;
break;
case 2:
cout<<2;
return;
default:
cout<<0;
}
13.5 Операторы break и continue
Оператор break прерывает выполнение ближайшего оператора цикла или оператора switch, в котором находится. Управление передается оператору, следующему за прерванным оператором.
Оператор continue передает управление в конец того оператора цикла, в котором находится.
13.6 Оператор goto и метки
Оператор
goto метка
передает управление оператору, помеченному меткой. Помеченный оператор имеет вид
метка: оператор.
Меткой может служить любой идентификатор. Метка видна в текущей функции или блоке, за исключением всех субблоков, в которых был объявлен такой же идентификатор. Единственное назначение метки — принимать управление, переданное оператором goto.
Практически единственным разумным применением оператора goto является досрочный выход из вложенных циклов, т.к. break завершает лишь тот цикл, в котором находится.
Вопросы
1. Какие бинарные операторы правоассоциативны?
2. Чем отличается префиксный инкремент от постфиксного?
3. Опишите синтаксис условного выражения.
4. Какие метки допустимы внутри оператора switch?
5. Какой тип выражения допустим внутри оператора switch?
6. Что прерывает оператор break?
7. Какова область видимости метки?
14 Классы
14.1 Определение класса
Классы позволяют программисту создавать различные типы объектов (безразмерный массив, список из любых элементов, банковский счет, самолет, аквариумная рыбка...) и определять функции, которые задают поведение объекта.
Класс в С++ расширяет понятие структуры и помимо компонентов-данных включает компоненты-функции, которые иначе называют методами.
Класс вводит новую область видимости (старые — это файл, функция, блок, прототип функции). В пределах класса видимы все его компоненты, за пределами — только некоторые.
П р и м е р. Класс “дата”. Хранит день, месяц, год. Способен установить дату, сообщить ее, и изменить на следующую.
struct date {
int d,m,y;
void set (int,int,int);
void get (int&,int&,int&);
void next ();
};
Объекты — это экземпляры класса.
void main ( ){
date d;
d.set (18,10,51);
}
Определение функций-компонент можно расположить внутри или за пределами декларации класса. В первом случае транслятор создаст функции inline. Во втором — имени функции должно предшествовать имя класса вместе с операцией разрешения видимости.
Вот как выглядит определение одного из методов класса date, расположенное за пределами декларации класса.
void date::set (int ad, int am, int ay) {
d = ad;
m = am;
y = ay;
}
Объединение (union) как и структура является частным случаем класса.