Информатика.ЛБ
.pdfрозміру, так і невизначеного (масиви змінної довжини). При використанні масивів фіксованої довжини в заголовку функції в списку формальних аргументів указується тип масиву і його розмір, наприклад:
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
