Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФУНКЦІЇ ЗДАВАТИ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
611.33 Кб
Скачать

Int day; /* на зовнішньому рівні */

char топ[10]; int year;

);

Запишемо функцію, яка заповнює поля структури struct full_date даними поточної дати і повертає сформовану структуру. Щоб отримати інформацію про поточну дату, використаємо бібліотечну функцію getdate (), прототип якої оголошений у за­головному файлі <dos.h>. Ця функція формує структуру зі встановленим у <dos.h> шаблоном struct date (він складається з трьох цілочислових полів) і записує її у змінну, адреса якої задається єдиним параметром функції getdate {).

/* Функція формування поточної дати */ •include <dos.h>

struct full_date GetCurDate (void)

struct date dat; /* структура, оголошена в <dos.h> */

struct full_date curd;

char" mon_name[]ei "Січень", "Лютий", "Березень", "Квітень", /* масив назв */ "Травень", "Червень", "Липень", "Серпень", /* місяців */ "Вересень", "Жовтень", "Листопад", "Грудень" );

11.7. Багатовимірні масиви я* параметри функцій і -.. = 209

/* визначення поточної дати - <dos.h> */ /* заповнення полів змінної curd */

/* повернення структури-дати */

Значення, яке повертає функція GetCurDate (), можна присвоїти довільній змінній, шо має тип struct full_date. Прикладом є наступний фрагмент програми, який заповнює змінну today даними поточної дати та виводить результат:

struct full_date today; today - GetCurDate();

printf("Сьогодні: %s, %d - %d p.", today.mon, today.day, today.year); На екран виводиться поточна дата у формі рядка:

Сьогодні: Травень, 14 - 2004 р.

Способи передавання структур. Використовують різні способи передавання

структур у функцію для опрацювання. Серед них:

  • передавання цілих структур через відповідні параметри-структури;

  • передавання адрес структур через параметри - вказівники на структури;

  • передавання окремих полів структур.

Залежно від конкретного випадку, кожен з цих способів має свої переваги й недоліки.

Проілюструємо різні форми опрацювання структур у функціях на прикладі такої іалачі. Задано масив структур, в яких зберігаються персональні дані членів наукового товариства (через typedef шаблону структур присвоєно ім'я PDAT). Одне з полів структури, а саме workplace, задає місце праці науковця:

typedef struct person_data ! /* шаблон структури з даними */

/* члена наукового товариства */

char workplace!601; \ PDAT;

Нехай певна наукова установа змінила своє найменування. Треба внести відповідні зміни в масив структур. Розглянемо три функції, призначені для зміни поля workplace.

Перший варіант базується на передаванні у функцію значення всієї структури. Якщо поле workplace цієї структури збігається зі заданим найменуванням установи oldname. то воно замінюється новим найменуванням newname, інакше структура не змінюється. Функція повертає опрацьовану структуру.

/' перший варіант функції зміни найменування місця праці */

♦include <string.h>

PDAT ChangeWorkPlacel (PDAT member)

1

char • oldname - ■ старе найменування "; chat * newname - " нове найменування ";

if < strcmp(member.workplace, oldname) ■*= 0 )

strcpy ( member .workplace, newname ); return member;

Ї

Для внесення змін у всю базу даних функцію потрібно застосувати циклічно: •define N 180 PDAT persondat[N];

. . . /*■ заповнення даними масиву persondat|N] */

for (і-0; i<N; і+4)

persondat[i] =ChangeWorkPlacel (persondatJ);

Наведена версія реалізації поставленої задачі найбільш нераціональна, оскільки в процесі опрацювання кожної структури масиву тричі виконується її копіювання, навіть, якщо поля структури не змінюються взагалі.

Перше копіювання структури відбувається у момент виклику функції, коли елемент масиву persondatfij переписується у формальний параметр member. Друга копія створюється у процесі виконання оператора

return member;

коли вміст структури member переписується у буфер обміну. Останнє копіювання ви­конує оператор, що присвоює елементу масиву persondat І і ] значення, яке повергає функція ChangeWorkPlacel (J.

Набагато ефективнішим є наступний варіант функції з використанням формаль­ного параметра pmemb, шоє вказівником на структуру, яку необхідно опрацьовувати. У разі виклику функції ChangeWorkPlace2 (ї цей параметр отримує адресу відповід­ної структури, тому в тілі функції відбуваються звертання безпосередньо до потрібних полів і не втрачається час на копіювання структур.

/• Другий варіант функції зміни найменування місця праці •/ void ChangeWorkPlacel (PDAT * pmemb)

I

char * oldname = " старе найменування ", * newname - " нове_найменування ": if {strcmp(pmemb->workplace, oldname) ==0} strcpy(pmemb->workplace, newname);

1

Приклад використання функції для внесення змін у весь масив:

for (і - 0; і < N; L++)

ChangeWorkPlace2 (persondat+i); /* або tpersondat (і ] */

Третій варіант функції ChangeWorkPlace3() використовує формальний пара­метр workname, що безпосередньо задає адресу символьною рядка, який треба перевірити і в разі потреби змінити. Відповідним фактичним параметром у викликах цієї функції має бути адреса поля структури, в якому записано найменування місця праці.