
- •Введение
- •Разработка функций рекурсивных и без рекурсии, использующих параметр – функцию и оператор 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. Список литературы
3.2.3 Динамическое выделение памяти под структуру и массив структур
Для выделения памяти будем использовать операцию new. Для освобождения – операцию delete.
Выделение памяти производится по общим правилам, и в качестве типа данного на которое выделяется память, следует использовать структурный тип.
Пример: Объявить структурный тип, объединяющий характеристики книги. Выделить динамически память на одну структуру и на массив структур.
//объявление типа
struct book {
char*name; //название;
char *author; //автор;
int year ; //год издания;
int pages ; //количество страниц;
};
book * une ; // объявим указатель на структуру типа book;
une = new ( book); // выделение памяти на одну структуру;
une->year=2009; //присваивание полю year значения, что эквивалентно
// (*une).year =2009;
…
delete une ; // освобождение памяти, выделенной на одну структуру;
une = new book [9] ; // выделение памяти на массив структур типа book;
une[0].year = 1999; // эквивалентно une->year=1999;
(une+1)-> year=2001 // эквивалентно une[1].year =2001
…
delete [ ] une ; //освобождение памяти, выделенной на массив структур;
Элементы структур
Элементы структуры могут иметь одинаковый тип, тогда при описании таких элементов можно указывать их общий тип, а имена перечислить через запятую:
struct { int i1, i2 ; char c [4]; } str;
Элементом структуры не может быть структура того же типа:
Struct def { def a , int b; } ; // - ошибка!
Элементом структуры может быть указатель того же структурного типа:
struct good { good* B ; float C; };
Элемент, предназначенный для хранения символьных строк (например, фамилии человека), может быть описан как символьный массив:
struct { сhar fio [ 20];…; } A;
и тогда:
а) нельзя присвоить полю fio значение строковой константы, используя, оператор:
A.fio = “Петров”; – не допустимо!
так как имя массива – указатель константа и нельзя ему присвоить новое значение адреса строки;
б) чтобы поместить в это поле fio строку с фамилией надо воспользоваться оператором копирования:
Strspy ( a.Fio, “ Петров”) ;
прототип встроенной функции strcpy:
char* strcpy (char*s1 , char* s2);
представлен в модуле string.h, функция strcpy копирует символы строки s2 в строку s1 и возвращает адрес строки s1;
в) можно ввести значения компонента fio с клавиатуры (т.к. память под элементы массива выделена), например:
cin>> A.fio ; /* ввод начинается от первого символа, отличного от пробела до первого обобщенного пробела; в конце строки в память помещается двоичный ноль */
cin.getline( A.fio, 20);
/*вводятся любые символы, включая и пробелы; чтение происходит до наступления одного из событий: прочитаны 19 символов или ранее появился символ перехода на новую строку ‘\n’ (при вводе с клавиатуры это означает, что была нажата клавиша Enter); в конце строки в память помещается двоичный ноль */
г) допустимо посимвольное присваивание:
A.fio [0] = ‘П’ ;
Элемент, предназначенный для хранения строковой информации, может быть представлен в виде указателя на char
struct { char* FIO ; …; } st;
и тогда:
а) допустима операция присваивания указателю адреса строки:
st.FIO=” Григорьев”;
в этом случае указателю присваивается адрес участка памяти, выделенного строковой константе;
б) при использовании указателя для представления символьной строки выделяется память только на указатель, а под элементы строки память не выделяется; если в данном случае надо ввести значение строки с клавиатуры (или из файла), следует динамически выделить участок памяти и присоединить к нему указатель FIO. Затем произвести ввод строки, например, так:
st.FIO=new char [20];
cin>> st.FIO;