Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Valor e Referência - Aula de Arquitetura de Computadores

Oi pessoal, tudo bem? Comecei a estudar programação agora, estou vindo de outra área e sinto algumas dificuldades nos conceitos teóricos.

Na aula em que é explicada a diferença entre passagem por valor ou referência não entendi como arrumar o código passado em Java pra transformar de valor para referência conforme a indicação dada no exercício após.

O que eu devo fazer nesse código, onde que está determinada a leitura por valor no código abaixo? E como eu poderia substituir para referência?

Sei que é uma dúvida bem básica mas não encontrei solução no fórum nem online, talvez não tenha conseguido achar.

Obrigado!

function calculaProximaIdade(idade) {
    idade += 1;
    console.log(idade);
}

function calculaProximasIdades(idades) {
    for (let i = 0; i < idades.length; i += 1) {
        idades[i] += 1;
    }
    console.log(idades);
}

function calculaIdadesDaqui5Anos(idades) {
     for (let i = 0; i < idades.length; i += 1) {
        idades[i] += 5;
    }
    console.log(idades);
}

const idadeStefany = 21;
calculaProximaIdade(idadeStefany);

const idadesAmigos = [idadeStefany, 20, 23, 18, 7];
calculaProximasIdades(idadesAmigos);

calculaIdadesDaqui5Anos(idadesAmigos);
2 respostas
solução!

Oi, Fábio! Ótima pergunta :)

O primeiro passo para entender o problema do código é executando ele. Como o código é em JavaScript, você pode executá-lo pelo próprio navegador com inspecionar elemento (ctrl + shift + i), indo na aba console, copiando e colando no console e executando com Enter.

Ao executar, você terá um resultado como este:

22
[22, 21, 24, 19, 8]
[27, 26, 29, 24, 13]

Cada linha é a execução das funções calculaProximaIdade(), calculaProximasIdades() e calculaIdadesDaqui5Anos(), respectivamente. Se a gente pegar a última execução, ela parece certa? Stefany tem 21 anos e, daqui a 5 anos, ela terá 26 anos, mas a função diz que ela terá 27 (o primeiro elemento da lista). Esse é o problema.

Isso acontece porque, na execução de calculaProximasIdades(), nós modificamos a lista idadesAmigos, porque ela é passada por referência para a função. Dessa forma, quando vamos executar a próxima função, todas as idades estão um ano a mais do que deveriam.

Um método de solucionar isso é fazendo uma cópia da lista dentro da função, com isso, a lista original não é modificada. Existem várias formas de fazer isso, você pode consultar algumas aqui, e uma delas é usando a spread syntax do JavaScript. Por exemplo, a função calculaProximasIdades() pode ser alterada da seguinte forma:

function calculaProximasIdades(idades) {
    const copiaIdades = [...idades];
    for (let i = 0; i < copiaIdades.length; i += 1) {
        copiaIdades[i] += 1;
    }
    console.log(copiaIdades);
}

Você consegue fazer a mesma correção para calculaIdadesDaqui5Anos()?

Para concluir, na primeira função (calculaProximaIdade()) seu argumento é passado por valor porque ele é um número, já nas outras funções (calculaProximasIdades() e calculaIdadesDaqui5Anos() ) os argumentos são passados por referência porque eles são listas. Dessa forma, todo o problema é que a passagem por referência nos faz modificar a lista original. Assim, nós não precisávamos transformar a passagem de valor pra referência mas, sim, o contrário.

Consegui resolver sua dúvida? Qualquer coisa que tiver é só falar

Abraços :)

Excelente, muito obrigado professor! Consegui entender perfeitamente o conceito agora.