[Unidade 1] Tipos de dados, Variáveis e Funções

🌐 slides 📺 video-aula

[Unidade 2] Condicionais, Vetores e Estruturas de Repetição

🌐 slides 📺 video-aula

[Unidade 3] Mais sobre funções e Métodos úteis

🌐 slides 📺 video-aula

Exercício 0.1: Entendendo a saída de testes

Nesta atividade de JavaScript, vamos apresentar os resultados de cada exercício usando uma função criada pelos professores chamada escreva(...). Ela mostra na página web o valor de uma determinada variável, com um determinado rótulo (descrição) para identificá-la. Assim, essa função recebe como parâmetros: 1) o número do exercício, 2) o rótulo (que é uma descrição da variável) e 3) o valor da variável. Por exemplo, ela pode ser invocada assim:

function algumaFuncaoMinha() {
    // ...
    // ...
    // ...
    let senhaWiFi = 'scientiasalvet';
    // ...
    // ...
    // chamando função 'escreva(...)'
    // ^
    // --------------------------------------------------------
    escreva(1, 'A senha do WiFi na casa do Coutinho', senhaWiFi);
    //      -  -------------------------------------  ---------
    //      ^ nº exercício   ^ rótulo (descrição)     ^ variável
    // ...
    // ...
}

Veja, no arquivo ex-unidade1.js, na função testeSaidas, como a função escreva(...) foi chamada para imprimir a variável a. Ao invocar a função para escrever, ela aparecerá na caixa de saída (região logo abaixo). Note que a função está apenas implementada mas ainda não foi invocada (chamada). Você pode invocá-la no próprio arquivo (ex-unidade1.js). Assim que invocá-la, o valor da variável será mostrado na caixa de saída logo abaixo . Então, invoque-a agora dentro de ex-unidade1.js e veja se aparece na saída o valor da variável a. Para verificar se ocorreu algum erro de sintaxe (escrita) no seu código, pressione F12 e o erro aparecerá na aba de console.

Neste exercício 0.1, você deverá continuar a implementação da função testeSaidas. Nela, você deverá chamar a função escreva mais vezes para imprimir as variáveis (i) b, (ii) a soma das variáveis a e b, (iii) d, (iv) e, da mesma forma que foi impressa a variável a. Logo após, escreva seu nome por meio da função escrevaMensagem - veja como ela foi usada no início do código da função testeSaidas.

Exercício 0.2: Função soma

No arquivo ex-unidade1.js, crie uma função chamada soma que recebe dois números como parâmetros, escreve na saída abaixo (ou seja, chama escreva(...)) a soma desses dois números e, por fim, retorna o resultado para quem invocou a função. Ao invocar escreva(...), use como rótulo (2º argumento) o texto soma. Você pode querer criar uma variável (mas dá para resolver sem criar também). Por fim, invoque a função criada soma(...) para os números 5 e -2.

Exercício 0.3: Fazendo cálculos matemáticos

Implemente no arquivo ex-unidade1.js uma função com nome calculaValoresDoNumero, que recebe como parâmetro um número qualquer e escreve: i) o quadrado deste número, ii) a sua metade e iii) a sua raiz quadrada usando os rótulos quadrado, metade e raiz, respectivamente. Faça o teste invocando esta função (calculaValoresDoNumero(...)) para, pelo menos, dois números diferentes.

Exercício 0.4: Entendedo o for of e "para cada"

Continue a implementação da função contandoElementosDoVetor no arquivo ex-unidade2.js. Essa função recebe como parâmetro o vetor elementos e um elementoSendoProcurado e deverá usar o for of ou o for each para contar quantas vezes que o elementoSendoProcurado apareceu no vetor elementos. Essa quantidade deve ser retornada pela função.

Para verificar se o elemento atual do vetor é igual ao elementoSendoProcurado, você pode querer usar um if/else.

Teste a função invocando-a tanto para vetores de strings quanto de numbers:

contandoElementosDoVetor([1, 5, 5], 5);                  // retorna 2
contandoElementosDoVetor(['daniel', 'flávio'], 'joão');  // retorna 0

Exercício 0.5: Nome do mês dado seu número

Na função obtemNomeDoMes do arquivo ex-unidade2.js, substitua as palavras null pelos valores corretos para terminar de implementá-la. Ela recebe como parâmetro o número do mês (de 1 a 12) e deve retornar seu nome. Lembre-se de como pegar o i-ésimo elemento de um vetor. Essa função também deve verificar se o número recebido é um mês válido, ou retornar null (lembre-se de if/else).

Neste exercício, você não deve alterar o vetor meses. Apenas altere os trechos do código onde está escrito null para valores que façam sentido para o código executar corretamente. Faça o teste para meses válidos e inválidos (ex: -1, 0, 13). Iremos usar esta função em outro exercício e, por isso, você deverá escrever o mês resultante do lado de fora da função usando seu retorno.

Exercício 0.6: Métodos úteis dos vetores

Implemente a função metodosVetor no arquivo ex-unidade3.js, que recebe como parâmetro um vetor e retorna o próprio vetor mas com as seguintes modificações:

  1. Ordene o vetor de forma crescente;
  2. Remova o último elemento do vetor (já ordenado);
  3. Insira a palava "abacate" no início do vetor;
  4. Escreva o vetor resultante na saída deste exercício.

Faça o teste abaixo invocando esta função 2 vezes com vetores de tamanho diferentes que contenham números ([4, 0, 9] ) ou então strings.

Note que...

A função vetor.sort() sem a função passada como parâmetro converte números para strings e só então compara. Sendo assim, [1, 2, 3, 100].sort() resultaria em [1, 100, 2, 3]. Para este exercício, não é necessário se preocupar com isso.

Exercício 0.7: Métodos úteis de string

Implemente no arquivo ex-unidade3.js a função metodosString que recebe como parâmetro uma string qualquer e deve fazer as seguintes transformações:

  1. Deixá-la toda em maiúsculas;
  2. Substituir todas as letras "o" por "a";
  3. Escreva o resultado na saída deste exercício.

Veja a documentação e 🌐 os slides, se necessário. Em particular, a função texto.replaceAll poderá ajudar. Faça o teste invocando a função algumas vezes para diferentes palavras.

Note que...

Diferente dos métodos de vetores, que alteram o próprio vetor, os métodos das strings não alteram a própria string, mas sim retornam uma nova string com o resultado. Ou seja, o código a seguir não está alterando o valor da variável:

let pessoa = 'Dança';
pessoa.toUpperCase(); // retorna 'DANÇA'

console.log(pessoa);  // imprime 'Dança'
...mas este aqui está atualizando para onde a variável aponta:
let pessoa = 'Dança';
pessoa = pessoa.toUpperCase(); // retorna 'DANÇA'

console.log(pessoa);  // imprime 'DANÇA'

Exercício 1: Altura da bola no instante t

Exercício adaptado de [Fundamentos da Programação de Computadores: Algoritmos, Pascal, C, C++ e Java, Holloway, 2008]

Uma bola é jogada para o alto. Neste problema, deve-se calcular a altura \(h(t)\) (em metros) desta bola em um determinado tempo \(t\) (em segundos). Considere que a pessoa lançou a bola a uma altura \(h(t)=v_0t - \frac{gt^2}{2}\), em que \(v_0\) é a velocidade inicial da bola em metros por segundo, \(t\) é o tempo em segundos e \(g\) é a gravidade.

Assim, você deverá terminar de implementar a função calculaAlturaBola no arquivo ex-unidade1.js substituindo o valor null apropriadamente. Essa função recebe como parâmetro o tempo \(t\), a velocidade inicial \(v_0\) e a gravidade \(g\) nessa ordem e retorne a altura da bola naquele instante.

Para testar, invoque esta função usando a gravidade da Terra (9,81 m/s²), velocidade inicial 50 e tempo 1, 5 e 10 (ou seja, invoque a função 3 vezes).

Se algo estranho (ou nada) acontecer, para verificar se o seu código tem algum erro de sintaxe (escrita), pressione F12 e o erro aparecerá na aba de console.

Escreva na saída abaixo o resultado das execuções dessa função. Contudo, em vez de invocar escreva dentro de calculaAlturaBola, chame-a fora dela, após invocá-la e receber seu valor de retorno. Isso é necessário neste exercício porque iremos reutilizar essa função em uma próxima atividade ;)

Exercício 2: Velocidade da bola no instante t

Exercício adaptado de [Fundamentos da Programação de Computadores: Algoritmos, Pascal, C, C++ e Java, Holloway, 2008]

Podemos complementar com mais uma informação sobre o lançamento da bola: agora, dado sua velocidade inicial \(v_0\) de lançamento para cima, calcule a velocidade \(v(t)\) que ela possui no instante \(t\) após ser lançada. A função \(v(t)\) é definida da seguinte forma: \(v(t) = v_0 − gt\)

Crie no arquivo ex-unidade1.js a função calculaVelocidadeBola que receberá como parâmetro o tempo \(t\), a velocidade inicial \(v_0\) e a gravidade g exatamente nessa ordem e deve calcular e retornar o valor encontrado de velocidade. Similar ao exercício da altura da bola, escreva na saída abaixo o resultado das execuções dessa função. Como iremos usar essa função em um outro exercício, você deverá escrever o resultado dele fora da função, usando seu retorno.

Seguindo as regras de legibilidade, use variáveis com nomes legíveis (inclusive os parâmetros). Ou seja, ao invés de nomear a gravidade como g, nomeie-a como gravidade O aluno pederá ponto caso o código esteja mal indentado ou ilegível.

Para testar, invoque esta função usando a gravidade da Terra (9,81 m/s²), velocidade inicial de 50 e tempo 1, 5 e 10 (ou seja, invoque a função 3 vezes).

Exercício 3: Velocidade e altura da bola em vários instantes t

Implemente a função calculaVelocidadeAlturaBola que recebe como parâmetro a velocidade inicial, a gravidade e um valor inteiro n nessa ordem e exibe na saída abaixo a altura e a velocidade da bola nos tempos \(t\) de 1 até n. Neste exercício, você deve usar as funções implementadas nos exercícios 1 e 2 (apenas invocá-las -- não as recrie).

Dentro do laço, você deve invocar escreva duas vezes para (i) altura e (ii) velocidade naquele instante, usando como rótulos h(i) e v(i) em que i é o número referente ao instante (tempo) atual. Para tanto, lembre-se de como concatenar strings.

Para testar, invoque esta função usando a gravidade da Terra (9,81 m/s²), velocidade inicial de 50 e n = 20.

Exercício 4: Somatório

Implemente a função somatorio que receberá como parâmetro um valor inteiro n e fará o seguinte cálculo: \(S = \frac{1}{2}+\frac{1}{4}+\frac{1}{6}+...+\frac{1}{n}\). Logo após, escreva o resultado S na saída abaixo e o retorne. Lembre-se de como criar um laço for (tradicional).

Dica

Há exercícios semelhantes, porém mais fáceis para se elaborar um plano. Imagine se fosse pra somar os números de 2 até \(n\). Só que, em vez disso, deve-se andar de 2 em 2. E, por fim, em vez de somar \(2+4+...+n\), o correto é \(\frac{1}{2} + \frac{1}{4} + ... + \frac{1}{n}\).

Para testar, invoque esta função 3 vezes: usando n=1, n=10 e n=100.

Exercício 5: Posição de um elemento no vetor

Implemente a função obtemPosicaoDoElemento que recebe como parâmetro um vetor e um elemento e retorna a posição da primeira ocorrência do mesmo. Caso não exista, ele deverá retornar null. Você deverá também escrever na saída abaixo esta posição. Como esta função será reutilizada em outro exercício, ela não deve escrever nada dentro dela (para exibir seu resultado, chame o escreva fora da função). Note que esta função deve funcionar para qualquer tamanho de vetor.

Por exemplo, considere o vetor let frutas = ['Pera', 'Uva', 'Abacaxi', 'Cenoura']:

0123
'Pera' 'Uva' 'Abacaxi' 'Cenoura'

Caso executemos obtemPosicaoDoElemento(frutas, 'Uva'), a função deve retornar a posição 1.

Para testar, você deve criar um vetor de strings ou de números e chamar a função escreva com seu retorno para ver o resultado na página.

Exercício 6: Média entre menor e maior valor no vetor

Neste exercício, você deve implementar a função calculaMediaEntreExtremos, que recebe como parâmetro um vetor de números e retorna a seguinte conta: \( \frac{min+max}{2} \) em que \(min\) e \(max\) são o menor e o maior valor no vetor, respectivamente. Da mesma forma que o exercício anterior, o vetor pode ser de qualquer tamanho.

Por exemplo, para o vetor [3, -2, 12], o valor de \(min\) encontrado seria \(-2\) e de \(max\) seria \(12\). Dessa forma, a função deveria retornar \(\frac{-2+12}{2}=\frac{10}{2}=5\).

Dica

Um algoritmo para encontrar o menor elemento de um vetor, em pseudocódigo:

algoritmo "Menor valor"(valores)
    menorAteAgoravalores[0]
    para cada valor de valores
        se valor < menorAteAgora então
            menorAteAgoravalor
        fimse
    fimpara
    retorna menorAteAgora
fimalgoritmo

Analogamente você pode construir outro algoritmo para achar o maior elemento.

Neste exercício, você pode usar essa lógica para achar simultaneamente o maior e o menor elementos. Em seguida, você pode calcular o valor que deve ser retornado (a média aritmética entre eles).

Após implementar, invoque a função usando um vetor que você criar e escrever na saída o resultado retornado pela função.

Exercício 7: Sequência de Fibonacci

A sequência de Fibonacci é uma sucessão de números, começando por 0 e 1, na qual, cada termo subsequente corresponde à soma dos dois anteriores. Ex: os sete primeiros elementos da sequência Fibonacci são (0, 1, 1, 2, 3, 5, 8).

Você deve continuar a implementar a função Fibonacci. Nela, você não deve criar mais variáveis, apenas adicionar elementos ao vetor sequencia. Essa função recebe como parâmetro um número inteiro n e retorna um vetor com os n primeiros elementos da sequência de Fibonacci. Por exemplo, fibonacci(7) deve retornar o vetor: [0, 1, 1, 2, 3, 5, 8].

Você pode considerar que o parametro de entrada sempre será maior que 2. Lembre-se que, em JavaScript, você pode adicionar elementos em um vetor facilmente.

Logo após, realize pelo menos 3 chamadas a esta função. Só não coloque valores muito altos para n (use, no máximo, uns 20), porque o cálculo pode demorar.

Exercício 8: Rede Social

Você irá fazer uma rede social por meio de um vetor de pessoas e matriz amizades, similar ao apresentado abaixo:

pessoas:
0123
'Alice' 'Bob' 'Carol' 'Daniele'
amizades:
0123
0 0 0 0 1
1 1 0 1 1
2 0 0 0 1
3 1 1 0 0

em que, na matriz amizades, cada linha e coluna correspondem a pessoas que podem manter uma relação de amizade entre si. Além disso, a pessoa da i-ésima linha (e coluna) corresponde a mesma pessoa na posição i no vetor pessoas. Por exemplo, a pessoa na linha 0 (e coluna 0) é a Alice, da mesma forma, a pessoa na linha e coluna 2 é a Carol.

Nesta matriz o valor é 1 caso uma pessoa, representada na linha, é amiga da pessoa representada pela coluna. Por exemplo, Alice é amiga apenas de Danielle (veja a linha 0). Nesta rede social (assim como na vida 💁) pode ocorrer falta de reciprocidade entre as amizades, por exemplo: Bob é amigo de Alice mas Alice não é amiga de Bob.

Neste exercício você deverá fazer duas funções e testá-las por meio da matriz e vetor acima (e outro que desejar):

Faça a exibição dessas saídas de tal forma que fique claro de qual entrada é a saída apresentada (use a função escrevaMensagem). A função obtemPosicaoDoElemento implementada anteriormente poderá ajudar (reutilize-a -- não implemente novamente).

Exercício 9: Escreve datas por extenso

Implemente a função escreveDataPorExtenso que recebe como parâmetro uma data no formato DD/MM/YYYY (ou seja, por exemplo, 31/12/2021) e retorna uma string com ela por extenso "DD de M de YYYY" (ou seja 31 de dezembro de 2021).

Para pegar o nome de um mês, dado seu número, use a função obtemNomeDoMes implementada anteriormente. Além disso, o método split das strings será útil para pegar as três partes da data.

Escreva a data por extenso na saída abaixo. Faça testes com pelo menos 3 datas.

Exercício 10: Operações em string

Neste exercício, você deve continuar a implementação das três funções que auxiliarão no próximo exercício a seguir. Como elas serão utilizadas no próximo exercício, utilize a função escreva fora das funções a serem implementadas.

eliminaCaracteres (2 parâmetros)
Elimina todas as ocorrências dos caracteres especificados de um texto.
Tanto o texto quanto os caracteres a serem removidos devem ser passados como parâmetros.
Por exemplo, eliminaCaracteres('correndo contra o tempo', 'coe') deve resultar na string 'rrnd ntra tmp'. Você não deve alterar o for já criado.
Use a função texto.replaceAll para auxiliar.
Lembre-se que você pode acessar posições de uma string como se fosse um vetor. Por exemplo, texto[2] acessa a letra de posição 2 desta string.
Dica: será necessário usar texto.replaceAll uma vez para cada caractere especificado (ou seja, dentro de um laço).
Dica 2: eliminar um caractere é equivalente a substituí-lo por '' (string vazia).
substituaCaracteres (3 parâmetros)
Dado um texto, uma string de procura e uma string de reposição, sendo que a string de procura e reposição são de mesmo tamanho, substitua no texto o caractere na posição i da string de procura pelo caractere na mesma posição i na string de reposição.
O texto, os caracteres a serem procurados no texto e os caracteres a serem colocados no lugar serão passados como parâmetro.
Exemplo: substituiCaracteres('o sapo nao lava o pe', 'aoe', 'iiu') deve resultar em 'i sipi nii livi i pu'
Dica: será necessário usar texto.replaceAll uma vez para cada caractere especificado (ou seja, dentro de um laço).
inverteTexto (1 parâmetro)
Dado um texto, retorna o mesmo de forma invertida
Exemplo: inverteTexto('roma') deve resultar em 'amor'

Exercício 11: Palíndromos

Palíndromos, segundo Oxford Languages, são textos que se pode ler, indiferentemente, da esquerda para a direita ou vice-versa. São exemplos de palíndromos as palavras: "asa", "rapar", "mirim". E também as frases: "A cara rajada da jararaca", "Socorram-me, subi no ônibus em Marrocos". A música "A cara rajada da jararaca" de Manu Lafer é feita por palíndromos. Perceba que, em frases, deve-se ignorar pontuação, acentuação, espaços e maiúsculas/minúsculas.

Você deverá implementar a função verificaPalindromo em que recebe-se uma string (texto ou uma única palavra) e retorna verdadeiro (true) caso o parâmetro represente um palíndromo ou falso, caso contrário. Além disso, a função deve escrever na saída abaixo a indicação se a palavra é ou não um palíndromo.

As funções do exercício anterior poderão auxiliar no processamento da string. Apenas chame-as quando necessário - não implemente-as novamente. Ignore as seguintes pontuações: ",-!?;" e o espaço em branco. Além disso, os acentos agudo, til e circunflexo em vogais devem ser ignorados, além do cedilha. Você pode ignorá-los ao substituí-los por suas versões sem acento.

Exercício 12: Funções como parâmetro 1

Em JavaScript, o valor de uma variável/parâmetro pode ser uma função. Neste exercício, entenderemos isso melhor.

Veja a função daOiPara, que "inicia um chat" (de mentirinha) com uma determinada pessoa. A forma de se dar oi é controlada pelo parâmetro funcaoDeDarOi, que é uma função que deve receber o nome da pessoa e é responsável por retornar uma string com o "oi" devidamente escrito em seu idioma. Além desse parâmetro, a função daOiPara espera receber o nome da pessoa. Veja em ex-unidade3.js a implementação dessa função além das vezes que ela foi invocada. Perceba as três formas que ela foi invocada.

Invoque a função daOiPara em que o parâmetro funcaoDeDarOi será outras 3 funções criadas por você. Lembre-se que ela deve obrigatoriamente receber o parâmetro do nome da pessoa e retornar uma string. Crie três dessas funções, das três formas diferentes que foram apresentadas, e invoque-as como exemplificado no arquivo. Use o seu próprio nome para receber o oi.

Exercício 13: Funções como parâmetro 2

Você deve implementar a função aplicaOperacaoEmCadaElemento, que recebe como parâmetros uma operacao (que é uma função) e dois vetores com mesmo tamanho: vetor1 e vetor2. Então, para cada par de elementos de mesma posição (ex: primeiro de vetor1 e primeiro de vetor2, depois segundo...), ela invoca a operação, retornando um novo vetor como resultado. Essa operação é uma função que recebe dois números como parâmetro (ex: function soma(a, b)) e deve retornar o resultado da operação entre os 2 elementos que foram passados como parâmetro (nesse caso, a + b).

Caso os dois vetores sejam de tamanho diferentes, deve-se exibir uma mensagem de erro, não realizar a operação e retornar null. Lembre-se que você pode acessar a propriedade length dos vetores para saber seu tamanho.

Veja o exemplo abaixo, considerando a operação soma (implementada no exercício 0.2).

vetor1:
0123
4 2 -1 10
vetor2:
0123
10 2 3 5
valor retornado
0123
14 4 2 15
let vetor1 = [4, 2, -1, 10];




let vetor1 = [10, 2, 3, 5];





aplicaOperacaoEmCadaElemento(soma, vetor1, vetor2);

function soma(a, b) {
    return a + b;
}

function aplicaOperacaoEmCadaElemento(operacao, vetor1, vetor2) {
    // ...implementar...
    // ...
    // retorna vetor de resultado
}

Você deverá implementar a função aplicaOperacaoEmCadaElemento e três operações distintas (por exemplo, soma(a, b), multiplica(a, b) e subtrai(a, b)), cada uma, criando uma função de forma uma diferente.