Algoritmos, Lógica

Algoritmos, Parte I – Conceito

Fala Desenvolvedores!!!

Estou começando esta série de artigos pois senti em alguns fóruns que um pessoal gosta bastante de falar sobre Spring, Struts, Hibernate, JSP, JSF, etc, mas acaba esquecendo (ou não aprendendo) alguns conceitos mais fundamentais. Também vi que muitas dúvidas são relacionadas a algoritmos, estruturas de dados, etc, principalmente em relação ao pessoal que está começando agora nesse divertido muito do desenvolvimento de software.

Estou falando deles: Os Algoritmos! Sim, temidos por uns, adorados por outros e ignorados por mais outros. O estudo sobre Algoritmos aparece normalmente no início dos cursos relacionados à Computação e depois acabam sendo deixados mais de lado, tanto pelo curso, como pelo estudante. Ok Alexandre, então qual será o foco desta série? Vamos lá!

Objetivo da série
O objetivo é simples: revisarmos sobre alguns conceitos teóricos e colocar a mão na massa em diversos problemas clássicos que aparecem nos cursos relacionados à computação e resolver outros problemas nem tão clássicos, que aparecem em cursos ligados à Matemática, como alguns problemas matemáticos clássicos dos cursos do IME-USP por exemplo.

Neste primeiro artigo vamos relembrar alguns conceitos e enfatizar os motivos do estudo sobre Algoritmos, bem como a importância de saber lidar com problemas clássicos e criar uma base um pouco mais sólida para a resolução de problemas mais complexos no seu ambiente de produção.

Como de costume, farei uma introdução bem básica a ponto de revoltar alguns que já sabem, mas com o intuito de realmente nivelar o conhecimento sobre o assunto e conseguir ajudar o pessoal que realmente está começando. Após alguns artigos, tenho certeza que colocarei algum exemplo que fará até o mais experiente pensar mais que 30 segundos! 🙂

Para os mais apressados, vou adiantar quais o assuntos que pretendo discutir (tentar!):

– Conceito e definição de Algoritmos
– Resolução de problemas com inteiros, com condições, com repetições, com vetores e matrizes
– Funções
– Pilhas
– Filas
– Análise de Algoritmos
– Classificação de tabelas
– Busca de registros

Ambiente utilizado
Na verdade a idéia é falar sobre Algoritmos e não sobre linguagens. Logo, você pode ler normalmente os artigos e aplicar os exemplos em Java, C, Pascal (normalmente estas 3 são utilizadas de forma acadêmica) mas sinta-se à vontade para utilizar a que você estiver acostumado.

Os Algoritmos (logo vamos resumir mais decentemente) são basicamente sequências de passos, ou seja, definiremos tais passos para a resolução de um problema específico e só no último momento (eu diria até o menos importante) passaremos para a linguagem.

Qual utilizarei nos exemplos? Utilizarei Java e C. São as mais comuns neste tipo de estudo e o pessoal gosta!

Algoritmo pra quê?
Apesar de ser realmente importante o estudo de Frameworks em geral, de linguagens e etc, o estudo de algoritmos é vital para o desenvolvedor que pretende revolver problemas de programação no seu dia a dia.
Sem uma base razoável na resolução de Algoritmos, dificilmente um desenvolvedor conseguirá resolver problemas e se conseguir, é quase certeza que levará mais tempo que o normal.

É praticamente impossível um desenvolvedor ao longo do seu dia não precisar criar um algoritmo para a resolução de algum problema! Respiramos algoritmos ao longo do dia inteiro!

Definição
Definição em poucas palavras: Um Algoritmo é uma sequência de passos para chegar em determinado lugar. Pronto! Temos aquela definição clássica do Algoritmo sendo uma receita de bolo, que nada mais é do que uma sequência de passos para chegar ao bolo pronto.

Na computação, usamos os Algoritmos para resolver determinados problemas. Em certas situações precisamos também resolver este mesmo problema, mas com uma velocidade de processamento maior (discutiremos este ponto mais pra frente), ou seja, temos agora um outro algoritmo para resolver o mesmo problema, mas de forma diferente.

Primeiro problema
Vamos começar já analisando um primeiro problema e a partir dele já vamos deixar mais clara a idéia dos “passos para chegar em determinado lugar”. Como um algoritmo nasce? Ele nasce a partir de um determinado problema. Então vamos criar um problema!

Problema: Fazer a divisão de um número por outro. Se o resultado for positivo, imprimir o número encontrado pela divisão, caso seja negativo, imprimir zero. Caso o divisor seja zero, imprimir o valor -1.

Para os que estão começando agora o texto pode parecer meio estranho mas é bem simples. Vamos começar a pensar sobre este problema em passos!

Possível primeiro passo:
– Pegar os dois números
Possível segundo passo:
– Verificar o valor do divisor, que no nosso caso é o B
Possível terceiro passo
– Se o divisor for zero, imprimimos -1, caso contrário continuamos felizes
Possível quarto passo
– Verificar se o número encontrado após a divisão é positivo ou negativo
Possível quinto passo
– Imprimir o número encontrado ou imprimir o valor zero.

Alexandre, por que “possível”? Simples: podemos ter outros passos além destes. Temos os famosos Baby Steps, onde podemos dar passos menores ainda que estes. Um algoritmo, apesar de ter passos bem definidos pode ter passos diferentes para o mesmo problema. Veremos alguns desses passos em um momento futuro.

Para ficar um pouco mais clara a sequência destes passos, vamos colocá-la em um fluxograma bem simples:

Não vamos detalhar o que é um fluxograma pois o desenho é bem simples. Ele detalha exatamente os passos que citamos.

Simples não? Basicamente pegamos um problema, dividimos o problema em possíveis passos e escrevemos um fluxograma bem simples para visualizarmos melhor o que queremos.

Resolvendo o problema em um pseudocódigo
Uma forma muito comum de se resolver problemas deste tipo, é resolvê-lo em um pseudocódigo, ou seja, um código “falso”, onde não escrevemos em uma linguagem específica e sim em uma linguagem mais próxima da nossa realidade, onde qualquer pessoa possa entender.

Esta forma é válida não somente pra quem está começando a desenvolver algoritmos mas também para algoritmos mais complexos. Alguns gostam de chamar esta forma de “Descrição Narrativa” dos passos a serem dados. A idéia é que qualquer pessoa realmente entenda o que está acontecendo.

Vamos lá:

Variáveis
A, B: Inteiros;
Inicio
   Escreva("Digite o primeiro número:");
   Lê o número e coloca na variável A;
   Escreva("Digite o segundo número:");
   Lê o número e coloca na variável B;
      Se (B = 0) Então
         Imprime -1;
      Se (A/B < 0) Então
         Imprime 0;
      Se (A/B > 0) Então
         Imprime A/B;
Fim

Simples não?
Vamos para um próximo problema!

Segundo problema
Segundo problema: O usuário digitará um número e vamos imprimir o quadrado deste número. Caso o usuário digite o número zero finalizamos o programa.
Desta vez já vamos pular para o pseudocódigo:

Vamos lá:

Variáveis
N: Inteiro;
Inicio
   Escreva("Digite o número desejado:");
   Lê o número e coloca na variável N;
   Enquanto (N diferente de 0)
   Inicio
      Imprime N*N;
      Escreva("Digite o número desejado:");
      Lê o número e coloca na variável N;
   Fim
Fim

Também bem simples. O sistema pede para o usuário digitar um número e verifica se esse número é zero. Se for diferente de zero, imprime o quadrado do número e caso seja zero, finaliza o programa.

Esta é uma forma simples e organizada de escrever os passos para a resolução de um problema. Note que realmente não precisamos de uma linguagem para resolver o problema. Não importa com o que resolveremos e sim como! É como pedir uma xícara de café: No Brasil e na China pedir um café é a mesma coisa, só mudamos a língua.

Que tal você resolver desta mesma forma um outro problema?
Terceiro problema
O sistema pede para o usuário digitar um número. Se o número for par, o sistema imprime o quadrado deste número e caso contrário imprime o cubo do número digitado.
Este problema nós vamos resolver no próximo artigo, já utilizando Java e C.

Finalizando
Pessoal, este artigo foi somente uma breve introdução sobre o estudo de Algoritmos(que é extenso) e foi também para lembrarmos sobre como podemos dar pequenos passos para a resolução de problemas e não necessariamente utilizando linguagens de programação.

No próximo artigo já vamos resolver alguns problemas clássicos utilizando Java e C, ou seja, estarei supondo que você já conheça um pouco da sintaxe de uma dessas duas linguagens.
Para você que está começando exatamente agora, sugiro dar uma pequena pesquisada sobre a sintaxe da linguagem de sua escolha para aproveitarmos melhor os exemplos que serão mostrados.

E lembro também que mais pra frente falaremos sobre um assunto que confunde bastante a cabeça de alguns, que são Pilhas, Filas e Pesquisa de registros, além do Cálculo do Tempo destes Algoritmos, ou seja, os “nem tão iniciantes” poderão tentar resolver os problemas também!

Abraços pessoal!!!

Advertisements

4 thoughts on “Algoritmos, Parte I – Conceito”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s