Introdução à programação e aos algoritmos
3.1 Blocos de Construção de um Programa
“... um método perfeito não deve ser eficiente apenas com respeito à realização dos objetivos para os quais foi projetado, mas deveria, em todas as partes e processos, manifestar certa unidade e harmonia.”
Como atingir esta unidade e harmonia, e por que não dizer, elegância, da qual falava Boole? Apesar de haver muitos enfoques possíveis, na programação de computadores podemos começar a domar a complexidade dos problemas usando a chamada programação estruturada, conhecida também como programação modular. Neste capítulo você vai conhecer as suas bases.
3.1 BLOCOS DE CONSTRUÇÃO DE UM
PROGRAMA
Um programa de computador só é realmente necessário se o problema que resolve envolver um volume considerável de dados ou um grande número de operações. Para situações mais simples, uma calculadora ou mesmo papel e lápis seriam suficientes.
Seria ótimo poder apresentar pequenos programas e, ao final, dizer: “agora expanda isso para programas maiores”. Infelizmente não é assim. Um programa de mil linhas tem muito pouco a ver com um programa de 10 linhas. Programar não é uma atividade escalável, ou seja, estar preparado para escrever um programa de 10 linhas não vai prepará-lo para escrever um programa de 1000 linhas.
Escrever um programa de computador é escrever um texto. À medida que este texto cresce, o fluxo de execução pode tomar diversas direções, de acordo com o processamento dos dados. Nos primórdios da computação, os programadores abusavam de desvios do fluxo de execução. Isto seria como se um escritor, dependendo de alguma condição, a idade do leitor, por exemplo, encaminhasse esse leitor da página 10 para a página 20 e depois retornasse à página 15. Esse processo aconteceria por todo o livro, de acordo com outras condições externas. Várias leituras seriam possíveis, mas o difícil seria manter a coerência entre as várias possibilidades de leitura. Cada percurso de leitura deveria conter uma história coerente. Isso não é impossível de ser feito, mas envolveria um grande esforço mental do escritor para domar toda a complexidade da tarefa. Três ou quatro linhas de narrativa poderiam ser fáceis de organizar, mas, e se essas narrativas chegassem à casa das dezenas ou centenas em um único livro? Facilmente poderia haver alguma linha de narrativa sem sentido.
O mesmo acontece com os programas de computador. De
acordo com as informações a serem processadas, pode haver diversos fluxos possíveis de execução de um programa. Sem uma estrutura, logo os programas tornam-se ininteligíveis em função de seu tamanho e das várias possibilidades de execução. Esse tipo de
código é chamado pejorativamente de “código espaguete” (Figura
3.1), por causa do emaranhado lógico que poderia ser gerado. É preciso pôr ordem nesse caos.
Figura 3.1 Código espaguete.
A programação estruturada surgiu para facilitar a escrita e a
depuração de programas. Seu princípio é o uso de estruturas simples que são encadeadas de modo que o programa possa ser dividido em blocos lógicos, cada um desempenhando um papel bem preciso na solução do problema. A programação estruturada foi definida por Niklaus Wirth como “A arte ou técnica de construir e formular algoritmos de forma sistemática”. Ser sistemática significa que se trata de uma abordagem que pode ser replicada para todos os problemas que um programa de computador possa resolver.
Além dos blocos, outro princípio usado é o desenvolvimento por refinamentos sucessivos, também chamado de top-down. Apresentei este método no capítulo anterior, quando desenvolvemos o algoritmo de procura de uma palavra em um dicionário. Começamos a desenvolver o algoritmo em um nível bem abstrato e, pouco a pouco, vamos definindo detalhes da solução, até chegar ao programa de computador.
Explicando melhor: na programação estruturada, dividimos a solução do problema em blocos. Cada bloco executa uma ação que pode consistir em um teste, na repetição de comandos ou na obtenção de um resultado. Para manter a complexidade em um nível compreensível, cada bloco possui apenas uma entrada e uma saída para o fluxo da informação. Isso quer dizer que um bloco recebe alguma informação, processa-a e devolve algum resultado ao seu final. Note que falo em “blocos”. Cada bloco engloba uma ou várias ações efetivas para a solução do problema. Isso impede o surgimento do “código espaguete”.
A ideia é que se cada bloco tem apenas uma entrada de dados e uma saída, conseguimos controlar melhor a complexidade do programa e assim sua depuração no caso de ocorrência de erros
(Figura 3.2).
Figura 3.2 Bloco de processamento.
Os blocos podem ser encaixados um dentro do outro, como as
famosas bonecas russas matrioskas. De qualquer forma, a regra de uma entrada e uma saída para cada bloco é mantida. Se um bloco começa dentro de outro bloco mais externo, deve terminar sua execução dentro deste mesmo bloco.
A programação estruturada também define regras de escopo
para os blocos de programa. Em vez de permitir que qualquer parte do programa tenha acesso e modifique qualquer variável e mude o fluxo de execução para qualquer outra parte do programa, na programação estruturada são definidos escopos tanto para as variáveis quanto para os desvios que podem ser efetuados. O escopo de uma variável define em quais blocos a variável é visível, ou seja, o valor dessa variável só pode ser lido e às vezes modificado dentro daquele bloco. O mesmo acontece com os desvios de execução. Qualquer desvio que saia do bloco obrigatoriamente deve retornar a este para ter sua execução continuada.
Apenas três estruturas são suficientes para escrever qualquer
programa: sequência, seleção e iteração.
Fato 3.1 – Programação estruturada é um paradigma de programação.