
- •Курс лекций по дисциплине “Основы программирования и алгоритмические языки” Бондарев в.М., Марченко ю.С. Введение
- •Основы алгоритмизации
- •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 Псевдорегистры ............................................................................
10.5 Указатель на функцию
С функцией можно делать только две вещи: вызывать ее и определять ее адрес. Указатель, хранящий адрес функции, можно использовать для вызова этой функции.
Пример. Объявление двух указателей на функции.
int (*psum)(int, int);
void (*pfun)(char*);
Если в программе определена какая-нибудь функция, например
Void error(char* p) { /*тело ф-ции*/} ,
то ее адрес можно поместить в указатель
pfun = &error;
а затем использовать его для вызова функции error
(*pfun)(“ошибка!”);
Поскольку операция вызова функции ( ) имеет приоритет выше, чем операция разыменования, необходимы скобки (*pfun).
З а м е ч а н и е. Вызывая функцию через указатель, операцию разыменования можно опускать, компилятор поймет вас правильно.
pfun(“ошибка!”); означает то же что (*pfun)(“ошибка!”);
З а д а ч а. Определите функцию, которая с каждым элементом вещественного массива выполняет действие, заданное функцией-параметром.
Р е ш е н и е.
#include<math.h>
void for_each(double *M, int n, double fun(double))
{
for (int i=0; i<n; i++) M[i]=fun(M[i]);
return;
}
char b[100];
void main( ) {
double M[5] = {1, 2, 3, 4, 5};
for_each(M, 5, sin);
}
10.6 Спецификатор inline
Спецификатор inline говорит компилятору, что он должен попытаться встроить в программу код функции всюду, где находятся вызовы функции.
Inline void error(char* p) { /*тело ф-ции*/}
Это может увеличить быстродействие программы.
З а м е ч а н и е. Если тело функции расположено в одной строке с заголовком, спецификатор inline можно не писать.
10.7 Макросы
Простой макрос определяется так.
#define NAME rest of line
Когда в тексте программы встречается лексема NAME, она заменяется словами rest of line. Эта замена (расширение макроса) выполняется до трансляции программы.
Макрос может занимать несколько строк, в этом случае знаком переноса служит обратная косая черта.
Можно определить макрос параметрами. Например,
#define MAC(a,b) a and b are parameters
При вызове MAC его параметрами должны быть две строки.
MAC(нечто, что-нибудь)
При расширении они заменят параметры макроса.
нечто and что-нибудь are parameters
Аргументу макроса может предшествовать оператор “#”, который после расширения превращает аргумент макроса в строку. Как любая строка, результат этой операции может объединяться с соседними строками.
Пример.
#define LEN(x) strlen(#x)
Макрос LEN(12345) расширяется в strlen(“12345”)
Оператор склейки “##” объединяет в одну две лексемы, между которыми он находится.
Пример. Определение макроса, создающего имена переменных.
#define DEF_VAR(n) int_var_ ## n
Макрос DEF_VAR(1) расширяется в int _var_1
Макросы могут быть вложенными. После каждого расширения макрос сканируется заново на предмет поиска еще не расширенных макросов. Макрос может быть отменен при помощи директивы #undef. После этого ссылка на имя макроса будет вызывать ошибку компиляции.
З а д а ч а. Определить макросы выделения старшего и младшего байта слова.
Р е ш е н и е.
#define LOBYTE(w) (char(w))
#define HIBYTE(w) (char((unsigned)(w)>>8))
Макросы позволяют создать эффективный код, но затрудняют отладку. Вместо сложных макросов следует пользоваться встроенными функциями (inline), а вместо простых — символическими константами (const) и нумераторами (enum).
Вопросы
1. Где устанавливается значение параметра, заданного по умолчанию ?
2. Что означает многоточие в списке параметров функции?
3. Какими макросами обрабатывают нефиксированные параметры функции ?
4. Где определены эти макросы?
5. Каково назначение неиспользуемых параметров функции?
6. Что такое перегруженная функция?
7. Объявите указатель на целую функцию двух вещественных аргументов.
8. Объявите тип “указатель на целую функцию двух вещественных аргументов”.
9. Какова цель спецификации inline?
10. Как определить макрос с параметрами?
11. Что означает операция #?
12. Что означает операция ##?
13. Как отменить определение макроса?