Article image
Adevan Santos
Adevan Santos28/02/2022 14:35
Compartilhe

Algoritmos : Uma abordagem prática para iniciantes

  • #Linux
  • #Python
  • #Java

Introdução

Um direcionamento comum para iniciantes em programação de computadores é entender e praticar a lógica de programação. Esta abordagem usa do paradigma estruturado para desenvolver código, focado principalmente em processos, funções e manipulação de dados em um único arquivo. Nesta fase, o estudante fará exercícios sobre estruturas de repetição, condicionais e funções.

No primeiro ano de graduação em Engenharia de Computação, o progresso feito por mim na área da Matemática e Física estava muito acima do que o progresso na programação de computadores. A solução escolhida foi revisitar todos os conceitos, resolver listas grandes de exercícios, entender o processo de solução era mais importante que saber se eu conseguia rodar em python. Se você está em uma situação parecida, não se preocupe porque esta angústia passa no longo prazo com dedicação.

Desafio 1 - Maior entre dois números

Depois de estudar estruturas condicionais, você pode elaborar um algoritmo que responda qual o maior valor entre dois números inteiros dados. Seu programa vai ler do usuário dois valores do tipo inteiro, e vai retornar uma mensagem indicando o maior (Considere que serão sempre números distintos). Como nós podemos resolver esse problema ? Papel e caneta ajudam na compreensão.

Exemplo 1 - Os números são 4 e 9

Recebo o 4 e o 9, agora precisa comparar estes elementos, utilizando o operador >(maior que). Façamos a primeira pergunta : 4 > 9 ? A resposta é não. O resultado é que o maior elemento é o 9, pois 4 não é maior que 9.

De maneira oposta, se eu adiciono primeiro o 9 e depois o 4, a pergunta feita será : 9 > 4 ? A resposta é sim. O resultado diz que 9 é o maior elemento. O seguinte programa feito no Portugol Webstudio é a materialização da nossa solução.

programa {
  funcao inicio() {
      inteiro a,b
      leia(a)
      leia(b)
      se(a>b){
          escreva("O maior valor inteiro é : "+a)
      }
      senao{
          escreva("O maior valor inteiro é : "+b)
      }
      
  }
}

Sugestão : Trate o caso de os dois elementos serem iguais

Entendo recursão

Uma função recursiva é uma função que tem a propriedade de chamar a si mesma direta ou indiretamente, pois é construída visando o pilar do pensamento computacional chamado decomposição. A decomposição tem como forma de abordar um problema decompor ele em subproblemas de maneira que a solução geral seja a junção das soluções de suas partes. Ao movimentar um armário de lugar na sua residência, você primeiro esvazia o móvel, transporta suas partes para o local desejado e depois soluciona o problema juntando tudo. A recursividade é divida em caso base e chamada recursiva.

O caso base é um ponto do processamento onde a função para de chamar a si mesma e resolve o problema de maneira direta, fornece um resultado direto. Na chamada recursiva, a função realiza o processo da decomposição, pois ela recebe o problema grande e quebra ele em partes cada vez menores com o objetivo de chegar no caso base, onde resolve o encadeamento das chamadas e apresenta a solução final ao seu chamador. Muito abstrato ? Calma que iremos exemplificar este comportamento.

Desafio 2 - Em busca do k-ésimo dígito

Escreva uma função que retorne o k-ésimo dígito (da direita para esquerda) de um inteiro n, k e n dados. Por exemplo, K_esimoDigito(2845, 3) = 8. Temos nosso problema e um exemplo. Papel e caneta, vamos ver como achar esse k-ésimo dígito

o 3 seria o número 8
3 2 1 0 --> Indíces
2 8 4 5 --> 3 elemento, direita para esquerda
^
|

Ao estudar este problema e fazer alguns casos de teste, podemos perceber o seguinte padrão de comportamento. Ao procurar o elemento 3 de 2845, é equivalente ao procurar o elemento 2 de 284, que é equivalente ao procurar o primeiro elemento de 28, resulta em 8. Parece que encontramos um caso base e uma chamada recursiva.

4 3 2 1 --> nossos indíces

2 8 4 5 --> me retorne o elemento 3

2 8 4 --> me retorne o elemento 2
  2 8 --> me retorne o elemento 1

O segredo deste comportamento o deslocamento da vírgula pelo valor, que pode ser obtida pela divisão com 10. Portanto, vamos a implementação no Portugol Webstudio, pois o nosso caso base é quando eu preciso do primeiro elemento (direita para esquerda) e a chamada recursiva se dar por índices decrementados e divisão por 10.

programa {
  funcao inicio() {
      inteiro a,b
      leia(a)
      leia(b)
      
      escreva("O k_esimo digíto é : "+k_esimo_digito(a,b))
      
      
  }
  
  funcao inteiro k_esimo_digito(inteiro n, inteiro k){
      inteiro d
      se(k==1){
          retorne n%10}
       
      senao{
          d=n/10
          k_esimo_digito(d,k-1)
      }
      
  }
}

Exemplo de implementação em linguagem C

#include <stdio.h>
  

  int k_esimoDigito(int n, int k)
  {
      
      int d;
      if(k==1){
          return n%10;
      }
      else{
          d=n/10;
          k_esimoDigito(d,k-1);
      }
      
  }
  

  int main(void)
  {
      int digito,n,k;
      
      printf("Digite um inteiro (n) ");
      scanf("%d",&n);
      
      printf("qual posição ? ");
      scanf("%d",&k);
  

      digito=k_esimoDigito(n,k);
      printf("Digito %d : %d",k,digito);
      return 0;
  }

Sugestão : Faça o famoso algoritmo do fatorial

Conclusão

Algoritmos resolvem problemas, um erro comum que eu cometia no início é não entender o problema e querer resolver mesmo assim. Se você começou há pouco tempo, sugiro assistir este vídeo do professor Gustavo Guanabara https://youtu.be/S9uPNppGsGo . Este vídeo é uma das primeiras aulas do curso de Python, mesmo que você não estude a linguagem Python assista este vídeo. Porém, se você começou e já caiu em alguma dificuldade sugiro assistir o vídeo do professor Fábio dos Reis, professor no canal Bóson Treinamentos https://youtu.be/Ou1m66rvJyE . Neste vídeo ele discute uma série de estratégias para vencer essas barreiras.

Propósito

Este artigo tem como objetivo compartilhar conhecimento com a comunidade da Digital Innovation One e participar do segundo Challenge da DIO Campus Expert 2022, onde tenho a função de ser embaixador da DIO na Universidade do Estado do Amazonas. Se você gostar do conteúdo, pode me ajudar de duas formas. Se você está na plataforma da DIO, marque a minha publicação como relevante, segue ela e comente na plataforma se você adotar alguma sugestão deste artigo, mas se você está vendo este artigo pelo Linkedin peço que curta e interaja com a publicação, apresente o seu ponto de vista ou a sua implementação dos problemas aqui abordados. Ao final, os melhores colocados ganharão um kit completo da DIO, com camisetas, copos, adesivos e muito mais. Conto com o apoio de vocês

Links :

Artigo no Linkedin : https://www.linkedin.com/pulse/algoritmos-uma-abordagem-pr%25C3%25A1tica-para-iniciantes-adevan-neves-santos

Códigos de exemplo : https://github.com/Adevan-Neves/Exercicios-Linguagem-C/tree/master/C%C3%B3digo

Compartilhe
Comentários (4)
Rafael Silveira
Rafael Silveira - 19/03/2022 18:37

Parabéns pelo artigo, certamente é relevante

Carla Silveira
Carla Silveira - 02/03/2022 13:54

Oi Adevan. Suas explicações foram bem didáticas. Parabéns!!

Djair Alves
Djair Alves - 01/03/2022 15:18

Olá, Adevan!

Rapaz gostei do artigo!

Só uma dica, os códigos estão com uns probleminhas, coisa pouca, mas para os iniciantes em programação pode ser que sofram um pouco até descobrir onde está o probleminha.

Não se preocupe, o problema é de sintaxe e também ausência de retorno em alguns locais.

Não estou colocando defeito, estou só dando a visão de onde podes refinar.

Quanto ao mais, parabéns!

Patrick Cordeiro
Patrick Cordeiro - 28/02/2022 14:57

Parabéns pelo artigo amigo, achei muito interessante!