Article image
Fernando Araujo
Fernando Araujo08/08/2024 12:53
Compartilhe

<Direto ao Ponto 34> Os algoritmos e a Lógica de Programação

  • #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 lógica de programação e dos algoritmos, base de toda a programação de computadores.

 

Sumário

1.   Introdução

2.  Lógica de programação

3.  Os algoritmos

4.  Considerações finais

5.   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, tratarei dos algoritmos, base de toda a programação de computadores.

 

É quase unanimidade que todo programador deve começar seus estudos pela Lógica de programação, que se confunde com os algoritmos, na prática, sem considerar a parte conceitual teórica.

 

Hoje, é muito comum um dev receber uma demanda e correr logo para codificar.

Em 1980, quando eu aprendi a programar, para o mainframe da universidade, em FORTRAN e perfurando cartões, a gente começava esboçando um algoritmo da solução do problema.

 

Depois, era rabiscado um fluxograma, que dava uma visão do relacionamento, sequenciamento e das dependências entre os diversos passos do algoritmo.

 

Só depois a gente criava o código, escrito no papel, o que seria a primeira implementação do algoritmo. Aí, a gente fazia um teste de mesa, simulando a execução do algoritmo, no papel, passo a passo, anotando os novos valores das variáveis a cada instrução executada.

 

Esse teste permitia visualizar claramente o comportamento do programa que seria escrito, ajustar os limites dos loops (malhas de repetição), os fluxos das decisões, os dados de entrada, os cálculos que seriam realizados e a saída desejada.

 

Caso precisasse de alterações no código, a gente fazia no papel e repetia o teste de mesa.

 

Como demorava 2 horas para receber uma listagem do programa submetido á execução, mostrando a saída ou os possíveis erros de digitação ou lógica, era muito importante acertar a digitação e a lógica de primeira, senão, o programa levava dias até rodar corretamente e dar o resultado desejado.

 

Se você achou isso interessante, leia os meus primeiros artigos aqui na DIO, nos quais detalho a saga de aprender a programar no início dos anos 80 (links na seção de referências).

 

 

2 – Lógica de programação

 

A primeira coisa que dizem a um programador iniciante é que ele deve começar pela Lógica de programação. Alguns até dizem que se deve começar pelo estudo de Raciocínio Lógico.

 

O Raciocínio Lógico usa a lógica para resolver problemas, fazer inferências e tomar decisões, baseadas em um conjunto de regras ou dados. Ele envolve a aplicação de princípios lógicos para entender, analisar e resolver questões de forma sistemática, em qualquer área.

 

O Raciocínio Lógico se baseia em:

·        Raciocínio dedutivo – parte de premissas gerais para chegar a conclusões específicas;

·        Raciocínio indutivo – parte de observações específicas para formular generalizações ou teorias;

·        Raciocínio abstrato – usa conceitos e ideias abstratas (como equações matemáticas) para resolver problemas complexos.

 

 

Já a Lógica de Programação é um subconjunto do Raciocínio Lógico, voltada apenas ao desenvolvimento de algoritmos para a programação. Por definição, um algoritmo é uma sequência ordenada e finita de passos para realizar uma tarefa.

 

Ele envolve a divisão de um problema complexo em partes menores e mais gerenciáveis, definição da ordem correta de ações e o uso de estruturas de decisão e repetição de ações.

Em programação, um algoritmo é uma sequência ordenada de instruções que um computador deve seguir. Na prática, ele define uma sequência de ações individuais, ou blocos de ações interligadas, que definem estruturas de decisão, de repetição, ou mesmo funções.

Um algoritmo define O QUE FAZER, mas não COMO FAZER as ações. Isso é tarefa para a codificação, que é implementada por alguma linguagem de programação, por meio de suas instruções, variáveis, estruturas de dados, estruturas de controle de decisão e repetição.

 

3 – Os algoritmos

 

Um algoritmo não é um conceito de programação, podendo ser aplicado até na definição dos passos para a realização de tarefas do cotidiano. Por exemplo, para trocar uma lâmpada, fazer um bolo, trocar um pneu, dirigir até um lugar desconhecido, por exemplo.

 

Vamos ver o algoritmo para uma tarefa simples do cotidiano, trocar uma lâmpada:

 

Imagine que a lâmpada da sua sala não acende mais e agora você precisa trocá-la. Um algoritmo básico para fazer essa troca poderia ser o seguinte:

 

1.    Pegar a escada;

2.    Pegar uma lâmpada nova;

3.    Subir na escada;

4.    Retirar a lâmpada queimada;

5.    Colocar a nova lâmpada no bocal;

6.    Descer da escada;

7.    Testar a lâmpada nova;

8.    Se acender, terminou;

9.    Senão, começar de novo, no passo 1.

 

Veja que os passos são ordenados, pois não adiantaria nada descer da escada primeiro se não tivesse subido antes (dãããããããããã). Ou colocar a lâmpada nova sem ter tirado a lâmpada queimada!

 

Parece óbvio, não é? Será mesmo?

 

Um fluxograma para este algoritmo seria assim:

 

 image



Agora imagine que você vai viajar e passar uns dias fora de casa, sem nenhum contato externo. Você mora sozinho e vai deixar seu robô doméstico humanoide (com pernas e braços, daqueles da Boston Dynamics), de última geração, programado para resolver qualquer problema que aconteça na sua casa. 

 

Aí, a lâmpada da sala queima (a mesma que você havia trocado rapidamente aí em cima!). O robô foi programado com o mesmo algoritmo que você usou para trocar a lâmpada antes e vai trocá-la em segundos.

 

No entanto, várias coisas podem dar errado!

A ação de subir na escada pode ser impactada se a faxineira trocou as coisas da despensa de lugar e as lâmpadas foram parar dentro da gaveta de ferramentas, por exemplo. O mesmo pode acontecer com colocar a nova lâmpada no bocal,  pois o zelador usou a escada para consertar o telhado e a guardou em outro lugar. E se o teste da lâmpada nova falhar? O que fazer? O algoritmo não mostra, pois encerra ali.

 

E agora??? O que o robô irá fazer?

Um ser humano saberia o que fazer com muito mais agilidade do que o robô, que não tinha sido programado para sair dessa situação.

 

Como eu disse, o robô teria que ser programado para seguir em cada uma das situações imprevistas que possam ocorrer, tornando o algoritmo completi muiro mais detalhado e complexo. Se ele não conseguisse sair de alguma delas, agiria como foi programado pelo fabricante para não entrar em loop infinito ou no modo pânico!!

 

Eu imagino as coisas absurdas que o robô iria fazer para sair de cada situação sem as instruções dadas claramente:

Subir na escada: ele poderia subir na escada deitada no chão da sala, pois não foi dito para levantá-la antes de subir.

Pegar uma nova lâmpada: ele teria que saber onde estavam as lâmpadas e como era a lâmpada da sala, pois poderia haver vários tipos de lâmpada nos cômodos da casa.

Apertar o interruptor para testar a lâmpada nova: Se faltasse energia após o robô trocar a lâmpada, ele passaria o dia todo testando a lâmpada, achando que a nova também estava queimada e trocaria ela de novo. E de novo, e de novo e de novo...

 

Ao final, o robô ainda teria que guardar a escada no lugar e jogar a lâmpada queimada no lixo, ações não explicitadas no algoritmo.

E por aí vai...

 

Se você acha que eu estou sendo muito rigoroso e detalhista com o coitado do robô, imagine a complexidade dos algoritmos de veículos autônomos, que precisam se virar para resolver todo e qualquer problema imprevisto que surge e continuar seu trajeto e operação para cumprir um objetivo definido.

 

Você acha óbvio fazer um algoritmo para uma situação do cotidiano? Tem certeza?

 

Então elabore um algoritmo para trocar o pneu de um carro e depois mostre para alguém com experiência nesta tarefa. A maioria das pessoas costuma esquecer de 2 ou 3 passos essenciais nesta tarefa!!

 

A diferença entre um algoritmo comum (do cotidiano) e um algoritmo computacional é que no computacional, que será implementado em um computador (ou num robô computadorizado) é que TODOS os passos para resolver o problema devem estar escritos explicitamente, pois ele só vai fazer o que for mandado. E só isso!

 

Exemplo de Algoritmo Computacional

 

Como exemplo, vamos ver um algoritmo para um problema simples.

Faça um algoritmo para um programa que vai ler 2 números inteiros, dividir o primeiro pelo segundo e imprimir o resultado.

 

1.   Ler o primeiro número

2.   Ler o segundo número

3.   Dividir o primeiro número pelo segundo

4.   Imprimir o resultado

 

O fluxograma é mostrado abaixo:


image


Parece simples, não é? Pense um pouco e diga quais são as informações não dadas no algoritmo precisariam ser passadas para o computador para garantir que o programa funcionaria, ou seja, que não quebraria?

 

De cara, eu penso logo em algumas:

  • E se o usuário digitasse dados de entrada que não fossem números?
  • E se o segundo número digitado fosse zero?
  • Se você rodar o programa assim, como o usuário saberia que precisaria digitar um número, e em seguida, outro número?
  • Como ele saberia que o objetivo do programa era imprimir o resultado da divisão de um número por outro?

 

Eu pensei em outras possibilidades, mas fique livre para listar outras que você pensou. Todos estes detalhes devem ser codificados para que o programa funcione bem e que a resposta seja adequada ao que ele se propõe a resolver. Assim, o algoritmo básico não resolveria tudo sozinho e precisaria de muito mais detalhes para resolver todos os imprevistos e casos especiais que surgiriam.

 

 

 4 – Considerações finais

 

Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO.

 

Desta vez, foram apresentados os conceitos práticos da Lógica de Programação e dos algoritmos.

 

A Lógica de Programação tem um contexto aplicado na programação, e é baseada no raciocínio Lógico, que tem um contexto bem mais geral, sendo baseado na lógica matemática formal.

 

Basicamente, um algoritmo é uma lista ordenada de ações que visam realizar uma determinada tarefa. Em programação, o algoritmo aponta para as instruções que deverão ser usadas na codificação por alguma linguagem.

 

Foram mostrados exemplos de algoritmos aplicados ao nosso cotidiano (trocar uma lâmpada) e para um problema simples de programação (ler 2 números e dividir um pelo outro).

 

Ficou claro que um algoritmo precisa lidar com muitos casos extras e situações imprevisíveis, mas que ocorrem na prática, para que ele modele corretamente uma situação que se deseja resolver.

 

No próximo artigo, eu ainda vou falar sobre os algoritmos, associando detalhando suas ações com as instruções de uma linguagem de programação.

 

 

5 – Referências

 

Todo o conteúdo deste artigo foi tirado do que eu aprendi (e me lembro) sobre o assunto desde o início da minha carreira como programador, desde os anos 80 até agora. Por isso, não vou listar nenhum a referência de livros nem de sites.

 

No entanto, vou listar artigos que eu escrevi sobre assuntos tratados aqui:

 

 

COMO ERA PROGRAMAR EM 1980?

 

Dinossauros 1 - Como virei um programador (com FORTRAN!!!) em 1980?

 

Dinossauros 2 - E como era essa tal de linguagem FORTRAN?

 

 

 ALGORITMOS

 

Iniciantes 4 – Algoritmos e Estruturas de Dados

 

Algoritmos x Algoritmos computacionais

 

  

TESTE DE MESA

 

Como fazer o Teste de Mesa manual

 

 

 

Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )

Compartilhe
Comentários (2)
Fernando Araujo
Fernando Araujo - 08/08/2024 14:41

Obrigado, Luiz!! Estamos juntos nesta tarefa de escrever artigos e passar nossa experiência para os mais novos na programação!!

Luiz Café
Luiz Café - 08/08/2024 14:29

Mais um artigo completo e muito útil. O aprendizado com seus artigos é uma recompensa impagável. Parabéns pelo conteúdo.