• Nenhum resultado encontrado

AULA 5

N/A
N/A
Protected

Academic year: 2022

Share "AULA 5"

Copied!
28
0
0

Texto

(1)

AULA 5

(2)

Curvas de Hilbert

Niklaus Wirth

Algorithms and Data Structures Prentice Hall, 1986.

(3)

Curvas de Hilbert

As curvas a seguir seguem um certo padrão regular e podem ser desenhadas na tela sobre o controle de um programa.

O objetivo é descobrir o esquema de recursão para construir tais curvas.

Estes padrões serão chamados de H0,H1,H2. . ..

Cada Hi denomina a curva de Hilbert de ordem i, em homenagem a seu inventor, o matemático David Hilbert.

(4)

H

1

(5)

H

2

(6)

H

3

(7)

H

4

(8)

Padrão

As guras mostram que Hi+1 é obtida pela composição de 4 instâncias de Hi de metade do tamanho e com a rotação apropriada, ligadas entre si por meio de 3 linhas de conexão.

Por exemplo:

I H1 é formada por 4 H0 (vazio) conectados por 3 linhas.

I H2 é formada por 4 H1 conectados por 3 linhas

I H3 é formada por 4 H2 conectados por 3 linhas

(9)

H

2

(10)

H

3

(11)

H

4

(12)

Partes da curva

Para ilustrar, denotaremos as quatro possíveis instâncias por A, B, C e D:

I A será o padrão que tem a abertura para direita;

I B será o padrão que tem a abertura para baixo;

I C será o padrão que tem a abertura para esquerda; e

I D será o padrão que tem a abertura para cima.

Representaremos a chamada da função que desenha as interconexões por meio da setas ↑,↓,←,→.

(13)

A

1

e A

2

(14)

B

2

e B

3

(15)

C

2

e C

3

(16)

D

4

(17)

Esquema recursivo

Assim, surge o seguinte esquema recursivo:

Ak : Dk−1 ← Ak−1 ↓ Ak−1 → Bk−1

Bk : Ck−1 ↑ Bk−1 → Bk−1 ↓ Ck−1

Ck : Bk−1 → Ck−1 ↑ Ck−1 ← Dk−1

Dk : Ak−1 ↓ Dk−1 ← Dk−1 ↑ Ck−1

Para desenhar os segmentos utilizaremos a chamada de uma função

linha(x,y,direcao,comprimento)

que move um pincel da posição (x,y) em uma dada direcao por um certo comprimento.

(18)

linha

typedef enum {DIREITA, ESQUERDA, CIMA, BAIXO} Direcao;

void linha (int *x, int *y, Direcao direcao, int comprimento) {

switch (direcao) {

case DIREITA : *x = *x + comprimento;

break;

case ESQUERDA : *x = *x - comprimento;

break;

case CIMA : *y = *y + comprimento;

break;

case BAIXO : *y = *y - comprimento;

break;

}desenhaLinha(*x, *y);

}

(19)

A

k

/** A

void a (int k, int *x, int *y, int comprimento) {*/

if (k > 0) {

d(k-1, x, y, comprimento);

linha (x, y, ESQUERDA, comprimento);

a(k-1, x, y, comprimento);

linha (x, y, BAIXO , comprimento);

a(k-1, x, y, comprimento);

linha (x, y, DIREITA , comprimento);

b(k-1, x, y, comprimento);

} }

(20)

B

k

/** B

void b (int k, int *x, int *y, int comprimento) {*/

if (k > 0) {

c(k-1, x, y, comprimento);

linha (x, y, CIMA , comprimento);

b(k-1, x, y, comprimento);

linha (x, y, DIREITA, comprimento);

b(k-1, x, y, comprimento);

linha (x, y, BAIXO , comprimento);

a(k-1, x, y, comprimento);

} }

(21)

C

k

/** C

void c (int k, int *x, int *y, int comprimento) {*/

if (k > 0) {

b(k-1, x, y, comprimento);

linha (x, y, DIREITA, comprimento);

c(k-1, x, y, comprimento);

linha (x, y, CIMA , comprimento);

c(k-1, x, y, comprimento);

linha (x, y, ESQUERDA, comprimento);

d(k-1, x, y, comprimento);

} }

(22)

D

k

/** D

void d (int k, int *x, int *y, int comprimento) {*/

if (k > 0) {

a(k-1, x, y, comprimento);

linha (x, y, BAIXO , comprimento);

d(k-1, x, y, comprimento);

linha (x, y, ESQUERDA, comprimento);

d(k-1, x, y, comprimento);

linha (x, y, CIMA , comprimento);

c(k-1, x, y, comprimento);

} }

(23)

Registros e Structs

PF Apêndice E

http://www.ime.usp.br/pf/algoritmos/aulas/stru.html

(24)

Registros e structs

Um registro (= record) é uma coleção de várias variáveis, possivelmente de tipos diferentes.

Na linguagem C, registros são conhecidos como structs.

struct { int dia;

int mes;

int ano;

} aniversario ;

dia mes ano aniversario

(25)

Registros e structs

É uma boa idéia dar um nome, digamos data, à estrutura.

Nosso exemplo caria melhor assim

struct data { int dia;

int mes;

int ano;

} ;

dia mes ano aniversario

struct data aniversario;

(26)

Registros e structs

Um declaração de struct dene um tipo.

struct data aniversario;

struct data,casamento;

dia mes ano aniversario

dia mes ano casamento

(27)

Registros e structs

É fácil atribuirmos valores aos campos de uma estrutura:

aniversario.dia = 31;

aniversario.mes = 8;

aniversario.ano = 1998;

aniversario 31 8 1998

(28)

Registros e structs

Para não repetir struct data o tempo todo podemos denir uma abreviatura via typedef:

struct data { int dia;

int mes;

int ano;

} ;typedef struct data Data;

Data aniversario;

Data casamento;

Referências

Documentos relacionados

Objetivo Geral: Contribuir para fortalecer a Política de Extensão da UFU no Município de Patos de Minas por meio da formação e consolidação do processo de gestão de projetos

Lembre-se que o botão de energia deve ser mantido na posição “ON” (ligado); caso contrário, o no-break será desativado e seu equipamento não estará protegido durante uma

Tomando como base as 20 incubadoras de maior destaque nacional, identifica-se na Tabela 1 que do total de empresas incubadas e já graduadas por intermédio destas empresas, 20%

Assumindo a estrutura Ponto2d vista em aula, a estrutura para o segmento de reta seria a seguinte:.. typedef

Neste momento você poderá ter uma informação de BEAM diferente da instalação do terminal e por isso você deverá clicar no botão SOBRESCREVER BEAM para seguir com o procedimento

Este manual de instalação e funcionamento contém diversas indicações de segurança para evitar danos materiais e pessoais: ▪ As indicações de segurança relativas a danos

Sempre que a tarefa a ser executada envolver mais de um ponto de trabalho em altura e houver a necessidade do trabalhador subir e descer de um ponto para outro, deve-

STOT - exposição única: AVALIAÇÃO: Com base nos dados disponíveis, a toxicidade para órgãos-alvo específicos não é esperada após a exposição única por via oral, inalação