- •Санкт-Петербургский
- •Структура программы на языке Си
- •Структура простейшей одномодульной программы
- •Комментарии в программе на языке Си
- •Начальные сведения о препроцессоре
- •Определение функции main().
- •Пример простейшей программы
- •Алфавит, синтаксис и семантика
- •Алфавит языка Си
- •Понятие о типе
- •Система типов языка Си Система типов языка Си
- •Понятие об объекте
- •Лексемы
- •Зарезервированные слова
- •Идентификаторы
- •Литералы
- •Целочисленные литералы
- •Литерал вещественного типа
- •Символьные литералы
- •Строковый литерал
- •Переменные
- •Символические константы в языке Си
- •Операторы, выражения и инструкции. Общие сведения.
- •Классификация операторов
- •Приоритет и ассоциативность операторов.
- •Побочные эффекты и вычисления выражений
- •Порядок вычисления выражений
- •Арифметические операторы и выражения
- •Унарные операторы
- •Бинарные операторы
- •Преобразования типа при выполнении бинарных операторов
- •Автоматическое преобразование типов
- •Явное преобразование типа
- •Математические функции
- •Оператор присваивания и инструкция присваивания
- •Простой оператор присваивания
- •.Множественное присваивание
- •Составной оператор присваивания
- •Преобразование типа при присваивании
- •Начальные сведения об указателях. Выходные параметры функции
- •Принятие решений и логические величины. Операторы отношения и сравнения на равенство
- •Логические операторы
- •Поразрядные операторы
- •Условные выражения (оператор ?:)
- •Оператор запятая
- •Оператор sizeof
- •Составная инструкция
- •Инструкция ifelse
- •Полная и сокращенная формы инструкции if
- •Вложенные инструкции if
- •Инструкция switch
- •Синтаксис инструкции switch
- •1.25.2. Использование инструкции switch
- •Функциональные компоненты цикла
- •Арифметические и итерационные циклы
- •Задачи, приводящие к арифметическим циклам
- •Задачи, приводящие к итерационным циклам
- •Циклические управляющие инструкции
- •Цикл, управляемый инструкцией for
- •Цикл, управляемый инструкцией while
- •Цикл, управляемый инструкцией do … while
- •Цикл с выходом
- •Вложенные циклы
- •Понятие о варианте и инварианте цикла
- •Объявления и определения (расширенное рассмотрение)
- •Спецификаторы объявления
- •Спецификаторы класса памяти.
- •Квалификаторы типа
- •Спецификаторы типа
- •Использование спецификаторов
- •Описатели
- •Использование зарезервированного слова typedefдля объявления синонимов типов
- •Функции
- •Понятие об абстракции и инкапсуляции
- •Функция языка Си и процедурная абстракция
- •Понятие о функции
- •Назначение функций
- •Определение функции
- •Функции, возвращающие и невозвращающие значение
- •Вызов функции. Передача параметров по значению
- •Внешние переменные и процедурная абстракция
- •Понятие о прототипе. Компиляция
- •Старый стиль определения функции
- •Массивы в стиле языка с89
- •Определение и объявление массивов
- •Определение и объявление одномерных массивов. Иницициализация одномерных массивов при их определении. Доступ к элементам массива.
- •Определение и инициализация двумерных массивов
- •Операции с массивами
- •Размещение массивов в оперативной памяти
- •Указатели
- •Операторы разыменования и взятия адреса
- •Области применения указателей
- •Нулевой указатель
- •Определение указателя
- •Недействительный указатель
- •Операции с указателями
- •Дополнительные сведения о разыменовании указателей
- •Присваивание указателей
- •Операция взятия адреса для указателя. Указатели на указатели
- •Указатели и операция индексирования
- •Арифметические операции с указателями
- •Сравнение указателей
- •Указатели и динамическая память
- •Функция malloc
- •Функция calloc
- •Функция realloc
- •Функция free
- •Указатели – параметры функций. Имитация передачи по ссылке
- •Указатели на функцию
- •Инициализация указателя на функцию
- •Операции с указателями на функцию
- •Табулирование произвольной функции одного переменного
- •Использование стандартной функции qsort
- •Указатели и массивы
- •Строковый литерал
- •Символические строковые константы
- •Строковые переменные
- •Инициализация строковых переменных
- •Операции со строковыми переменными
- •Ввод строк
- •Функция scanf()
- •Опасная функция gets()
- •Использование функции fgets()
- •Вывод строк
- •Функция printf()
- •Функция puts()
- •Функция fputs()
- •Библиотечные функции для обработки строк
- •Функция strlen()
- •Функции strcpy()иstrncpy()
- •Функции strcat() иstrncat()
- •Функция strcmp()
- •Массивы строк
- •Структуры
- •Объявление структур
- •Обращение к полям структуры
- •Инициализация структур
- •Операции над структурами
- •Массивы структур
- •Объявление массива структур
- •Идентификация элементов массива структур
- •Работа с внешними устройствами
- •Понятие потока
- •Текстовый поток
- •Двоичный поток
- •Указатель файла
- •Функция fopen()
- •Функция fclose()
- •Построковый ввод – вывод
- •Блоковый ввод – вывод
- •Примеры решенных задач
- •Прямой доступ к файлу
- •Функция fseek()
Функции
Понятие об абстракции и инкапсуляции
Известно, что сложность программирования обусловлена в первую очередь сложностью решаемых задач. Основным способом преодоления этих сложностей является применение декомпозиции. Декомпозиция сводится к тому, что исходная задача заменяется совокупностью подзадач, совместное решение которых приводит к искомому решению. Однако не любая декомпозиция заканчивается успешно. Типичной является следующая ситуация. Программные компоненты, реализующие решение отдельных подзадач работают корректно, а их объединение не работает. Классическим примером неудачной декомпозиции является попытка написать текст пьесы, распределив работу между отдельными исполнителями, следующим образом. Определяется состав действующих лиц. Затем каждому исполнителю указывается список действующих лиц пьесы и поручается написать часть текста пьесы, в которой они участвуют. Представляется, что результат будет самый плачевный.
Существует мнение, что качество декомпозиции может быть повышено в том случае, когда при ее выполнении применяется абстракция.
В науке и технике широко используется понятие абстракции. Под абстрагированием понимается процесс отделения основных характеристик объекта, явления или операции от их второстепенных характеристик. Применительно к программированию процесс абстрагирования можно трактовать следующим образом. При разработке любого программного компонента следует различать интерфейс и реализацию. Основные элементы должны составить интерфейс компонента, а второстепенные следует отнести к его реализации. Таким образом, основным результатом процесса абстрагирования является создание интерфейса, позволяющего клиенту разрабатываемого программного компонента воспользоваться возможностями, которые будут предоставляться компонентом.
Вторым понятием, которое наряду с абстракцией широко используется в современном программировании, является инкапсуляция. Назначение инкапсуляции состоит в том, чтобы сделать реализацию программного компонента недоступной для клиентского кода. Клиентский код должен получать доступ к возможностям программируемого компонента только через его интерфейс. Такой подход предоставляет определенные преимущества, как для разработчика, так и для клиента. Разработчику это дает возможность в дальнейшем изменять реализацию. Если при изменении реализации не произошло изменение интерфейса, то не возникает необходимости в изменении клиентского кода. С другой стороны инкапсуляция избавляет клиента от опасности испортить реализацию компонента.
В языке Си имеется развитый аппарат подпрограмм, которые называются функциями.
Прежде чем переходить к изучению функций, поставим ряд вопросом, на которые излагаемый материал позволял бы находить ответы. Следует иметь в виду, что на один и тот же вопрос можно получить, казалось бы, совершенно разные ответы. Причем каждый из ответов будет правильным. Это имеет место в тех случаях, когда рассматриваемая проблема оказывается сложной. Заметим, что это в полной мере относится к работе с функциями. Совокупность полученных ответов часто позволяет уяснить существо самой проблемы и возможных способ ее решения.
При использовании функций важно получить ответ на следующие вопросы:
Какова роль функций в программировании?
Какие разновидности функций имеются в языке Си?
Чем отличается понятие функции языка Си от понятия функции, принятого в математике?
В чем состоят преимущества и недостатки применения функций при программировании на языке Си?
Как оценить качество разработанной функции?
Как организованы функции языка Си?
Из каких структурных частей состоит функция языка Си?
На многие вопросы можно найти ответ, рассматривая функцию как процедурную абстракцию. Изучение функций языка Си начнем с установления связи между ними и процедурной абстракцией.