- •Министерство образования Республики Беларусь
- •1. Что такое программа на языке программирования
- •2. Общее знакомство с языком с
- •3. Структура простой программы на языке с
- •4. Что такое программа на языке с
- •5. Представление информации и типы данных в языке с
- •6. Константы
- •7. Переменные
- •8. Элементарный вВод и вывод информации
- •9. Выражения и операции
- •9.1. Арифметические операции
- •9.2. Операция изменения знака
- •9.3. Операции инкремента и декремента
- •9.4. Операция присваивания
- •9.6. Поразрядные логические операции
- •9.8. Логические операции и операции отношения
- •9.9. Условная операция «? :»
- •9.10. Операция последовательного вычисления
- •9.11. Операция определения требуемой памяти в байтах sizeof
- •9.12. Операция приведения типа (type)
- •10. Операторы управления вычислительным процессом
- •10.1. Операторы ветвления if и else
- •10.2. Оператор switch
- •10.3. Оператор цикла while
- •10.4. Оператор цикла do…while
- •10.5. Оператор цикла for
- •10.6. Бесконечные циклы
- •10.7. Другие управляющие средства языка с
- •10.8. Стандартные математические функции
- •11. Вычисление выражений и побочные эффекты
- •11.1. Преобразования типов при вычислении выражений
- •11.2. Побочные эффекты при вычислении выражений
- •12. Массивы
- •12.1. Описание массива
- •12.2. Инициализация массива
- •12.3. Ввод-вывод массива
- •12.4. Двумерные массивы (массивы массивов)
- •13. Указатели
- •14. Адресная арифметика
- •15. Массивы и указатели
- •15.1. Указатели и одномерные массивы
- •15.2. Указатели и двумерные массивы
- •16. Строки
- •17. Массивы строк
- •18. Функции
- •18.1. Определение функции в языке с
- •18.2. Возвращение значений из функции
- •18.3. Формальные и фактические параметры функции
- •18.4. Вызов функции
- •18.5. Объявление и определение функции: прототип функции
- •19. Передача параметров в функции
- •19.1. Способы передачи параметров в функции
- •19.2. Передача параметров в функции в языке с
- •19.3. Передача указателей в функции
- •20. Классы хранения и видимость переменных
- •20.1. Общие положения
- •20.2. Спецификаторы класса памяти
- •20.3. Область видимости функций
- •20.4. Глобальные переменные
- •20.5. Глобальные статические переменные
- •20.6. Локальные переменные
- •20.7. Статические локальные переменные
- •20.8. Регистровые переменные
- •20.9. Выводы
- •21. Организация памяти программы
- •22. Многофайловая компиляция (проекты)
- •23. Передача в функции массивОв
- •23.1. Передача одномерных массивов в функции
- •23.2. Передача двумерных массивов в функции
- •23.3. Передача в функции символьных строк
- •23.4. Возвращение указателей из функций
- •24. Функции с переменным количеством аргументов
- •24.1. Соглашения о вызовах: модификаторы функций
- •24.2. Объявление списка параметров переменной длины
- •25. Передача параметров в функцию main()
- •26. Указатели на функцию
- •27. Стандартные функцИи языка с
- •27.1. Функции для работы со строками
- •27.2. Функции для проверки символов и преобразования данных
- •27.3. Функция быстрой сортировки – gsort()
- •27.4. Функция двоичного поиска – bsearch()
- •28. Работа с файлами
- •28.1. Основные понятия
- •28.2. Основные функции для работы с файлами
- •28.3. Открытие и закрытие файлов
- •28.4. Ввод/вывод символов
- •28.5. Ввод/вывод строк
- •28.6. Форматированный ввод/вывод
- •28.7. Ввод/вывод блоков данных
- •28.8. Другие средства для работы с файлами
- •28.9. Ввод/вывод низкого уровня (префиксный доступ к файлам)
- •29. Типы, определяемые пользователем: Перечисления, структуры и объединения
- •29.1. Переименование типов – оператор typedef
- •29.2. Перечисления (enum)
- •29.3. Основные сведения о структурах
- •29.4. Структурные переменные в памяти компьютера
- •29.5. Доступ к полям структуры
- •29.6. Массивы структур
- •29.7. Структуры и функции
- •29.8. Объединения (union)
- •30. Динамическая память
- •30.1. Понятие динамического объекта
- •30.2 Создание и уничтожение динамических объектов
- •30.3 Динамическое размещение одномерных массивов и строк
- •30.4 Динамическое размещение двумерных массивов
- •30.5. Функции для работы с блоками памяти
- •31. Динамические структуры данных
- •31.1. Понятие структуры данных
- •31.2. Структуры, ссылающиеся на себя
- •31.3. Связанные списки
- •31.5. Очереди
- •Ниже приводятся примеры функций для очереди (структура элемента очереди совпадает со структурой элемента стека в примере выше):
- •32. Препроцессор языка с
- •32.1 Директива включения файлов
- •32.2. Директива определения макрокоманд (макросов)
- •32.3 Директива условной компиляции
- •32.4 Дополнительные директивы препроцессора
30.5. Функции для работы с блоками памяти
Данные функции упрощают работу с блоками информации в памяти. Блок – это подряд расположенные байты оперативной памяти. Функции используют наиболее эффективные машинные команды – так называемые цепочечные примитивы. Поэтому эти функции очень быстро работают с большими блоками памяти. Все функции используют указатель на начало блока памяти как параметр. Функции для блоков похожи на функции для строк. Отличие – функции для строк концом блока информации считают ‘\0’, а эти функции всегда ориентируются явно на длину блока. При работе с этими функциями надо аккуратно резервировать память под буфер-назначение.
Прототипы функций для работы с блоками памяти содержатся в заголовочном файле <mem.h>, а также в <string.h>.
Рассмотрим основные функции (подробно все можно найти в Касаткине).
Копирование блоков:
void *memcpy(void *d, void *s, unsigned int n);
Копируется n байт из блока, на начало которого указывает s, в другое место памяти, на начало которого указывает d. Блоки не должны пересекаться в памяти. Функция возвращает адрес блока-назначения.
Копирование блоков с условием:
void *memccpy(void *d, void *s, int c, unsigned int n);
Копируется блок, на начало которого указывает s, в другое место памяти, на начало которого указывает d. Копирование продолжается до тех пор, пока не произойдет одно из двух событий: функция встретит в блоке-источнике байт, содержащий символ c, который тоже перенесется в блок-назначение; или общее число скопированных байтов достигнет значения n. Если происходит первое событие, функция возвращает указатель на следующий после символа c байт в блоке-назначении, иначе возвращает NULL.
Пересылка блоков:
void *memmove(void *d, void *s, unsigned int n);
Копируется n байт из блока, на начало которого указывает s, в другое место памяти, на начало которого указывает d. Блоки могут пересекаться в памяти. Функция возвращает адрес блока-назначения.
Сравнение двух блоков:
int memcmp(void *s1, void *s2, unsigned int n);
Сравнивает n первых байтов двух блоков, на начало которых указывают s1 и s2. Функция возвращает значение больше нуля, если s1 > s2, меньше нуля, если s1 < s2, и равное нулю, если s1 == s2.
Занесение символа n раз в буфер:
void *memset(void *s, int c, unsigned int n);
Устанавливает n байтов буфера, на начало которого указывает s, в заданное значение c. Функция возвращает указатель на блок s.
Поиск символа в блоке:
void *memchr(void *s, int c, unsigned int n);
Просматривается n байтов блока, на начало которого указывает s, сопоставляя каждый байт с кодом символа c. Если совпадение найдено, функция возвращает указатель на этот байт с символом c в буфере, иначе возвращает NULL.
31. Динамические структуры данных
31.1. Понятие структуры данных
При решении любой задачи возникает необходимость работы с данными и выполнения операций над ними. Набор этих операций для каждой задачи, вообще говоря, свой. Однако, если некоторый набор операций часто используется при решении различных задач, то полезно придумать способ организации данных, позволяющий выполнять именно эти операции как можно эффективнее. После того, как такой способ придуман, при решении конкретной задачи можно считать, что у нас в наличии имеется «черный ящик» (его мы и будем называть структурой данных), про который известно, что в нем хранятся данные некоторого рода, и который умеет выполнять некоторые операции над этими данными. Это позволяет отвлечься от деталей и сосредоточиться на характерных особенностях задачи. Внутри этот «черный ящик» может быть реализован различным образом, при этом следует стремиться к как можно более эффективной (быстрой и экономично расходующей память) реализации.
Решение многих задач предполагает выделение структур сложного типа с их последующей реализацией средствами выбранного языка программирования. Под структурой данных понимают совокупность элементов фиксированных типов и набор базовых операций, определяющих организацию и способ обработки данных. Для каждой структуры характерен свой собственный набор операций.
Структуры данных могут быть статическими и динамическими. Ранее мы рассматривали структуры данных фиксированного размера: одномерные и двумерные массивы, структуры. Основное отличие динамических структур от статических заключается в возможности менять в ходе работы количество содержащихся в структуре данных элементов.