Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика.ЛБ

.pdf
Скачиваний:
15
Добавлен:
14.04.2015
Размер:
950.97 Кб
Скачать

У бібліотеці <stdlib.h> існує також функція пошуку змінних структурного типу в масиві цих змінних.

4.3 Контрольні питання

1.Що таке дані типу структура і які типи даних вони містять?

2.Як описуються дані типу структура?

3.Які існують засоби ініціалізації полів структури?

4.Що таке ―вкладеність― структур?

4.4. Індивідуальні завдання

1.З відомості працівників цеху визначити, скільки в цеху чоловіків-

токарів?

2.Скільки в групі студентів-відмінників (всі оцінки 5) і студентів невстигаючих?

3.Є чи в групі студенти, що грають у волейбол , зріст яких більше 180

см?

4.Список студентів відсортувати за зменщенням середнього бала.

5.Ввести в довільному порядку відомості про студентів групи. Вивести прізвища студентів по групах: встигають ‖добре‖,‖ задовільно‖,‖ незадовільно‖.

6.Віддрукувати список робітників-жінок ціху пенсійного віку.

7.Ввести в пам'ять розклад електропоїздів прямуючих з Харкова через Мерефу. Які з потягів прямують тільки до Мерефи?

8.Хто зі студентів групи має самий великий зріст і вагу ?

9.Ввести відомості про дату народження студентів групи, вивести дані в

такому порядку: спочатку - про народжених в 1-ої декаді, потім у 2-ий і 3-їй декадах.

10.Зі списку студентів групи вивести на екран два списки: перший містить прізвища дівчин, другий — прізвища юнаків.

11.Список студентів групи ввести в довільному порядку, а вивести на екран по групах, кожна група належить до якого-небудь знака зодіаку.

12.За яким предметом в студента з заданим номером по журналу краща оцінка за підсумками сесії?

13.Ввести в пам'ять результати змагань по лижних гонках. Показати п'ять кращих результатів окремо для юнаків і дівчат.

14.За результатами лижних змагань у трьох групах сформувати збірну команду з 7 чоловік.

15.Ввести списки двох студентських груп, упорядкованих за зменшенням середнього бала. Виконати злиття списків в один список, упорядкований за тою же відзнакою.

71

16.В одному списку інформація про студентів, що приймали участь в олімпіаді по математиці, в іншому — по інформатиці. Сформувати третій список з учнями, що брали участь в обох олімпіадах.

17.З якого предмета в заданого студента краща оцінка за підсумками навчального року ?

18.Хто зі студентів-спортсменів здав усі випускні іспити на "добре" і "відмінно" ?

19.Хто краще учиться в групі - дівчата або юнаки?

20.Є чи в групі студенти, що мають оцінку 4 або 5 по інформатиці і грають в шахи ?

21.Знаючи прізвища улюблених письменників ваших друзів, надрукувати прізвища п'яти найбільш популярних письменників.

22.Обчислити середній бал групи і роздрукувати список студентів, що мають середній бал вище за середнє бала групи.

23.Роздрукувати список студентів, прізвища яких починаються з букви "А", і їхньої оцінки за час навчання.

24.За підсумками останньої сесії роздрукувати список відмінників і тих, що вчаться добре упорядкований за алфавітом.

25.Обчислити середній бал групи і роздрукувати список студентів за зменшенням середнього бала.

72

5 ВИКОРИСТАННЯ ФУНКЦІЙ ПРИ РОЗРОБЦІ ПРОГРАМ

5.1 Ціль роботи

Придбання навичок складання і використання функцій при розробці програм.

5.2 Методичні вказівки з організації самостійної роботи студентів

При підготовці до роботи варто вивчити матеріал з організації і використанню функцій. Звернути увагу на те, що програма мовою С++ складається з розділу визначень (описів) і набору однієї чи декількох функцій.

Функція це логічно завершена сукупність описів і операторів, призначених для виконання визначеної задачі.

У мові С++ немає розподілу на основну програму і підпрограми, на процедури і функції і т.д. Однак серед функцій повинна бути одна з ім'ям main, що може знаходитися в будь-якому місці програми. Ця функція виконується завжди першою і закінчується останньою. Будь-яка функція має однакову структуру, що має вигляд :

[тип результату ] ім'я функції ([список формальних аргументів])

{

// тіло функції

опис даних ; оператори ; [return] [вираз];

}

тут квадратні дужки [ ], як звичайно вказують, що розташованана в них конструкція може бути відсутньою ;

тип результату будь-який базовий або раніше описаний тип значення, яке повертається функцією (необов'язковий параметр), якщо він відсутній, тоді тип результату буде цілий (int); цей параметр може бути описаний ключовим словом (void), у цьому випадку функція не повертає ніякого значення (результату). Якщо параметр заданий із зірочкою (*) функція повертає покажчик на об'єкт, або на одержання адреси об'єкта (& ) (в операторі return);

ім'я функції будь-яке ім'я, що складається з літер, цифр і знака "_" (підкреслення), що починається літерою або знаком "_", або ім'я main, за ім'ям функції завжди повинна стояти пара круглих дужок ( ), у яких записуються формальні параметри, а якщо їх немає, тоді порожні дужки.

73

Варто мати на увазі, що фактично ім'я функції це особливий вигляд покажчика на функцію, його значенням є адреса початку входу у функцію;

список формальних аргументів визначає кількість, тип і порядок проходження переданих у функцію вхідних аргументів, що друг від друга розділяються комою. У випадку, коли список відсутній, це поле буде порожнім ( ), або містити ключове слово ( void ) . Формальні параметри функції цілком локалізовані в ній і недоступні для будь-яких інших функцій.

Список формальних аргументів повинний мати наступний вигляд:

( [const] тип 1 [параметр 1] , [const] тип 2 [параметр 2],. . . )

У цьому списку не можна групувати параметри одного типу, указавши їх тип один раз, для кожного параметра треба вказувати його тип. Слово const повідомляє компілятору, що значення параметра не повинне змінюватися функцією ( це необов'язковий атрибут). За замовчуванням усі формальні параметри передаються за значенням, тобто якщо вони змінюються в тілі функції, то за її межами залишаються без зміни, оскільки передаються не самі значення, а їхні копії. Ці копії створюються усередині функції, це ілюструє, наприклад, такий фрагмент програми:

void fun ( int p)

{

++ p;

cout << " p=" << p << endl;

}

void main ( )

{

int x = 10;

fun (x); // виклик функції cout << "x=" << x << endl;

}

У результаті роботи цього фрагмента програми буде виведено: р=11, х = 10, оскільки для виклику функції fun(x) до неї передається копія значення рівного 10, під час виконання цієї функції значення p збільшується на 1, тобто (++р) і, тому виводиться р = 11, але за межами функції зазначене значення не змінюється. Якщо треба змінити змінну оригінал, тобто передати зміну параметра за межами тіла функції, то можна передати значення параметра за посиланням або використовувати параметр-покажчик. Тоді, використовуючи параметрпосилання, одержимо :

// Використання параметра - посилання void fun (int &р)

{ ++p;

cout << "p = " << р << endl;

74

}

void main ( )

{

int x = 10; fun( x );

cout << "x=" << x << endl;

}

У результаті буде виведена інформація: р=11 і х=11.

Під час використання аргументу-покажчика програма буде мати вигляд:

// Використання параметра - покажчика void fun2 (int *p)

{

++*р;

cout << "*p = " << *p << endl;

}

void main ( )

{

int x = 10; fun2 ( &x );

cout << "x = " << x << endl;

}

У цьому випадку одержуємо той же результат, тобто р = 11 і х = 11.

Під час використання таких параметрів у функцію і з неї передається не значення, а адреса, тому зміна значення цієї змінної усередині функції передається за її межі (в інші функції). Якщо треба, щоб які-небудь параметри не змінювали свої значення усередині функції, то їх варто оголосити як параметри-константи, використовуючи модифікатор const .

Тіло функції може складатися з описів змінних і операторів. Змінні, котрі використовуються при виконанні функції, можуть бути глобальні і локальні. Якщо змінні описані (визначені) за межами функції, вони будуть глобальними. З їхньою допомогою можна передавати дані у функцію, не включаючи до складу формальних аргументів. У тілі функції їх можна змінювати і потім отримані значення передавати в інші функції.

Змінні, описані в тілі функції, називаються локальними або автоматичними. Вони існують тільки під час виклику функції. Як тільки відбувається повернення з функції, система видаляє локальні змінні і звільняє пам'ять. Отже, між викликами функції значення локальних змінних губиться, тому ініціалізацію локальних перемінних треба робити щораз при виклику функції.

75

У випадку, коли необхідно зберегти значення локальних змінних між викликами функції, їх треба описати як статичні за допомогою службового слова static, наприклад:

static int x, y; або static float p = 3.25;

Статична змінна схожа на глобальну, але доступна тільки в тій функції, у якій вона оголошена.

Таким чином, можна зробити висновок:

параметри функції передаються в неї за значенням, тому за межами функції вони не змінюються, тобто їх не можна використовувати для передачі результату роботи функції;

при передачі результату функції

за

її межі використовуються:

або передача параметрів за посиланням (&р);

або

передача за покажчиком

(*р), у цьому випадку під час звертання до функції застосовується символ адреси & , тобто (&р); або як параметр функції варто використовувати глобальні змінні;

локальні (звичайні) змінні використовуються в тілі функції, існують тільки під час роботи функції, а при виході з неї знищуються, тому такі змінні називаються автоматичними і їх можна використовувати тільки для перетворень усередині функції;

якщо виникає необхідність збереження значень локальних змінних між викликами функції, то вони повинні бути оголошені як статичні, тобто з описом static, наприклад:

static char st[ ] = "Тесленко А.М.";

у якості вхідних (і вихідних) формальних аргументів функцій можуть використовуватися масиви як фіксованої довжини, так і змінної; якщо використовується в якості формальний масив змінної довжини, то обов'язково серед аргументів функції повинна бути змінна, що вказує длину масиву, наприклад:

int minmas (int mas [ 50]);

// Масив фіксованої довжини

int minmas

(int mas [ ], int n);

//Масив змінної довжини

int minmas

(int *mas, int n);

//Масив змінної довжини

усі масиви формальні аргументи передаються за адресою, тобто як покажчики;

на початку програми записується заголовок використовуваної функції, який називається прототипом , наприклад:

double sgr (double);

// Прототип функції sqr

76

. . . . . . . . .

int main ( )

{

cout << "5**2 = " << sgr (5) << endl; // Виклик функції

}

При записі прототипу можна перелічувати тільки типи формальних елементів без імен, і наприкінці необхідно ставити символ ";" , а в описі функції цей символ після заголовка не записується.

в останніх версіях мови С++ з'явилася можливість передавати дані за замовчуванням. У цьому випадку при написанні функції аргументам присвоюються початкові значення, що можуть мати всі аргументи або частину з них. У результаті задовольняються наступні вимоги: якщо якому-небудь аргументу надане значення за замовчуванням, то всі аргументи, що стоять за цим параметром (тобто записаним праворуч), повинні мати значення за замовчуванням. Таким чином, список параметрів поділяється на дві частини: параметри, що не мають значення за замовчуванням, і параметри, що мають такі значення.

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

void funct1 ( float x, int y, int z =80 )

{

cout << "x = " << x << " y= " << y << "z=" << z << endl;

}

void funct2 ( float x, int y = 25 , int z = 100 )

{

cout << "x=" << x << "y=" << y << "z=" << z << endl;

}

 

 

void

funct3 ( float x=3.5 , int y= 40, int z =200 )

{

 

 

cout

<< "x = " << x << "y = " << y << "z = " << z << endl;

}

 

 

 

main ( )

 

{

 

 

funct1 ( 5.1 , 10 );

// за замовчуванням один аргумент z

funct2 ( 10.2 );

// за замовчуванням два аргументи y ,z

77

funct3 ( );

// за замовчуванням всі аргументи

}

 

 

 

На екрані буде виведено:

x =5.1

y = 10

z = 80

 

x =10.2

y = 25

z = 100

 

x =3.5

y = 40

z = 200

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

при виклику функції

funct (13.5, 75); на екрані буде виведено :

 

x = 13.5 y =75

z = 80 ,

тобто

z - прийнято за замовчуванням.

5.2.1 Використання покажчиків на функцію

 

 

Синтаксис

мови

С++

дозволяє

використовувати покажчик на

функцію. Ім'я будь-якої константи

 

це покажчик –

константа,

дорівнює

адресі початку

входу

у

функцію,

тобто

адресі її

першої

машинної

команди. Крім констант можна також описувати покажчики - змінні на функцію у вигляді:

type (*name) (список аргументів); ,

де type тип значення, що повертається функцією, ; name ім'я змінної - покажчика на функцію.

Покажчики на функцію використовуються в наступних основних випадках :

при використанні їх як формальні аргументи в інших функціях;

для непрямого виклику інших (резидентних) функцій (програм), початок входу в який записується у відоме місце ОП.

Приклад 5.1 Обчислення суми і різниці двох чисел програмно реалізувати з використанням покажчика на функцію для доступу до інших функцій

78

//P5_1.CPP – використання покажчика на функцію для доступу

// до інших функцій difference( ) і sum( ).

#include < iostream > using namespace std;

int difference ( int, int ); // Прототип функції int sum ( int, int );

void main ( )

{

int (*fun) (int, int ); int x = 20, y = 5, z ;

fun = difference ; // Присвоювання адреси одного покажчика - іншому z = fun (x, y);

cout << "z = " << z << еndl;

fun = sum; // Присвоювання нової адреси покажчика z = fun (x , y );

cout << "z = " << z << endl;

}

 

int difference (int a , int b)

// Опис функції

{ return (a - b);

 

}

 

int sum ( int a, int b )

 

{ return (a + b);}

 

Як і звичайні змінні, покажчики на функції можна об'єднати в масиви, наприклад, якщо описати функції, тобто їхні прототипи у вигляді:

int god (

const void*,

const void * )

;

 

int chena (

const void*,

const void *)

;

 

int nazv (

const void*,

const void * )

;

 

int avtor (

const void*,

const void * )

;

,

то можна описати функцію

 

int (*fcmp[4]) () {god, chena, nazv,

avtor} ; .

У результаті вийшов масив функцій,

доступ до елементів цього

масиву звичайний, наприклад:

 

int i =0;

fcmp [i] ( pt1,pt2 ); // це виклик функції god ( pt1, pt2);

Варто звернути увагу, що замінивши індекс, можна викликати іншу функцію і т.д.

Крім повернення результату виконання функцій у вигляді даних за значенням, можливе також повернення за допомогою операцій разіменування "*" чи одержання адреси "&".

79

Операція разіменування "*" означає, що функція повертає адресу на об'єкт. Функції в такому випадку з'являються як покажчики на функцію, тобто в наступному вигляді:

type * fname (список формальних аргументів)

.

Описані в такий спосіб функції повинні повертати покажчик на тип (адреса), наприклад:

сhar* dayweek (int data)

{

static char *weekday[ ] = {"Sunday", "Monday", "Tuesday", "Weduesday", "Thursday", "Friday", "Saturday"}

return weekday [data % 7];

}

Тут функція dayweek одержує значення data, тобто число днів, що пройм ли з якоїсь визначеної дати, і повертає день тижня у вигляді покажчика на char* оскільки weekday це масив покажчиків на char , що належить

типу char*.

Під час оголошення функції як покажчика на функцію результат можна передавати шляхом одержання адреси, що позначається "&". Така функція буде мати наступну структуру:

type *funame (список формальних аргументів)

{

static type x;

// далі виникає тіло функції return &x;

}

Оскільки значенням покажчика є адреса, то функція може повернути адресу об'єкта того ж типу, що і тип покажчика, що повертається. Якщо необхідно повернути результат функції за посиланням, то переважніше використовувати операцію одержання адреси "&", і функцію описувати у вигляді :

type& funame (список формальних аргументів)

.

5.2.2 Використання масивів - параметрів

функцій

Як аргументи (параметрів) функцій можуть бути не тільки змінні, але і масиви. У цьому випадку можна використовувати як масиви фіксованого

80