image

Acesse bootcamps ilimitados e +650 cursos pra sempre

60
%OFF
Pedro Junior
Pedro Junior28/06/2022 11:06
Compartilhe

Algoritmos: Bicho de Sete Cabeças? #communityweekchallenge

  • #Desperte o potencial

Apresentação

Já vi diversas vezes pessoas reclamando que programação de computadores é uma coisa difícil. Muitos reclamam que queriam aprender mas acham complicado, ou que tentaram aprender e não conseguiram. 


Com o passar do tempo, notei que todos nós possuímos capacidades iguais para o aprendizado. O que nos diferencia, na maioria das vezes, são as características das nossas oportunidades, e como lidamos com elas.


Aprender algoritmos é parecido com uma receita de bolo que a gente aprende a fazer com a mãe ou o pai na cozinha. De início fazemos uma certa “bagunça”, até por não ter certeza, ou por nos faltar experiência, mas o tempo e a prática fazem com que as nossas ideias e as habilidades sejam mais refinadas e, desta forma, conseguimos pensar mais claramente na tarefa. 


Algumas vezes, conseguimos nos retirar da equação e enxergar nossos problemas olhando “de fora da caixa”.


Decidi escrever este artigo como uma forma de repassar a você algumas das “receitas de bolo” que uso para resolver os mais diversos problemas, e como forma de ajudar aqueles que precisam de uma base para começar a estudar algoritmos, ou simplesmente tem curiosidade de se aventurar neste campo.


É óbvio que não podemos dizer que existe uma fórmula mágica para cada uma das coisas, mas se formos um passo de cada vez, algum dia a gente chega lá. Confesso que eu ainda estou caminhando, devagar e sempre, mas pode acreditar que a jornada vale a pena. O conselho (se é que dá para chamar assim) vale tanto para os iniciantes quanto para quem já começou a caminhada e às vezes desanima: 


Não desista! Cada problema é resolvido um passo de cada vez, e todos nós estamos destinados a coisas grandiosas.

Mas, afinal, o que é mesmo algoritmo?

A origem da palavra não é muito exata, mas relatos nos levam a crer que se originou dos estudos de um matemático e astrólogo persa chamado Mohamed ibn Musa al-Khwarizmi, nascido por volta do ano 780. Embora pouco se saiba sobre sua vida como um todo, sabe-se que viveu em Bagdá (Iraque), e trabalhou num centro de pesquisas científicas chamado de Casa da Sabedoria, onde estudou as obras de sábios árabes, gregos e indianos.

Também desenvolveu suas próprias teorias, criando maneiras de solucionar problemas matemáticos. Um de seus livros é considerado a origem da álgebra. Esta palavra se originou como uma variante da expressão al-jabr (algo como restauração), que buscava o equilíbrio entre os dois lados de uma equação.

A palavra Algoritmo tem origem na expressão “algorismo”, empregada para definir as regras de cálculo utilizando numerais hindus. Esta palavra evoluiu para “algoritmo” baseada na tradução do latim do nome al-Khwarizmi, por volta do século 18.

Esta mesma palavra foi utilizada como definição para qualquer procedimento finito empregado para resolução de problemas e realização de tarefas. O primeiro algoritmo escrito para computador é atribuído a Ada Lovelace (filha do Lorde Byron), em 1842.

O princípio de tudo

O mais importante para se chegar a uma solução é ter em mente que precisamos, antes de tudo, pensar na questão que buscamos resolver utilizando um algoritmo.

Muitas vezes isso é o que mais nos deixa confusos: o pensar. Por que motivos isso acontece? Normalmente não é muito claro o motivo pelo qual não conseguimos pensar em soluções para um determinado problema. Por várias vezes, dependendo de que tipo de problema for, gastamos bastante tempo até encontrar o caminho que funciona melhor para sua solução.

De uma forma geral, vamos precisar de três ferramentas:

  • Uma folha de papel em branco;
  • Um lápis (sim, um lápis mesmo);
  • Uma borracha (porque não é proibido a gente apagar tudo e começar de novo).

Pode parecer estranho neste ponto, mas no começo eu não recomendo a você utilizar o computador para resolver os seus primeiros algoritmos. A razão para isso é que não queremos distrair o nosso foco.

Para justificar este modo de pensar, vamos rever o conceito de algoritmo de Ada Lovelace:

ALGORITMO: Qualquer procedimento finito empregado para resolução de problemas e realização de tarefas.

Veja que o conceito não serve apenas para problemas. Também pode ser aplicado em tarefas. Logo, um algoritmo pode ser aplicado em outras áreas que não sejam atividades de computação. 

Como um exemplo, dependendo de quem aplica, um algoritmo também pode ser chamado por outros nomes, tais como processo e até ser chamado de procedimento ou receita.

Devagar, vamos longe!

Para que possamos trabalhar na resolução de um problema ou realização de uma tarefa utilizando algoritmos, vamos precisar aprender a fazer a decomposição daquela tarefa em etapas mais simples, de uma forma que possam ser melhor compreendidas. Mesmo sendo decomposta em etapas menores, o algoritmo deve ser capaz de realizar a tarefa por completo para que tenhamos sucesso.

Antes de partir efetivamente para a programação, em qualquer linguagem (computacional) que seja, temos que tomar nota de tudo que precisamos fazer. É sempre bom utilizar algum tipo de linguagem escrita que possa ser entendida mesmo por quem não tem contato mais aprofundado com os computadores.

Uma boa ideia é escrever em seu idioma, da forma mais clara possível. Para que possamos trabalhar juntos, vou colocar algumas dicas a seguir:


  1. Escreva em linguagem natural clara e de forma sucinta (em qualquer idioma);
  2. Utilize verbos no infinitivo (como se fossem os “comandos”);
  3. Sempre escreva um passo para cada etapa da resolução da tarefa;
  4. Releia seu algoritmo depois que terminar, e tente visualizar os passos da melhor forma possível, para garantir que o objetivo do algoritmo seja totalmente cumprido.

Vamos tentar escrever uma versão deste algoritmo:

Você gosta de bombons de chocolate meio-amargo. Sua mãe, sabendo disso, comprou uma caixa de bombons e deu um bombom para cada pessoa da família. Descreva as etapas necessárias para comer o bombom, do início ao fim.

INÍCIO
  Etapa 1: Escolher um bombom na caixa
  Etapa 2: Pegar o bombom da caixa
  Etapa 3: Desembrulhar o bombom
  Etapa 4: Comer o bombom
  Etapa 5: Colocar a embalagem no lixo
FIM

Veja que o algoritmo tem um número finito de etapas, representando todas as fases necessárias para comer o bombom. Dependendo da forma como quem escreve o algoritmo interpreta o enunciado (ou o problema) que precisa resolver, esta solução pode ter várias versões diferentes, levando em conta a quantidade de passos e a lógica de cada um de nós.

Estou certo ou errado?

Uma das coisas mais importantes, além da própria resolução do problema proposto, é que respeitemos nosso próprio estilo de trabalho e também o estilo de outras pessoas.

Podemos dizer com certeza que dois algoritmos que diferem entre si, mas que solucionam um mesmo problema não estão errados. Eles podem ser diferentes interpretações de uma situação que precisa ser resolvida. Pode parecer complicado agora, mas com o tempo e a prática, você chega lá.

Outra coisa que notamos com o passar do tempo é que existem diversas formas de escrever algoritmos ou mapear problemas a serem resolvidos. Agora veremos alguns conceitos elementares para que você possa continuar a escrever seus algoritmos.

Variáveis e Tipos de Dados

As variáveis são como caixinhas onde guardamos os nossos valores. Podem ser grandes ou pequenas, como vagas num estacionamento para diversos tipos de veículos, ou caixas de sapato de tamanhos diferentes onde guardamos os sapatos dos membros da nossa família.

Sendo assim, podemos dizer que as variáveis ocupam espaços diferentes de memória de acordo com o tipo de dado que guardam. Normalmente temos os seguintes tipos

  • Números inteiros - Guardam números inteiros, sem casas decimais.
  • Números com casas decimais - Guardam números uma ou mais casas decimais.
  • Caracteres (fixos) - Guardam uma sequência fixa composta de uma ou mais letras, sempre do mesmo tamanho.
  • Caracteres variáveis (ou strings) - Guardam uma sequência de caracteres, podendo ser variável ou até um certo limite de caracteres.
  • Booleanos - Guardam um valor fixo, que varia entre verdadeiro (1) ou falso (0).

Dessa forma poderemos armazenar e manipular valores de acordo com a nossa necessidade durante a execução do algoritmo.

Você se lembra que, anteriormente, eu falei em tamanhos na memória? Lembre-se que os tamanhos da sua estrutura de dados na memória vão depender da linguagem utilizada por você, que pode lidar com o espaço de memória do computador de maneiras diferentes.

Consulte sempre a documentação para saber mais sobre os limites ou espaços de memória.


Operadores e Estruturas de Controle

Para algoritmos mais complexos vamos precisar utilizar, além das variáveis, operadores (de atribuição, lógicos e aritméticos, por exemplo) e estruturas de controle de fluxo e de decisão. Vamos falar um pouco sobre cada um a seguir:

Operador de Atribuição

Este operador é usado para atribuir valores a variáveis. Geralmente é representado pelo sinal de igualdade. Caso não seja esse o operador de atribuição, verifique a documentação da sua linguagem de programação.

Operadores Aritméticos

Os operadores aritméticos são aqueles que conhecemos desde crianças, quando aprendemos a calcular. Basicamente são quatro, mas podemos ver outros pelo caminho quando estudamos computação. Veja:

Operadores de soma, subtração, multiplicação e divisão - Representados pelos sinais +, -, * e /, executam os cálculos matemáticos mais triviais. 

Veja os exemplos:

2 + 2 = 4
4 - 1 = 3
4 * 2 = 8
4 / 2 = 2

Podemos acrescentar ainda um quinto operador chamado de módulo (ou resto), que retorna o resto da divisão entre dois números. Este operador é representado pelo símbolo %. Veja:

10 % 4 = 2

Operadores Lógicos 

Os operadores lógicos são aqueles que representam comparações entre os números e sempre retornam um valor entre verdadeiro ou falso. Também são chamados de operadores booleanos.

O conjunto básico desses operadores, presente na maioria das linguagens, é composto pelos operadores E (AND), OU (OR), NÃO (NOT), IGUAL (= =) e DIFERENTE (!= OU <>).

Utilize estes operadores para comparar ou agrupar valores, quando necessitar saber se uma expressão é verdadeira ou falsa. Veja o exemplo:

INICIO
numero1 = 4
SE (numero1 == 4)
  ESCREVA “Quatro”
SENÃO
 ESCREVA “Não é quatro”
FIM_SE
FIM

Pergunta: O que o algoritmo acima escreveria na tela?

Estruturas de decisão

As estruturas de decisão são representadas por pontos onde a execução do algoritmo é suspensa até uma decisão ser realizada com base nas condições estabelecidas. No exemplo anterior, utilizamos a estrutura SE..SENÃO…FIM_SE para comparar valores. É justamente isso que uma estrutura de decisão faz. Ela permite que comparemos valores com determinada condição para seguir com a execução de acordo com essa decisão.

Estruturas de repetição

As estruturas de repetição são estruturas elementares que executam determinadas partes do seu código quando uma condição ou conjunto de condições é satisfeito. é semelhante às estruturas de decisão, mas geralmente envolve a repetição das etapas num determinado número de vezes que pode ser fixo ou variável, dependendo da condição.

Geralmente temos três estruturas desse tipo:

PARA….ATÉ…PRÓXIMO

A estrutura PARA…ATÉ…PRÓXIMO permite que sejam executadas determinadas instruções repetidamente, com base em um valor, veja só o exemplo para escrever os números de 0 a 10:

INÍCIO
  NUMERO = 0
  PARA NUMERO=0 ATÉ NUMERO <= 10, NUMERO +1
      ESCREVA NUMERO
  PRÓXIMO
FIM


FAÇA…ENQUANTO

A estrutura FAÇA…ENQUANTO executa o bloco de código e faz um teste para verificar se a condição para sair da repetição é verdadeira. Portanto estruturas desse tipo executam o bloco pelo menos uma vez. Veja o exemplo:

INÍCIO
  NUMERO = 0
  FAÇA 
      ESCREVA NUMERO
  NUMERO +1
  ENQUANTO NUMERO <= 10
FIM

Importante: Quando usar este tipo de estrutura sempre altere sua variável de controle (a que é testada na condição) ao final do bloco para evitar repetições infinitas e travamento do seu algoritmo.

ENQUANTO…FIM_ENQUANTO

A estrutura ENQUANTO…FIM_ENQUANTO faz um teste para verificar se a condição para sair da repetição é verdadeira antes de executar o código dentro do bloco. Portanto, estruturas desse tipo podem executar o bloco de código ou não. Veja o exemplo:

INÍCIO
  NUMERO = 0
  ENQUANTO NUMERO <= 10
      ESCREVA NUMERO
  NUMERO +1
  FIM_ENQUANTO
FIM

Importante: Quando usar este tipo de estrutura sempre altere sua variável de controle (a que é testada na condição) ao final do bloco para evitar repetições infinitas e travamento do seu algoritmo.

Português? Inglês? Como assim?

Veja que escrevi os exemplos usando a língua portuguesa. Isto é chamado de Pseudocódigo ou ainda Portugol, quando escrevemos o código como uma forma de exemplificar como seria um algoritmo. Experimente fazer o mesmo em inglês e comparar com uma linguagem de programação. Vai ficar bem parecido!

Indo mais além

Você também poderá usar fluxogramas (flow charts ou flow diagrams), mapas mentais e diagramas de modelagem de processos (usando a notação BPMN, por exemplo) para chegar a soluções que pode aplicar na resolução de problemas, sejam problemas hipotéticos ou que remetem a situações reais. Pesquise mais sobre o tema, você vai gostar!

Exercícios

Para exercitar as suas habilidades, deixo aqui uma lista de exercícios que você pode utilizar:

  • Calcular a soma de dois números
  • Calcular a média aritmética de duas notas
  • Verificar se um número é par ou ímpar
  • Calcular a idade de uma pessoa recebendo o ano de nascimento e o ano atual

Conclusão

Espero ter ajudado você a dar mais um passo na direção do seu objetivo ao participar da #communityweekchallenge. Não esqueça que, na busca pelo conhecimento, somos todos navegantes nesse mesmo mar.

Um abraço, e até a próxima!

Compartilhe
Comentários (1)
Paulo Franco
Paulo Franco - 28/06/2022 21:34

Obrigado,pelas explicações!