Міністерство освіти і науки України
Національний університет "Львівська політехніка"
Кафедра СКС
Звіт
З лабораторної роботи №2
з дисципліни: "Програмування ч. 2 (Об'єктно-орієнтоване програмування)"
на тему: "Перевантаження функцій"
Мета роботи:
Використовуючи перевантаження функцій, написати та продемонструвати функцію func, яка повертає середнє арифметичне елементів послідовності між мінімальним та максимальним елементами для масивів цілих і дробових значень окремо.
Короткі теоретичні відомості
С++ дозволяє визначати декілька функцій з одним і тим же іменем, якщо дані функції мають різні набори параметрів (принаймні різні типи параметрів).
Нехай оголошені наступні функції:
іnt func(іnt);
іnt func(int, int);
іnt func(double);
При виклику функції з ім’ям func спершу компілятор намагатиметься знайти функцію, формальні аргументи якої відповідають фактичним аргументам без усяких перетворень типів або з використанням тільки неминучих перетворень - наприклад, імені масиву до покажчика або значення змінної до константи або навпаки. Якщо відповідна функція не знайдена, то здійснюється пошук такої функції, щоб для відповідності формальних і фактичних аргументів досить було використати тільки такі стандартні перетворення, що не спричиняють перетворень цілих типів до типів з плаваючою крапкою і навпаки. При цьому підбирається функція, для якої число таких перетворень було б мінімальним.
int i = func(2.5, 3.7); // Викличе func(int, int)
int i = func(123L); // Викличе func(int)
Третім етапом є пошук такої функції, для виклику якої досить здійснити будь-які стандартні перетворення аргументів (і знову так, щоб цих перетворень було якнайменше).
Далі здійснюється пошук функції, для якої аргументи можна одержати за допомогою всіх перетворень, розглянутих до цього, а також перетворень типів, визначених самим програмістом. Якщо й у цьому випадку єдина потрібна функція не знайдена, то на останньому етапі компілятор пробує знайти відповідність з урахуванням списку невизначених аргументів. Якщо компілятор не знайде ні однієї підходящої функції, тоді буде виведене повідомлення про помилку.
Повний лістінг виконаної програми
Перевірено на дієздатність у Microsoft Visual C++ 2008 Express Edition
// Кафедра СКС
// ООП, Лабораторна робота № 2
// Виконав студент групи КІ-15
// Дунай Андрій
// 12 варіант
#include <iostream> // необхідна для керування потоками cin/cout
#include <conio.h> // необхідна для використання функції _getch()
using namespace std;
float average(int integers[10])
{
int a, i, min, minId, max, maxId;
minId=0;
maxId=0;
for(i=1,min=integers[0],max=integers[0];i<10;i++)
{
if(integers[i]<min) { min=integers[i]; minId=i; }
if(integers[i]>max) { max=integers[i]; maxId=i; }
}
if(max<min) swap(minId, maxId);
a=0;
for(i=minId+1;i<maxId;i++) a=a+integers[i];
return (float)a/(maxId-minId-1);
}
float average(float floats[10])
{
int i, minId, maxId;
float a, min, max;
minId=0;
maxId=0;
for(i=1,min=floats[0],max=floats[0];i<10;i++)
{
if(floats[i]<min) { min=floats[i]; minId=i; }
if(floats[i]>max) { max=floats[i]; maxId=i; }
}
//if(max<min) swap(minId, maxId);
a=0;
for(i=minId+1;i<maxId;i++) a=a+floats[i]; /* cout << floats[i] << " ";*/
return a/(maxId-minId-1);
return 0;
}
int main(int argc, char* argv[])
{
int i;
int integers[10];
float floats[10];
float nAverage, fAverage;
cout << "This program calculates the average arithmetic\n";
cout << "of numbers between minimal and maximal of\n";
cout << "entered array values.\n\n";
for(i=0;i<10;i++)
{
cout << "Please enter INT " << i+1 << " of 10:";
cin >> integers[i];
}
for(i=0;i<10;i++)
{
cout << "Please enter FLOAT " << i+1 << " of 10:";
cin >> floats[i];
}
nAverage=average(integers);
fAverage=average(floats);
cout << "The average of integers is " << nAverage << "\n";
cout << "The average of floats is " << fAverage << "\n";
_getch();
return 0;
}
Висновок
Я навчився реалізувати перевантаження функцій у програмах на С++ та дослідив багато помилок протягом створення вище проілюстрованого коду.
Підпис викладача