Passagem por Referência [RESOLVIDO]

1. Passagem por Referência [RESOLVIDO]

Daniel
Aristarco

(usa Linux Mint)

Enviado em 19/10/2014 - 12:13h

Estou com dúvidas a respeito desta questão, fiquei confuso em relação a forma de como ela irá retornar os valores.

P.S.: Ela só pode ser construída de acordo o enunciado (PASSAGEM POR REFERÊNCIA)

Escreva um método que receba um vetor de inteiros e retorne o maior elemento e o menor elemento. Observe que o método deve retornar ao local da chamada os dois valores (não imprimir ao usuário). Portanto você precisará usar passagem por referência, já que os métodos só podem retornar um único valor.


  


2. MELHOR RESPOSTA

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 19/10/2014 - 13:06h

Claro, veja isso:



int, int get_max_min(std::vector<int> numbers)



Essa seria a ideia original, receber um vetor de números, e retornar o máximo e o mínimo. Mas isso não existe, não é permito possuir dois retornos por função.

Então o que pode ser feito?

- Retornar um objeto que possua os dois valores, Ex: std::pair
- Passar por referência, os valores desejados, como resultado, para serem atribuídos dentro da função

A segunda opção correponde ao seu problema.

Quando temos:



void get_max_min(std::vector<int> numbers, int max, int min)
{
// ...
}

int max(0);
int min(0);

std::vector<int> numbers = {10, 2, 6, 7, 9};

get_max_min(numbers, max, min);



E aí, já sabe quem são min e max, após essa função?
10 e 2?
Errado, será 0 e 0, os mesmos valores inicializados. Por quê?
Porque ao passar max e min para a função get_max_min, a assinatura dela diz que está recebendo uma variável int, por cópia, por não alegar os operadores ou de referência & ou ponteiro *

Quando isso ocorre, a variável passada é copiada e essa utilizada no escopo da função. Logo, o max que é utilzado na função, não é o mesmo max passado por parâmetro.

Para tirar essa dúvida, imprima o endereço da variável, irá perceber que serão diferentes.

Quando é passado por referência:


void get_max_min(std::vector<int> numbers, int& max, int& min)
{
// ...
}

int max(0);
int min(0);

std::vector<int> numbers = {10, 2, 6, 7, 9};

get_max_min(numbers, max, min);



Note que é quase o mesmo código, apenas mudando o operador & (refência). Desse modo está dizendo que será utilizado a referência da variável passada e a mesma será manipulada no escopo da função.
Neste caso sim, max passado por parâmetro, será o mesmo max atribuído dentro da função.

E quanto ao min_element e max_element, são funções padrões da STL, que irão dar de bandeja o valor máximo e mínimo, dentro do container:

http://www.cplusplus.com/reference/algorithm/min_element/

3. Re: Passagem por Referência [RESOLVIDO]

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 19/10/2014 - 12:31h

Olá

O que está sendo pedido, são dois valores de retorno, mas uma função só pode retornar um valor. Para que seja possível possuir dois valores, será necessário passar os dois referência e atribuir o min e max a eles.

Ex:


//Em C++
void get_min_max(std::vector<int> numbers, int& min, int& max)
{
min = *std::min_element(numbers, numbers + numbers.size());
max = *std::max_element(numbers, numbers + numbers.size());
}

//Em C
void get_min_max(int vector[], int* min, int* max)
{
if (!min || !max)
return;

//Aqui da pra usar um for para capturar o minimo e o máximo ...
//*min =
//*max =
}



Note que é passado o operador de ponteiro, em C e de referência, em C++. Isso justamente porque caso passado sem o operador, a variável passado como parametro, será copiada e esta utilizada no escopo da função. Ao termino da função, a variável local será destruída e a original, que foi passada, estará intocada. Daí você irá coçar a cabeça e se perguntar o porquê dela não ter mudado de valor ;)


4. Re: Passagem por Referência [RESOLVIDO]

Daniel
Aristarco

(usa Linux Mint)

Enviado em 19/10/2014 - 12:40h

É c++, apesar de parecer correta, sua resposta ficou muito complexa, teria outro modo de resposta mais simples?


5. Re: Passagem por Referência [RESOLVIDO]

Daniel
Aristarco

(usa Linux Mint)

Enviado em 19/10/2014 - 13:13h

Perfeito!! Entendi a sua explicação agora, muito obrigado!!
Abç..






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts