- •Введение
- •1Основы программирования Тема 1.1. Введение в программирование
- •1.1.1Основные понятия программирования
- •1.1.2Первая программа
- •1.1.3Комментарии
- •1.1.4Переменные и типы данных
- •1.1.5Ключевые слова и идентификаторы
- •1.1.6Вывод информации на экран
- •1.1.8Вывод русских букв
- •1.1.9Простые вычисления
- •1.1.10Контрольные вопросы
- •Тема 1.2. Математические вычисления
- •1.2.1Операции и выражения
- •1.1.7Ввод информации с клавиатуры
- •1.2.2Оператор присваивания
- •1.2.3Приоритет операций
- •1.2.4Смешанные выражения и преобразование типов
- •1.2.5Явное преобразование типов
- •1.2.6Функции и их аргументы
- •1.2.7Математические функции
- •1.2.8Контрольные вопросы
- •Тема 1.3. Условный оператор if-else
- •1.3.1Примеры использования условных операторов
- •1.3.2Конструкция if-else
- •1.3.3Оператор ?: и сокращенная запись для if-else
- •1.3.4Логические операторы и выражения
- •1.3.5Использование оператора if без ветки else
- •1.3.6Лесенка if-else-if
- •1.3.7Контрольные вопросы
- •Тема 1.4. Условный оператор switch-case
- •1.4.1Синтаксис оператора switch-case
- •1.4.2Исключение операторов break из switch
- •1.4.3Реализация простого консольного меню
- •1.4.4Контрольные вопросы
- •Тема 1.5. Символы и строки
- •1.5.1Объявление и вывод строк
- •1.5.2Кавычки и апострофы
- •1.5.3Ввод русских символов
- •1.5.4Контрольные вопросы
- •2Циклы и массивы Тема 2.1. Цикл на базе if и goto
- •2.1.1Синтаксис оператора goto
- •2.1.2Использование оператора goto при реализации меню
- •2.1.3Оператор goto и игра «Угадай число!»
- •2.1.4Реализация цикла на базе if и goto
- •2.1.5Контрольные вопросы
- •Тема 2.2. Циклы while и do-while
- •2.2.1Назначение циклов и базовые понятия
- •2.2.2Цикл while
- •2.2.3Условие, вложенное в цикл
- •2.2.4Обработка данных в цикле
- •2.2.5Неизвестное число итераций
- •2.2.6Цикл do-while
- •2.2.7Перевод числа в другую систему счисления
- •2.2.8Бесконечный цикл while
- •2.2.9Контрольные вопросы
- •Тема 2.3. Цикл for
- •2.3.1Предпосылки к созданию цикла for
- •2.3.2Синтаксис цикла for
- •2.3.3Вариации цикла for
- •2.3.4Оператор break
- •2.3.5Бесконечный цикл for
- •2.3.6Контрольные вопросы
- •Тема 2.4. Массивы
- •2.4.1Зачем нужны массивы?
- •2.4.2Объявление массива
- •2.4.3Работа с массивом заранее неизвестного размера
- •2.4.4Сравнение и присваивание массивов
- •2.4.5Вычисление суммы элементов массива
- •2.4.6Подсчет количества элементов с нужным свойством
- •2.4.7Поиск элемента в массиве
- •2.4.8Нахождение максимального элемента в массиве
- •2.4.9Контрольные вопросы
- •Тема 2.5. Обработка строк
- •2.5.1Подготовка к работе
- •2.5.2Поиск символа в строке
- •2.5.3Вывод символов с определенным свойством
- •2.5.4Контрольные вопросы
- •3Процедуры и функции Тема 3.1. Процедуры
- •3.1.1Подпрограммы, функции, процедуры
- •3.1.2Создание и вызов процедуры
- •3.1.3Пример создания процедуры
- •3.1.4Пример вызова процедуры
- •3.1.5Распространенная ошибка
- •3.1.6Процедуры с аргументами
- •3.1.7Название процедуры
- •3.1.8Формальные и фактические аргументы
- •3.1.9Тело процедуры
- •3.1.10Создание нескольких процедур
- •3.1.11Создание заголовочного файла
- •3.1.12Контрольные вопросы
- •Тема 3.2. Функции
- •3.2.1Возвращаемое значение
- •3.2.2Определение и вызов функции
- •3.2.3Название функции
- •3.2.4Формальные и фактические аргументы
- •3.2.9Контрольные вопросы
- •3.2.5Тело функции
- •3.2.6Оператор return
- •3.2.7Глобальные и локальные переменные
- •3.2.8Прототипы функций
- •Тема 3.3. Рекурсивные функции
- •3.3.1Понятие рекурсивной функции
- •3.3.2Рекурсивные процедуры
- •3.3.3Рекурсивные функции, принимающие более одного аргумента
- •3.3.4Контрольные вопросы
- •Тема 3.4. Логические функции
- •3.4.1Примеры громоздких логических конструкций
- •3.4.2Создание и вызов логической функции
- •3.4.3Сравнивать с true не обязательно
- •3.4.4Вызов логических функций внутри циклов
- •3.4.5Контрольные вопросы
- •Тема 3.5. Прикладной программный интерфейс (api)
- •3.5.1 Простой вложенный цикл
- •3.5.2Вынесение вложенного цикла в функцию
- •3.5.3Зависимость вложенных циклов
- •3.5.4 Два цикла, вложенные в третий
- •3.5.5Понятие api
- •3.5.6Вложенные циклы и вывод цифр
- •3.5.7Контрольные вопросы
- •4Простые структуры данных Тема 4.1. Матрицы
- •4.1.1Основные понятия
- •4.1.2Объявление матрицы
- •4.1.3Инициализация матрицы
- •4.1.4Вывод матрицы на экран
- •4.1.5Вывод ровных столбцов матрицы
- •4.1.6Заполнение матрицы в автоматическом режиме
- •4.1.7Работа с матрицей заранее не известного размера
- •4.1.8Заполнение матрицы случайными числами
- •4.1.9Заполнение матрицы с условием
- •4.1.10Обработка матрицы
- •4.1.11Обработка строк и столбцов
- •4.1.12Комбинированная обработка матрицы
- •4.1.13Контрольные вопросы
- •Тема 4.2. Массивы строк
- •4.2.1Объявление и инициализация массива строк
- •4.2.2Присвоение элементов массива строк
- •4.2.3Вывод и ввод массива строк
- •4.2.4Обращение к отдельным символам массива строк
- •4.2.5Сортировка массива строк
- •4.2.6Пример работы с массивом строк
- •4.2.7Контрольные вопросы
- •Тема 4.3. Файлы
- •4.3.1Запись информации в файл
- •4.3.2Чтение информации из файла
- •4.3.3Распространенная ошибка
- •4.3.4Контрольные вопросы
- •Тема 4.4. Структуры
- •4.4.1Причины использования структур
- •4.4.2Объявление структуры
- •4.4.3Обращение к полям структуры и оператор «точка»
- •4.4.4Ввод и вывод содержимого структуры
- •4.4.5Вложенные структуры
- •4.4.6Массив структур
- •4.4.7Вывод массива структур в виде таблицы
- •4.4.8Сортировка массива структур
- •4.4.9Передача структур в качестве аргументов функций
- •4.4.10Возврат структуры в качестве значения функции
- •4.4.11Контрольные вопросы
- •Тема 4.5. Реализация динамических структур данных на основе массива
- •4.5.1Пометка элементов
- •4.5.2Пометка элементов с оберткой
- •4.5.3Реализация стека на основе массива
- •4.5.4Реализация очереди на основе массива
- •4.5.5Реализация списка на основе массива
- •4.5.6Контрольные вопросы
- •Глоссарий
- •Литература
- •Основное (обязательное) обеспечение
- •Дополнительное обеспечение
4.4.11Контрольные вопросы
Зачем нужны структуры?
Как определить новую структуру и объявить переменные-структуры?
Как инициализировать структуру?
Как объявить массив структур?
Что такое поле структуры и как к ним обращаться?
Что такое вложенные структуры?
Как вывести содержимое массива структур в виде таблицы?
Можно ли передавать структуры в качестве аргументов функций и возвращать структуры в качестве значений функций?
Создайте структуру, описывающую точку в пространстве, и создайте функцию, вычисляющую расстояние между двумя такими точками.
Создайте структуру, описывающую треугольник, и создайте функцию, вычисляющую его площадь.
Тема 4.5. Реализация динамических структур данных на основе массива
Рассмотрим довольно распространенную задачу, заключающуюся в реализации такой структуры данных, которая позволяла бы добавлять и удалять элементы. Подобные задачи широко встречаются в повседневной жизни: поступление товара на склад, прием на работу и увольнение сотрудников, добавление и удаление клиентов и пр. Для решения этих задач требуются структуры данных, которые бы могли изменять размер, а порой и изменяться сами, в процессе исполнения программы. Они называются динамическими структурами данных.
Существует целый ряд динамических структур данных, учитывающих особенности разных задач. Среди них можно выделить стек, очередь, списки, деревья, хеш-таблицы. Эти структуры сильно разнятся по сложности их реализации, поэтому они рассматриваются в отдельных курсах, где изучается их эффективность и специфика. Нашей же целью будет изучить некоторые простые способы реализации операций вставки и удаления элементов, позволяющих их быстро запрограммировать.
Добавление и удаление элементов не обязательно выполнять фактически. Главное, чтобы пользователю казалось, что это происходит. Идея реализации операций добавления и удаления будет заключаться в скрытии или, наоборот, показе элементов. Представьте себе, что перед вами на столе несколько фигурок. Одна из этих фигурок прячется, и у вас создается впечатление, что этой фигурки нет. Затем некто достает три новых фигурки, помещая их на стол, и вам кажется, что они появились.
4.5.1Пометка элементов
Первое, что мы рассмотрим – это реализация динамического массива с использованием пометки элементов как существующих и несуществующих. При операциях, требующих обращения к элементам (поиск, удаление, вывод элементов и пр.), предварительно будет проверяться, помечен ли элемент как существующий. Для элементов, помеченных как несуществующие, требуемое действие выполняться не будет.
Реализуем динамический массив для целых чисел. Объявим целочисленный массив для хранения элементов и логический массив для отметки существования элементов. Кроме того, зададим константу, означающую вместимость массива. Создадим функцию инициализации, заполняющую логический массив значениями false, что означает отсутствие элементов.
const int size=10;
int numbers[size];
bool exists[size];
void init() {
for (int i=0; i<size; i++) {
exists[i]=false;
}
}
Для вывода всех элементов следует пробежаться по всему массиву и вывести элементы, помеченные существующими:
void print() {
for (int i=0; i<size; i++) {
if (exists[i]) {
cout << numbers[i] << " ";
}
}
cout << endl;
}
Для реализации добавления элемента следует найти пустую позицию, записать туда новое значение и пометить его существующим. Если пустая позиция не найдена, то следует сообщить, что массив заполнен.
int getEmptyPosition() {
for (int i=0; i<size; i++) {
if (!exists[i]) {
return i;
}
}
return -1;
}
void add(int x) {
int pos = getEmptyPosition();
if (pos != -1) {
numbers[pos]=x;
exists[pos]=true;
} else {
cout << "No place\n";
}
}
Обратите внимание, что функция поиска пустой позиции возвращает индекс первой попавшейся пустой позиции, если она найдена и -1, если не найдена. Минус единица – это стандартная константа, возвращаемая при неудачном поиске индекса. При добавлении элемента происходит обращение к этой функции и, если возвращено значение, отличное -1, то новое значение заносится в массив, и элемент на этой позиции помечается как существующий.
Следующая важная задача для любой динамической структуры данных – это поиск элемента. В нашем случае она еще будет играть роль вспомогательной функции при удалении элемента. Мы используем стандартный последовательный поиск, добавляя только условие, что элемент существует. Если элемент не найден, то возвращаем -1.
int find(int x) {
for (int i=0; i<size; i++) {
if (exists[i] && numbers[i]==x) {
return i;
}
}
return -1;
}
Наконец, удаление заключается в том, что удаляемый элемент ищется и, если он найден, то помечается как несуществующий.
void remove(int x) {
int pos = find(x);
if (pos != -1) {
exists[pos]=false;
} else {
cout << "No such element\n";
}
}
При удалении происходит только пометка, что элемент не существует, а физически он остается в массиве. Однако все функции (поиска, поиска пустой позиции, вывода) его «не видят», поскольку он помечен как несуществующий. Теперь реализованные функции можно использовать, например, организовать меню, где они вызываются.
init();
for (;;) {
cout << "1 - Print\n2 - Add\n3 - Remove\n";
cout << "0 - Exit\nYour choice - ";
int choice; cin >> choice;
int toRemove;
switch(choice) {
case 1 : print(); break;
case 2 : add (rand()); print(); break;
case 3 : cout << "Element to be removed=";
cin >> toRemove;
remove(toRemove);
print(); break;
case 0 : exit(EXIT_SUCCESS);
default : cout << "Error\n";
}
system("pause"); system("cls");
}
