Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 24.08.2020
Сообщений: 20
1

Использование передачи параметров по ссылке для возврата нескольких значений из функции

15.10.2020, 22:51. Показов 1858. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Напишите функцию, которая принимает одномерный массив целых чисел,
его размер и возвращает: максимальное, минимальное значения массива, сумму
элементов массива, среднее арифметическое, количество отрицательных, положительных и нулевых
элементов массива. Использовать передачу параметров по
ссылке для возврата нескольких значений из функции.

Помогите, пожалуйста, исправить код. Заранее благодарю!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<iostream>
#include<time.h>
using namespace std;
 
int& rmax(int n, int d[])
{
    int imax = 0;
    for (int i = 1; i < n; i++)
        imax = d[imax] > d[i] ? imax : i;
    return d[imax];
}
 
int& rmin(int n, int d[])
{
    int imin = 0;
    for (int i = 1; i < n; i++)
        imin = d[imin] < d[i] ? imin : i;
    return d[imin];
}
 
int& rsumm(int n, int d[])
{
    int isumm = 0;
    for (int i = 0; i < n; i++)
        isumm+=d[i];
    return d[isumm];
}
int& raverage(int n, int d[])
{
    int iaverage = 0;
    int isumm = 0;
    for (int i = 0; i < n; i++)
    
    isumm = d[i] + d[i + 1];
    iaverage = isumm / n;
    return d[iaverage];
}
 
int main()
{
    int x[] = { 100, 20, 30, 14 };
    int n = 4;
    cout << "\nrmax(n,x) = " << rmax(n, x);
        cout << "\n";
    cout << "\nrmin(n,x) = " << rmin(n, x);
        cout << "\n";
    cout << "\nrsumm(n,x) = " << rsumm(n, x);
        cout << "\n";
    cout << "\nraverage(n,x) = " << raverage(n, x);
        cout << "\n";
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2020, 22:51
Ответы с готовыми решениями:

Использование указателей для передачи параметров функции
Ели мы объявляем формальный параметр как указатель,тогда ведь нам при вызове этой функций следует...

функции в языке с: (использовать механизм передачи параметров по ссылке)
реализовать функцию, осущ. поиск в целочисленном массиве 4-го максимума и 3-го минимума. В качестве...

Использование стека для передачи параметров и локальных переменных
объсните пожалуйста про стек. имеем стек. в данный момент он пустой. я вызываю функцию ...

Аналог передачи параметров по ссылке
Здравствуйте. Мне нужно переписать метод, написанный на Delphi, на Java. procedure...

11
21 / 17 / 5
Регистрация: 05.09.2020
Сообщений: 161
15.10.2020, 23:22 2
Должна быть одна функция, нет?

Добавлено через 10 минут
Или так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
 
using namespace std;
 
void get(int d[], int n, int &max, int &min) {
    //copy rmax
    int imax = 0;
    for (int i = 1; i < n; i++)
        imax = d[imax] > d[i] ? imax : i;
    max = d[imax];
    
    //copy rmin
    int imin = 0;
    for (int i = 1; i < n; i++)
        imin = d[imin] < d[i] ? imin : i;
    min = d[imin];
}
 
int main(int argc, char *argv[])
{
    int x[] = { 100, 20, 30, 14 };
    int n = 4;
    int max = 0, min = 0;
    get(x, n, max, min);
    cout << max << endl;
    cout << min;
}
Или так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
 
using namespace std;
 
int rmax(int n, int d[])
{
    int imax = 0;
    for (int i = 1; i < n; i++)
        imax = d[imax] > d[i] ? imax : i;
    return d[imax];
}
 
int rmin(int n, int d[])
{
    int imin = 0;
    for (int i = 1; i < n; i++)
        imin = d[imin] < d[i] ? imin : i;
    return d[imin];
}
 
void get(int d[], int n, int &max, int &min) {
    max = rmax(n, d);
    min = rmin(n, d);
}
 
int main(int argc, char *argv[])
{
    int x[] = { 100, 20, 30, 14 };
    int n = 4;
    int max = 0, min = 0;
    get(x, n, max, min);
    cout << max << endl;
    cout << min;
}
Добавлено через 1 минуту
Ну и соответственно с остальными функциями также...

Добавлено через 2 минуты
И что за d[isumm]:
C++
1
2
3
4
5
6
7
int& rsumm(int n, int d[])
{
    int isumm = 0;
    for (int i = 0; i < n; i++)
        isumm+=d[i];
    return d[isumm];
}
Нужно вернуть isumm, ты же сумму посчитал, зачем в массив лезешь?

Добавлено через 4 минуты
Тоже что-то странное...
C++
1
int& raverage(int n, int d[])
Ты можешь использовать в этой функции свою rsumm (только исправь) и результат этой функции поделить на количество элементов.
И не нужно лезть снова в массив, а верни переменную или результат деления.

Добавлено через 4 минуты
Что-то вроде этого:
C++
1
2
3
4
5
void raverage(int n, int d[], int &max, int &main, int &average) {
         int summ = rsumm(n, d);
         average = rsumm / n;
         //average = rsumm(n, d) / n;
}
1
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.10.2020, 23:47 3
Цитата Сообщение от macced Посмотреть сообщение
Должна быть одна функция, нет?
да, функция должна быть одна:
Цитата Сообщение от SITO Посмотреть сообщение
Напишите функцию
Цитата Сообщение от macced Посмотреть сообщение
Или так или так:
нет. в первом варианте мало возвращаемых значений, во втором много функций

если что тип переменной для среднего арифметического double
1
0 / 0 / 0
Регистрация: 24.08.2020
Сообщений: 20
16.10.2020, 10:17  [ТС] 4
Благодарю Вас за ответы! Но что-то не работает. Простите меня за дилетантство! Только учусь.
Я максимальное и минимальное значение в массиве нашёл. Всё работает. У меня вопросы с нахождением: суммы значений в указанном массиве, нахождением средне арифметического значения, положительных, отрицательных и нулевых значений. Логика понятна, а с реализацией всё сложно. Заранее благодарю за помощь!
0
21 / 17 / 5
Регистрация: 05.09.2020
Сообщений: 161
16.10.2020, 15:40 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
using namespace std;
 
float raverage(int n, int d[])
{
    int isumm = 0;
    for (int i = 0; i < n; i++) {
        isumm += d[i];
    }
    return (float)isumm / n;
}
Функция суммы у тебя есть, ты подсчитал, но результатом передаешь элемент в массив с индексом суммы, исправь:
return d[isumm] на return isumm.

Добавлено через 10 минут
А по поводу отрицательных, положительных и т.п. не понимаю в чем заключается сложность, если ты сделал эти функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    int d[] = {-1, -2, 0, 0, 3, 4, 5};
    int less = 0, larger = 0, zero = 0;
    for (int i : d) {
        if (i < 0)
            less++;
        else if (i > 0)
            larger++;
        else
            zero++;
    }
    cout << less << " " << zero << " " << larger;
}
1
0 / 0 / 0
Регистрация: 24.08.2020
Сообщений: 20
16.10.2020, 16:43  [ТС] 6
Благодарю за помощь и объяснение. Попробовал Ваши комментарии включить в программу. У меня расчёт средне арифметического получился, а сумма, отр., пол. и нулевые не выходят. Подскажите, пожалуйста, что исправить.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include<iostream>
#include<time.h>
using namespace std;
 
int& rmax(int n, int d[])
{
    int imax = 0;
    for (int i = 1; i < n; i++)
        imax = d[imax] > d[i] ? imax : i;
    return d[imax];
}
 
int& rmin(int n, int d[])
{
    int imin = 0;
    for (int i = 1; i < n; i++)
        imin = d[imin] < d[i] ? imin : i;
    return d[imin];
}
 
int& rsumm(int n, int d[])
{
    int isumm=0;
    for (int i = 0; i < n; i++)
        isumm+=d[i];
    return isumm;
}
float raverage(int n, int d[])
{
    int isumm = 0;
    for (int i = 0; i < n; i++) {
        isumm += d[i];
    }
    return (float)isumm / n;
}
 
int& rneg(int n, int d[])
{
int ineg = 0;
    for (int i = 0; i < n; i++)
    {
        if (i < 0)
            ineg++;
    }
    return d[ineg];
}
 
int& rpoz(int n, int d[])
{
int ipoz = 0;
    for (int i = 0; i < n; i++)
    {
        if (i > 0)
            ipoz++;
    }
    return d[ipoz];
}
 
int& rnull(int n, int d[])
{
int inull = 0;
    for (int i = 0; i < n; i++)
    {
        if (i == 0)
            inull++;
    }
    return d[inull];
}
 
 
int main()
{
    int x[] = { 100, 20, 30, 14, -5, 0 };
    int n = 6;
    cout << "\nrmax(n,x) = " << rmax(n, x);
        cout << "\n";
    cout << "\nrmin(n,x) = " << rmin(n, x);
        cout << "\n";
    cout << "\nrsumm(n,x) = " << rsumm(n, x);
        cout << "\n";
    cout << "\nraverage(n,x) = " << raverage(n, x);
        cout << "\n";
    cout << "\nrneg(n,x) = " << rneg(n, x);
        cout << "\n";
    cout << "\nrpoz(n,x) = " << rpoz(n, x);
        cout << "\n";
    cout << "\nrnull(n,x) = " << rnull(n, x);
        cout << "\n";
    return 0;
}
На выходи имею:

rmax(n,x) = 100

rmin(n,x) = -5

rsumm(n,x) = 0

raverage(n,x) = 26.5

rneg(n,x) = 100

rpoz(n,x) = 0

rnull(n,x) = 20
0
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 562
16.10.2020, 17:34 7
Лучший ответ Сообщение было отмечено SITO как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <time.h>
using namespace std;
 
void result(int* arr, size_t size, int& max, int& min, int& sum, double& avg, size_t& negative, size_t& positive, size_t& zero)
{
    max = INT_MIN;
    min = INT_MAX;
    negative = 0;
    positive = 0;
    zero = 0;
    sum = 0;
 
    for (size_t i = 0; i < size; i++)
    {
        if (max < arr[i])
            max = arr[i];
 
        if (min > arr[i])
            min = arr[i];
 
        if (arr[i] > 0)
            positive++;
 
        if (arr[i] < 0)
            negative++;
 
        if (arr[i] == 0)
            zero++;
 
        sum += arr[i];
    }
 
    avg = double(sum) / double(size);
}
 
int main()
{
    setlocale(LC_ALL, "");
    srand(time(0));
 
    size_t size = rand() % 20 + 1, negative, positive, zero;
    int arr[size], min, max, sum;
    double avg;
 
    cout << "Массив:" << endl;
 
    for (size_t i = 0; i < size; i++)
    {
        arr[i] = rand() % 10;
 
        if (rand() % 2 == 0)
            arr[i] *= -1;
 
        cout << arr[i] << " ";
    }
 
    cout << endl;
    result(arr, size, max, min, sum, avg, negative, positive, zero);
 
    cout << "Максимальный элемент: " << max << endl;
    cout << "Минимальный элемент: " << min << endl;
    cout << "Сумма элементов: " << sum << endl;
    cout << "Среднее значение массива: " << avg << endl;
    cout << "Количество отрицательных элементов: " << negative << endl;
    cout << "Количество положительных элементов: " << positive << endl;
    cout << "Количество нулевых элементов: " << zero << endl;
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 24.08.2020
Сообщений: 20
16.10.2020, 19:58  [ТС] 8
Большое спасибо BlackStoneBlack!
Вот в 43 строчке компилятор ругается:

int arr[size], min, max, sum;

Что можно тут сделать?
0
21 / 17 / 5
Регистрация: 05.09.2020
Сообщений: 161
16.10.2020, 20:59 9
Код полностью скопировали? И желательно ошибку показать...
0
0 / 0 / 0
Регистрация: 24.08.2020
Сообщений: 20
16.10.2020, 21:20  [ТС] 10
Прикрепил скриншот с ошибкой.
Миниатюры
Использование передачи параметров по ссылке для возврата нескольких значений из функции  
0
21 / 17 / 5
Регистрация: 05.09.2020
Сообщений: 161
16.10.2020, 21:42 11
Компилятор требует написать константу, либо через new выдели память или напиши размер массива вручную.

Добавлено через 10 минут
Поэтому, нужно самому писать, а не копировать решения).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <time.h>
using namespace std;
 
void result(int* arr, size_t size, int& max, int& min, int& sum, double& avg, size_t& negative, size_t& positive, size_t& zero)
{
    max = INT_MIN;
    min = INT_MAX;
    negative = 0;
    positive = 0;
    zero = 0;
    sum = 0;
 
    for (size_t i = 0; i < size; i++)
    {
        if (max < arr[i])
            max = arr[i];
 
        if (min > arr[i])
            min = arr[i];
 
        if (arr[i] > 0)
            positive++;
 
        if (arr[i] < 0)
            negative++;
 
        if (arr[i] == 0)
            zero++;
 
        sum += arr[i];
    }
 
    avg = double(sum) / double(size);
}
 
int main()
{
    int arr[] = { 100, 20, 30, 14 };
    int size = 4;
    
    int min, max, sum;
    double avg;
    size_t negative, positive, zero;
    
    result(arr, size, max, min, sum, avg, negative, positive, zero);
 
    cout << "Максимальный элемент: " << max << endl;
    cout << "Минимальный элемент: " << min << endl;
    cout << "Сумма элементов: " << sum << endl;
    cout << "Среднее значение массива: " << avg << endl;
    cout << "Количество отрицательных элементов: " << negative << endl;
    cout << "Количество положительных элементов: " << positive << endl;
    cout << "Количество нулевых элементов: " << zero << endl;
 
    return 0;
}
1
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 562
17.10.2020, 09:44 12
Писал в Code::Blocks с прикрученным MinGW, в Visual Studio не проверял. Но да, Visual Studio ругается. Ничего страшного, разные компиляторы по-разному обрабатывают код. Просто объявить массив таким образом:
C++
1
int* arr = new int[size];
И после всего кода перед оператором возврата return добавить оператор delete[] arr. Должно получиться что-то вроде этого:
C++
1
2
3
4
5
6
7
int main()
{
    int* arr = new int[size];
    /* Выполнение алгоритма программы */
    delete[] arr;
    return 0;
}
1
17.10.2020, 09:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2020, 09:44
Помогаю со студенческими работами здесь

Альтернатива передачи параметров по ссылке, или как переписать код
Здравствуйте. Есть метод на языке C#, в котором используются передача параметров по ссылке и...

Реализовать программу одним из способом передачи параметров в функцию(по адресу,по значению,по ссылке)
Даны координаты вершин двух треугольников. Определить, какой из них имеет большую площадь. ...

Нахождение углов треугольника в градусах по сторонам. Для возвращения нескольких значений применить параметр по ссылке
Я остановился на этом: #include &lt;stdio.h&gt; #include &lt;math.h&gt; int main () { int...

Использование значений, заданных по умолчанию для параметров функций
Прочтено в учебнике &quot;Джесс Либерти. Си++ за 21 день&quot;. Мол, затерев значения переменной в главной...

Составить программу для вычисления значений функции для нескольких значений аргумента(ов)
Добрый вечер, помогите пожалуйста с задачей в PascalABC. 1. Составить программу для вычисления...

способ передачи параметров-значений в п\п
Организовать способ передачи параметров-значений в п\п на примере вычисление минимального элемента...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru