Решение

Решение

Операции над структурами

Инициализация структур

Обращение к полям структуры

Для обращения к отдельным полям структуры в языке Си служат два оператора:

· .

· ->

Оператор . используется в том случае, когда известна переменная, имеющая тип структуры. Оператор -> при работе со структурой через указатель. Оба оператора относится к категории бинарных операторов. Эти операторы имеют следующий формат:

· <α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;
}