- •Курс лекций по дисциплине “Основы программирования и алгоритмические языки” Бондарев в.М., Марченко ю.С. Введение
- •Основы алгоритмизации
- •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 Псевдорегистры ............................................................................
8.5 Объявление структур
Объявить структуру можно многими способами:
1) typedef struct { int x;} T; сравни typedef int T
2) typedef struct tagT { int x;} T; то же, но устаревшее из С
3) struct T{ int x;}; так делают в С++
4) struct T{ int x;}t; объявлен и тип и переменная этого типа
5) struct { int x;} t; сравни int t
Последний пример объявляет переменную структуру, не давая особого имени ее типу.
При объявлении типов и переменных следует помнить, что:
1) имя становится доступным сразу после его первого появления. Это позволяет писать так
struct sss {
sss* a;
};
2) переменная не может быть объявлена, пока не завершено объявление ее типа
struct sss {
sss a; // ОШИБКА !
};
Размер структуры (как и размер любого типа или переменной) можно получить операцией
sizeof выражение
или
sizeof (тип).
З а м е ч а н и е. Размер структуры может быть больше суммарного размера ее элементов из-за выравнивания — размещения элементов на границах слов. Это делается для повышения скорости обработки данных.
8.6 Битовые поля
Для компактного размещения малоразрядных переменных используют битовые поля. Член структуры считается битовым полем, если после его имени указано число битов, которые он занимает. Допустимы неименованные поля, они нужны для оптимизации размещения других полей.
Хотя использование полей экономит пространство, оно увеличивает объем кода и снижает эффективность программ. Битовые поля — это удобный способ внесения и извлечения информации из части слова.
З а д а ч а. Упаковать информацию о дате (день, месяц, год) в одно слово. Диапазон изменения года — от 1900 до 2000.
Р е ш е н и е.
struct date {
unsigned int d:5, m:4, y:7;
};
date D = {19,10,1951-1900};
8.7 Объединения
З а д а ч а. Создать массив, в котором можно хранить и числа, и указатели на строки.
Это можно сделать, если элементы массива имеют тип объединения.
union U{
char* name;
long value;
};
Объединение во всем похоже на структуру, но его элементы занимают одно и то же место в памяти.
Р е ш е н и е.
union U{
char* name;
long value;
};
void main(){
U arr[20];
arr [0].name = "123456";
arr [1].value = 123456;
arr [2] = arr[1];
}
Объединение может быть элементом структуры. Предположим мы хотим знать о журнале название, год и номер, а о книге — название, год издания и издательство.
П р и м е р.
struct mag_book {
char* tittle;
int year;
union{
int number;
char* publ;
};
};
Вопросы
1. Запишите оператор, который выведет на экран текст "C:\BORLANDC\BIN\BC".
2. Какие символы имеют собственные имена?
3. Каким символом должна завершаться любая строка?
4. Каково значение операции последовательного выполнения?
5. В каком заголовочном файле объявлены строковые функции?
6. Почему в Паскале определено присвоение строк, а в С — нет?
7. Что такое структура?
8. Каким образом можно инициализировать структуру?
9. Как получить доступ к элементу структуры?
10. Как в одной декларации объявить и тип, и переменную – структуру?
11. Объявите структуру, которая могла бы служить элементом связанного списка.
12. Как определить истинный размер структуры?
13. В чем недостаток битовых полей?
14. Какой цели служат объединения?
15. От чего зависит размер объединения?
