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

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

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

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

vоid sort (int mas [ 30 ]);

.

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

 

 

void sort ( int mas [ ], int n ) ;

.

Усі масиви у функції передаються за адресою (як покажчики), тому у

випадку

зміни

масивів у

функції , ці зміни зберігаються при поверненні в

зухвалу

функцію.

 

 

Приклад 5.2

Навести

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

передача символьного масиву у функцію .

 

//P5_2.CPP – використання масивів – параметрів функцій

#include < string.h > #include < iostream > using namespace std;

void fun1 (char st [15]);

 

int main ( )

 

{

 

char p[15] ="стіл ";

 

fun1 (p);

 

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

// p="стілець "

return 0;

 

}

 

void fun1 ( char st[15] )

 

{

 

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

// стіл

strcpy (st, "стілець ");

 

}

 

Результати виконання програми :

 

р=стіл

 

р=стілець

 

81

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

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

void fun1 (int mat [7][10]); // використовується матриця mat(7,10)

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

void fun2 ( int mat [ ] [10], int rows, int cols );

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

// P5_3.CPP – обчислення середнього значення // кожного стовпця матриці

#include < iostream > using namespace std;

const int mincol = 1; const int maxcol = 20; const int minrow = 2; const int maxrow = 30;

//Функція getnum ( ) для введення кількості рядків і стовпців int getnum (const char *elemtype , int low , int high )

{

int n; do

{

cout << " Введіть кількість " << elemtype

<< " N від [" << low << "] до [" << high << " ] : "; cin >> n;

}

while (( n<low) || (n>high)); return n;

}

82

// Функція inmatr ( ) введення елементів матриці

void inmatr ( float matr [ ] [maxcol], int rows , int cols);

{

for (int i =0; i<rows; i++)

{

cout << "Введіть"<< i << "рядок матриці " << endl; for ( int j =0; j < cols ; j++)

cin >> matr [i][j];

}

cout << endl;

}

// Функція srcols ( ) одержання середніх значень стовпців void srcols ( float matr [ ] [maxcol] , int rows , int cols )

{

float sum , sr;

for ( int j = 0; j < cols; j++ )

{

sum =0.0;

for ( int i = 0; i < rows; i++) sum += matr [i][j];

sr = sum / rows;

cout << "середнє значення стовпця" << j << " = " << sr << endl;

}

}

// Головна програма int main ( )

{

float matr [maxrow] [maxcol]; int rows, cols;

// Уведення кількості рядків і стовпців

rows = getnum ( "rows", minrow, maxrow ); cols = getnum ( "colnums" , mincol , maxcol);

// Уведення матриці

inmatr ( matr, rows , cols);

// Обчислення середнього значення стовпців матриці srcols (matr , rows , cols);

return 0;

}

83

5.2.3 Використання функції як параметра значень

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

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

Приклад 5.4 Скласти програму c використанням функції обчислення інтегралів методом трапецій (точність обчислення е =10-3 ).

3

1

ln(1

x)

 

Y

 

1 ln xdx

 

dx

 

 

 

2, 2

0

1 x

 

 

 

//P5_4.CPP – обчислення інтеграла методом трапеції

//використання функції як параметра значення

#include <math.h> #include < iostream > using namespace std;

const float e =1 e-3;

float fn1 (float x ) // підінтегральна функція 1-го інтеграла

{

return sgrt (1 +log (x));

}

float fn2 ( float x ) // підінтегральна функція 2-го інтеграла

{

return log (1 +pow (x,2)) / (1+pow (x,2));

}

float ft (int n, float a ,float b , float fun( float )) // функція методу трапецій

{

int i;

float s1 ,h, s=0; do

{ s1 =s;

h = (b -a ) /n;

s = ( fun (a) +fun (b) ) / 2; for ( i = 1; i <= n-1; i++) s += fun ( a + i *h );

s *= h; n *= 2;

84

} while ( fabs ( s-s1 ) > e ); return s; }

int main ( )

{

float y;

y = ft ( 20 , 2 , 2, 3.0, fn1 ) +ft ( 20, 0, 1.0, fn2 ); cout << "y=" << y << endl;

return 0;

}

Результат виконання програми : y = 1.29012

5.2.4 Звертання до функції і передача результату

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

double sgr (double); main( )

{

cout << "Квадрат числа=" << sgr ( 10 ) << endl;

}

double sqr (double p)

// Повернення за значенням

{

return p*p;

}

У результаті буде виведено:

Квадрат числа = 100.

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

85

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

використовується

операція

разіменувания "*",

функції описані

в такий

спосіб повинні повертати покажчик на тип, тобто його адреса.

 

Приклад 5.5

 

Обчислити функцію загального вигляду для

заданого

значення аргументу

x

з використанням функції,

у яку коефіцієнти

a, b і c

можуть бути введені за замовчуванням.

 

 

// P5_5.CPP обчислення квадратної функції

 

//

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

 

 

//

вводитися у функцію

"за замовчуванням"

 

 

#include < iostream >

 

 

 

using namespace std;

 

 

 

float ur ( float x, float а=0., floatb b =0.,float c=0.);

 

int main ( )

 

 

 

 

 

 

{

 

 

 

 

 

 

 

float а =1., b = 2.,

c = 3.,

x = 0.5, y;

 

 

cout << " Уведені всі аргументи " << endl;

 

 

y = ur ( x, a, b, c);

 

 

 

 

cout << " y = "<< y << endl;

 

 

cout << " Введені аргументи x, a, b " << endl;

 

y =ur ( x, a, b);

 

 

 

 

 

cout << " y = "<< y << endl;

 

 

cout << " Введений аргумент x " << endl;

 

 

y =ur ( x );

 

 

 

 

 

 

cout << " y = "<< y << endl;

 

 

}

 

 

 

 

 

 

 

// Функція обчислення квадратної функції

 

 

float ur ( float x, float a, float b, float c );

 

 

{

 

 

 

 

 

 

 

return a * x * x + b * x + c;

 

 

 

}

 

 

 

 

 

 

Результати виконання програми:

 

 

 

Уведено всі аргументи

 

 

 

y = 4.25

 

 

 

 

 

 

 

Уведені x,

a

і b

 

 

 

 

y = 1.25

 

 

 

 

 

 

 

Введено

аргумент x

 

 

 

 

y = 0

 

 

 

 

 

 

86

5.2.5 Перевантаження функцій

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

Основне достоїнство перевантажених функцій це можливість визначати кілька функцій з тим самим ім'ям, але з різними типами і числом параметрів.

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

#include <string.h> #include < iostream > using namespace std;

int funp (int x)

 

//

1.

 

{

return x*x; }

 

 

 

int funp (unsigned x)

//

2.

 

{

return -x*x;

}

 

 

 

char funp (char x)

//

3.

 

{

return x+3;

}

 

 

 

int funp (int x, char *y)

 

//

4.

{

return x*strlen ( y);

}

 

 

int funp (int x , char y)

 

//

5.

{

return x*y;

}

 

 

 

float funp (float r)

 

//

6.0

{

return r*r;

}

 

 

 

float funp (double r)

 

//

7.

{

return r+r; }

 

 

 

 

int main ( )

 

 

 

 

{

 

 

 

 

 

cout << funp(5) << endl ;

 

// Буде 25

cout << funp ((unsigned)10) << endl ; // Буде 100

cout << funp

( 'а') << endl ;

 

// Буде d

cout << funp

(4,"abc") << endl ;

// Буде 12

cout << funp ( 4 , 'а') << endl ;

// Буде 388

cout << funp( 1.2)<< endl ;

// Буде 1.44

cout << funp( (double) 4.5) << endl ;

// Буде 9

return 0;

 

 

 

}

 

 

 

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

87

програму замість звертання до функції.

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

1.Що таке функція і яка її структура?

2.Що означає передача параметрів у функцію за значенням, за посиланням і за покажчиком?

3.Що таке локальні і глобальні змінні?

4.Як використовувати покажчики на функцію?

5.Які способи передачі і повернення результату обчислень функції?

6.Як використовувати одновимірні масиви як параметри функції?

7.Які особливості використання багатовимірних масивів як аргументи функції?

8.Чи можна обробляти у функції масиви змінної довжини?

9.Чи може функція передавати кілька результатів у місце виклику?

10.Що таке перевантаження функцій?

5.4 Варіанти індивідуальних завдань

1.Розробити функцію , що збільшує всі від‘ємні елементи масивів

A(12), B(10), C(8) на 10.

2.Розробити функцію видалення підрядка в n символів з к- ой позиції .

3.Скласти функцію обчислення найбільшого загального дільника 2-х

чисел.

4. Обчислити площу багатокутника за допомогою складеної функції , що визначає площу по координатах його вершин.

5.За допомогою функції визначення середнього значення елементів масиву обробити два масиви різної довжини.

6.Скласти функцію визначення середнього арифметичного і середнього геометричного значень елементів масиву.

7. Розробити функцію пошуку максимального елемента масиву і застосувати її для двох масивів різної довжини.

8.Розробити функцію сортування одновимірних масивів за зростанням і застосувати її для сортування чотирьох масивів довільної довжини.

9.Негативні елементи матриць A(5,4), B(3,2), C(4,4) записати в одновимірний масив.

10.Розробити функцію, що обчислює суму діагональних елементів квадратної матриці , і з її допомогою знайти суми діагональних елементів трьох матриць .

11.Скласти функцію визначення суми і кількості елементів,

розташованих між мінімальним і

максимальним

елементами масиву.

88

Використовуючи цю функцію, обробити три одновимірних масиви різноі довжини.

12.За допомогою розробленої функції підрахунку кількості і суми парних елементів одновимірного масиву обробити три одновимірних масиви різної довжини.

13.Три групи студентів здали іспит. Розробити функцію і з її допомогою вивести список студентів кожної групи за зменшенням оцінок .

14.Розробити функцію знаходження найдовшого слова в рядку. Ввести текст і одержати фразу із самих довгих слів.

15.Розробити функції обчислення площ трикутника за формулою Герона

іза формулою з використанням основи і висоти. Роботу функцій перевірити при визначенні площ трьох довільних трикутників.

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

17.Розробити функцію виділення в тексті слів-паліндромів ( тобто слів, що читаються однаково ліворуч - праворуч і праворуч - ліворуч) і з її допомогою обробити введений текст.

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

19.Розробити функцію визначення коренів квадратного рівняння і функцію перевірки цих коренів за теоремою Вієта. Використовуючи ці функції, знайти корені двох квадратних рівнянь .

20.Визначити скільки разів кожна літера з алфавіту зустрічається в тексті з застосуванням функції , що виконує таку операцію для заданої літери.

21.Розробити функцію визначення суми членів арифметичної прогресії і реалізувати її для двох арифметичних прогресій з різною кількістю членів .

22.Розробити функцію знаходження максимального елемента масиву і його номера і реалізувати її для обробки трьох масивів довільної довжини.

23.Скласти функцію перестановки максимального і мінімального елементів масиву і застосувати її для обробки двох двовимірних масивів.

24. Розробити функцію сортування масиву за зменшенням і з її допомогою обробити три одновимірних масиви довільної довжини .

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

89

6 РОБОТА З ФАЙЛАМИ

6.1 Ціль роботи

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

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

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

Як елементи файлу можна використовувати будь-які дані мови С++ (числа, символи, рядки, масиви і структури).

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

Упроцесі введення-виведення з використанням стандартних пристроїв (клавіатури й екрана) у програму варто включити заголовний файл iostream.h,

уякому міститься опис відповідного класу iostream, тобто на початку тексту програми поміщають директиву :

#include <iostream>

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

Існують також додаткові файли бібліотеки введення-виведення, що містять більш спеціалізовані функції – члени введення-виведення.

Для відкриття файлу на диску використовується функція-член класу fstream, що має наступний прототип (заголовок):

void open (const char *filename, int mode, int m = fіlebuf :: openprompt);

де filename ім'я файлу, що відкривається, у якому при необхідності можна вказати шлях;

mode параметр, що задає режим введення , у файлі fstream визначені значення цього режиму і їх зміст;

m параметр, що задає захист файлу, що за замовчуванням приймає значення, заданий константою filebuf :: openprompt ;

90