Ads 468x60px

segunda-feira, 20 de junho de 2011

Lógica de programação

Pôster 'lógica é o início da criatividade'
Por: RabiD Son.

Antes que me perguntem: não, não pretendo tornar este espaço um blog de programação. Mas não é por nada que todo engenheiro tem uma disciplina de programação no ciclo básico e muitos cientistas acabam fazendo uso de uma linguagem de programação eventualmente: hoje em dia, quase tudo feito em prol da ciência e tecnologia pode ser otimizado por processos computacionais.

Realizar simulações por computador, visualizar formas da geometria fractal, implementar algoritmos, gerar números primos... são inúmeros os possíveis interesses de estudantes e professores de matemática e física na computação. Embora haja várias ferramentas disponíveis que dispensam muito conhecimento técnico, como o Wolfram Alpha, uma linguagem de programação (mesmo um software como MATLAB) oferece muito mais liberdade para conversar com nosso amigo computador.

Mas antes de botarmos a mão na massa, precisamos aprender a adequar nosso raciocínio às limitações da máquina (ela só sabe 0 e 1, coitada) para podemos mandar nela à vontade. Veremos que fazer um programa de computador nada mais é do que resolver um problema, como na matemática ou física, e até mesmo usando processos semelhantes.


Um pequeno histórico da programação de computadores


Tudo começou em torno da década de 40... de 1840, para ser mais específico. O matemático Charles Babage propõe uma máquina computacional chamada Engenho Analítico, que chama a atenção de Ada Lovelace. Lovelace escreveu um conjunto de observações que especificavam em detalhes como calcular números de Bernoulli com a máquina. Eis o primeiro programa de computador.

Avançando um século no tempo, temos a Segunda Guerra Mundial, e com ela o início da computação moderna. Como vocês já devem saber, os primórdios da computação estão intimamente ligados a este conflito, sendo usado para cálculos envolvendo armas, ataques etc. Os programadores dispunham apenas de cartões perfurados, linguagem Assembly e muita força de vontade.

Isso porque computadores só entendem a dita linguagem de máquina, incompreensível a humanos. As linguagens de baixo nível — com pouca abstração e muito ligadas ao hardware —, Assembly, facilitam esse processo ao oferecer os mnemônicos (hoje mais conhecidos como comandos) para substituir padrões de bits. Tudo bem, é mais prático do que acionar válvulas para mudar o estado de um bit, mas veja os seguintes códigos neste tipo de linguagem:

add bx, 4
cmp [adr], 3
jmp address

Entendeu alguma coisa do escrito acima? Eu não, pelo menos. Outro problema das linguagens de baixo nível é... bem, serem de baixo nível, e portanto limitadas ao hardware. Um programa feito em um lugar nem sempre funcionaria em outro. Então surgiram linguagens como FORTRAN, BASIC, COBOL e ALGOL, que mudaram esse paradigma e incentivaram a busca por meios mais simples de se comunicar com a máquina.

Alguns detalhes técnicos


Em primeiro lugar, não é exagero dizer que o inglês é o idioma da programação. As linguagens de alto nível são mais próximas do idioma natural humano; e este idioma é justamente o inglês. Mesmo que você mude de uma linguagem para outra, com certeza haverá comandos idênticos e uma sintaxe parecida com a seguinte, por exemplo:

for(int i = 1; i <= 10; i++) {
    if(i % 2 == 0)
        System.out.println(i);
}

O código acima, escrito em Java, imprime todos os pares de 1 a 10, mas é possível que até mesmo quem não tem contato com programação tenha captado a intenção. Naturalmente, a maior parte dos bons tutoriais/aulas também está em inglês. Além disso, a informática de modo geral é cheia de jargões, acrônimos, abreviações. É útil ter alguns deles em mente para não se perder:

Algoritmo:

Conjunto finito de instruções para a resolução de um problema. Veremos mais sobre isso a seguir.

Pseudocódigo:

Representação mais técnica e estruturada de um algoritmo. Mais informações abaixo.

Fluxograma:

Outro modo de representar um algoritmo, além do pseudocódigo. Utiliza figuras geométricas para ilustrar ações, tomadas de decisão etc.

Input/Output:

Respectivamente, entrada e saída. O usuário "inputa" um ou mais dados, o programa processa e devolve alguma coisa no output.

IDE:

Integrated Development Environment. É um software que auxilia no desenvolvimento de programas em uma ou mais linguagens.

Paradigmas:

Mais do que técnicas, são modos de pensar/aproximações diferentes. Uma linguagem pode ou não dar suporte a determinado paradigma. Exemplos: orientação a objetos, imperativo, funcional.

POO ou OOP:

Programação Orientada a Objetos. É um paradigma muito utilizado hoje em dia, mas não vamos explorá-lo por enquanto.

Programa em BASIC e sua representação em fluxograma
Por: steveluscher.

O algoritmo


Todo programa é a implementação de uma lógica elaborada na forma de algoritmo, então apenas essa implementação varia. Por isso é importante dominar a lógica acima de uma determinada linguagem. E que lógica é essa? Início, processamento e fim, sendo que no processamento há tomadas de decisão e ações. Por mais complexo que seja seu sistema, no fundo ele é basicamente isso. Por exemplo:

Início do programa;
Ação 1: carregar interface do usuário;
Ação 2: receber clique;
Decisão: usuário clicou no botão? Então fazer... (ação condicionada), senão fazer (outra ação);
Ação 3: mostrar uma animação na tela;
Ação 4: mostrar um pop-up de "adeus";
Fim do programa.

Um programa bem feliz, não? Note que apesar de envolver interface gráfica, algo um pouco mais avançado, a lógica segue o padrão de início, processamento (ação e decisão) e fim. Observe também que estamos usando uma linguagem de alto nível para representar o que deve ser feito, então um humano consegue entender perfeitamente, mas não nos preocupamos como diabos o computador fará isso.

Aí entra o pseudocódigo!

Pseudocódigo e conceitos de programação


Pseudocódigo, também chamado português estruturado, é o algoritmo escrito de forma mais próximo à compreensão da máquina. A estrutura básica é:

algoritmo "nome"
var
inicio
fimalgoritmo

As palavras em negrito são comandos que indicam, respectivamente: identificação do algoritmo, declaração das variáveis, marcador de início do processamento e marcador do fim do processamento.

Variáveis

Variáveis, naturalmente, armazenam valores de um determinado tipo. Exemplos:

var
x, y, z: inteiro
nome: caracter
dinheiro: real

Claro que podemos realizar operações de subtração, adição, multiplicação etc. com certos valores, obedecendo à ordem padrão de precedência em operações complexas. Podemos também usar matrizes para armazenar múltiplos valores de um mesmo tipo em uma variável só; em programação chamamos esse tipo de dados vetores, listas ou arrays (ou matrizes mesmo; há uma certa controvérsia à respeito dessas nomenclaturas, mas no fim das contas dá na mesma).

numeros: vetor[0..5] de inteiro
bidimensional: vetor[0..1, 0..1] de inteiro

Note que o vetor numeros é uma matriz-linha (ou matriz-coluna) com 6 inteiros, de 0 a 5. Similarmente, bidimensional é uma matriz 2 x 2 contendo tipos inteiros. Normalmente, em linguagens de programação, o primeiro índice por padrão é 0. Em Java, por exemplo, teríamos:

numeros = new int[5];
vetor = new int[1][1];

Isso já nos dá recursos para pensar em como funciona uma interface gráfica 2D, adotando uma matriz bidimensional com as dimensões da tela para servir como plano cartesiano. Cada ponto seria um elemento desta matriz, com as coordenadas (x, y) representando sua posição.

Input/output

Sem segredos aqui. No caso do output, podemos optar por escrever alguma coisa na saída padrão e então pular uma linha:

escreva("Teste")
escreva("Outro Teste")

Note que a saída deverá ser "TesteOutro Teste", pois não pulamos linhas entre uma sentença e outra. A alternativa é, então, utilizar o comando escreval. O seguinte exemplo ilustra como ler um dado numérico, fazer algum cálculo com ele e mostrar seu novo valor na saída:

var
x: inteiro

inicio
escreval("Insira algum inteiro:")
leia(x)
x <- x + 2 escreva("O número somado a 2 é: ", x)
fimalgoritmo

Controle de fluxo

Todo programa segue um fluxo natural de execução (lembra? Início -> processamento -> fim), mas frequentemente precisamos interromper esse fluxo em algum ponto e tomar uma decisão. Aí entra o se-então e se-então-senão. Se não tiver entendido, então darei um exemplo; senão, pode pular esta parte:

se x >= 2 entao
escreva("x é maior ou igual a 2... puxa!")
senao
escreva("x é menor que 2")
fimse

Note que precisamos demarcar também o final da instrução com o comando fimse. Além disso, poderíamos facilmente criar um se dentro do senão, e assim sucessivamente. Mas podemos também pensar em manter o fluxo preso em um certo ponto até uma certa condição ser cumprida. Por exemplo, manter o jogo rodando até o jogador morrer ou chegar ao fim do jogo (de fato, é justamente assim que funciona o dito game loop).

Em linguagens de programação temos vários modos de criar um laço, ou loop, que repita um ciclo de instruções até algo ser acionado para interrompê-lo e retornar o fluxo ao normal. O mais comum é o enquanto...faça. Veja o exemplo para imprimir os números de 1 a 10:

x <- 1
enquanto x <= 10 faca
escreval(x)
x <- x + 1
fimenquanto

Opa, note uma coisa importante: todos os comandos são "americanizados", ou seja, não há caracteres especiais como acentos e cedilha (por isso "faca" e não "faça"). Lembre-se disso ao criar suas variáveis.

Mais alguma coisa?

Pode apostar que sim. Estou cobrindo apenas a ponta do iceberg para despertar seu interesse, mas você pode encontrar vários outros tópicos fundamentais em bons tutoriais e livros por aí. Se quiser se aventurar em programação, o tio Google é definitivamente seu melhor amigo. E o conselho mais importante para aprender a programar: programe. Fuçe em códigos alheios, implemente algoritmos, tente resolver problemas, enfim, só não vale copy-paste. Se quiser, dê uma olhada em um post anterior no qual abordo alguns algoritmos.

A questão clássica: com qual linguagem começar?


Questão clássica, porém polêmica. Vale ressaltar aqui que nenhuma linguagem do mundo faz algo além do que foi dito acima, ou seja, são todas regidas pela mesma lógica. Tenha sempre em mente que linguagens são apenas ferramentas usadas para construir programas, mas quem está no controle é você e sua lógica, então não caia no erro de idolatrar uma determinada linguagem ou família de linguagens.

Como estou supondo que o leitor não domine a lógica de programação, minha sugestão é experimentar o VisuAlg. VisuAlg é um software muito útil aos iniciantes de programação que estão cansados de "programar no papel" e querem ver seus algoritmos executados em tempo real. A sintaxe é simples e baseada em Portugol, então não tem nenhuma "pegadinha de linguagem" fora suas limitações. Baixe gratuitamente aqui.

Outra linguagem que segue a mesma linha de VisuAlg é Pascal, sendo inclusive bastante utilizada no meio acadêmico. O Small Basic da Microsoft também serve como contato inicial. Uma vez dominada a lógica, já podemos ir ao que interessa, certo? Se estiver simplesmente a fim de fazer programas só por fazer mesmo pode ser uma boa dar uma olhada em linguagens como Ruby e Python, ambas de alto nível e sintaxe simples.

Outra sugestão é Java, um verdadeiro canivete suíço em termos de aplicações. C e C++ são ideais para quem quiser entender a fundo como as coisas funcionam a um nível mais baixo, além de serem extremamente populares. No meio científico podemos destacar:

- MATLAB;
- Perl (sobretudo bioinformática);
- R.

Fontes e links úteis


History of Programming Languages and Their Evolution History and comparision of programming languages
BABEL: A Glossary of Computer Oriented Abbreviations and Acronyms
Lógica de programação
Conceitos básicos de algoritmos
A Linguagem do Visualg (aplica-se a pseudocódigo no geral)
Apostilando - seção de lógica
300 ideias para Programar

0 comentários:

Postar um comentário