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

Exercícios complexos e um mini-desabafo

Todas as vezes que me deparo com problemas mais complexos, que envolvem blocos de códigos que se relacionam, travo e fico perdido.

Esse exercício da troca de cor e o do gráfico de barras, da aula 02, são bons exemplos.

Já consegui uma boa noção de funções, variáveis e loops (ensinados no 1º módulo), mas ainda tenho muita dificuldade em encontrar um raciocínio lógico coeso em problemas extensos.

O que deve ser feito neste caso? Revisar o primeiro módulo do curso do 0 para preencher lacunas de conceitos que (possivelmente) não foram assimilados?

Para se ter uma ideia, vou deixar abaixo o código que consegui produzir, até agora, deste exercício. Não sei para onde correr, tentando encontrar um modo de fazer com que a função troque as cores.

// Capturando a tela 
var tela = document.querySelector("canvas");

// Criando um pincel e informando à tela que os gráficos serão 2d
var pincel = tela.getContext("2d");


// Cor Background da Tela
pincel.fillStyle = 'grey';

// Cordenadas e Medidas do Background
pincel.fillRect(0, 0, 600, 400);


// Função Desenha Círculo
function desenhaCirculo(evento) {

    /* Pegando as cordenadas do clique e 
    relacionando-as ao canvas, não à tela inteira */
    var x = evento.pageX - tela.offsetLeft;
    var y = evento.pageY - tela.offsetTop;

    // Desenhando um Círculo ao clicar
    pincel.fillStyle = 'blue';
    pincel.beginPath();
    // Pega as cordenadas como argumento
    pincel.arc(x, y, 10, 0, 2 * Math.PI);
    pincel.fill();

    // Logando as cordenadas
    //console.log(x + "," + y);
}

var cores = ['blue', 'red', 'green'];

//Função Muda Cor 
function mudaCor() {

    var contador = 0;

    while(contador < cores.length) {

        tela.oncontextmenu = cores[i];
    }

    //Impede que o menu padrão seja exibido
    return false;
}


// Atribuindo a função ao evento
tela.onclick = desenhaCirculo;

// Atribuindo a função Muda Cor ao evento
tela.oncontextmenu = mudaCor;
5 respostas
solução!

Oi Roger,

É normal isso de se sentir perdido com códigos mais extensos. Programadores experientes também tem isso, embora em menor escala. Com o tempo você vai se familiarizar com a lógica da programação, e depois com a sintaxe de uma linguagem específica.

Programar é uma atividade que exige uma grande memória mental de curto prazo. Qualquer interrupção atrapalha bastante. Procure um lugar silencioso pra estudar.

Eu não li com calma o exercício acima, mas as dicas que dou são:

  • Insista. Não vai fazer sentido algum por um tempo, continue. Daqui a pouco acontece um click e você começa a entender.
  • Repita. Após conseguir resolver um problema, faça várias vezes até você automatizar a coisa.
  • Escreva o algoritmo em português, antes de implementar. Isso dá clareza de pensamento antes de se preocupar com sintaxe.Igual a escrever uma receita de bolo.
  • Faça um diagrama no papel mesmo, anote o passo-a-passo do seu algoritmo. Pra começar use o gráfico que você entender, sem se preocupar com formalismos. Mais pra frente você pode ler sobre UML e uns diagramas interessantes: fluxo, sequência, atividade, classes, etc.

Além das dicas acima, recomendo o uso de um editor de texto tipo o http://www.atom.io, assim você se ocupa em escrever sem distrações.

E resolvendo o seu exercício... veja assim:

<canvas width="600" height="400"></canvas>

<script>
    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');
    pincel.fillStyle = 'grey';
    pincel.fillRect(0, 0, 600, 400);

    function desenhaCirculo(evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        pincel.fillStyle = mudaCor();
        pincel.beginPath();
        pincel.arc(x, y, 10, 0, 2 * 3.14);
        pincel.fill();
        console.log(x + ',' + y);
    }

    tela.onclick = desenhaCirculo;

    var cores = ['blue', 'red', 'green'];
    var i = 0;
    function mudaCor() {
        i++;
        if(i == cores.length) {
            i = 0;
        }
        return cores[i];
    }

</script>

Aqui eu chamei a mudaCor(): pincel.fillStyle = mudaCor();

E a function mudaCor agora acrescenta + 1 no contador i para retornar um index do array cores.

Observe que há inúmeros jeitos de resolver esse problema.

Obrigado, Ricardo.

Você já usou o sublime? Se sim, o que te fez migrar para o Atom?

Usei Sublime por alguns anos mas nunca gostei. Era o mais acessível na época (antes eu usava Textmate desde 2007, mas que foi abandonado/enrolado infelizmente). O Sublime ganhou muita popularidade naquela época por causa disso.

Alguns motivos que troquei pro Atom em 2013/14:

  • integração nativa com GitHub
  • atualizações constantes
  • plugins raramente quebram entre uma atualização e outra
  • infinitamente mais fácil de personalizar opções e os temas
  • gerenciador de pacotes nativo
  • autocomplete decente e rápido
  • o próprio editor é escrito em HTML/CSS/JS, encapsulado em um container Electron = bem leve

Dica: veja esse tema https://atom.io/themes/search?utf8=✓&q=keyword:duotone

Hoje em dia eu troquei os editores pelas IDE. É muito detalhe pra lembrar ao mesmo tempo... Estou com PHPStorm, Xcode e Android Studio. Uso Atom só pra editar rapidamente um arquivo ou outro.

Entendi.

Vou testar o Atom, já ouvi muitas pessoas o elogiando. O que mais me atrai nele é justamente a integração nativa com GitHub.

Eu larguei o DreamWeaver há alguns dias e migrei pro Sublime. Mas, quando eu preciso atualizar automaticamente os caminhos de um link renomeado, por exemplo, eu corro pro DreamWeaver, por que o Sublime não tem essa feature.