
- •Введение
- •Разработка функций рекурсивных и без рекурсии, использующих параметр – функцию и оператор return
- •Return (выражение);
- •Функция возвращает значение любого простого типа
- •Функция возвращает указатель на скаляр, массив, структуру, файл или функцию
- •А) Функция возвращает указатель на скаляр
- •Б) Функция возвращает указатель на первый элемент одномерного массива
- •3) Ссылка - возвращаемый результат функции
- •Return имя переменной;
- •2.2.2 Рекурсивные функции
- •2.2.3 Указатели на функции
- •( * Имя указателя) (список фактических параметров);
- •2.2.4 Массивы указателей на функции
- •2.2.5 Определение типа указателя на функцию
- •2.2.6 Указатель на функцию - параметр функции
- •2.3 Задание на выполнение лабораторной работы
- •Порядок выполнения работы
- •Пример выполнения лабораторной работы
- •2.6 Контрольные вопросы
- •2.7 Варианты заданий лабораторной работы
- •Лабораторная работа № 6 Разработка программ с использованием структурированных данных
- •3.1 Цель лабораторной работы
- •Теоретические сведения
- •3.2.1 Структурные типы и структуры
- •Для обращения к элементам, входящим в состав конкретной структуры используются уточненные имена:
- •(*Имя указателя). Имя элемента структуры
- •3.2.2 Инициализация структур
- •3.2.3 Динамическое выделение памяти под структуру и массив структур
- •Элементы структур
- •Элементы структуры могут иметь одинаковый тип, тогда при описании таких элементов можно указывать их общий тип, а имена перечислить через запятую:
- •Struct def { def a , int b; } ; // - ошибка!
- •Strspy ( a.Fio, “ Петров”) ;
- •3.2.5 Структуры и функции
- •3.2.6 Использование массива указателей, инициированного строками
- •3.3 Задание на выполнение лабораторной работы
- •3.4 Порядок выполнения работы
- •3.5. Пример выполнения лабораторной работы
- •3.6 Контрольные вопросы
- •3.7 Варианты заданий лабораторной работы
- •4. Список литературы
Для обращения к элементам, входящим в состав конкретной структуры используются уточненные имена:
<имя структуры> . <имя элемента структуры>
Уточненные имена формируются с именем конкретной структуры, а не с именем структурного типа!
Например, для определенной выше структуры A оператор
A.st=450.5
присвоит переменной st значение 450,5.
Для ввода значения переменной fio структуры A можно, например, использовать оператор:
cin.getline (A.fio, 20);
Можно вывести в стандартный выходной поток значения элементов структуры.
Например, вывод в столбик полей fio каждой структуры массива grup:
for (int i=0; i< 25; i++) cout<<’\n’<<grup[i].fio;
Структурный тип обладает всеми правами имен типов и, следовательно, можно объявлять, как было уже сделано выше, указатели на структуры:
<имя структурного типа> * <указатель на структуру>;
Значением указателя на структуру может быть адрес структуры того же типа, то есть номер байта, начиная с которого структура размещена в оперативной памяти. Структурный тип задает размеры структуры и тем самым определяет, на какую величину (на сколько байт) изменится значение указателя на структуру, если к нему прибавить 1 (или из него вычесть 1), или при операциях инкремента (декремента).
Например, можно определить указатель на структуру типа men с инициализацией (тип men и структуры men1, men2, men3 объявлены выше):
men*ptr = & men2;
Указатель ptr инициализирован адресом структуры men2.
После объявления указателя, инициализированного адресом структуры men2, появляется еще два способа обращения к элементам структуры men2:
1) используя операцию ‘->’ доступа к элементам структуры, с которой в этот момент связан указатель:
имя указателя -> имя элемента структуры
2) используя операцию разыменования указателя и формирования уточненного имени:
(*Имя указателя). Имя элемента структуры
Таким образом, три следующих обращения эквивалентны:
men2.age
(*ptr).age
ptr->age
Если применить к указателю, например, операцию инкремента ( ptr++), значением указателя будет адрес другой структуры с большим адресом. Так, если структуры men1, men2, men3 являются локальными переменными, то ptr получит адрес структуры men1, так как сегмент стека заполняется от больших адресов к меньшим адресам. Если структуры являются внешними, то после операции инкремента ptr будет обладать адресом структуры men3, так как сегмент данных заполняется от меньших адресов к большим адресам. И теперь посредством указателя ptr можно будет обращаться к элементам другой структуры, “связанной” с этим указателем.
3.2.2 Инициализация структур
При определении структуры возможна ее инициализация, то есть задание начальных значений ее элементов.
После объявления структуры ставится знак ‘=’, за которым следует заключенный в фигурные скобки список значений для элементов структуры. Значения элементов перечисляют через запятую. Элементы инициализируются по правилам, определенным их типом.
Объявим с инициализацией структуру one типа student (см. выше) и структуру без объявления имени типа:
student one =
{“Петров”, 4123, {4,3,2}, (one.maks [0]+one.maks [1]+one.maks [2])/3.0};
struct { char* FIO ; int nz ; float st ; } A = { “ Иванов”, 1234, 280.5 };
Если надо провести инициализацию массива структур, то кроме общих фигурных скобок, список инициализации каждой структуры массива также заключается в фигурные скобки, которые перечисляются через запятую.
Например,
men Mas [3] = { {“Иванов”,30}, {“Петров”, 40}, {“Сидоров”, 70}};