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

Exercício Anos das Copas - Aula 7

A proposta do exercício é que se exiba os anos que houveram ou haverão Copas do Mundo.

No código abaixo, ele listará as copas desde 1930 até o ano limite informado. Está funcionando!!! Entretanto no segundo código indicado pelo Flávio, não está correto, porque ele assume que o ano inicial informado é uma data de copa e vai acrescentando + 4 anos até atingir o ano limite da pesquisa o que gera erro de informação. Como resolver esta questão?

<script>

    function mostra(frase) {
        document.write(frase + "<br>");
    }

    var anoCopa = 1930;
    var fimPesquisa = parseInt(prompt("Digite o ano limite"));

    while (anoCopa <= fimPesquisa) {
       mostra(anoCopa + " tem copa");
       anoCopa = anoCopa + 4;
    }
    mostra("Ufa! Esses foram os anos de copa até " + fimPesquisa);
<script>
function mostra(frase) {
    document.write(frase + "<br/>");
}

var anoComoTexto = prompt("Informe o ano inicial");
var AnoCopa = parseInt(anoComoTexto);
var limite = prompt("Qual o ano limite?");

while(AnoCopa <= limite) {
    mostra(AnoCopa + " é ano de copa!");
    AnoCopa = 4 + AnoCopa;
}
mostra("Ufa! Esses foram os anos de copa até " + limite);
</script>
8 respostas

Hephaestus,

isso não tem como "resolver", pois é uma entrada de dados. Do jeito que está, não há como saber se, realmente, o ano informado na entrada de dados é realmente um ano de copa (até porque, se o programa já soubesse, não haveria necessidade de informar anos, etc, bastaria pedir todas as datas de um banco de dados). O propósito do exercício é mostrar que, com a entrada de dados correta, o sistema consegue "prever" as próximas copas.

Espero que tenha ajudado.

Abraço.

var anoComoTexto = "";
var anoCopa = "";

do {

    anoComoTexto = prompt("Informe o ano inicial");
    anoCopa = parseInt(anoComoTexto);

} while((anoCopa  - 1930) % 4 != 0);

A solução acima garante que o usuário não vai poder digitar um ano que não seja um ano de copa. Não sei se você já chegou no comando do...while. Ele vai deixar o usuário inserir um ano qualquer, depois vai subtrair 1930 e vai testar se esse número dividido por 4 é uma divisão de resto 0. Se não for, o usuário vai ter que tentar novamente.

Se testar vai ver que sempre que um ano é ano de copa, se você fizer esse cálculo vai ver que funciona.

É um jeito de garantir.

Olá Tomás, obrigado pela resposta, mas não haveria outra forma para independente do ano informado houvesse a contagem a partir de um ano de copa?

Porque da forma que você demonstrou é tentativa e erro até a informação correta de um ano de copa.

solução!
var anoComoTexto = prompt("Informe o ano inicial");
var AnoCopa = parseInt(anoComoTexto);

if(AnoCopa < 1930) {

    //Se entrar nesta condição, está errado. Você pode
    //optar por corrigir automaticamente para 1930.

    AnoCopa = 1930;

} else if((AnoCopa - 1930) % 4 != 0) {

    //Se entrar nesta condição, não é um ano de copa.
    //Você pode optar por corrigir para o próximo ano de
    //copa.

    while((AnoCopa - 1930) % 4 != 0) {

        AnoCopa++;

    }

} else {

    //Se entrar nesta condição, o usuário digitou
    //corretamente

}

É meio complexo. Não sei se é o que você pensa fazer. Mas é o único jeito que eu pensei para evitar tentativa e erro. Neste código, se o usuário digitar 1960, o código vai corrigir para a próxima copa, ou seja, 1962.

Se ele digitar 1500, vai corrigir para 1930. Se ele digitar 1970, vai aceitar.

Para validar se o ano teve ou não copa o jeito é criar uma lista. Uma forma este tipo de problema seria esta:

<script type="text/javascript">
var copas = [1930, 1934, 1938, 1950];
var ano_inicial = 1950;
var ano_atual = new Date().getFullYear();
while(ano_atual >= ano_inicial+4){
    ano_inicial = ano_inicial + 4;
    copas.push(ano_inicial);
}

var teste = copas.indexOf(2013);
if (teste >=0){
    alert("ano de copa!");
} else {
    alert("nao teve copa!");
}
</script>

No exemplo, eu criei um array com as copas de 1930 a 1950 (houve um intervalo na década de 40 devido a Segunda Guerra). A partir de 1950, eu fiz uma programação para adicionar automaticamente até hoje.

Usando o array.indexOf(), eu posso validar se um número informado existe ou não no array. Se existir, imprimir o aviso que existe.

Uma forma de imprimir a lista das copas até um ano informado seria primeiro validar se o ano limite é maior que 1930. Se for, bastaria, com base nesta lista de anos válidos, fazer o seguinte:

<script type="text/javascript">
var copas = [1930, 1934, 1938, 1950];
var ano_inicial = 1950;
var ano_atual = new Date().getFullYear();
while(ano_atual >= ano_inicial+4){
    ano_inicial = ano_inicial + 4;
    copas.push(ano_inicial);
}

var ano_informado = 1970;
if (ano_informado  >=1930){
    for (i = 0; i < copas.length; i++) { 
        if (ano_informado >= copas[i]  ){
            console.log("Copa de " + copas[i]);
        }
    }
}
</script>

Temos duas soluções interessantes. Uma usa módulo e outra array.

Hep, o grau de difuculdade dessa questão pode afastar o aluno do seu primeiro curso de lógica e não é isso que querenos. O foco era ensinar repetição. Contudo sua preocupação com a validação é bem-vinda porque é algo que no futuro toda app precisa fazer. Mas como disse, o foco maior foi no aluno aprender loop.

Tudo bem?

Hephaestus , não deixe de nos dar um retorno sobre essa questão. Se esta tudo direitinho.

Obrigado pelas respostas, pessoal.