- •1. Краткие теоретические сведения
- •1.1. Понятие структуры
- •1.2. Определение (описание) шаблона структуры
- •1.3. Описатель типа
- •1.4. Объявление переменных структурного типа
- •1.5. Инициализация переменной структурного типа
- •1.6. Операции со структурами
- •1.7. Доступ к значениям полей структурного типа
- •1.8. Вложенные структурные типы
- •1.9. Массивы структурного типа
- •1.10. Структурные переменные и указатели
- •1.11. Структуры и функции
- •1.11. Использование синонима типа
- •1.12. Доступ к отдельному биту
- •1.13.Типичные ошибки при разработке структур
- •1.14. Примеры программирования задач на структуры
- •2. Задание
- •2.4. Задания для выполнения на занятиях
- •2.4.1. Задание 1. Вычисление с использованием структур
- •2.4.1.1. Условие задания
- •2.4.1.2. Пример для варианта 30
- •2.4.1.3. Программа
- •2.4.1.4. Тестирование
- •2.4.2. Задание 2. Массив структур
- •2.4.2.1. Условие задания
- •2.4.2.2. Пример выполнения работы
- •2.4.2.3. Программа
- •2.4.2.4. Тестирование
- •2.4.3. Задание 3. Структуры данных
- •2.4.3.1. Условие задания
- •2.4.3.2. Пример для варианта 30
- •2.4.3.3. Программа
- •2.4.3.4. Тестирование
- •2.4.4. Задание 4. Структуры данных
- •2.4.4.1. Условие задания
- •2.4.4.2. Пример для варианта 31
- •2.4.4.3. Программа
- •2.4.4.4. Тестирование
- •2.4.5. Задание 5. Создание и обработка структур
- •2.4.5.1. Условие задания
- •2.4.6.2. Пример для варианта 30
- •2.4.7.2. Пример для варианта 30
- •2.4.7.3. Программа
- •2.4.7.4. Тестирование
- •3. Выводы
- •4. Требование к отчету
- •4. Краткие теоретические сведения.
- •5. Вопросы для самоконтроля
- •Литература
- •1. Краткие теоретические сведения 2
- •1.1. Понятие структуры 2
1.11. Структуры и функции
Структуры могут быть переданы в функцию в качестве аргументов и могут служить в качестве возвращаемого функцией результата.
Существует три способа передачи структур функциям:
- передача компонентов структуры по частям;
- передача целиком структуры;
- передача указателя на структуру.
Например, в функцию передаются координаты двух точек:
void showrect(struct point p1,struct point p2)
{
printf("Левый верхний угол прямоугольника:%d %d\n",
p1.x, p1.y);
printf("Правый нижний угол прямоугольника:
%d %d\n", p2.x, p2.y);
}
При вызове такой функции ей надо передать две структуры:
struct point pt1={5,5},
pt2={50,50};
showrect(pt1,pt2);
Теперь рассмотрим функцию, возвращающую структуру:
struct point makepoint (int x,int y) /*makepoint – формирует точку по компонентам x и y*/
{
struct point temp;
temp.x = x;
temp.y = y;
return temp;
}
Результат работы этой функции может быть сохранен в специальной переменной и выведен на экран:
struct point buf;
buf=makepoint(10,40);
printf("%d %d\n",buf.x,buf.y);
После выполнения этого фрагмента на экран будут выведены два числа: 10 и 40.
Структура может быть параметром функции и возвращаемым функцией значением, например заголовок функции ff:
struct student ff (struct student x)
говорит, что формальный параметр х и возвращаемый функцией результат имeют структурный тип student. Фактический параметр функции ff структура типа student, связь между формальным и фактическим параметром устанавливается по значению, т.е. для переменной х выделяется память, куда копируется значение фактической структуры при вызове функции. Вызов функции (для приведенных выше описаний):
stud1 = ff ( stud[0] );
Кроме того, в обоих случаях могут использоваться указатели на объекты структурного типа:
student * ff ( student * x )
Вызов функции (для приведенных выше описаний):
pstud = ff ( &stud [j] ) ;
Здесь pstud – указатель на структуру, который должен быть определен до вызова ff:
student *pstud;
Если функция не изменяет структуру, вы можете передать структуру в функцию по имени. Например, следующая программа в примере 14.50 использует функцию show_employee для вывода элементов структуры типа employee:
Пример 14.50
#include <iostream.h>
#include <string.h>
struct employee
{
char name[64];
long employee_id;
float salary;
char phone[11];
int office_number;
};
void show_employee(employee worker)
{
cout << "Служащий: " << worker.name << endl;
cout << "Телефон: " << worker.phone << endl;
cout << "Номер служащего: " << worker. employee_id << endl;
cout << "Оклад: " << worker.salary << endl;
cout << "Офис: " << worker.office_number << endl;
}
void main(void)
{
employee worker;
// Копировать имя в строку strcpy(worker.name, "Джон Дой");
worker.employee_id = 12345;
worker.salary = 25000.00;
worker.office_number = 102;
// Копировать номер телефона в строку strcpy(worker.phone, "555-1212");
show_employee(worker);
}
Как видите, программа передает переменную типа данной структуры worker в функцию show__employee по имени. Далее функция show_employee выводит элементы структуры. Однако обратите внимание, что программа теперь определяет структуру employee вне main и до функции show_employee. Поскольку функция объявляет переменную worker типа employee, определение структуры employee должно располагаться до функции.
Как вы знаете, если функция изменяет параметр, вам следует передавать этот параметр в функцию с помощью адреса. Если функция изменяет элемент структуры, вы должны передавать эту структуру в функцию с помощью адреса, Для передачи переменной типа структуры с помощью адреса вы просто предваряете имя переменной оператором адреса C++ (&), как показано ниже:
some_function(&worker);
Внутри функции, которая изменяет один или несколько элементов, вам следует работать с указателем. Если вы используете указатель на структуру, легче всего обращаться к элементам структуры, используя следующий синтаксис:
pointer_variable->member = some_value;
Например, следующая программа в примере 14.51 передает структуру типа employee в функцию с именем get_employee_id, которая запрашивает у пользователя идентификационный номер служащего и затем присваивает этот номер элементу структуры employee_id. Чтобы изменить элемент, функция работает с указателем на структуру:
Пример 14.51
#include <iostream.h>
#include <string.h>
struct employee
{
char name[64];
long employee_id;
float salary;
char phone[11];
int office_number;
};
void get_employee_id(employee *worker)
{
cout << "Введите номер служащего: ";
cin >> worker->employee_id;
}
void main(void)
{
employee worker;
// Копировать имя в строку strcpy(worker.name, "Джон Дой");
get_employee_id(&worker) ;
cout << "Служащий: " << worker, name << endl;
cout << "Номер служащего: " << worker.employee_id << endl;
}
Как видите, внутри main программа передает переменную worker типа структуры в функцию get_employee_id с помощью адреса. Внутри функции gel_employee_id значение, введенное пользователем, присваивается элементу employee_id с помощью следующего оператора:
cin >> worker->employee_id;
Если функция изменяет элемент структуры, вызвавшая программа должна передать структуру в функцию с помощью адреса. Функция, в свою очередь, использует указатель на структуру. Для обращения к элементу структуры функции следует использовать следующий формат:
value = variable->member;
variable->other_member = some_value;
Структуры позволяют достаточно эффективно решить вопрос возврата множества значений из функции. Если функция должна вернуть несколько значений в качестве результата, то их достаточно поместить в структуру и возвращать значение указанного типа.
struct Point {
int x,y;
};
Point GetCursorPosition() {
Point cursor;
…
return cursor;
}
В этом случае вызывающая функция будет получать результат типа Point, содержащий два значения – координаты x и y курсора:
void DisplayCursorInfo()
{
Point cursor;
cursor = GetCursorPosition();
cout << cursor.x;
cout << cursor.y;
}