
- •11.5.1. Масиви - параметри функцій
- •11.5.2. Символьні рядки - параметри функцій
- •Int day; /* на зовнішньому рівні */
- •11.8. Опрацювання структур у функціях
- •11.9.1. Оголошення вказівника на функцію. Звертання через вказівник
- •11.9.2. Вказівник на функцію як параметр функцій
- •11.9.3. Функції, що повертають вказівник на функцію
- •11.9.4. Масиви вказівників на функцію
- •Void Menu (void);
- •Int main (void)
- •Void Menu (void) /* функція формування меню */
- •Int nuro, nitems;
- •If (pred — null) (
- •Int* FindElement (int nfind, int arr[], int k)
- •If (*pel «nfind) return pel; /* число знайдено */
- •11.11.2. Макрозасоби для роботи з неогопошеними параметрами
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 */
/*
повернення структури-дати */
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 (persondat[і J);
Перше копіювання структури відбувається у момент виклику функції, коли елемент масиву 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, що безпосередньо задає адресу символьною рядка, який треба перевірити і в разі потреби змінити. Відповідним фактичним параметром у викликах цієї функції має бути адреса поля структури, в якому записано найменування місця праці.