1

Тема: Повернення масиву

#include <iostream>
using namespace std;
int f(int* arr, size_t n) {
    for (size_t i = 0; i < n; i++) {
        if (arr[i] < 0) {
            arr[i] = -(arr[i]);
        }
    }
    for (int i = 0; i < n; i++) {
        cout << arr[i] << endl;
    }
    return ;
}
int main() {
    int a[5] = { -5,-4,-3,-2,-1 };
    cout << f(a, 5) << endl;
    system("pause");
    return 0;
}

Доброго дня. Прошу вашої допомоги з цим кодом :) Є два варіанти вирішення : (в функції f) замість cout через return вивести кінцевий масив або ж return буде виводити порожнечу або ж слово "done". Проте, як це реалізувати не розумію. Наперед вдячний)

2

Re: Повернення масиву

Для початку: щоб нормально відповісти на питання по коду, потрібні:
- завдання;
- код;
- опис проблеми.
Роздуми про можливе вирішення, опис спроб і т.д. також вітаються.

"Повернення масиву" - це завдання? Масив має повертатися з функції? Це можна зробити так само, як і передачу його в функцію, тобто вказівником:

int *f(int *arr, size_t n) { //повертаємо вказівник, n не змінюється
    ...
    return a;
}
...
int *b = f(a, 5); // тепер b вказує на масив на 5 елементів; але це не дуже й потрібно, бо a - той же масив

Однак потім ви намагаєтеся вивести те, що повертає функція, через cout. А cout не вміє виводити масиви; та ви й самі це знаєте - он, у функції виводите масив по елементах. Отже, що саме ви намагаєтеся зробити? Яке завдання?

3

Re: Повернення масиву

koala написав:

Для початку: щоб нормально відповісти на питання по коду, потрібні:
- завдання;
- код;
- опис проблеми.
Роздуми про можливе вирішення, опис спроб і т.д. також вітаються.

"Повернення масиву" - це завдання? Масив має повертатися з функції? Це можна зробити так само, як і передачу його в функцію, тобто вказівником:

int *f(int *arr, size_t n) { //повертаємо вказівник, n не змінюється
    ...
    return a;
}
...
int *b = f(a, 5); // тепер b вказує на масив на 5 елементів; але це не дуже й потрібно, бо a - той же масив

Однак потім ви намагаєтеся вивести те, що повертає функція, через cout. А cout не вміє виводити масиви; та ви й самі це знаєте - он, у функції виводите масив по елементах. Отже, що саме ви намагаєтеся зробити? Яке завдання?

Суть програми в тому, що є дві функції - одна f, друга main. Завдання f - перетворити в заданому в main масиві від'ємні елементи на додатні. В main задається цей масив і виконується f. Проблема полягає в тому, що компілятор вимагає return щось для f. І я запропонував два варіанти - замість cout в f вивести масив або ж його елементи через return (як?), або щоб return в f виводив порожнечу (як?). Інші варіанти вирішення проблеми вітаються)

4

Re: Повернення масиву

loburyaka написав:

Проблема полягає в тому, що компілятор вимагає return щось для f

Ну от бачите, як важливо чітко формулювати питання.

void f(int *arr, size_t n) { //і вже ніхто нічого не вимагає

void - спеціальний тип, що означає "нічого". Користуйтеся на здоров'я.

Подякували: loburyaka1

5

Re: Повернення масиву

koala написав:
loburyaka написав:

Проблема полягає в тому, що компілятор вимагає return щось для f

Ну от бачите, як важливо чітко формулювати питання.

void f(int *arr, size_t n) { //і вже ніхто нічого не вимагає

void - спеціальний тип, що означає "нічого". Користуйтеся на здоров'я.

Дуже дякую, тепер все так як треба. Але тепер, якщо я юзаю void, мені доведеться в main, там де cout, замінити "<<" на ":", бо компілятор не розпізнає "<<" для void. Є якийсь шлях залишити "<<"?

6 Востаннє редагувалося P.Y. (20.10.2019 17:51:08)

Re: Повернення масиву

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

7

Re: Повернення масиву

Ну от, починається. В умові немає нічого на кшталт "не можна змінювати рядок cout<<f(a,5)<<endl;" Нащо вам взагалі щось виводити в main, якщо все вже вивелося в f?

Прихований текст
string f(int *a, size_t n) {
    stringstream ss;
    for(auto x: a) ss<<abs(x);
    return ss.str();
}
...
cout << f(a,5) << endl;

8

Re: Повернення масиву

P.Y. написав:

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

Про це не подумав) Вже зробив звичайний виклик функції без cout.

9

Re: Повернення масиву

koala написав:

Ну от, починається. В умові немає нічого на кшталт "не можна змінювати рядок cout<<f(a,5)<<endl;" Нащо вам взагалі щось виводити в main, якщо все вже вивелося в f?

Прихований текст
string f(int *a, size_t n) {
    stringstream ss;
    for(auto x: a) ss<<abs(x);
    return ss.str();
}
...
cout << f(a,5) << endl;

Про це не подумав) Вже зробив звичайний виклик функції без cout.

10

Re: Повернення масиву

Якщо подумати, правильний стиль розробки — розмістити у функції лише обчислювальні дії, а вивід масиву розмістити в main. Оскільки масив передається за посиланням і всі зміни вносяться безпосередньо в цей масив, повертати результат через return необхідності нема. Тобто, в main має бути ініціалізація масиву a, виклик функції f (яку можна зробити void, оскільки результат її роботи передається не через return, а через зміну параметрів) та цикл виводу з масиву a.