Решение
Решение
Операции над структурами
Инициализация структур
Обращение к полям структуры
Для обращения к отдельным полям структуры в языке Си служат два оператора:
· .
· ->
Оператор . используется в том случае, когда известна переменная, имеющая тип структуры. Оператор -> при работе со структурой через указатель. Оба оператора относится к категории бинарных операторов. Эти операторы имеют следующий формат:
· <α1> . <b>.
· <α2> -> <b>.
Здесь α1 – переменная, имеющая тип структуры, α2 – указатель, установленный на объект типа структуры, а b - поле структуры.
Важно отметить, что результат вычисления рассматриваемых выражений имеет все свойства своего правого операнда. К ним относятся значение и тип результата. Рассмотрим следующий пример. Пусть имеется следующий программный код.
#define MLEN 81
struct person_salary
{
char fio[MLEN];
double salary;
};
//…
struct person_salary employee;
struct person_salary* p = &employee;
Тогда можно написать следующий программный код, содержащий обращения к полям объекта employee.
strcpy(employee.fio, “Petrov Ivan Ivanovich”);
puts(p->fio);
p->salary = 10000;
printf(“%10.3f\n”, employee.salary);
Структура может быть инициализирована во время своего определения. Ограничимся примером.
#define MLEN 81
struct person_salary
{
char fio[MLEN];
double salary;
};
int main(void)
{
struct person_salary new_person = {
“Ivanov I.I”,
};
// …
}
Со структурой как со структурной переменной можно выполнять следующие операции:
· присваивание,
· передавать в функцию по значению,
· передавать в функцию с использованием указателя,
· структуру можно использовать как значение, возвращаемое функцией.
Остальные операции со структурами выполняются по компонентно.
Пример 1. Присваивание структур.
Постановка задачи. Имеются две структуры person1 и person2. Требуется скопировать поля структуры person1 в структуру person2.
#define MLEN 81
struct person_salary
{
char fio[MLEN];
double salary;
};
int main(void)
{
struct person_salary person1 = {
“Ivanov I.I”,
};
struct person_salary person2 = {
“Petrov P.P”,
};
person2 = peson1;
// …
}
После выполнения этого фрагмента программного кода все поля структуры person1 оказались скопированными в структуру person2.
Пример 2. Возврат функцией значения типа структуры.
Постановка задачи. Заданы значения полей. Требуется сформировать структуру (построить структурную переменную) структуру.
#define MLEN 81
struct person_salary
{
char fio[MLEN];
double salary;
};
// Прототип функции, которая формирует структуру
struct person_salary form_struct(const char* fio, double
salary);
int main(void)
{
struct person_salary = form_struct(“Petrov P.P.”, 20000);
//…
}
struct person_salary form_struct(const char* fio, double
salary)
{
struct person_salary temp;
strcpy(temp.fio, fio);
temp.salary = salary;
return temp;
}
Пример 3. Использование указателей для передачи структур в качестве аргументов функций.
Постановка задачи. Выполнить обмен значений двух структур.
Решение
#define MLEN 81
struct person_salary
{
char fio[MLEN];
double salary;
};
void swap_struct(struct person_salary* p1,
struct person_salary* p2);
int main(void)
{
struct person_salary person1, person2;
//…
swap_struct(&person1, &person2);
//…
}
void swap_struct(struct person_salary* p1,
struct person_salary* p2)
{
struct person_salary temp = *p1;
*p1 = *p2;
*p2 = temp;
}