
- •Курс лекций по дисциплине “Основы программирования и алгоритмические языки” Бондарев в.М., Марченко ю.С. Введение
- •Основы алгоритмизации
- •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 Псевдорегистры ............................................................................
12 Уточнение понятий языка
12.1 Объявление, определение, инициализация
Прежде, чем имя будет использовано, оно должно быть объявлено, т.е. указан его тип. Это необходимо транслятору для генерации правильного кода.
Определение соединяет имя с материальной сущностью. Для переменной — это область памяти, для функции — код программы, для константы — конкретное значение. Большинство объявлений являются одновременно и определениями.
П р и м е р ы.
int i; — объявление и определение переменой;
int f(int i); — объявление функции;
extern char c; — объявление внешней переменной.
Объявлений имени может быть несколько (но одинаковых!), а определение имени — только одно.
Инициализация — это задание значения имени при его определении.
П р и м е р ы.
const float pi = 3.14; — объявление, определение и инициализация
int i = 10; — то же.
З а м е ч а н и е. Глобальные и статические локальные (см. ниже) объекты неявно инициализируются нулем.
12.2 Область видимости и время жизни
Объявление вводит имя в область видимости. Для локального имени (объявленного в блоке или в функции) область видимости простирается от точки объявления до конца блока. Для глобального имени область видимости распространяется от точки объявления до конца файла, в котором имя объявлено.
Локальное имя может скрывать глобальное или внешнее локальное имя. К скрытому глобальному имени NAME можно получить доступ с помощью операции разрешения видимости.
::NAME
К скрытому локальному имени получить доступ нельзя.
Параметры функции считаются объявленными в самом внешнем блоке функции.
Как правило, объект создается, когда встречается его определение, и уничтожается, когда управление выходит из его области видимости. Глобальные объекты создаются один раз и “живут” до окончания программы. Так же ведут себя локальные объекты с описателем static.
ПРИМЕР. Сокрытие имени в блоке.
#include <iostream.h>
int i; // глобальная переменная
void main(){
int i = 1; // внешняя локальная переменная
{
int i = 2; // внутренняя локальная переменная
cout << i << ::i << '\n';
}
}
12.3 Типы
Каждое имя в С++ имеет тип, который определяет возможные операции над именем.
Имена типов используют:
— в спецификации другого имени, например, int i;
— в операциях new и sizeof, например, new char;
— в явных преобразованиях типов, например, long(b).
Неявные преобразования типов могут искажать или терять информацию, поэтому их следует избегать. Явные преобразования типов выполняются в двух формах:
традиционной (double) a,
функциональной double(a).
Функциональная форма преобразования не может быть применена, когда тип составной.
12.4 Производные типы
Производные типы конструируются из базовых при помощи следующих адресных операций (в порядке убывания приоритета):
1) массивы [ ],
2) функции ( ),
3) ссылки &,
4) указатели *,
5) константы const,
6) структуры struct,
7) объединения union,
8) классы class.
В декларации типа можно выделить 2 части: заголовок и декларатор. Например, в декларации
int *p, i, *m[10];
int — заголовок, а *p, i и *m[10] — три декларатора.
Принцип описания производного типа в том, что если в программе встретится выражение в форме декларатора, оно должно иметь тип, объявленный в заголовке.
Примеры объявлений производных типов.
typedef int *t указатель на целое,
typedef char t [10] массив символов,
typedef int *t [10] массив указателей на целое,
typedef int (*t) [10] указатель на массив из целых,
typedef int* (*t) [10] указатель на массив указателей на целое.
Для лучшего понимания последнего примера построим его поэтапно.
typedef int* t1; // t1 — указатель на целое,
typedef t1 t2 [10]; // t2 — массив указателей на целое,
typedef t2 *t; // t — указатель на массив указателей на целое.
Сделаем подстановки согласно определениям
int*
t1
int* t2 [10]
int* (*t) [10].
З а д а ч а. Описать переменную типа:
а) массива ссылок на float;
б) массива указателей на целую функцию одного целого аргумента;
в) ссылки на массив ссылок на int.