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

Duvida sobre as diferenças dos parâmetros.

Minha duvida se resume nos parâmetros em negrito utilizado pelo mestre no trecho:

function voltaPosicaoInicialDoCarro(){ for(let i = 0; i < imagemCarros.length; i = i + 1){ if(passouTodaATela(xCarros[i])){ xCarros[i] = 600; } } }

function passouTodaATela(xCarro){ return xCarro < - 50; }

Não consegui entender porquê o primeiro é xCarros[i] e o segundo xCarro, não deviam ser todos iguais, também gostaria não compreendi o conceito de um parâmetro e seu papel.

4 respostas

Olá Eduardo, tudo bem com você?

O parâmetro de uma função, é o que a função espera receber para ser executada, isso é, o que for passado por parâmetro em uma função é algum dado importante para a função utilizar, e esse parâmetro pode ser do tipo numérico, texto, vetores, enfim, qualquer tipo de dado que possamos declarar.

Neste caso que você apresentou, quando declaramos a função

function passouTodaATela(xCarro){
    return xCarro < - 50;
}

definimos que a função passouTodaATela(xCarro) espera um xCarro para executar. Para entender melhor, sempre é interessante pensar qual o papel do que esperamos como parâmetro, podemos fazer a pergunta: o que é um xCarro?

Nesse caso, sabemos que um xCarro é a posição x de um único carro na nossa tela (note que a escolha do nome da variável é muito importante ao entender o que cada variável faz. Imagine que o nome da variável fosse só 'x': o que é 'x'?' x' de onde?). Por fim, a função recebe essa posição x de um carro e nos diz se ele já atravessou toda a tela.

Agora que sabemos para que serve a função passouTodaATela(xCarro) e o que ela recebe como parâmetro, vamos analisar a função voltaPosicaoInicialDoCarro()

function voltaPosicaoInicialDoCarro(){
    for(let i = 0; i < imagemCarros.length; i = i + 1){
        if(passouTodaATela(xCarros[i])){ 
            xCarros[i] = 600; 
        } 
    }
}

A primeira coisa a se notar é que essa função não recebe nenhum parâmetro: ela apenas executa suas instruções.

Sobre a execução, essa função faz um for loop para iterar sobre a lista de carros que temos aparecendo na nossa tela e verifica para cada carro que temos nessa lista se ele passou da tela, utilizando nossa função passouTodaATela(xCarro), e caso ele tenha passado da tela, a função reajusta a posição dele para o início da tela.

Para ficar mais claro, vamos imaginar a nossa lista de carros com

//           0        1         2
xCarros = [xCarro1, xCarro2, xCarro3];

ou seja, 3 carros diferentes.

Na primeira iteração, quando i é igual a 0, será executado

function voltaPosicaoInicialDoCarro(){
    for(let i = 0; i < imagemCarros.length; i = i + 1){
        if(passouTodaATela(xCarros[0])){ 
            xCarros[i] = 600; 
        } 
    }
}

ou seja, vamos passar o carro que está na posição 0 da lista xCarros (xCarro1) e executar a verificação nele.

Na segunda iteração, quando i é igual a 1, será executado

function voltaPosicaoInicialDoCarro(){
    for(let i = 0; i < imagemCarros.length; i = i + 1){
        if(passouTodaATela(xCarros[1])){ 
            xCarros[i] = 600; 
        } 
    }
}

agora, a verificação é na posição 1 da lista xCarros (xCarro2), utilizando a função passouTodaATela(xCarro)

Por fim, na ultima iteração i = 2

function voltaPosicaoInicialDoCarro(){
    for(let i = 0; i < imagemCarros.length; i = i + 1){
        if(passouTodaATela(xCarros[2])){ 
            xCarros[i] = 600; 
        } 
    }
}

e será executada a mesma verificação, só que com o xCarro3, que está na posição 2 da nossa lista.

Portanto, a diferença é que quando acessamos a variável xCarros, estamos na verdade acessando toda a lista de carros ([xCarro1,xCarro2,xCarro3])

Já quando acessamos xCarros[i], estamos acessando o carro que está na posição i da lista xCarros, e é por esse motivo que temos que utilizar desta maneira. Pense que um carro tem a informação de onde ele está, a lista de carros apenas sabe que os carros existem e onde encontrar eles, mas não onde eles estão

Espero que tenha ficado claro.

Me coloco à disposição e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Foi de grande ajuda a explicação, só permaneceu uma duvida.

Por que o parâmetro da primeira função xCarros[i], é diferente da segunda xCarro, ou seja, não tem a letra s no final. No meu entendimento os parâmetros deviam ser iguais, tanto na primeira função quanto na segunda. Além disso não utilizei o parâmetro xCarro em nenhum lugar do meu código, apenas nessa função, ou seja, não existe variável nem listas com esse nome. Segue código: https://editor.p5js.org/eduardorcecilio/sketches/Ve2CO-ZIx

solução!

Olá!

Para entender melhor, vamos analisar a função passouTodaATela:

function passouTodaATela(xCarro){
    return xCarro < - 50;
}

quebrando em partes, as funções podem ter 4 partes:

1 - Declaração da função - é como identificamos que existe uma função no código e neste caso esta sendo feita pela palavra-chave function

2 - Nome da função - é como identificamos e referenciamos essa função em outros lugares no código, esse nome é arbitrário, podemos escolher qualquer um desde que não seja uma palavra reservada. Neste caso, o nome da nossa função é passouTodaATela.

3 - Parametros - é o que fica dentro dos parênteses na função, podem ser 0 ou muitos. Aqui, novamente, o nome é arbitrário, e pode ser qualquer um que não seja palavra-chave, no nosso caso temos apenas o xCarro, que poderia se chamar apenas x*, ou apenas *carro, ou até qualquer outra coisa que você possa imaginar, o nome dado é apenas para ficar claro que estamos lidando com a posição x de um carro.

4 - Corpo da função - é onde colocamos as instruções que a função vai executar, delimitado por chaves, no nosso caso o corpo é bem curto: return xCarro < - 50;.

Esse conjunto de 4 partes, é o que chamamos de assinatura da função, que define o comportamento de uma função, bem como utilizá-la (como referenciar ela[nome] e o que ela espera[parâmetros]). Quando fazemos essa definição, a função está pronta para ser executada, da seguinte maneira:

passouTodaATela(xCarro);

ou seja, utilizando seu nome, o parêntese (que determina a execução da função) e dentro dos parênteses, a série de parâmetros que a função espera, nesse caso é só um, mas poderiam ter múltiplos. Quando passamos um parâmetro para essa função, ele passa a se chamar argumento da função e não necessariamente precisa ter o mesmo nome do parâmetro que definimos na assinatura da função, precisamos apenas que seja um tipo válido para que aquela função execute.

Por este motivo, quando passamos xCarros[i] na execução da função, o que vai acontecer é a verificação do valor que está dentro de xCarros[i], e se ele for um valor válido a função vai executar como o esperado. Para testar, tente em algum momento passar uma variável do tipo String para a função, algo como:

var xCarro = "um carro";
passouTodaATela(xCarro);

Note que nesse caso, a variável tem o mesmo nome da assinatura, mas ainda assim vai dar um erro. Por que?

Acontece, que ele verifica o valor que esta na variável xCarro, uma String; e na função é esperado um valor numérico, então na hora de verificar se é menor que -50, ele não vai conseguir fazer isso, por se tratar de um texto.

Portanto, a assinatura da função, define como a função se comporta, e o que ela espera receber, no entanto não delimita que tenhamos que utilizar o mesmo nome da variável, o que nos importa é o tipo dela para garantir o funcionamento correto do programa.

Me coloco à disposição e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Explicação excelente para quem, assim como eu, está começando a entender a lógica. Obrigada, Arthur.