terça-feira, 2 de agosto de 2011

Laços


Ao longo deste blog, que já deve contar com mais de 10 artigos, falei algumas vezes sobre laços de repetição. Mas que diabos seria isto? Pense num laço, em questões de montaria. O cavaleiro faz um laço de corda para envolver qualquer que seja o objeto mirado, ou seja, figurativamente, uma prisão, armadilha ou cativeiro. Em programação, temos mais ou menos esta ideia para laços. Um local onde o código fica aprisionado, rodando dependentemente de alguma condição imposta. Por repetição se entende que o código delimitado será executado tantas vezes quanto forem definidas. Ou seja, ele ficará lá repetindo até chegar a uma condição estabelecida.
Temos três maneiras formais de se delimitar laços de repetição. Existem outras, que falarei ao final deste artigo, mas não são consideradas verdadeiros laços de repetição, e sim, estruturas de dados que simulam este artifício. O primeiro e mais elementar, é o laço Enquanto. Ele simplesmente conta com uma condição que, ao ser respeitada, os comandos que estão dentro do bloco serão executados. Quando a condição não for respeitada, passa-se o laço e a execução vai diretamente para a linha posterior ao fechamento do bloco, deixando o laço para trás. É bem útil, mas geralmente exige mais que uma linha de código no bloco. Vamos fazer um exercício que perdure para todos os comandos deste artigo: calcular o Fatorial de um número. Utilizarei as linguagens Java e VB.Net, apenas para notar as diferenças entre elas.
public static double Fatorial(int n){
 int c = n;
 while(c>1){
  c--;
  n *= c;
 }
 return n;
}
Public Function Fatorial(ByVal n As Integer) As Double
 Dim c = n 'não precisamos definir o tipo, quando já igualamos a outra variável.
 While c > 1
  c = c - 1
  n = n * c
 End While
 Return n
End Function
Bem simples, não é? Declara uma variável "c" que é igual ao número informado. Enquanto c for maior que 1 (ao se multiplicar por 0, o resultado se anula), c é diminuído em 1 e o n pega o valor do resultado dele mesmo multiplicado por c (x *= y significa x = x * y). Perceba que o retorno não se repete junto com o laço, pois está fora do escopo (parte do código que está dentro de um bloco delimitado por chaves, que não pode ser acessado por outras partes do código). Um bug notável neste código (bug = defeito, falha, erro) aparece quando o número fornecido for 0. O resultado retornado é 0. Sabemos que nenhum fatorial dá 0, porque zero não tem número natural antes de si mesmo, portanto, o fatorial de 0 é 1, pois nenhum número multiplicado por outro dá 1, a não ser ele mesmo. Uma solução seria colocar uma condição, como:
if(n == 0) return 1;
//lembrando que não precisamos abrir o bloco de chaves quando só há uma instrução. Isto serve também para laços.
Outra forma, bem semelhante, mas sutilmente diferente no conceito é o laço Faça - Enquanto:
public static double Fatorial(int n){
 if(n == 0) return 1; //debugador
 int c = n;
 do{
  c--;
  n *= c;
 }while(c>1)
 return n;
}
Public Function Fatorial(ByVal n As Integer) As Double
 If n = 0 Then
  Return 1
 End If 'sim, temos que abrir e fechar o bloco em VB.Net :(
 Dim c = n
 Do
  c = c - 1
  n = n * c
 While n > 1
 Return n
End Function
Este laço tem a diferença de que, a verificação, ao invés de ser feita na volta do código, é feita no final, podendo representar uma melhoria (embora não significativa) na performance, sem ter que contar com o desvio para a volta do laço.
Existe mais um tipo de laço que consegue reunir muitas características dos outros dois, além de ser mais funcional e contar com um inicializador, uma comparação e um incrementador próprio. É o laço For:
public static double Fatorial(int n){
 if(n == 0) return 1; //debugador
 for(int c = n;c>1;c--) //sem abrir bloco, pois só há uma instrução
  n *= c;
 return n;
}
Public Function Fatorial(ByVal n As Integer) As Double
 If n = 0 Then
  Return 1
 End If 'sim, temos que abrir e fechar o bloco em VB.Net :(
 For c = n To 2 Step -1
  n = n * c
 Next
 Return n
End Function
Este laço é praticamente uma função inteira dentro de outra. Conta com um escopo de declaração de variável, sendo que a variável declarada dentro dele (int c = n) só pode ser usada DENTRO DELE. Se for tentar usar o c fora do laço, vai dar erro de compilação, pois o c simplesmente não vai existir. A comparação é igual a do while em Java, mas em VB, há a diferença de que o For é um contador, e não um comparador. Você declara uma variável e ele vai incrementando ou decrementando até (To) o valor especificado. Para definir se queremos incrementar ou decrementar a variável, colocamos o passo, que no Java é representado pelo "c--" (pode ser c++ [sendo assim, podendo ser ocultado] ou então c+=2, qualquer numero para incrementar / decrementar) e no VB é representado pelo Step (que pode ser positivo ou negativo. Quando queremos Step 1, podemos ocultar o Step que o VB reconhece automaticamente o passo 1).
Temos duas formas de fazer algo parecido com os laços de repetição, embora não sejam reais laços. Temos o desvio incondicional e uma verdadeira obra-prima da programação, a recursão, que nada mais é do que um aproveitamento de regras matemáticas.
Primeiramente com o Desvio Incondicional (não existe em Java):
Public Function FatorialDI(ByVal n As Integer) As Double
 If n = 0 Then
  Return 1
 End If 'sim, temos que abrir e fechar o bloco em VB.Net :(
 c = n
 inicio:
  n = n * c
  c = c - 1
 If(c > 2) GoTo inicio
 Return n
End Function
O grande truque é o GoTo, que existe em C, C++, C#, VB, e em muitas outras linguagens, mas não em Java :(
Ele define um rótulo (neste caso, "inicio", mas poderia ser qualquer palavra) que pode ser acessado por meio da palavra-chave GoTo, ou seja, desviando o fluxo natural do código para onde o programador quiser, quando ele quiser, ou seja, incondicionalmente. Pode-se acrescentar uma condição como foi feita neste trecho, mas o comando GoTo realmente, não possui condição, assim como os laços de repetição.
Agora, a chave de ouro para este artigo. A recursão utiliza uma regra matemática um tanto confusa para quem observa de primeira, mas muito útil e economiza várias linhas de código, apesar de forçar o trabalho mental do programador. Esta regra utiliza a chamada de uma função dentro dela mesma, ou seja, o resultado retornado pela função é usada dentro dela mesma, gerando uma pseudo-repetição que, se não for propriamente controlada, pode durar infinitamente. A recursão não utiliza nenhuma palavra-chave nova, apenas é um conceito utilizado por programadores muito seguros no que fazem. Mas bem útil.
public static double FatorialR(int n){
 if(n <= 1) return 1; //debugador
 return n * FatorialR(n--);
}
Public Function FatorialR(ByVal n As Integer) As Double
 If n <= 1 Then
  Return 1
 End If 'sim, temos que abrir e fechar o bloco em VB.Net :(
 Return n * FatorialR(n-1)
End Function
Para entender este código, leva um tempinho. Primeiramente, mudei o debugador para se adequar às condições da recursão. Agora, se n for menor ou igual a 1 (ou 0 ou 1) vai retornar 1. Se passar desta condição, ele retorna o valor de n multiplicado pelo retorno da própria função com argumento de n menos um! Ou seja, o n vai ser cada vez menor, até bater de frente com o debugador, que vai retornar 1. Simplificando, o return iria ficar assim: return n * n-1 * n-2 * n-3 ... * 1 Justamente porque ele percorre a função e encontra sua própria chamada, aí tem que executar a função de novo, até encontrar uma condição que faça a repetição parar, para não cair em looping infinito! Como eu falei, bem confusa, mas bem útil. Viram como o código fica mais enxuto, com menos linhas? Apenas duas linhas na função inteira em Java e quatro em VB! Agora você pensa que não dá pra diminuir mais ainda as linhas? Dá pra fazer ficar com apenas UMA linha em ambas as linguagens:
public static double FatorialR(int n){
 return (n <= 1) ? 1 : n * FatorialR(n--);
}
Public Function FatorialR(ByVal n As Integer) As Double
 Return IIf(n <= 1, 1, n * FatorialR(n-1));
End Function
Este é o chamado operador ternário (em Java) que faz uma pergunta (valor_booleano ?) e retorna o primeiro argumento se o valor for verdadeiro ou o segundo se for falso. Sintaxe:

(<expressao_booleano> ? <valor_verdadeiro> : <valor_falso>)

Em VB, há uma função que faz essa decisão por nós, que tem uma sintaxe parecida e retorna ou o valor verdadeiro ou o valor falso, a IIf:

IIf(<expressao_booleano>, <valor_verdadeiro>, <valor_falso>)

Bem, é isso, gente. Acabei escrevendo bem mais do que eu planejava. Até a próxima!

sexta-feira, 29 de abril de 2011

DHTML

Dynamic HyperText Markup Language... Uma coisa muito interessante no mundo atual da programação Web. É desse jeito que são feitos os sites bonitos, funcionais, interativos e, ao mesmo tempo, simples e leves!
Primeiramente, à definição. DHTML é, nada mais, nada menos, que a mistura das 3 principais linguagens que hoje em dia são utilizadas na Web: HTML, CSS (Estilo) e JavaScript! Um exemplo simples e praticíssimo, apenas para deixar com água na boca:

Arraste-me!

Agora você pode arrastar esta janelinha para onde quiser nesta página, assim como minimiza-la e maximiza-la ao seu interesse. Tudo isto é feito baseado na tecnologia DHTML.
Para utilizá-la, não é preciso grandes conhecimentos em HTML nem em estruturação de WebSites, mas precisa-se ter um grande conhecimento em JavaScript (porque é o principal elo entre as três linguagens) e, para ficar mais visualmente atraente, alguns conhecimentos de Estilo/CSS.
Para começar, listarei aqui algumas das muitas capacidades do DHTML:
  • Deixar elementos invisíveis ao toque de um botão;
  • Personalizar o texto explicativo ao deixar o mouse sobre um elemento;
  • Alterar a cor de fontes, backgrounds, assim como as configurações de uma imagem (filtros);
  • Fazer efeitos visuais leves (sem Flash), iterativos (com repetição) e interativos (o usuário pode interferir).
  • Entre muitos outros!
Então vamos parar de falação e vamos aos códigos.
Para manipular tudo por código e deixar até a estrutura HTML mais programável, usamos o Javascript. Pode-se usar Javascript pra QUASE tudo, uma vez que podemos estruturar todo o HTML e CSS dentro do código JavaScript. Apenas para questões de compilação e interpretação do navegador, temos que colocar as tags <html/> e <head/>. A partir daí, se quisermos, podemos abusar do Javascript. Então, vamos lá:
<html>
<head>
</head>
<body id="body"> <!--tem que definir 'id' para acesso posterior-->
<script type="text/javascript">
document.getElementById("body").innerHTML = "<div id='div1' style='text-align:center;height:100px;background-color:#AACCFF'/>";
//acrescenta à tag <body> uma <div> com 100px de altura e fundo azul-celeste.
document.getElementById("div1").innerHTML = "<span id='span1' style='background-color:#bb00bb;font-family:Comic Sans MS;color:#ffffff'>Olá, Mundo!</span>";
//acrescenta à tag <div> criada pelo JavaScript um painel <span> com fundo púrpura, fonte Comic Sans MS e cor da fonte branca, já com o texto predefinido "Olá, Mundo!".
document.getElementById("div1").innerHTML +="<br/><br/><input type='text' id='input1' onblur='document.getElementById(\"span1\").innerHTML=this.value;'/>"
//aqui está o segredo! Criamos um <input> do tipo texto que, ao ser desfocado (blur - ou seja, quando perder o foco de digitação) ele chama novamente um comando JavaScript (mesmo dentro do próprio comando JavaScript) para delegar o texto inserido na <input> no <span>.
</script>
</body>
</html>
Não esquecer de salvar isto como .html, se não, não roda!
Resultado:
Simples, prático e bastante útil! Abusem e usem do DHTML e as opções que ele tem a oferecer!
Até a próxima :D

quinta-feira, 31 de março de 2011

Binários, Hexa?


Que informática é inteiramente baseada em números já não deve restar dúvida. A informática foi derivada da lógica matemática, e foi por meio dela que houve a possibilidade de se criar máquinas. Mas até que ponto a matemática que conhecemos chega? Será que não há possibilidade de estender nosso conhecimento sobre números, e aplica-los na informática?
SIM! Os seres humanos sempre tentaram usar os números a seu favor, por isso somos chamados de seres racionais. Desde a descoberta do fogo, passando pela primeira invenção do mundo, a roda, até os dias atuais, em que você pode conversar com uma pessoa que mora a 3000 km de você bastando um toque. A tecnologia depende do conhecimento humano, o conhecimento humano depende da lógica e a lógica depende da matemática. Mas a matemática não se faz apenas dos números que nós, estudantes, conhecemos. Muitas vezes temos que ir além.
O sistema de classificação de capacidade física e lógica na informática é baseado na potência de 2. Existem bits, bytes, kilobytes, megabytes, gibabytes, terabytes... Cada um desses tem uma correlação com o nível anterior, que geralmente vai na ordem de 1024, menos o byte. O bit é a unidade elementar da informática, é considerado a menor unidade de medida. Oito bits formam um byte, que é o caracter (considera-se caracter qualquer elemento que possa compor um texto, seja ele letra, número ou símbolo, e que esteja presente no código ASCII). A partir daí, 1024 bytes formam um kilobyte, 1024 kilobytes formam um megabyte, 1024 megabytes formam um gigabyte, e assim por diante.
Em 1703, na Alemanha, um matemático chamado Gottfried Leibniz elaborou um artigo científico traduzido como "Explicação da Aritmética Binária", em que se desenvolvia operações e cálculos matemáticos apenas com dois números: 0 e 1. Foi considerado o marco inicial do Sistema Binário moderno, pois, pela primeira vez, questionou-se o sistema já tão utilizado e conhecido de 10 algarismos (0, 1, 2, 3, 4, 5, 6, 7, 8 e 9). No começo é bem difícil calcular de cabeça, por exemplo, a soma de dois números binários, mas, se analisar ao fundo, veremos que se trata de um mesmo padrão utilizado na aritmética decimal. Em decimais, um número com um algarismo chama-se unidade, com dois chama-se dezena, com três chama-se centena, e por aí vai. O número de referência para a quantidade de algarismos que um número tem é sempre a base numérica (neste caso, decimal = 10) elevado à posição do último algarismo. Então, partindo-se do pressuposto que a matemática sempre conta como princípio o número 0, temos:
100 = 1 (unidade);
101 = 10 (dezena);
102 = 100 (centena);
103 = 1000 (milhar)...
No caso dos binários, a base é 2, ou seja, só existem dois algarismos possíveis de se utilizar: 0 e 1. Então, utiliza-se o mesmo padrão de posicionamento:
20 = 1;
21 = 2;
22 = 4;
23 = 8...
(Xy Lê-se: X na base Y. Base é o sistema de numeração que se está utilizando. Binários são na base 2, decimais são na base 10, hexadecimais são na base 16, e assim por diante.)
No sistema de contagem decimal, temos que os algarismos representam quantas unidades, dezenas, centenas, milhares, etc. temos nas respectivas posições, ou seja:
49210 = 400 + 90 + 2 (4 centenas + 9 dezenas + 2 unidades)
Já nos binários, temos apenas duas possibilidades de quantidades: ou uma ou nenhuma. Portanto, fica mais fácil para a máquina decidir qual será o resultado final do número. Observando o método formal de formação dos números, temos que:

49210 = 4.102 + 9.101 + 2.100
11012 = 1.23 + 1.22 + 0.21 + 1.20 = 1310

Como na informática, o byte é composto de 8 bits, o bit pode estar ligado ou desligado, temos a comparação com os binários. Um byte (uma cadeia de bits) é um conjunto de 8 números binários, ou seja, as sequências binárias chegam até 8 posições. Assim sendo, o byte tem a capacidade de 2= 256, portanto, podemos contar de 0 até 255 usando um byte. Percebem que, usando um número relativamente grande, nós só consumimos uma mínima parte da capacidade do computador? É esse o objetivo dos binários: simplificar para amplificar.
Aqui vai um bom e interessante exemplo sobre binários. Um desafio: como contar até 32 em apenas uma mão? Um dedo levantado representa 1, e dedo abaixado representa 0. Perceba como é a formação dos números sequenciais: Clique aqui
Agora, os hexadecimais. Se números com apenas duas possibilidades já foram meio difíceis de entender, imagina o que tem DEZESSEIS possibilidades! Ora, é o mesmo padrão usado. Mas como, se eu só conheço 10 números, de 0 a 9? Há novos números que eu nunca vi? Na verdade não. Até o número 9, utilizamos os números normais, mas a partir do 9, completamos com letras, de A a F, completando 16 elementos. Assim, correlacionando com decimais, A16 = 1010, B16 = 1110, C16 = 1210, D16 = 1310, E16 = 1410, F16 = 1510 (lembrando que a contagem começa do zero). Como a principal unidade de medida do computador chega até 255, então é de se presumir que um conjunto de Fs (o valor máximo com um único algarismo em hexadecimal) dará este valor em decimal. Mas um conjunto de quantos Fs?
Em binários, chegamos ao valor de 256 elevando a base ao número de posições. Podemos fazer ao contrário para descobrir quantos hexadecimais darão 255 em decimal.

16x = 256
16 = x√256
O único número que ao tirar raiz de 256 dá resultado Inteiro é 2, portanto:
162 = 256

Então, um simples FF já resulta em 255, o máximo que um byte pode alcançar. Usamos os hexadecimais para configurações do computador, principalmente para cores. As cores, no computador, possuem uma codificação hexadecimal, e respeitam o padrão dos bytes. Geralmente, um computador possui 256 cores, para seguir o estabelecimento hexadecimal, mas, ao invés de um byte, são usados três. Como se faz isto? Apenas utilizando três pares de hexadecimais, formando seis algarismos, que ajudam a compor as cores baseado na intensidade de cores fundamentais e que formam todas as cores que existem na tela do computador, televisão e qualquer monitor: Vermelho, Verde e Azul (padrão RGB, em inglês). A intensidade varia de 0 (00) a 255 (FF), podendo passar por quaisquer valores entre eles, exemplo: 0A, 9B, 75, BD, CC, etc... O padrão para definir que um número é hexadecimal é colocar uma hash (#) antes do número: #FF0000 (Vermelho), #FFFF00 (Amarelo), #00FFFF (Ciano), #FFAA00 (Laranja), #FFFFFF (Branco - mistura de todas as cores), #000000 (Preto - ausência de cor).
Qualquer dúvida, só comentar! Até a próxima, pessoal!

segunda-feira, 28 de março de 2011

Estilo


Estilo é quando sua página Web é personalizada visualmente. Praticamente é a definição de como a página vai parecer. Logicamente pode ser feito com HTML, mas o estilo tem algumas propriedades a mais, além de poder ser modificado em um arquivo diferente, sem prejudicar o teu código HTML. Basicamente ele trabalha com os objetos presentes na página HTML já existente e modifica sua forma, cor, fonte, alinhamento, etc. Pode ser usado para qualquer elemento da página, inclusive a própria página principal (<body>).
Muitas vezes é chamado também de CSS (Cascading Style Sheet), por contar com os objetos definidos como classes e apenas acrescentando as propriedades, como um bloco aberto e fechado por chaves e definido como fim de linha o ponto-e-vírgula. Agora a pergunta "então isto é uma linguagem de programação?" tem como resposta um não. Linguagem de programação é considerada quando ela pode ser interpretada e compilada, tendo as estruturas principais (laços, condições, etc.), que o CSS não possui. Portanto, ela também não é uma linguagem de marcação, pois não contém tags, nem script. Ela é uma linguagem simplesmente de estilo, pois conta apenas com as classes de objetos e suas propriedades.
Para simplificar, veja o que pode ser feito com a tag HTML <body> :
body {
background-color: #FFFF00;
font-family: Georgia;
}
Esta classe define que todos os elementos dentro da tag <body> terão fonte do tipo Georgia, e que o plano de fundo da página será amarelo (#FFFF00 = yellow). Isto pode ser feito em HTML? Pode. Mas este foi um exemplo apenas, para entendimento da estrutura CSS. Vejamos agora, como faríamos isso para uma entrada de texto:
input[type="text"] {
background-color: #FFFF00;
font-family: Comic Sans MS;
color: #0000FF;
}

Resultado:
Já este efeito não se dá para fazer com HTML puro. Imagine que você queira construir um formulário de cadastro Web, em que haja campos obrigatórios e opcionais. Não seria visualmente melhor marcar os campos obrigatórios com um fundo vermelho claro (#FFFBFB), para o usuário perceber que ali ele tem que colocar algum dado?
Os estilos, assim como o Javascript são embutidos no HTML ou pode vir de uma fonte ou arquivo externo. Temos três formas de declarar o estilo: Externo, em que todas as propriedades estão dentro de um arquivo com a extensão .css, interno, em que se abre uma tag <style> dentro da página HTML, seja no cabeçalho (<head>), seja no corpo da página, e local, em que se declara dentro da própria tag onde se deseja colocar o estilo:

Estilo Externo:
(dentro de um arquivo .css)
input[type="text"] {
background-color: #FFFBFB;
font-family: Georgia;
}
(dentro da página HTML, faz a chamada ao arquivo)
<link href="nome_do_arquivo.css" rel="stylesheet" type="text/css" />
Estilo Interno:
<html>
<head>
<style>
input[type="text"] {
background-color: #FFFBFB;
font-family: Georgia;
}
</style>
</head>
<body>
.
.
.
Estilo Local:
<input type="text" style="background-color:#FFBFBF; font-family:Georgia" />
<!--A tag input não precisa de fechamento, pois ela é apenas uma sentença, e não um bloco. Basta uma barra antes de fechar a tag. Comentários em HTML são feitos usando os dois sinais nos extremos desta frase.-->
Para mais dúvidas sobre estilos, segue o link para um tutorial bem resumido e prático aqui
Por hoje é só... Até a próxima!!! :)

sexta-feira, 25 de março de 2011

HTML


Não é uma linguagem de programação. Não é uma linguagem de scripts. Mas é I-M-P-R-E-S-C-I-N-D-Í-V-E-L para o teu WebSite. Quem faz sites em outros formatos que me perdoem, mas não há maneira mais pura, mais personalizável e que fornece tanto aprendizado quanto este. Aqui dá pra ver o processo de formação de um site, como ele se estrutura e quais são as suas possibilidades. Aqui dá pra extravasar criatividade e criar verdadeiras obras de arte que podem ser vistas, a princípio, por todos que possuem internet!
HTML é um acrônimo para HyperText Markup Language (Linguagem de Marcação de Hypertexto). Mas não acabei de falar que não era linguagem de programação? E não é. HTML é uma linguagem sim, mas de MARCAÇÃO, ou seja, não possui estruturas típicas de linguagens de programação, como laços, condições, etc., muito menos conexão com servidor. Apenas serve para estruturar visual e funcionalmente a página da Web. Agora, se prestaram atenção em meus artigos anteriores sobre Web, perceberão que nem Javascript nem HTML são linguagens de programação, ou seja, a Web não possui linguagens de programação? Sim, possui. PHP é a mais famosa delas, mas falaremos sobre PHP mais pra frente, primeiramente vamos entender a estrutura HTML.
Um HTML puro é fácil de ser reconhecido, principalmente pelo uso das Tags, ou seja, um rótulo, etiqueta, algo para identificar um bloco. Cada bloco deve ser aberto e fechado, mas não com chaves. As próprias tags abrem e fecham o bloco, que é composto por outras tags. Para exemplificar, temos a tag inicial:
<html>

</html>
Essa é a tag que abre e encerra o bloco principal da estrutura. As tags devem seguir uma ordem de abertura e fechamento, um seja, a primeira tag a ser aberta tem que ser fechada por último. Por exemplo, este código não executará de maneira esperada:
<html>
<body>
<font color="red">
<b>Hello World</b>
</html>
</body>
</font>
A tag <html> é fechada antes que a tag <body> e a <font>, portanto, é uma forma incorreta de se estruturar a página. Assim como a tag html abre a página web inteira, temos a tag body, que abre o corpo da página. Tudo escrito antes ou depois da tag body não será mostrado na tela, a não ser que haja algo que chame esta determinada função (como é o caso do Javascript). Usamos tags fora da body para definir configurações do website (assim como o título da página, que aparece na barra superior do navegador), scripts, como Javascript e estilo. Tudo isso colocamos na tag <head>, como segue:
<html>
<head>
<title>
Hello World
</title>
</head>
<body>
Olá, mundo!
</body>
</html>
Esta sim é uma forma correta de se estruturar. As tags foram abertas e fechadas na ordem. Isto resultaria em uma impressão do texto "Olá, mundo" no navegador e, no título, estaria "Hello World".
Como podem ter percebido, no código que foi estruturado errado, as tags possuem propriedades que podem ser definidas manualmente. No caso da tag <font>, há as principais propriedades color, que define a cor da fonte (pode ser definido tanto pelo nome das cores em inglês, quanto pelo código hexadecimal representativo das partes da cor - RGB, ou Red/Green/Blue. Ex.: #000000 produz a cor preta, #ffffff produz a cor branca, #ff0000 produz a cor vermelha, #aaaa00 produz a cor alaranjada, e assim por diante, é só misturar as cores com a devida intensidade), face, que define qual a fonte será utilizada para aquele texto (Arial, Tahoma, Verdana, Comic Sans MS...), que tem que ser colocada entre aspas (únicas ou duplas) e contendo o nome inteiro da fonte (o correto é Comic Sans MS, não apenas Comic Sans) e size, que define o tamanho da fonte em pontos ou pixels, dependendo da definição. Existem outras propriedades para outras tags, que iremos comentar mais adiante.
O código HTML pode ser escrito em qualquer editor de texto. Para executa-lo no navegador, tem que salvar o código no formato ".html" ou simplesmente ".htm".
Devem ter ficado curiosos sobre o que se trataria "estilo". No próximo artigo explicarei melhor, mas adianto que é algo que complementa o HTML, aplicando uns enfeites e deixando o teu website muito mais bonito e personalizável!
Até a próxima :)

quinta-feira, 24 de março de 2011

Programação?


É, eu talvez possa ter me precipitado um pouco aos códigos e blá blá blá, mas eu não atentei ainda para o objetivo principal deste blog... Iniciação em programação.
E se as pessoas não sabem o que é programação, nem para que serve programar, elas não vão querer aprender, certo? Vamos começar com um background aqui.
O computador é uma máquina, sendo assim, feito por humanos. Só que máquinas não são inteligentes nem têm vontade própria, apenas fazem o que nós, seres humanos, comandamos. Muitas vezes isso pode ser interessante, se aplicado da maneira correta. Só que também nós, humanos, não podemos simplesmente falar pra máquina "me faça um café" se ela não souber fazer um café. Aliás, ela nem sabe o que você está falando. Máquinas não têm vida, ok? Máquinas entendem uma linguagem diferente da nossa, uma linguagem que precisaríamos de décadas de experiência para entender. O computador (aquilo que computa, calcula) tem suas informações baseadas em código binário, pois só entende operações que possuem apenas dois estados, opostos (exemplo: ligado e desligado, aberto e fechado). Um simples comando de máquina pode vir a ser algo como:
0010100110101010110101010100110010011010111010101111111111111100010001011
1000101101001101100101101011011001010000010110110000001111110101111111111
0100111110010110111110101010101110101010100010000001011111111100001010010
0101010101110101101101100111010111001111111010101010100101110110111001100
Uma codificação provavelmente ininteligível para a grande maioria dos seres humanos. Poderíamos muito bem "conversar" com a máquina nesta linguagem, mas seria um método muito doloroso para os seres humanos. Então, vieram com a ideia de desenvolver um meio termo entre escrever um programa e executa-lo! Criou-se a linguagem de programação, que combina fatores e palavras inteligíveis, imperativas e com uma estrutura mais familiar para humanos, com uma capacidade de poder ser traduzida para a linguagem da máquina, trabalho este feito por compiladores e interpretadores, que também são programas embutidos em vários ambientes de desenvolvimento.
Agora, o que são programas? Ah é fácil, é aquele... ahm... aquilo lá que tem no computador... Muito genérico, não é? Sabemos o que é um programa, mas é difícil encontrar palavras para defini-lo precisamente. Ao fazer um programa, o que se pretende fazer? Pense em um programa que calcule a média das notas da escola e traga o resultado se você foi aprovado, ficou em exame ou foi reprovado. Você definiu um problema inicial, ou seja, abstraiu (de tornar abstrato, imaginário) as informações que você tinha para resolver uma determinada tarefa e pensou qual seria o objetivo principal do problema. Um programa é uma concretização do problema que nós temos no mundo real, utilizando-se de um conjunto de instruções para solucioná-lo. Como o computador não entende a nossa lógica de raciocínio do problema nem o que queremos fazer com o problema, não podemos simplesmente escrever a fórmula que o computador fará tudo sozinho... Temos que descrever as instruções corretamente, para que não haja mau-funcionamento nem funcionamento inesperado.
Daqui a alguns artigos, começarei a explorar o conceito de Algoritmo. O que seria isto? Não galera, não é ALGARISMO, como na matemática. Algoritmo é uma forma de abstrair o problema, só que no papel, fazendo como se fosse uma rota para a melhor solução. É como se fosse o próprio código do programa, escrito em uma linguagem que você escolher, e que você, e todos que irão utilizar o código entendam. Se o programa é particular, pode extravasar na criatividade, mas tem que ser algo que seja rememorável e fácil de ler, para que a solução para tal problema esteja sempre ali, é só consultar. Neste blog, criarei uma linguagem Algorítmica para facilitar o entendimento da programação, assim como suas funções.
Bem, isto é tudo por hoje. Espero que agora entendam mais um pouco do que é a programação e porque me encantei por ela!
Até a próxima! :)

quarta-feira, 23 de março de 2011

Condições


Este artigo promete ser grande. Peço paciência, porque este assunto é realmente um dos de maior importância em computação e programação.
Ao falar em condições, duas palavras aparecem bem claramente na nossa cabeça. Se eu fizer pudim, então teremos sobremesa. Como na informática ainda o idioma dominante é o inglês, traduzimos para IF. O comando IF é o único com bloco de códigos que não pode ser substituído por nenhum outro, ou seja, não há formas alternativas. A condição, em programação é essencial para o percurso de um programa, por isso, quem sabe programar condicionalmente, já sabe fazer muitas coisas.
A condição trabalha com valores booleanos, ou seja, apenas verdadeiro e falso. Podemos trabalhar de duas maneiras com a condição. Com sentenças lógicas ou variáveis booleanas. Primeiramente, vamos à estrutura:
if(a > b){
   a = a - b;
}
Bem simples. SE tal condição (neste caso, a é maior que b, que são variáveis), então (representado pelo abre-chaves) execute um comando (neste caso o comando fala que o valor de a passa a ser igual a ele mesmo menos o valor de b), e fecha-chaves. Parametrizando, temos:
if(<condição>){
   <comandos>;
}
O comando if é essencial para reconhecer com qual usuário o programador está lidando e qual valor este usuário fornece. Não podemos sempre contar com o mesmo valor, nem que o usuário digite apenas o valor que queremos, no tipo que queremos. Por exemplo (e o que acontece muito) quando pedimos para o usuário digitar um número e ele coloca letras no meio. Temos que fazer uma verificação, para ver se aceitamos aquele valor ou então pedimos para o usuário digitar de novo. Este ou então, em programação, é representado, em TODAS as linguagens, pelo comando else. Nas linguagens com blocos de código definidos por chaves, o else vai logo após o fechamento das chaves de um comando if:
if(a > b){
   a = a - b;
}
else{
   a = a + b;
}
Em BASIC, o Else entra no meio do bloco de códigos If:
If a > b Then
   a = a - b
Else
   a = a + b
End If
Mais uma semelhança do BASIC com a linguagem natural: As chaves são substituídas por Then (então) e End If (Fim Se). Como já disse, BASIC é uma linguagem que foi feita para fins didáticos apenas. Muitos costumam confundir VB (ou VB.NET) com BASIC, mas a linguagem de programação é realmente BASIC. VB é apenas o ambiente de desenvolvimento de propriedade da Microsoft baseado na linguagem BASIC.
Pode-se acrescentar outros ifs dentro de um if, e dentro do else também. Essa é uma característica muito útil para quem quer analisar mais de uma condição, uma de cada vez e reportar os erros sobre cada condição falsa. Lembrando-se de que o IF só prossegue a executar o código que está dentro dele se a condição expressa for verdadeira, podemos utilizar de alguns operadores relacionais entre as variáveis e valores:

NomeSímbolo em C, JAVA, C#...Símbolo em BASIC
Igual a===
Maior que>>
Menor que<<
Maior ou igual a>=>=
Menor ou igual a<=<=
Diferente de!=<>

Além dos operadores relacionais, que operam entre variáveis e constantes, podemos também usar operadores lógicos entre sentenças, os mesmos que usamos na álgebra de Boole, mas com uma diferença de notação:

NomeSímbolo em C, JAVA, C#...Símbolo em BASIC
Não!Not
E&&And
OU||Or

Percebam mais uma similaridade de BASIC com a linguagem natural inglesa. Também percebam que o símbolo de Não está presente no símbolo de Diferente de, significando que uma variável NÃO é IGUAL à outra (ou seja, diferente). Com estes símbolos, podemos formar a seguinte sentença lógica:
if((a != b) && (a + 2 < c)){
<comando>
}
Nesta condição, pedimos para verificar se o valor da variável "a" é diferente do valor da variável "b" e ainda se o valor da variável "a" somado a 2 é menor que o valor da variável "c". Como usamos o conector lógico E, o comando que for colocado no bloco só será executado se as duas sentenças forem verdadeiras. Se colocássemos um "||" (barras verticais, não I nem L) no lugar de &&, qualquer caso em que pelo menos uma das sentenças fosse verdadeira executaria o código.
O funcionamento do IF é bem simples: Verifica se a condição é verdadeira baseando-se em regras pré-definidas de comparação binária, dentro do processador (ação efetuada em escala de nanosegundos) e executa o código se o resultado da sentença for verdadeiro. Se o resultado for falso, o programa procura algum ELSE. Se tiver um ELSE, executa o comando que tiver no ELSE. Se não tiver, passa diretamente para o próximo código na sequência do programa.
Para usar o IF com variáveis no lugar da condição, esta variável terá que ser declarada como bool (aceita apenas verdadeiro ou falso). Isso é interessante para quando você tem uma estrutura inteira para analisar se algo é verdadeiro ou falso, por exemplo, se um elemento existe em uma lista de elementos. A princípio não dá para fazer este reconhecimento em apenas uma sentença, necessita-se de uma função (falarei sobre funções mais adiante) com uma estrutura montada à mão, que retorne um valor bool. Esta função então pode ser usada como se fosse uma variável com um código dentro, e pode ser usada dentro do comando IF, usando a seguinte sintaxe:
if(verifica()){
<comandos>;
}
Sendo "verifica()" o nome da função, ela retorna valores bool, ou verdadeiro, ou falso. Uma variável booleana poderia muito bem ser utilizada no lugar da função. O IF analisa se aquela expressão resulta em verdadeiro e executa. Se for falso, não executa e procura pelo ELSE. Se não encontrar passa para a sequência.
Muitas vezes também temos a necessidade de verificar se uma sentença (ou variável) é falsa. Ao colocar a variável ou a sentença dentro da condição do IF, basta colocar um ! (negação) à frente da variável ou sentença (esta última, podendo ser substituída com o operador relacional imediatamente contrário), ficando assim:
if(!(a > b)){

//ou

if(a <= b){
*Nota: Pode-se usar // para comentar (ou seja, fazer uma anotação que será ignorada pelo programa, para fins de orientação de funcionalidade do código) uma linha ou /* */ para comentar um bloco de linhas. Neste caso, utiliza-se /* no começo do bloco e */ no final do bloco de comentários.
Verifica-se que o oposto de "Maior que" é "Menor ou igual a", por questões simplesmente matemáticas (se um número não é maior que outro, ele só pode ser menor ou então igual a ele).
Bem, acho que é isso por hoje. Estamos começando a evoluir na programação! Qualquer dúvida, comentem!
Até a próxima :)

terça-feira, 22 de março de 2011

Álgebra Booleana


E / OU. Qual a diferença entre essas duas palavrinhas? E o que acontece se colocar um NÃO no meio? A lógica de funcionamento desses conectores parece tão natural para nós, humanos, que nem percebemos como, quando e nem porque os usamos. Já o computador não consegue ter o mesmo processo mental que nós temos. Nisso nós somos e sempre seremos mais eficazes que o computador. Não, caros amigos, o mundo não será dominado pelas máquinas, NUNCA, pois as máquinas dependem dos seres humanos, nós as controlamos, comandamos e ordenamos a fazer o que nos der na telha (sinto-me com poderes agora). Não podemos dar inteligência à máquina, nem que a tecnologia avance 300 milhões de anos. E principalmente nessas comparações, tão fáceis à vista do ser humano, mora o principal defeito da máquina. Ela não sabe decidir o que é verdadeiro e falso. Os seres humanos tiveram que colocar regras de comparação baseados na comparação binária que a máquina faz para acrescentar o E, o OU e o NÃO. Ainda não acrescentarei prática a este assunto, pois isto precisa de um pouco mais de estudo. E como teoria SUCKS, procurarei ser breve.
Comecemos pela mais básica das 3 palavras: o NÃO. É uma negação, ou seja, inversão. Quando você nega uma sentença, você está invertendo-a de sentido. O mesmo princípio se aplica à algebra. Quando negamos algo, queremos o oposto. Assim, VERDADEIRO negado vira FALSO e vice-versa. Em números:
0' = 1
1' = 0
( ' é um símbolo para NÃO)

Fácil, não é? Passemos para a próxima. A palavra E é um conector que "amarra" duas sentenças, ou seja, para que a sentença formada com as duas unidas pelo E seja verdadeira, as DUAS têm que ser verdadeiras. Um exemplo prático:
A bola é redondaverdadeiro
Açúcar é salgadofalso
A bola é redonda
E
açúcar é salgado
falso

A bola é redondaverdadeiro
Açúcar é doceverdadeiro
A bola é redonda
E
açúcar é doce
verdadeiro

Usamos a tabela verdade para nos orientar sobre os possíveis valores dos conectores para determinados valores de sentenças.
Tabela Verdade
ABA ^ B
111
100
010
000
( "^" é um símbolo para E)

Podemos comparar o operador conectivo (ou lógico) E ao operador matemático de multiplicação (.), já que para que o resultado seja não-nulo, ambos os fatores têm de ser não-nulos (zero multiplicado por qualquer número é igual a zero).
O OU é um pouco mais difícil de abstrair. Mesmo porque há duas situações no dia-a-dia em que usamos a palavra OU. Em questão de gramática, OU é uma conjunção alternativa e optativa. Quando é optativa, há duas opções, mas ambas não podem ser verdadeiras, há de se escolher apenas UMA. Mas não é somente essa a aplicação do OU. Na verdade, este é o OU exclusivo. Na informática, usaremos mais o OU inclusivo, ou seja, há duas opções, e pode ser qualquer uma delas verdadeira, e inclusive ambas. Na tabela verdade temos:
Tabela Verdade
ABA v B
111
101
011
000
( "v" é um símbolo para OU)

Praticamente temos que, para duas sentenças, uma sentença formada por elas unidas pelo conectivo OU será verdadeira se uma delas for verdadeira, ou até ambas.
Podemos comparar o operador conectivo (ou lógico) OU ao operador matemático de adição (+), já que para que o resultado seja não-nulo, pelo menos um dos dois fatores tem de ser não-nulos (qualquer número somado a zero é igual ao próprio número).
Ao invés de ^ ou v, podemos usar para E e OU os operadores matemáticos nas sentenças:

A . B (A E B);
A + B (A OU B);

Também podemos misturar os conectores em uma única sentença, para formarmos circuitos lógicos:

A' + B . (C + D') => A negado OU B E (C OU D negado)

Bem, é isso por hoje. Aprendemos bastante teoria matemática e lógica nos dois últimos artigos. Nos próximos, colocaremos em prática!
Até a próxima! :)

segunda-feira, 21 de março de 2011

Matemática!


Como é chato ficar escrevendo tantas fórmulas, números, frações, potências... blá blá blá! Você pode muito bem pensar isso, e que muitas das coisas que você aprende em cálculo, jamais usará em toda a tua vida. ERRADO! Todos os dias você usa aquilo que aprende na matemática, se realmente aprende. Para caminhar nós usamos matemática, para ver se o carro consegue ultrapassar outro antes do cruzamento, etc. O que mais aprendemos em matemática é lógica, e não a como usar as intermináveis fórmulas que os professores extendem na lousa. Basta sabermos como utilizar aquela lógica no nosso dia-a-dia.
Mas o importante é: como colocar aquilo que escrevemos no papel dentro do computador, para ele fazer os cálculos por nós, extremamente mais rápido? O fato é que o computador entende uma linguagem diferente de nós, por isso consegue fazer cálculos mais rápida e eficientemente. O computador entende apenas a linguagem binária ou digital. Apenas dois números, o 0 e o 1, fazem toda a diferença na hora do cálculo. Sim, o computador é burro. Ele não sabe fazer 2 + 2. O que ele sabe fazer é transformar o 2 em número binário e a partir daí, aplicar regras de diferenciação binária, ou seja: 00000010 + 00000010 = 00000100 (em decimais, lê-se: 2 + 2 = 4). Em binários, não existe o número 2. Então, 1 + 1 é igual a zero, e o que sobrou dessa adição vai para a casa da frente. Esse método de cálculo é infinitamente mais fácil do que os cálculos decimais. O único contra para que nós não conseguimos fazer com tanta rapidez é que fomos acostumados desde crianças a fazer contas com decimais, ou seja, não entendemos  o conceito por trás dos binários, e entendemos apenas que 2 + 2 = 4. Os binários também representam os fatores ligado e desligado, ou seja, apresenta apenas duas possibilidades opostas, sendo digital (ou lógico) e não analógico. Um exemplo de elemento analógico é uma torneira. Ela pode estar ligada ou desligada, mas também pode estar forte, fraca, pingando, vazando, com força média... Agora, a pergunta que se faz é: quantas possibilidades de posicionamento, ou então, quantas opções temos no modelo analógico? Desde desligada até a força total permitida pela torneira, podemos definir com exatidão os estágios que a torneira para? Não, não podemos. Por isso, podemos dizer que temos infinitas possibilidades no modelo analógico, mas apenas duas no modelo lógico ou digital. Por isso o computador faz cálculos mais rapidamente, porque ele só lida com comparações em que há apenas dois resultados: ou verdadeiro ou falso. Essa é a base da Álgebra Booleana, desenvolvida por George Boole, assim como o conceito das conjunções fundamentais E, OU e a negação NÃO. Essa é a base da computação e quem quer seguir esta área, precisa ser ciente das funções dessas três palavras. No próximo artigo, explicarei mais detalhadamente a álgebra de Boole.
Para calcular, na programação, usamos, logicamente, os números (ou inteiros ou reais [com ou sem ponto flutuante {notação científica}]), as variáveis e as operações que temos à nossa disposição. O computador não consegue fazer qualquer operação além da adição. Mas há regras fixas nele que permitem transformar as operações em adição para que ele possa calcular e nos retornar o resultado das comparações aditivas binárias em formato decimal, tudo isso em menos de um milésimo de segundo! Para fazer operações, temos que guardar o valor resultante em uma variável ou então exibi-lo diretamente na tela (por meio de console ou de objetos).
#include <stdio.h>
#include <conio.h>
int a,b,c;
void main(){
a=5;
b=a+2;
c=a+b;
printf("O resultado é: ", c);
getch();
}
Aqui incluimos outra biblioteca: conio.h (acrônimo de Console Input/Output), para manipular entrada e saída de dados no console. Incluí esta biblioteca apenas para mostrar uma outra forma de codificar em C. O "getch();" na penúltima linha serve para o programa parar para o usuário ver o resultado. Se não houver esta linha, assim como o "return" na função, o programa executa e o console fecha. Esta linha ficcionalmente captura o caractere que o usuário digitar na próxima linha, ou seja, nenhum. Quando o programa executar, esta função segurará o programa para ele não fechar. Assim que o usuário der Enter, o programa fechará, pois já executou tudo o que tinha para ser executado.
Podemos declarar variáveis do mesmo tipo em sequência, sem precisar declarar uma por linha. As variáveis começam com o valor que existia no lugar da memória que elas ocuparam. Se usar as variáveis antes de lhes fornecer valores, elas podem causar resultados inesperados. No ambiente VB.NET, as variáveis são zeradas automaticamente quando são declaradas, pois não é exatamente uma declaração, e sim um dimensionamento.
Na próxima linha, declaramos o método principal como sendo do tipo void (vácuo), pois não retorna nenhum valor, apenas executa uma ação. Atribuimos o valor 5 à variável "a", falamos que a variável "b" é igual à variável "a" somada a 2 e que "c" é a soma de "a" e "b". Mostramos o resultado e encerramos o programa. Logicamente que o resultado mais óbvio é 12, pois definimos isso durante o programa. Mas a maioria dos programas é feito dos valores que o usuário fornece, portanto, não se pode ter certeza de qual valor será. Poderíamos muito bem ter omitido a variável "c", mas para efeito de prática de variáveis, deixemos assim mesmo.
Usamos também neste código da concatenação, ou seja, unir trechos string com variáveis ou outros trechos string, usando o operador "+". Neste caso, concatenamos a string "O resultado é: " com a variável "c", mostrando na tela: "O resultado é: 12".
Bem, creio que seja só isso por hoje pessoal. Qualquer dúvida, comente. Até a próxima :)

domingo, 20 de março de 2011

Variáveis


O que são variáveis? No mundo normal, saindo um pouco do mundo da informática, poderíamos dizer que é algo sucetível a mudanças, variações. Na matemática temos as famosas variáveis X e Y, que compõem a maioria das equações, funções, etc. Na informática, variáveis também são elementos sucetíveis a mudanças, na maioria das vezes. Mas são mais do que apenas isso. As variáveis são "reservas" na memória do computador, ou seja, ao declarar uma variável, você está alugando um espacinho na memória do teu pc para que os valores possam ficar lá, à tua disposição. Mas variáveis em informática não suportam apenas números, como na matemática, mas sim vários tipos diferentes.
Para declarar uma variável, existem diferenças entre as linguagens. A forma mais comum é usada em C, C++, C#, Java, entre outras, que segue:
int x;
Pode-se padronizar como:
tipo_da_variávelØnome_da_variável;
Onde Ø significa espaço normal obrigatório.
Abaixo segue uma tabela com os principais tipos de variáveis e suas respectivas declarações.

NomeTipoDescrição
BooleanoBASIC: Boolean
Outras: bool
Verdadeiro ou Falso. Utiliza da lógica Booleana para fazer comparações (mais pra frente veremos o que é lógica booleana).
CaracterecharUm único caracter em texto, que pode ser letras de A a Z, números de 0 a 9 e caracteres especiais (!,@,#,$,%,&,*...).
InteiroBASIC: Integer
Outras: int
Número inteiro, limitado entre os valores de
-2.147.483.648 a 2.147.483.647. Como é inteiro, não suporta números fracionários.
Não-assinadounsignedSe colocado na frente de outro tipo de variável, denota que esta não pode chegar a ser negativa e dobra o alcance positivo da variável.
CurtoshortCorta pela metade o número de bits que a variável ocupa na memória, fazendo reduzir também o seu alcance tanto positivo quanto negativo.
LongolongTem o dobro do tamanho de alocação do Inteiro, alcançando a faixa de
-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807.
ObjetoobjectQualquer tipo de variável.
Cadeia de caracteresstringConjunto de caracteres em texto. Não há limite definido de quantos caracteres são permitidos.

Em BASIC, há uma maneira especial para se declarar (ou alocar) uma variável:
Dim nome_da_variável As Integer
"Dim" significa "dimension", ou seja, está dimensionando a variável em definidos bits. Dimensionar como os tipos que existem, nesse caso, números Inteiros. BASIC é uma linguagem de nível altíssimo, ou seja, chega muito à proximidade da linguagem humana. Só que a linguagem é um tanto limitada para fins de estudo e didáticos.
No começo do artigo mencionei que as variáveis, na maioria das vezes são sucetíveis a mudanças. Existem as variáveis estáticas, que, uma vez definidos o valor, elas não podem mudar.
Bem, por enquanto é tudo sobre variáveis. Qualquer dúvida, só deixar como comentário. Até a próxima! :D