A Essência da Programação – Parte II

Respeito – e não duvido dos méritos – de qualquer metodologia descrita anteriormente, mas acredito que não se deva iniciar o aluno diretamente um uma linguagem, seja ela qual for. Em minha opinião ele deve aprender primeiro a pensar como os computadores , ou seja de forma lógica e com os mesmos critérios utilizados pela máquina, independente de qualquer linguagem. Depois, sim, ele pode aprender a usar a linguagem que lhe for conveniente.  

Para uma melhor analogia, aprender uma linguagem em paralelo em que se aprende lógica de programação, é como aprender a escrever ao mesmo tempo em que se aprende a pensar. O pensamento fica limitado a uma realidade e demora a se desenvolver, bem como de ser expresso da melhor forma. É preciso aprender a pensar para depois aprender a falar ou escrever, da mesma forma que os bebês fazem. Daí a importância de se desenvolver o pensamento lógico, a capacidade de desenvolver algoritmos, antes de se partir para um C ou um Pascal.

Como um computador pensa? Ou melhor, de que forma básica o computador obedece às instruções? A CPU de um computador possui, de uma forma geral, processadores (unidade lógica, matemática e de controle), memória e caminhos de entrada e saída de dados. Com isso, podemos dizer que o computador armazena informações, realiza cálculos (operações matemáticas), decisões lógicas, recebe novos dados (entrada) e envia dados para meios externos (saída). Faz também controle de onde e o que está processando naquele momento. Então, podemos concluir que o computador executa basicamente instruções de armazenar, realizar operações, decidir, controlar execução, entrar dados e sair dados. E com estas instruções, pelo menos teoricamente, dá para fazer tudo em processamento de dados. Ou seja, todo o processamento que é realizado nos computadores, seja ele qual for, é feito baseado nestas instruções.

Para simplificar, e ficar mais apresentável ao iniciante, vamos considerar que as instruções são executadas de forma seqüencial. Dessa forma a seqüência de instruções constitui um algoritmo ou um trecho dele. E como deve ser a representação deste algoritmo com estas instruções? Se utilizarmos os símbolos básicos do fluxograma certamente poderemos ter uma aproximação desta representação, entretanto terá as desvantagens já citadas. A melhor representação seria uma forma mais compacta, tipo uma linha por instrução, podendo adotar as seguintes nomenclaturas:

. Armazenar: . Exemplo: A ← 10. Esta instrução significa que estou armazenando o valor 10 em um espaço de memória rotulado de “A”. Nesta instrução a preocupação é somente do ato de armazenar no espaço de memória, não cabendo aqui uma preocupação com o tamanho desta caixa, nem os tipos de dados que possam conter nesta caixa. Aliás, para melhor didatismo só vamos considerar dois tipos de dados: numéricos e alfanuméricos.

. Realizar Operações: op(<operação matemática ou lógica>). Exemplos: op(2+3) e op(x>=3). O primeiro exemplo realiza uma operação matemática cujo resultado é 5. O segundo exemplo é uma operação lógica que é verdadeira se o valor armazenado no espaço rotulado de “x” for maior ou igual a 3. Caso contrário a operação lógica é falsa. Para operações matemáticas poderemos utilizar a mesma representação que estamos acostumados (+, -, *, /, %(resto)). Para operações lógicas podemos utilizar os operadores que normalmente utilizamos (>, >=, <, <=, =, #(diferente), ~(negação)) com os seguintes conectivos: E (e lógico), OU (ou inclusive), OUX (ou exclusive). Símbolos, incluindo funções (ou operadores) lógicas e matemáticas, podem ser acrescentados a medida que forem necessários.

. Decidir: <operação lógica>? V:<ação se verdadeira>  F:<ação se falsa>. Exemplos:

op(x>y E x>z)?
      V: maior ← x

op(a>3)?
      V: a ← op(a + 1)
      F: a ← op(a – 1)

No primeiro exemplo, se a operação lógica for verdadeira, o valor do espaço de memória rotulado de “x” é atribuído ao espaço rotulado de “maior”. No segundo exemplo, se o valor contido no espaço “a” for maior que 3, este valor será somado de 1 e armazenado no mesmo espaço, sobrescrevendo o valor anterior. Caso contrário, o valor será subtraído de 1 e armazenado também no mesmo espaço, sobrescrevendo da mesma forma o valor anterior.

. Entrar Dados: «. Obtém dados externos ao algoritmo. Exemplo: N «. Neste exemplo, o valor que obtiver pela leitura externa de dados, que pode ser proveniente de teclado ou qualquer outro periférico de entrada, vai ser armazenado no espaço na memória rotulado de “N”.

. Sair Dados:  ». Envia dados do algoritmo para meio externo. Exemplo. » X. Neste exemplo, o valor contido no espaço “X” será enviado para o meio externo, que pode ser uma tela, impressora, ou qualquer outro periférico de saída.

. Controlar Execução: A execução é feita sempre de forma seqüencial, de cima para baixo, linha a linha. Entretanto, podem acontecer casos que seja interessante executar outra linha (ou conjunto de linhas) que não seja a próxima. Ou seja, um desvio do controle de execução para outro lugar. Nesse caso o desvio sempre é associado a um rótulo. Exemplo: desvio loop, onde “loop” é rótulo de onde começa uma instrução, para onde vai passar o controle de execução. Vamos ver um exemplo mais completo:

 

  A ← 0
loop: A ← op(A + 1)
  » A
  op(A<10)?
      V: desvio loop

Neste exemplo, se a operação lógica é verdadeira, é executado um desvio para o rótulo “loop”. Note que o rótulo “loop” se inicia na instrução “A ← A + 1″.

A propósito, o que faz este algoritmo? ;-)

Este artigo é dividido em 3 partes. Esta é a segunda. Para ler a primeira parte, clique aqui. Na parte 3 – próxima semana – continuarei a desdobrar a idéia do artigo e irei expor melhor esta nova forma proposta para aprendizagem, enriquecendo-a com exemplos, e mostrando os próximos passos.

4 Comentários para A Essência da Programação – Parte II

  • Sales

    O primeiro parágrafo está assim 10!!! Estava pensando qual seria a sua opinião depois de tantos comentários “discutíveis” no artigo anterior. Só achei estranho no início: computador “pensando”? Mas, ao longo do documento achei bem colocadas as anologias.
    Outro ponto que achei interessante foi a forma que encontrou para ir disseminando “conhecimentos acadêmicos” com os exemplos.
    Idéia boa.
    Aguardo o próximo.

  • Andre Luiz

    Cara, gostei dessa sua maneira de encarar o aprendizado de programação, comparando com o que existe lá dentro do computador. Pensar igual ao bicho ou entender como ele pensa. Isso aí é lógica crua e pura e depois de aprender isso, o aluno vai poder ir para qualquer linguagem mesmo.
    Só que aluno que nasceu para programador não vai querer ficar muito tempo nisso. Vai dar apenas um tempinho para ir programar de verdade. Gostei mesmo, mas isso aí so vale para um ou meio-semestre inicial. Mas vai dar uma boa base pro aluno.
    abç
    Andre

  • Mascarenhas

    Werther, me parece que você está fazendo uma adaptação melhorada do fluxogramo. Digamos, uma adaptação textual, não é isso? Seu raciocínio é interessante neste aspecto, “pensar como o computador pensa”, mas entendo que nem sempre devemos aprender da mesmo forma que funciona. Nem sempre a forma que funciona é a melhor forma de se aprender.
    Acho interessante esse método. É capaz de desenvolver o raciocínio lógico do iniciante, mas o distancia de uma linguagem de programação.

  • Oi, Mascarehas.
    Procurei pegar o lado bom do fluxograma, que é a ausencia de estruturas de programação (while, for, do, …) e foco apenas no algorimto lógico. E tentei colocar em uma notação mais compacta e mais fácil de utilizar. Com isso o aluno deve desenvolver o pensamento e raciocínio lógico. Não tenho a pretensão de que ele aprenda a programar e sim que ele adquira (ou desenvolva) raciocínio lógico e possa elaborar algorimtos simples na sua cabeça. Depois disso é que ele iria aprender a programar. Na minha ótica, aprender a programar diretamente queima uma etapa preciosa do aprendizado, que é o desenvolvimento do raciocínio lógico, tão importante para quem está iniciando. A falta dele pode ser um fator inibidor.
    Abraços, Werther