- •Часть 1
- •40 01 02 – 02 Информационные системы и технологии (в экономике)
- •Общие сведения Сведения об эумк
- •Методические рекомендации по изучению дисциплины
- •Рабочая учебная программа
- •Протокол согласования учебной программы по изучаемой учебной дисциплине с другими дисциплинами специальности
- •Содержание дисциплины
- •1. Название тем лекционных занятий, их содержание, объем в часах
- •3. Перечень тем лабораторных занятий, их содержание и объем в часах
- •Теоретический раздел
- •Тема № 1. Введение в программирование
- •Происхождение языка с.
- •Основные характеристики алгоритмического языка с
- •Область применения
- •Системы программирования
- •Исходные и объектные модули, процессы компиляции и связывания
- •Алфавит языка
- •Лексемы (cTokens)
- •Тема № 2. Выражения и операции языка Унарные операции
- •Бинарные операции
- •Условная трехместная операция
- •Операция явного преобразования типа
- •Приоритет операций. Порядок вычисления выражений.
- •Организация ввода-вывода информации
- •Тема № 3. Управляющие структуры. Ветвления и циклы
- •Операторы преобразования данных – это операторы присваивания и произвольные выражения, завершенные символом «;».
- •Операторы управления работой программы называют управляющими конструкциями программы.
- •Тема № 4. Организация данных. Массивы и указатели Массивы
- •Инициализация массивов
- •Указатели
- •Функции для выделения и освобождения памяти
- •Тема № 5. Функции. Символьные строки и функции над ними Определение функций
- •Описание функций
- •Вызов функции
- •Передача параметров
- •Указатели на функции
- •Массивы указателей на функции
- •Главная функция. Передача аргументов главной функции
- •Рекурсивные программы
- •Стандартные функции ввода-вывода строк
- •Стандартные функции обработки строк
- •Тема № 6. Классы памяти и препроцессор языка Си Локальные и глобальные переменные
- •Автоматические (локальные) переменные
- •Внешние (глобальные) переменные
- •Статические переменные
- •Регистровые переменные
- •Область видимости и функции
- •Препроцессор и его директивы
- •Тема № 7. Структуры Декларация структур
- •Инициализация структур
- •Доступ к элементам структур
- •Элементы-массивы
- •Массивы структур
- •Указатели на структуры
- •Доступ к элементам структуры, определенной через указатель
- •Структуры и функции
- •Объединения
- •Битовые поля
- •Практический раздел Виртуальные лабораторные работы
- •Лабораторная работа №1
- •Лабораторная работа №2
- •Контрольные работы
- •Содержание пояснительной записки.
- •Задание для контрольной работы №1
- •Задание для контрольной работы №2
- •Варианты индивидуальных заданий
- •Теоретические вопросы
- •Пример оформления титульного листа для виртуальных лабораторных работ
- •Пример оформления титульного листа для контрольных
Указатели на функции
Рассмотрим теперь вопрос о том, почему в языке С функция введена как один из производных типов. Необходимость в таком типе связана, например, с задачами, в которых функция (или ее адрес) должна выступать в качестве параметра другой функции или в качестве значения, возвращаемого другой функцией. В этом случае используется «указатель на функцию».
Самый употребительный «указатель на функцию» – это ее имя (идентификатор). Идентификатор <имя_функции> в ее определении и в ее прототипе подобен имени массива и является указателем-константой. Он навсегда связан с определяемой функцией и не может быть «настроен» на что-либо иное, чем ее адрес.
«Указатель на функцию» (как переменная) вводится отдельно от определения и прототипа какой-либо функции. Для этих целей используется конструкция:
<тип> (*<имя_указателя>)(<спецификация_параметров>);
где <тип> - определяет тип возвращаемого функцией значения;
<имя_указателя> - идентификатор, произвольно выбранный программистом;
<спецификация_параметров> - определяет состав и типы параметров функции.
В отличие от имени функции указатель func0 является переменной, т.е. ему можно присваивать значения других указателей, определяющих адреса функций программы. Важно, что тип указателя-переменной должен полностью соответствовать типу функции, адрес которой ему присваивается.
Массивы указателей на функции
Указатели-переменные могут группироваться в массивы, при этом используется следующая форма их определения:
<тип> (*<имя_массива>[<размер>])(<спецификация_параметров>);
где <тип> - определяет тип возвращаемых функциями значений;
<имя_массива> - идентификатор, произвольно выбранный программистом;
<размер> - количество элементов в массиве;
<спецификация_параметров> - определяет состав и типы параметров функций.
Пример:
int (*farray[4]) (int);
где farray - массив из 4-x указателей на функции, каждому из которых можно присвоить адрес функции с прототипом <int имя_функции (int)>.
Главная функция. Передача аргументов главной функции
Главная функция – это функция, которая имеет имя main. Главная функция обязательна в любом выполняемом комплексе функций и всегда только одна. Она получает управление от операционной системы, а после выполнения передает управление. Функция main в общем случае имеет следующее определение:
void main( int argc, char *argv[])
В переменную argc передается число аргументов, размещенных в строке «Programm arguments» раздела Project Settings плюс один дополнительный аргумент, который среда Microsoft Visual C++ генерирует автоматически, и представляет собой символьную строку, содержащую путь доступа к исполняемой программе, т.е. строку вида "D:\Prog\dd\Debug\dd.exe".
Переменная *argv[] является указателем на массив указателей, в котором каждый элемент представляет собой адрес символьной строки, передаваемой из командной строки в качестве аргумента. Первым адресом в этом массиве будет адрес дополнительного аргумента, который генерируется автоматически.
Рекурсивные программы
Рекурсивной называют функцию, которая прямо или косвенно вызывает сама себя. Классический пример – это функция, вычисляющая факториал n! = 1*2*…*n, 0!=1.
long Factorial(int n)
{
if (n < 0 ) return 0; // не определен – возврат нуля
if (n == 0 ) return 1;
return(n* Factorial(n - 1));
}
Следует обратить внимание, что последовательность рекурсивных обращений к функции Factorial прерывается при вызове Factorial(0).
В этой функции используется прямая рекурсия – в ее теле содержится вызов этой же функции. Может быть и косвенная рекурсия – когда вызывается другая функция, содержащая вызов первой.
A() { … B(); …}
B() { … A(); …}
