- •Санкт-Петербургский
- •Структура программы на языке Си
- •Структура простейшей одномодульной программы
- •Комментарии в программе на языке Си
- •Начальные сведения о препроцессоре
- •Определение функции 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()
Функция языка Си и процедурная абстракция
Как отмечалось ранее, применение абстракции позволяет повысить качество декомпозиции. Язык Си позволяет реализовать один из видов абстракции, который принято называть процедурной абстракцией. Такой вид абстракции основан на применении подпрограмм. В процедурной абстракции используется способ, называемый абстрагированием через параметризацию. Понятие параметров функции знакомо читателю по работе с библиотечными функциями.
Понятие о функции
Функцией называется автономныйфрагмент программного кода, написанный на языке Си, имеющий собственноеимя, предназначенный для решения некоторой задачи ивозвращающий значениев точку вызова (последнее необязательное). Программной конструкцией для синтаксического оформления указанного фрагмента программного кода служит определение функции.
Прежде всего, отметим, что в языке Си предусмотрены две категории функций:
Обычные функции.
Встроенные функции или inlineфункции (стандарт С99).
Основное отличие между этими категориями функции состоит в том, что в выполняемом коде программы всегда присутствует только одна копия кода обычной функции. Программный код inlineфункции встраивается в каждую точку ее вызова.
Рассмотрим компоненты этого определения:
Имя. Каждая функция должна иметь имя, которое позволяет обратиться к инструкциям, входящих в функцию. Такое обращение называетсявызовом функции. Функцию можно вызывать из другой функции.
Автономность – важнейшая характеристика функции. Язык Си обеспечивает синтаксическую независимость функции от другого программного кода.
Возвращаемое значениепозволяет вернуть результаты вычислений в точку вызова. Следует отметить, что возвращаемое значение является не единственным средством передачи в точку вызова результатов вычислений. Результаты вычислений можно вернуть, с помощью аппарата параметров функции, используя в качестве параметров указатели.
При работе с функциями языка Си следует различать три понятия:
Определение функции.
Объявление функции (прототип).
Вызов функции.
Определение функции является ее реализацией. Написать функцию означает написать ее определение. Каждая функция в программе должна быть представлена только одним определением (это не относится к так называемым встроенным функциям или inlineфункциям).
В той точке программы, в которой функция должна выполнить требуемую от нее работу, к ней необходимо обратиться. Средством обращения к функции является вызов функции.
Появление прототипов функций связано с используемой в языке Си раздельной компиляцией отдельных модулей. Под модулем в языке Си понимается отдельный файл, имеющий расширение .c. Раздельная компиляция предполагает, что каждый модуль может разрабатываться, компилироваться и отлаживаться отдельно от других модулей. При этом вызов функции может оказаться в одном модуле, а ее определение – в другом модуле. Одно из преимуществ использования прототипа состоит в том, что его наличие позволяет компилятору выполнить корректную компиляцию вызова функции даже при условии недоступности ее определения. Программисту прототип позволяет написать корректный вызов функции. Перейдем к детальному рассмотрению программных компонентов, предназначенных для работы с функциями.
Следует учитывать, что определения функций в соответствии со стандартом языка Си не могут быть вложенными. Правда, некоторые расширения языка (например, вложенные функции реализованы среде rhide)