terça-feira, 30 de dezembro de 2014

Introdução da Programação de Computadores - Capítulo 2

Neste capítulo tratamos das estruturas sequenciais, que nos permitem gerar programas simples com entrada e saída de dados.


Exemplo 1


Exemplo 2


Exemplo 3


Exemplo 4


Exemplo 5


Exemplo 6


Exemplo 7


Exemplo 8


Exemplo 9


Exemplo 10


Exemplo 11


Exemplo 12


Exemplo 13


Exemplo 14


Exemplo 15


Exemplo 16


Exemplo 17


Exemplo 18


Exemplo 19


Exemplo 20



Exemplo 21


Exemplo 22


Exemplo 23


Exemplo 24


segunda-feira, 29 de dezembro de 2014

Introdução da Programação de Computadores - Capítulo 1

Neste post apresentamos o conceito básico de algoritmo. Existem diversas definições, apresentamos a seguir a de Manber.

“Um procedimento para resolver um problema matemático em um número finito de passos que freqüentemente envolve a repetição de uma operação; ou de forma mais abrangente: um procedimento passo-a-passo para resolver um problema ou realizar algum objetivo.” (Manber, 1989:1)


Algoritmo correto é aquele que gera um programa que sempre termina e para qualquer instância de entrada produz uma saída correta. Programar consiste em representar/descrever um algoritmo em alguma linguagem de programação. Isto também é chamado codificação.

Apresentamos no vídeo os conceitos de descrição narrativa, fluxograma e pseudocódigo.

Um pseudocódigo consiste em uma notação que se assemelha a uma linguagem de programação, que possibilita ao programador se concentrar no problema a ser modelado sem “se prender” a uma linguagem de programação específica. Essa notação mistura definições formais sobre dados e estruturas de controle, com informações em estilo livre. O livro adotado nesta série apresenta como passo inicial para o desenvolvimento a geração do pseudocódigo. Nos abstivemos de usá-los nos nossos vídeos (basta ler o livro).

Daí evoluímos para a definição de variável e identificadores.

Finalizamos este vídeo mostrando onde achar informações para instalação do ambiente de desenvolvimento Java que usaremos para criar nossos exemplos. Veja o post sobre a instalação do JDK e baixe o DrJava do site do desenvolvedor (é gratuito e não precisa instalação).

Introdução da Programação de Computadores

A programação de computadores é uma atividade que leva à montagem dos passos necessários à resolução de um problema em linguagem de programação, mediante utilização de algoritmos.

Para dar início ao aprendizado dessa atividade, é importante compreender seu contexto, seu propósito, os conceitos básicos subjacentes, bem como tomar contato com o ferramental necessário a sua realização.

Utilizaremos nesta séria de vídeos o livro Fundamentos da Programação de Computadores. Recomendamos como livros texto:


Estes dois livros fornecem uma boa base téorica e prática de algoritmos.

Nosso objetivo porém é algo ainda mais básico, e por isto adotamos nesta série de posts o livro Fundamentos da Programação de Computadores. Este livro possui 10 capítulos sobre programação básica, ensinando a utilizar as linguagens Pascal e C. Nossos posts como sempre serão em Java e utilizamos os problemas de exemplo sugeridos pelos autores.

sábado, 14 de junho de 2014

Usando grafos em Java - Parte 3

Agora veremos como implementar em Java as duas pesquisas. A seguir mostramos as duas classes que serão implementadas:




Vimos no post anterior a teoria por trás destas duas pesquisas. Vamos ver no vídeo agora como implementá-las.

Implementando árvore binária - parte 3

Vamos acrescentar a nossa classe algumas outras funções úteis. Como vimos no primeiro vídeo (de teoria) existem 3 formas mais comuns de caminhamento na árvore binária. Vamos implementá-las neste vídeo. Na verdade, já realizamos um caminhamento LNR.

Vamos buscar também o menor e o maior valor armazenado na árvore. Veremos que isto pode ser obtido por uma pesquisa simples.

Para isto vamos alterar nossa classe Arvore para que ela tenha os seguintes métodos:
Veja no vídeo como as alterações são feitas.

Implementando árvore binária - parte 2

Neste post terminaremos nossa classe de árvore binária.O diagrama de classe que teremos está indicado abaixo:

Vemos que na classe de Arvore somente precisamos armazenar a raiz da árvore. As demais ligações são obtidas a partir dos atributos Esq e Dir em No. No vídeo veremos como implementar

  • pesquisar(): que verificar se existe na árvore um nó com um determinado valor, retornando o nó se este existir ou nulo se não existir
  • balancear(): como nosso procedimento de inserção não insere os valores de forma balanceada, temos que criar um procedimento que faz o balanceamento da árvore (reduz a altura da árvore ao mínimo)
  • toString(): gera a árvore como uma string para que possamos apresentar o conteúdo dela
  • altura(): que retorna a altura da árvore.



Se vocês analizarem o método de balanceamento, irão ver que existe um problema. O que acontece se existem elementos repetidos na árvore?

domingo, 8 de junho de 2014

Implementando árvore binária - parte 1

Neste post iremos mostrar como implementar em Java uma árvore binária. Utilizaremos Generics assim é possível tornar a nossa árvore capaz de suportar qualquer classe de dados. Se você quiser ver um pouco da teoria de árvore, dê uma olhada em Usando árvores binárias em Java.


sábado, 7 de junho de 2014

Usando árvores binárias em Java

Você vai me peguntar: por que é que eu preciso conhecer como implementar uma árvore binária em Java? Afinal a API do Java já possui duas classes bastante úteis que são TreeSet e TreeMap. As operações em TreeSet são O( log(n) ) - o que é muito bom.

A resposta é por que a árvore binária é uma estrutura clássica e a menos que você queira ser somente um daqueles usuários que não sabe o que está fazendo e como programador você não pode se dar ao luxo de ser somente um usuário. No vídeo a seguir veremos uma introdução às árvores binárias.



domingo, 27 de abril de 2014

Usando grafos em Java - Parte 2

Continuando nossos estudos em Java sobre Grafos, vamos ver agora como fazer pesquisas em grafos usando nossa classe Java. Neste post veremos um vídeo com introdução a duas pesquisas em grafos: pesquisa em largura e pesquisa em profundidade.

Na primeira busca  a gente começa pelo vértice raiz e explora todos os vértices vizinhos. Então, para cada um desses vértices mais próximos, exploramos os seus vértices vizinhos inexplorados e assim por diante, até que ele encontre o alvo da busca.

Já na segunda busca (em profundidade), como o próprio nome indica, a gente começa num nó raiz (da mesma forma que na busca em largura), só que agora a gente explora tanto quanto possível cada um dos seus ramos, antes de retroceder. Isto é, a gente seleciona um dos filhos da raiz e daí um de seus filhos e assim por diante até chegar em um nó final (que não tem filhos). Só aí a gente, retrocede para continuar a busca.


Pesquisas em grafos


Desenhando Fractais

Neste post vamos ver como utilizar a classe Graphics para desenhar figuras fractais usando Java. Utilizamos como base a classe de fractais apresentada no livro de Deitel. Se você está começando vale a pena ler este livro. Ele é bastante completo. O texto é fácil de ler, apesar de que eu acho o layout meio bagunçado. Neste post vamos ver uma variação do que é apresentado no livro do Deitel.

Para entender como a classe gera o fractal sugiro ler o livro do Deitel. Não entrarei nestes detalhes aqui. A explicação do livro é bastante elaborada. Se alguém ainda tiver uma dúvida, poste no comentário que eu tentarei explicar com mais detalhes.

Para entender como as coisas (pontos, retas, círculos etc) são desenhadas na tela, é importante entender como funcionam as coordenadas da tela. A origem é no canto superior esquerdo da tela. O eixo x (horizontal) começa na esquerda e cresce em direção a direita. O eixo y (vertical) começa de cima e cresce para baixo. A figura abaixo mostra melhor como identificar um ponto na tela.

Para desenhar um ponto, precisamos somente de 3 coisas (três ?): os valores de x e y e a cor do ponto.
Para desenhar uma reta precisamos de informação para posicionar 2 pontos e da cor.
O Java as coordenadas são colocadas nesta mesma ordem: primeiro a largura (eixo horizontal x ou width em inglês), depois a altura (eixo vertical y ou height em inglês).

Para podermos desenhar precisamos ter acesso à classe Graphics. Como vamos fazer isto? Simples, os componentes GUI normalmente possuem um método public void paintComponent( Graphics g ). Qual é o parâmetro do método? Isto mesmo, é Graphics. Desta forma poderemos usar g para desenhar uma reta por exemplo com g.drawLine(x1, y1, x2, y2).

Se você olhar na documentação do Java não verá um método denominado ponto ou círculo, tipo um drawPoint. Para desenhar um ponto, use drawLine com x1=x2 e y1=y2. Para desenhar um círculo, use drawOval com width=height.

Os métodos drawXXXX desenham somente o contorno. Para preencher o interior é necessário usar fillXXXX. Por exemplo drawOval(20,30,10,10) desenha uma circunferência no ponto x=20, y=30 e com raio igual a 10. É só aquela linha do contorno. Para ter um círculo, você deve usar fillOval(20,30,10,10).

No início eu falei da cor, mas vocês já devem ter visto que não faz parte dos parâmetros de desenho. A classe Graphics possui setColor(cor) que determinar a cor corrente. Por exemplo, se queremos desenhar 2 círculos, um verde e outro azul temos que fazer:

g.setColor(Color.GREEN)
g.drawOval(20,30,10,10)
g.setColor(Color.BLUE)
g.drawOval(30,30,10,10)

Vamos ao vídeo

Splay Trees - a classe

Vimos em um post anterior como são formadas as árvores splay. Neste agora vamos ver como construir a classe que gera o splay:

Vamos ver o que acontece se criamos mais alguns nós. Veja como a altura da árvore cresce.


Vamos agora somente fazer uma pesquisa. Vamos procurar o valor "3" (que no nosso caso está na chave 3).

Note como a árvore é reestruturada pela pesquisa.


Splay Trees

Uma árvore splay é uma árvore de busca binária auto-ajustável de tal forma que os elementos acessados ​​mais recentemente, serão mais rapidamente acessados em seguida em função um rearranjo da estrutura da árvore.

Podemos executar sobre os elementos da árvore splay as seguinte operações básicas: inserção, pesquisa e remoção em tempo amortizado de O (log n).

A árvore splay foi inventado por Daniel Domingos Sleator e Robert Endre Tarjan em 1985.


Uma introdução teórica sobre as árvores Splay


No próximo post veremos a classe que implementa

domingo, 26 de janeiro de 2014

Usando Grafos em Java

Este post na verdade é composto por diversos vídeos em função da complexidade do assunto. Vamos tratar basicamente em como criar uma classe genérica capaz de armazenar o grafo e realizar buscas.

As partes são:
  1. introdução aos grafos e criação da estrutura básica para a classe de Grafos
  2. codificação e teste da classe de grafos
  3. geração de um grafo usando Graphviz
Introdução aos Grafos - Parte 1 / 3

Introdução aos Grafos - Parte 2 / 3

Introdução aos Grafos - Parte 3 / 3

Visualizando graficamente um grafo


quinta-feira, 2 de janeiro de 2014

Usando Sockets para criar comunicação em Java - Parte 3 de 3

Continuando nosso post anterior, apresentamos o último de nossa série de 3 posts sobre sockets. Mostramos anteriormente uma aplicação cliente/servidor usando TCP e neste post apresentaremos uma aplicação com UDP.

quarta-feira, 1 de janeiro de 2014

Usando canvas (ou java.awt.Graphics) - Parte 5

Agora temos uma base para brincar um pouquinho. Vamos aproveitar e conhecer algumas outras classes em java.awt.geom. Estas classes permitem gerar diversas figuras geométricas. Notem que sempre existe uma classe abstrata que possui factories denominadas .Double e .Float que geram o que desejamos:
  • Arc2D: cria um arco
    • Arc2D.Double
    • Arc2D.Float
  • CubicCurve2D: cria uma curva
    • CubicCurve2D.Double
    • CubicCurve2D.Float
  • Ellipse2D: cria uma elipse (se os raios forem diferentes) ou um círculo se os raios forem iguais
    • Ellipse2D.Double
    • Ellipse2D.Float
  • Line2D: cria uma linha
    • Line2D.Double
    • Line2D.Float
  • Path2D: define um caminho geométrico dado pelas coordenadas
    • Path2D.Double
    • Path2D.Float
  • Point2D: cria um ponto (x,y)
    • Point2D.Double
    • Point2D.Float
  • QuadCurve2D: cria uma curva paramétrica quadrática
    • QuadCurve2D.Double
    • QuadCurve2D.Float
  • Rectangle2D: cria um retângulo
    • Rectangle2D.Double
    • Rectangle2D.Float
  • RoundRectangle2D: cria um retângulo com bordas arredondadas
    • RoundRectangle2D.Double
    • RoundRectangle2D.Float
Assim para criar uma linha, você não pode utilizar Line2D. Deve utilizar Line2D.Double ou Line2D.Float. Vamos ver isto no post. Como vídeo é um pouco grande, o post foi dividido em duas partes, a primeira mostra todo a criação de um desenho de um carrinho (daqueles de pré-primário) e o segundo mostra como animar (isto é, fazer com que o carro ande na janela) e como colocar uma imagem na tela e também usar o mesmo recurso de animação.