Форум программистов, компьютерный форум CyberForum.ru

Несколько значений функции - C++

Восстановить пароль Регистрация
 
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
06.10.2012, 11:30     Несколько значений функции #1
Здравствуйте. Нужно написать рекурсивную функцию, к-ая возвращает наибольный элемент массива и его индекс.
Я могу сделать функции по отдельности, но надо, чтобы оба значения каким-то образом возвращались в одной функции. Подскажите, пожалуйста, как?

Непосредственно код:
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
#include "stdafx.h"
#include <iostream>
#include <ctime>
 
using namespace System;
using namespace std;
 
int m [1000];
 
 
int rec(int i, int max)
{
    int k,x;
    bool a;
    if ((i-1)!=-1)
    {
    i=i-1;
    k=m[i];
    return m[i] > max ? rec (i,m[i]) : rec (i,max);
    }
    else return max;
    
}
 
 
int main()
{
    srand(time(NULL));
    int n,i,j,max;
    cout<<"Vvedite razmernost massiva: "<<endl;
    cin>>n;
    for (i=0; i<=n; i++)
    {
        m[i]=rand()%100;
        cout<<m[i]<<" ";
    }
    i=(n+1);
    max=rec(i,0);
    cout<<endl;
    cout<<max;
    cin.get();
    cin.get();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.10.2012, 12:50     Несколько значений функции #2
std::pair вам в руки.
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
06.10.2012, 13:51  [ТС]     Несколько значений функции #3
Эээмм... Что за паир?) Вот я немного доделал программку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int rec(int i, int max, int ind)
{
    int k,x;
    bool a;
    if ((i-1)!=-1)
    {
    i=i-1;
    k=m[i];
    return m[i] > max ? rec (i,m[i],i) : rec (i,max,ind);
    }
    else 
    {
        pair<int,int> p1(max,ind);
        return max;
    
}

Как теперь вывести эту пару?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.10.2012, 14:42     Несколько значений функции #4
Нет же. pair — это как раз тип данных "два значения". Фактически, это структура с двумя полями: first и second, хранящими ваши два значения. Возвращать её же вам надо.
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
#include <iostream>
#include <utility>
 
/* (Неэффективный и неустойчивый к дуракам) рекурсивный поиск
 * максимума в массиве array в пределах [from; to)
 */
template <typename T>
std::pair<T, size_t> rec_max(const T array[], size_t from, size_t to)
{
  if (from != to - 1) {
    std::pair<T, size_t> first(array[from], from);
    std::pair<T, size_t> rest = rec_max(array, from + 1, to);
    return first.first > rest.first ? first : rest;
  }
  else {
    return std::pair<T, size_t>(array[from], from);
  }
}
 
int main()
{
  int array[] = {1, 2, 5, 3, 4};
  std::pair<int, size_t> max = rec_max(array, 0, 5);
  std::cout << "Max: " << max.first << " @ " << max.second;
}
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
06.10.2012, 15:11  [ТС]     Несколько значений функции #5
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Нет же. pair — это как раз тип данных "два значения". Фактически, это структура с двумя полями: first и second, хранящими ваши два значения.
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
#include <iostream>
#include <utility>
 
/* (Неэффективный и неустойчивый к дуракам) рекурсивный поиск
 * максимума в массиве array в пределах [from; to)
 */
template <typename T>
std::pair<T, size_t> rec_max(const T array[], size_t from, size_t to)
{
  if (from != to - 1) {
    std::pair<T, size_t> first(array[from], from);
    std::pair<T, size_t> rest = rec_max(array, from + 1, to);
    return first.first > rest.first ? first : rest;
  }
  else {
    return std::pair<T, size_t>(array[from], from);
  }
}
 
int main()
{
  int array[] = {1, 2, 5, 3, 4};
  std::pair<int, size_t> max = rec_max(array, 0, 5);
  std::cout << "Max: " << max.first << " @ " << max.second;
}
ох ты, целая куча нового... Можете пояснить значения template <typename T>, std:air<T, size_t> rec_max(const T array[], size_t from, size_t to) (и отдельно про size_t, так как переменную я че-то не признаю), и rest?

Добавлено через 22 минуты
Вах! Программа выводит все правильно после того, как я изменил функцию так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int rec(int i, int max, int ind)
{
    int k,x;
    bool a;
    if ((i-1)!=-1)
    {
    i=i-1;
    k=m[i];
    return m[i] > max ? rec (i,m[i],i) : rec (i,max,ind);
    }
    else 
    {
        pair<int,int> p1(max,ind);
        cout<<endl;
        cout<<p1.first;
        cout<<" "<<p1.second;
        return max;
    }
}
Благодарю за подсказку с типом pair, теперь буду знать о его существовании. Но все же после успеха пояснения нужны, мало ли, когда понадобятся.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.10.2012, 16:32     Несколько значений функции #6
template <typename T> перед функцией означает шаблон функции. То есть функция может принимать массив (T array[]) любого типа: это может быть int, double и т. п.

size_t — специально обученный тип со смыслом "размер чего-то" (фактически это unsigned int). Его использование просто является чем-то вроде хорошего тона для индексов.

rec_max возвращает пару (максимальное значение, его индекс). Соответственно, в ветках ифа разбирается два варианта: если массив из одного элемента (else-ветка), то возвращаем этот один элемент; если в массиве больше элементов, то максимум — это большее из first и rest значение. first — это первый элемент просматриваемой части массива (с индексом from), rest — это максимальный среди всех остальных элементов (с индексами от from + 1 до to – 1). rest-то и вычисляется рекурсивно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2012, 16:42     Несколько значений функции
Еще ссылки по теме:

C++ Вернуть несколько значений из функции С++
C++ Вычисление таблицы значений заданной функции для N значений X в заданном интервале
C++ Argc argv, передать несколько значений в качестве параметров

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

Или воспользуйтесь поиском по форуму:
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
06.10.2012, 16:42  [ТС]     Несколько значений функции #7
еще раз спасибо. Pair'ом так и не получилось воспользоваться, ибо куча буков смутила.

Опять переделал программу, теперь функция возвращает нужные значения через структуры (а не просто выводит его).
Yandex
Объявления
06.10.2012, 16:42     Несколько значений функции
Ответ Создать тему
Опции темы

Текущее время: 11:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru