<Direto ao Ponto 35> Visualizando os algoritmos
- #Informática Básica
Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )
Olá, dev!
Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO. Ele vai tratar da relação entre os algoritmos e as linguagens de programação.
Sumário
1. Introdução
2. Os algoritmos computacionais
3. Linguagens estruturadas
4. Fluxogramas para a programação
5. Considerações finais
6. Referências
1 – Introdução
Eu criei a série de artigos DIRETO AO PONTO com o objetivo de apresentar, de forma simples e direta, conhecimentos básicos da programação e de computação, principalmente, para os iniciantes.
Aqui, são tratados de temas como lógica de programação, linguagens, hardware dos computadores, história da computação e assuntos relacionados à plataforma da DIO, como a escrita de artigos e os desafios de código.
Neste artigo, serão tratados os detalhes dos algoritmos e sua relação com as linguagens de programação.
No artigo anterior, falei sobre a Lógica de programação e dos algoritmos, computacionais ou não.
2 – Os algoritmos computacionais
Os algoritmos computacionais são usados desde o início das primeiras linguagens de programação, e até mesmo antes delas.
Segundo ISAACSON [1], a história da computação considera que o primeiro algoritmo computacional foi criado por Ada Lovelace, por volta de 1843, antes da invenção do computador e das linguagens de programação.
Em um artigo, ela destalhou, passo a passo, um programa para calcular números de Bernoulli, uma série infinita de extrema complexidade, na Máquina Analítica criada por Charles Babbage.
100 anos depois, por volta de 1944, outra referência histórica importante foi Grace Hopper, que criou algoritmos para se programar no ENIAC, um dos primeiros computadores eletrônicos existentes, em 1944.
Hopper sabia como traduzir problemas do mundo real em equações matemáticas, e estas equações em comandos que a máquina podia entender, dividindo cada problema de física ou cada equação matemática em pequenos passos aritméticos.
Eu aprendi a programar com a linguagem FORTRAN, em 1980, numa época que a instrução GO TO era usada para prover o fluxo dos programas, tanto na implementação de comandos de decisão quanto de repetição. Esta instrução era a principal causa do chamado código “spaghetti”, que comparava o fluxo de programas desta e de outras linguagens da época a pratos de espaguete, com o fluxo indo de cima para baixo e de baixo para cima em vários locais do programa, dificultando a legibilidade dos programas ao extremo.
A figura seguinte mostra um exemplo de código escrito em FORTRAN para um programa simples, que realiza um de 3 cálculos possíveis, dependendo da comparação entre dois valores inteiros.
O algoritmo deste programa poderia ser, por exemplo:
Ler A
Ler B
Se A = B, RESULTADO = A + B
Se A > B, RESULTADO = A – B
Senão, RESULTADO = B – A
Imprimir “RESPOSTA = “, RESULTADO
Para os valores codificados, de A = 5 e B = 3, teremos a saída “RESPOSTA = 2”, pois 5 > 2 e a operação realizada é 5 – 3.
Note como é difícil seguir o fluxo das instruções no código. Ainda pior é quando o programa apresenta algum erro de lógica e é preciso alterá-lo, adicionando novo código (novos comandos GO TO) a uma lógica já difícil de seguir.
As primeiras linguagens de programação não eram estruturadas, por isso o fluxo da execução das instruções era tão confuso, com desvios baseados em comandos GO TO.
Foi com este tipo de código que eu aprendi a programar com FORTRAN, em 1980, perfurando cartões. A perfuradora de cartões não oferecia letras minúsculas, era tudo com maiúsculas. Por isso, os programas antigos em FORTRAN (e em COBOL) eram todos escritos em maiúsculas!
3 – Linguagens estruturadas
Felizmente, o FORTRAN evoluiu e, após várias versões (I, II, III, IV e 66), foi lançada uma versão estruturada, o FORTRAN 77.
Nesta versão, foram oferecidos comandos de repetição que agrupavam blocos de instruções individuais como DO/ WHILE, por exemplo, bem como comandos de decisão, como IF/THEN/ELSE.
Desta forma, a codificação de um algoritmo, como uma sequência de passos lógicos se tornou bem direta.
Um algoritmo é um conjunto ordenado de ações que são realizadas sequencialmente e pode ser implementado como uma sequência de instruções e blocos de comandos integrados.
A figura a seguir mostra o mesmo programa anterior, escrito em FORTRAN estruturado, com os blocos de comando IF-THEN-ELSE ao invés do comando GOTO. Mesmo que não tenha indentação (nem se falava disso naquela época), veja como fica mais fácil de identificar os blocos de código nos comandos IF-THEN-ELSE, e a sequência de comandos individuais. Além disso, o código fica muito mais parecido com o algoritmo.
4 – Fluxogramas para algoritmos
Os algoritmos podem ser representados por pseudocódigo ou por fluxogramas.
Os primeiros fluxogramas utilizados para representar algoritmos ou codificação eram muito parecidos com os fluxos de execução de códigos implementados por comandos GOTO, com as setas indicando fluxo indo para uma ou outra instrução, adiante ou mesmo atrás do código já escrito.
A figura a seguir mostra um exemplo de fluxograma desenhado para o primeiro algoritmo, com as ações já sendo representadas por código.
No livro que eu aprendi FORTRAN 77, HEHL [2] mostrava outro tipo de fluxograma, criado especificamente para representar os blocos usados na programação estruturada. Era o diagrama de Nassi-Schneiderman, criado por Isaac Nassi e Bem Schneiderman, também conhecido por Diagrama de Chapin.
Ele é uma ferramenta gráfica e foi criado para ser hierárquico, com o objetivo de representar as estruturas da programação estruturada. Basicamente, ele oferece estruturas para representar ações sequenciais, tomadas de decisão, e comandos de repetição. A execução de suas ações é sequencial, a não ser que seja encontrado um bloco de seleção ou de repetição, que determina fluxos diferentes.
As estruturas principais são mostradas abaixo (ver figura em seguida):
Blocos de execução sequencial – representados por retângulos em sequência. Quando um é encontrado, sua ação é executada e passa-se ao bloco seguinte (pode ser usada por declarações de variáveis, comandos de atribuição, de entrada/saída, chamadas a funções, etc);
Bloco de repetição – representado por uma condição e uma sequência de blocos sequenciais, que se repetem de acordo com o resultado da condição. Existem 2 tipos, um com a condição no início (para comandos WHILE-DO e FOR, por exemplo) e outro com a condição no final (para comandos DO-WHILE e REPEAT-UNTIL, por exemplo);
Bloco de seleção – representado uma condição, que define o fluxo de execução por um de 2 caminhos alternativos, depende se ela é verdadeira ou falsa (pode ser usada para comandos IF-THEN-ELSE ou ainda SWITCH-CASE);
A figura a seguir mostra um diagrama Nassi-Schneiderman para o algoritmo do exemplo inicial deste artigo:
Eu acho que ainda se pode melhorar o visual deste diagrama, acrescentando cor e simplificando os blocos, usando como base os blocos coloridos oferecidos pela linguagem de programação visual ”Scratch”. (não conhece? Aguarde o próximo artigo, que falarei dela aqui).
5 – Considerações finais
Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO.
Desta vez, foram apresentadas as características dos algoritmos e fluxogramas antigos, do tempo das linguagens de programação não estruturadas, e sua evolução para novas formas gráficas de se representar algoritmos e comandos de linguagens de programação.
Foi mostrada a dificuldade de se codificar neste tipo de linguagens, principalmente pelo uso de instruções GO TO, que transformavam o programa em um emaranhado de idas e vindas às suas instruções , parecendo um prato de espaguete (por isso mesmo chamados de códigos “spaghetti”).
Após o lançamento das linguagens estruturadas (FOTRAN 77), também surgiram novas ferramentas parta representar algoritmos e codificação, como o diagrama de Nassi-schneiderman, tornando mais fácil o entendimento dos algoritmos e permitindo uma adequação direta entre o algoritmo e o código estruturado das novas linguagens.
Hoje, existem aplicações e linguagens de programação visuais, como “Scratch”, usadas para ensinar programação a crianças e adolescentes de forma bem intuitiva.
No próximo artigo, eu vou falar sobre a linguagem Scratch e como ela pode ajudar os iniciantes a entrarem no mundo da programação de maneira bem divertida, podendo criar até animações e jogos de maneira bem fácil!
6 – Referências
[1] ISAACSON, Walter. Os Inovadores – Uma biografia da revolução digital. Companhia das Letras, 2014.
[2] HEHL, Maximilian, Linguagem de Programação Estruturada - FORTRAN 77. McGraw-Hill Brasil, 1986.
Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )