29 de nov. de 2008

Árvore binária sem recursividade, pós-ordem / postorder / pós-fixada / EDR

O algorítmo era trabalho de aula, passei pelo menos duas tardes quebrando a cabeça pra tentar desvendar este mistério: como fazer uma árvore binária EDR (Esquerda-Direita-Raíz), ou seja, imprimir na tela os elementos da esquerda, depois os da direita, e então a raíz.

Uma forma "mágica" de fazer isso é modificando a estrutura da árvore, que ganha uma propriedade booleana "visitada", quando setada como false (padrão), significa que esse nodo ainda não foi visitado na busca, quando ela estiver setada como true, verdadeira, é porque já foi visitada, e por isso o iterador não necessita percorrer novamente esta ramo da árvore, isso evita redundância e loops infinitos, tornando o processo dinâmico.

Realmente recomendo você fazer o algorítmo, é um ótimo exercício pra desenvolver o raciocínio e testa suas habilidades, mas caso não consiga segue abaixo o código.

#include<stdio.h>
#include<stdlib.h>

struct arvore
{
int info;
arvore *dir;
arvore *esq;
bool visitado; // a magia do negócio, evita que um nodo seja lido redundantemente e entre em loop infinito
};

arvore *raiz = NULL;

struct pilha //estrutura da pilha
{
arvore *elto ; // ponteiro para elemento do tipo arvore
pilha *prox;
pilha *ant;
};
pilha *topo=NULL, *base=NULL;

arvore *aloca(int valor)
{
arvore *tmp;
tmp = (arvore *) malloc(sizeof(arvore));
tmp->info = valor;
tmp->esq = NULL;
tmp->dir = NULL;
tmp->visitado = false;
return tmp;
}
pilha *alocapilha(arvore *elto)
{
pilha *tmp;
tmp = (pilha *) malloc(sizeof(pilha));
tmp->elto = elto;
tmp->ant = NULL;
tmp->prox = NULL;
return tmp;
}

void insere(int valor)
{
arvore *atual = raiz, *folha = NULL;
if(raiz == NULL)
{
raiz = aloca(valor);
return;
}
/// inicio / inserir na folha
while(atual)
{
folha = atual; /// salva a raiz/nodo anterior
if(valor < atual->info)
{
atual = atual->esq;
}
else
{
atual = atual->dir;
}
}
if(valor < folha->info)
{
folha->esq = aloca(valor);
}
else
{
folha->dir = aloca(valor);
}

}

//retira o topo da pilha
void pop()
{
pilha *tmp;
tmp = topo;
if(topo->elto == raiz)
{
raiz = NULL;
}
else
{
topo = topo->ant;
topo->prox = NULL;
free(tmp);
}
}

void push(arvore *elto)
{
/// aloca na pilha um elemtno pilha q contem ponteiro do elemento da arvore
pilha *tmp = alocapilha(elto);
if (base == NULL)
{
base = topo = tmp;
}
else
{
tmp->ant = topo;
topo->prox = tmp;
topo = tmp;
}
}

void EDR()
{
printf("\nEntrou na funcao");
// r é a variável temporária, troca valores pra fazer as operações
arvore *r = raiz;
while(raiz)
{
/// empilha todos os elementos da esquerda de todas as folhas e raiz
while(r != NULL && r->visitado != true)
{
if(r != NULL)
{
push(r);
}
r = r->esq;
}
r = topo->elto;
while(r->dir == NULL)
{
printf("\n\t-[DESEMPILHOU] %d", topo->elto->info);
topo->elto->visitado = true;
pop();
r = topo->elto;
}
if(r->dir != NULL && r->dir->visitado == false)
{
topo->elto->visitado = true;
r = r->dir;
}
else
{
printf("\n\t-[DESEMPILHOU] %d", topo->elto->info);
pop();
r = topo->elto;
topo->elto->visitado = true;
}
}
}
/*############## RECURSIVA*/

void EDRr(arvore *atual)
{
if(atual != NULL)
{
EDRr(atual->esq);
EDRr(atual->dir);
printf("\n%d", atual->info);
}
}/**/

int main()
{
insere(50);
insere(2);
insere(1);
insere(23);
insere(21);
insere(54);
insere(12);
insere(53);
insere(55);
EDR();
//EDRr(raiz);
system("PAUSE");
}

28 de nov. de 2008

Utilizando a variável global $_GET e $_POST

Quando comecei a programar em PHP, sempre quis saber porque algumas páginas apresentavam uma formatação estranha nos endereços do tipo http://www.sitetal.com/index.php?pagina=4&acao=postar.

Foi difícil achar mas encontrei na época, e por isso hoje vou postar aqui como isso funciona.

Se você já utiliza o $_POST sabe que você deve usá-lo para receber os dados do seu formulário de envio de dados. Sempre se usa POST em formulários porque os dados passam de maneira "escondida" através de headers, de forma que não há como se acessar esses dados, a não ser pela página que os recebe.

O $_GET é totalmente diferente, na verdade é exatamente o inverso, ele ao invés de pegar os dados enviados pelo header da página, pega tudo aquilo que for enviado pela url do seu site. Como no exemplo mostrado no início.

Por definição, $_POST e $_GET são consideradas variáveis SUPERGLOBAIS, ou seja, acessíveis em todo o escopo da seu código.

Vou fazer o exemplo dos dois para mostrar um comparativo.

No caso do método POST:

<form name="meuform" method="post" action="recebe.php">

<input type="text" name="meutexto">
<input type="submit" value="Enviar">

</form>

Temos o nosso formulário, salve-o como "form.php". Agora vejamos como fica o nosso arquivo "recebe.php" que irá receber os dados.

<?
///A variável global recebe os dados do header
$meutexto = $_POST['meutexto'];

echo $meutexto;
?>

Depois de salva, teste sua página, acesse a página "recebe.php" no seu browser, digitando http://localhost/getpost/form.php.

No seu formulário digite qualquer coisa no campo e clique em enviar. Se você fez tudo certo, deverá estar aparecendo no seu browser aquilo que você escreveu na caixa de texto.

E agora veremos como GET funciona, pra explicar é mais simples.

Crie um novo arquivo PHP, chame ele de "get.php" e digite código abaixo:

<?
$meuget = $_GET['nome'];
/*
O cifrão é o prefixo de todas as variáveis do php
neste caso atribuímos a variável recebida através da url para a variável $meuget.
Diferente das linguagens compiladas, o PHP sendo uma linguagem interpretada, não necessita de declaração de variáveis. Ou seja, para criar uma variável basta atribuir um valor.
*/

echo "Dado recebido através da url:". $meuget;
echo "<BR>*Dado recebido através da url: $meuget";
/*
echo é o comando do php que faz com que o texto seja impresso na tela.
Tudo que for string ou caractére simples, leia-se texto simples, vai entre aspas.

O ponto que está antes do $meuget serve de concatenação, ou seja, ele faz a ligação entre os dois lados, entenda o ponto de concatenação como o "+" para unir dois textos.

Abaixo tem outra forma de imprimir o valor de uma variável, ela é inserida dentro das aspas, o PHP interpreta as 2 strings da mesma forma. O método com concatenação é uma prática melhor pois facilita a leitura do código e deixando-o mais organizado.
*/

echo "<BR>Dado recebido através da url:". $_GET['nome'];
/*
Acima está outra forma de impressão, que é pegando diretamento o valor que está na url sem passar para uma variável
*/

?>

Agora no seu browser digite o caminho da página, se você seguiu o tutorial é http://localhost/getpost/get.php. A sua página será carregada mas não irá aparecer nada.

Agora, na caixa de endereço do browser acrescente ao final o código entre aspas "?nome=ornitorrinco" e pressione enter. O endereço deve ficar assim "http://localhost/getpost/get.php?nome=ornitorrinco".

Ao carregar a página deve aparecer a palavra que você escreveu depois do "=" (igual, símbolo de atribuição).

Digite o que você quiser ali e carregue a página, que a palavra irá aparecer.

Qual a utilidade dos dois?

$_GET serve para tornar uma página mais navegável, de forma que o usuário possa guardar o endereço e retornar à página com as variáveis ou dados já carregados.
Ex: www.site.com.br/index.php?secao=eletronicos&preco=barato

$_POST serve para enviar dados onde você não quer que o visitante da página, ou mesmo intrusos, tenham acesso. Por isso geralmente se usa o POST para enviar os dados de forma segura, para que o conteúdo não possa ser interceptado.

Caso o tutorial não tenha funcionado, poste o erro que ocorreu.

21 de nov. de 2008

Quem disse que configurar o PHP é difícil? Era...

Em tempos onde a computação e a automatização têm crescido de forma exponencial, seria triste, pra não dizer cômico, não haver uma forma simples e rápida para se configurar um servidor PHP. Mas felizmente há!

Apresento-lhes o Vertrigo. Existem outros mas este é o que eu atualmente uso. Realmente uma ferramenta muito boa, não só configura o servidor PHP no seu PC, como também oferece opções de configuração do php.ini através de uma interface gráfica amigável (arquivo de configurações do seu servidor), dessa forma você pode simular condições de configuração diferentes de forma muito rápida sem a necessidade de ficar editando arquivos de texto.

Site oficial: http://vertrigo.sourceforge.net/?lang=br
Download: http://prdownloads.sourceforge.net/vertrigo/Vertrigo_221.exe?download

O pacote inclui:

  • Apache (servidor web HTTP)
  • PHP (linguagem de programaçăo interpretada)
  • MySQL (multi-usuário, Sistema Gerenciador de Base de dados SQL)
  • SQLite (sistema gerenciador de base de dados relacional ACID-compliant)
  • SQLiteManager (ferramenta web multi-linguagem para gerenciar base de dados SQLite)
  • PhpMyAdmin (ferramenta escrita em PHP que objetiva manusear a administração do MySQL)
  • Zend Optimizer (qual aumenta o desempenho do runtime até 40% ) para plataforma Windows.

Os ítens críticos que um usuário básico irá realmente usar são o Apache, o PHP, MySQL e o PhpMyAdmin. Baixe o pacote, instale e você terá uma forma de simular o ambiente web no seu PC!

Existem outras alternativas ao vertrigo, como o xampp, que também é muito utilizado.

18 de nov. de 2008

Dica do mês

Essa é praqueles que tem problemas pra achar o melhor esquema de cores pra fazer o site. Então regozijai webdesigners de toda a terra, eis que para vos auxiliar existe o beta.dailycolorscheme.com

No site você encontrará esquemas de cores que melhoram o acabamento e o visual do site, com cores que realmente combinam. Inclusive o site oferece a possibilidade de você baixar o esquema de cores que você quiser pra usar nos swatches do Photoshop, Illustrator e Topstyle.

Outro site interessante da categoria, é o www.colorhunter.com 

Você pode enviar fotos ao site, fazendo o upload da foto, que ele então irá gerar uma palheta com as cores do cenário. O site também permite que você escolha ou digite o código de uma cor para o site buscar por cores que combinem com essa.

Ambos os sites são uma mão na roda.

17 de nov. de 2008

Como centralizar div's com css?

Bom, primeiramente lembre-se que a tag div tem o comportamento de bloco. Vale ressaltar que quando você usa "float" na sua div, ela irá ignorar o alinhamento.

<html>
<head>
<title>Meu Css</title>
<style type="text/css">
<!--
.teste{
width:500px;
height:500px;
margin:0 auto;
background-color:#0000FF;
}
-->
</style>
</head>
<body>
<div class="teste">
</div>
</body>
</html>

EX:
Slave o exemplo acima, pode ser no bloco de notas mesmo ou no seu editor de html de escolha. Salve como ".html" ou ".htm".
Abra ele com seu navegador e veja o resultado.

Um bloco azul, centralizado na tela.
Agora vamos para algo mais emocionante.
Substitua todo o código do arquivo que você salvou, por esse:

<html>
<head>
<title>Meu Css</title>
<style type="text/css">
<!--
.teste{
width:500px;
height:500px;
margin:0 auto;
background-color:#0000FF;
}
.teste2{
width:100px;
height:100px;
float:left;
background-color:#000000;
}
-->
</style>
</head>
<body>
<div class="teste">
<div class="teste2"> </div>
</div>
</body>
</html>



Veja o resultado, agora estamos usando algo novo, o atributo "float". Em inglês isso quer dizer flutuar, tais elementos ficam flutuando na tela, e se alojam onde encaixam, é quase como brincar de dominó, coloque as peças que e vá encaixando como dá.

Podemos ver nesse tutorial que não podemos ter uma div com float centralizada na tela, mas podemos ter um elemento float dentro de uma div não float.

Isso é CSS, Cascade Styling Sheet, estilos em cascata, ou seja, os elementos "filho" são submissos aos elementos "pai", ou seja, o "filho" sempre estará onde o seu "pai" estiver, e nisso constitui o elemento fundamental da linguagem de estilos.