Назад Зміст Вперед

Функції з декількома параметрами та декількома значеннями, що повертаються

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

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

  1. Об'єднання повертаємих даних у структуру: Створимо структуру, що містить всі значення, які необхідно повернути, і повертаємо змінну цієї структури.
  2. Використання функції типу void та передача параметрів за посиланням: Описуємо функцію, яка не повертає значень, але приймає параметри за посиланням. Таким чином, функція може змінювати значення цих параметрів, і зміни будуть видимі на стороні виклику.

Приклад 1

Написати функцію Swap, яка міняє місцями значення двох цілих змінних.

Не виводить на екран значення змінних в іншому порядку, а саме змінює значення змінних.

Напишемо цю функцію двома способами.

1 спосіб

Функція отримує як параметри дві змінні цілого типу А і В, а повертає структуру, у якої значення першого поля дорівнює В, а значення другого поля А.

Результат роботи програми

Код програми з структурою Приклад коду на C++

#include <iostream>

using namespace std;

struct TwoIntNums
{
    int n1;
    int n2;
};

TwoIntNums Swap(int, int);

int main()
{
    int a,b;
    cin>>a>>b;
    //Присвоює результат функції структурі
    TwoIntNums t=Swap(a,b);
    //Виводить поля структури
    cout<<t.n1<<" "<<t.n2;
}

TwoIntNums Swap(int x, int y)
{
    TwoIntNums p;
    p.n1=y; p.n2=x;
    //Повертає структуру
    return p;
}

2 спосіб

Функція отримує як параметри посилання на дві змінні цілого типу. Результат роботи функції буде теж в цих змінних. Тобто, це параметри і вхідні, і вихідні одночасно. Не завжди це так.

Посилання — це ще одне ім'я одного місця в оперативній пам'яті.

У цьому прикладі змінна X це ще одне ім'я змінної A, а змінна Y ще одне ім'я змінної B. Тому, змінюючи місцями значення X і Y всередині функції, ми змінюємо місцями значення змінних A і B в main.

Код програми з посиланнями Приклад коду на C++

#include <iostream>
using namespace std;

//Параметри функції вказані як посилання
void Swap(int&, int&);

int main()
{
    int a,b;
    cin >> a >> b;
    Swap(a,b);
    cout << a << " " << b;
}

void Swap(int &x, int &y)
{
    //Меняємо значення x і y
    int t;
    t=x; x=y; y=t;
}

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

Приклад 2

Написати функцію ArithAndGeoMean, яка знаходить середнє арифметичне та середнє геометричне двох чисел А та В. Напишемо цю функцію теж двома способами.

Середнє арифметичне двох чисел a і b визначається як їх сума поділена на 2.

Середнє геометричне двох чисел a і b визначається як квадратний корінь з їхнього добутку.

1 спосіб

Функція отримує як параметри дві змінні цілого типу А і В, а повертає структуру, у якої значення першого поля є середнє арифметичне, а значення другого поля середнє геометричне.

Результат роботи програми

Код програми з структурою Приклад коду на C++

#include <iostream>
using namespace std;
#include <cmath>

//Структура TwoRealNums
struct TwoRealNums
{
    double n1;
    double n2;
};

TwoRealNums ArthAndGeoMean(int, int);

int main()
{
    int a,b;
    cin >> a >> b;
    //Присвоює результат структурі
    TwoRealNums t=ArthAndGeoMean(a,b);
    //Виводить результат із заданою точністю
    cout << fixed << setprecision(3);
    cout << t.n1 << " " << t.n2;
}

TwoRealNums ArthAndGeoMean(int x, int y)
{
    TwoRealNums p;
    p.n1=(x+y)/2.0; p.n2=sqrt(x*y);
    //Повертає структуру
    return p;
}

2 спосіб

У функції 4 параметри. Два параметра вхідні, вони передаються по значенню. Два параметри вихідні, вони передаються за посиланням.

У цьому прикладі змінна n1 це ще одне ім'я змінної X, а змінна n2 ще одне ім'я змінної Y. Тому, змінюючи значення n1 і n2 всередині функції, ми змінюємо значення змінних X і Y в main.

Код програми з посиланнями Приклад коду на C++

#include <iostream>
using namespace std;
#include <cmath>

void ArthAndGeoMean(int, int, double&, double&);

int main()
{
    int a,b;
    double x,y;
    cin >> a >> b;
    //4 параметра
    ArthAndGeoMean(a,b,x,y);
    cout << fixed; cout << setprecision(3);
    cout << x << " " << y;
}

void ArthAndGeoMean(int x, int y, double &n1, double &n2)
{
    //2 входних параметра, передаються по значенню
    //2 вихідних параметра, передаються по ссилке
    n1=(x+y)/2.0; n2=sqrt(x*y);
}

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

Приклад 3

Написати функцію ReduceFraction, яка скорочує простий дріб. Для цього будемо використовувати вже написану функцію GcdOfAB, яка знаходить найбльший спільний дільник за алгоритмом Евкліда. Напишемо цю функцію теж двома способами.

1 спосіб

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

Результат роботи програми

Код програми з структурою Приклад коду на C++

#include <iostream>
using namespace std;
struct ComFraction { // структура проста дріб
    int numerator; // чисельник
    int denominator; // знаменник
};

int GcdOfAB(int, int); // знаходження НСД
// скорочуємо дріб
ComFraction ReduceFraction (ComFraction);

int main()
{
    ComFraction d1, d2;
    cin >> d1.numerator >> d1.denominator;
    d2=ReduceFraction (d1);
    cout << d2.numerator << "/" << d2.denominator;
}

int GcdOfAB(int a, int b)
{
    while (a!=b)
    {
        if (a>b) {a=a-b;}
        else {b=b-a;}
    }
    return a;
}
ComFraction ReduceFraction (ComFraction f1)
{
    ComFraction f2;
    // Для вхідної дробі
    // знаходимо НСД чисельника і знаменника
    int nod=GcdOfAB (f1.numerator, f1.denominator);
    // скорочуємо дріб
    f2.numerator=f1.numerator/nod;
    f2.denominator=f1.denominator/nod;
    // Повертаємо скорочену дріб
    return f2;
}

2 спосіб

Код програми з посиланнями

#include <iostream>
using namespace std;
struct ComFraction { // структура проста дріб
    int numerator; // чисельник
    int denominator; // знаменник
};
int GcdOfAB(int, int);
void ReduceFraction (ComFraction &);

int main()
{
    ComFraction d;
    cin >> d.numerator >> d.denominator;
    ReduceFraction (d);
    cout << d.numerator << "/" << d.denominator;
}
int GcdOfAB(int a, int b)
{
    while (a != b)
    {
        if (a > b) {a = a - b;}
        else {b = b - a;}
    }
    return a;
}
void ReduceFraction (ComFraction &f)
{
    // Знаходимо НСД чисельника і знаменника
    int nod = GcdOfAB (f.numerator, f.denominator);
    // скорочуємо дріб
    f.numerator = f.numerator / nod;
    f.denominator = f.denominator / nod;
}

Варіанти задач

Варіант 1

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури ціле число a - сторону квадрата. Знайдіть площу та периметр цього квадрата. SquarePerimArea
2 Ввести з клавіатури три цілих числа. Вивести ці числа за зростанням. Incr

Варіант 2

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури два цілих числа - сторони прямокутника. Знайдіть площу та периметр цього прямокутника. RectanglePerimArea
2 Ввести з клавіатури три цілих числа. Вивести ці числа за спаданням. Decr

Варіант 3

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури ціле число - ребро куба. Знайдіть площу поверхні та об’єм цього куба. CubeSurfaceAreaVol
2 Ввести з клавіатури три цілих числа А, В та С. Для цих чисел виконати праве циклічне зміщення: значення А переходить у В, значення В - в С, значення С - в А. Було 3 4 5, стало 5 3 4. CycleRight

Варіант 4

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури три цілих числа - ребра паралелепіпеда. Знайдіть площу поверхні та об’єм цього паралелепіпеда. ParSurfaceAreaVol
2 Ввести з клавіатури три цілих числа А, В та С. Для цих чисел виконати ліве циклічне зміщення: значення В переходить у А, значення С - в В, значення А - в С. Було 3 4 5, стало 4 5 3. CycleLeft

Варіант 5

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури 4 цілих числа, що є чисельниками та знаменниками двох простих дробів. Знайдіть суму цих дробів та скоротить результат. SumFraction
2 Ввести з клавіатури ціле число r - радіус кола. Знайдіть площу та довжину кола з таким радіусом. CircLengthArea

Варіант 6

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури 4 цілих числа, що є чисельниками та знаменниками двох простих дробів. Знайдіть різницю цих дробів та скоротить результат. SubtrFraction
2 Ввести з клавіатури ціле число r - радіус кола. Знайдіть довжину кола, площу кола та об'єм кулі з таким радіусом CircLengthAreaVol

Варіант 7

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури 4 цілих числа, що є чисельниками та знаменниками двох простих дробів. Знайдіть добуток цих дробів та скоротить результат. MulFraction
2 Ввести з клавіатури два цілих числа – радіус основи та висоту циліндра. Знайти площу його поверхні та об’єм. CylSurfaceAreaVol

Варіант 8

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури 4 цілих числа, що є чисельниками та знаменниками двох простих дробів. Знайдіть частку цих дробів та скоротить результат. DivFraction
2 Ввести з клавіатури два цілих числа – радіус основи та висоту конуса. Знайти площу його поверхні та об’єм. ConeSurfaceAreaVol

Варіант 9

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури три натуральних числа. Якщо вони можуть бути сторонами трикутника, то знайти його периметр та площу. Якщо ні, то вивести повідомлення. TrianglePerimArea, IsSide
2 Дано n натуральних чисел T1, T2 , … Tn, кожне з яких є часом в секундах. Для кожного з цих чисел визначити: скільки у ньому міститься цілих годин, хвилин і секунд. Наприклад, 7503 сек = 2ч 5 мін 3 сек. GetHourMinSec

Варіант 10

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури два цілих числа - радіус основи та висоту циліндра. Знайдіть площу поверхні та об’єм цього циліндра. CylSurfaceAreaVol
2 Ввести з клавіатури 2 цілих числа, що є чисельником та знаменником простого дробу. Якщо дріб неправильний, то виділить цілу частину та скоротить результат. Наприклад, 10/4=2 і 1/2. GetIntFraction

Варіант 11

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури координати трьох точок на площині. Якщо вони можуть бути координатами вершин трикутника, то знайти його периметр та площу. Якщо ні, то вивести повідомлення. TrianglePerimArea, IsCoord
2 Ввести з клавіатури 4 цілих числа, що є чисельниками та знаменниками двох простих дробів. Знайти найбільший дріб. MaxFraction

Варіант 12

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури координати трьох точок на площині. Якщо вони можуть бути координатами вершин трикутника, то знайти радіус і площу кола вписаного у трикутник. Якщо ні, то вивести повідомлення. InCircRadArea, IsCoord, LengthByCoords
2 Ввести з клавіатури 4 цілих числа, що є чисельниками та знаменниками двох простих дробів. Знайти найменший дріб. MinFraction

Варіант 13

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури координати трьох точок на площині. Якщо вони можуть бути координатами вершин трикутника, то знайти радіус і площу кола описаного навколо трикутника. Якщо ні, то вивести повідомлення. ExCircRadArea, IsCoord, LengthByCoords
2 Ввести з клавіатури два натуральних числа. Знайти їх найбільший спільний дільник та найменше спільне кратне MaxDivMinMult

Варіант 14

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури два цілих числа - координати точки на плоскості. Знайдіть відстань від цієї точки до початку координат та номер чверті, в якій знаходиться точка. PointDistQuart
2 Ввести з клавіатури три цілих числа та число T . Якщо ці числа можуть бути часом (години, хвилини, секунди), то збільшить цей час на T секунд. Якщо ні, то вивести повідомлення. TimePlusOneSec, IsTime

Варіант 15

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури три цілих числа. Якщо ці числа можуть бути сторонами трикутника, то знайти 3 його бісектриси. Якщо ні, то вивести повідомлення. TriangleBisector, IsSide
2 Ввести з клавіатури три цілих числа. Якщо ці числа можуть бути датою , то знайдіть дату завтрашнього дня. Якщо ні, то вивести повідомлення. Tomorrow, IsDate

Варіант 16

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури три цілих числа. Якщо ці числа можуть бути сторонами трикутника, то знайти 3 його висоти. Якщо ні, то вивести повідомлення. TriangleAltitude, IsSide
2 Ввести з клавіатури три цілих числа. Якщо ці числа можуть бути датою, то знайдіть дату вчорашнього дня. Якщо ні, то вивести повідомлення. Yesterday, IsDate

Варіант 17

Кожну програму написати двома способами:

  1. Результат функції повертати return у вигляді структури.
  2. Результат void функції повинен бути у параметрах, які передаються за посиланням.

Функції потрібно писати відповідно до вказаних прототипів. Прототипи функцій, а також необхідні структури, дивитись у розділі «Довідник власних функцій». Вони згруповані за змістом та відсортовані за їх іменами.

№
задачі
Умова задачіЯкі функції
потрібні
1 Ввести з клавіатури три цілих числа. Якщо ці числа можуть бути сторонами трикутника, то знайти 3 його медіани. Якщо ні, то вивести повідомлення. TriangleMedian, IsSide
2 Дано n натуральних парних чисел. Кожне з них більше двох. Для кожного з чисел перевірити гіпотезу Гольдбаха: кожне парне число представляється у вигляді суми двох простих чисел. Вивести ці два простих числа, для кожного з введених парних чисел. CalcTwoPrimes

Назад Зміст Вперед