Olá, aluno(a)! Nesta nova lição, nosso foco será mostrar como podemos criar e apresentar soluções de problemas por meio de programas, estes que são estruturas que tanto o computador quanto o próprio ser humano compreende. Os algoritmos são parte essencial da computação e, ao mesmo tempo, excelentes oportunidades para você explorar a sua criatividade.
Certamente, você já estudou algoritmos no componente curricular Lógica de Programação, porém, aqui, revisitaremos conceitos importantes e entenderemos o tema como parte fundamental na área de Ciência da Computação. Vamos lá?
O ser humano sempre se deparou com alguns problemas que são chamados clássicos. Por exemplo, durante muito tempo, um problema que impediu os avanços da corrida espacial era conseguir determinar a velocidade necessária para impulsionar os foguetes bem como o cálculo relacionado ao lugar onde, possivelmente, a cápsula de retorno cairia.
Também existem problemas teoricamente mais simples e que, durante certo tempo, não tinham solução. Por exemplo, há um deles o qual vemos a solução todos os dias, quando utilizamos o Google Maps: a menor distância entre dois pontos ou o problema do caminho mínimo. Este problema foi solucionado por um algoritmo criado por Edsger Dijkstra, em 1956. Tá a fim de conhecer a proposta dele?
Acesse: https://www.vivaolinux.com.br/script/Alg oritmo-de-Dijkstra
Se perguntassem a você o que o Google tem de mais valioso, o que responderia?
Se respondeu o algoritmo de busca, você acertou! O Google é um excelente exemplo de uma empresa que fez e faz muito sucesso em virtude da qualidade de seu algoritmo de busca. Além de ter excelente eficiência nessa atividade, ele também realiza a sua operação de maneira muito rápida. Já percebeu que, inclusive, ele mede isso?
Vá até google.com e faça uma busca por “Cristóvão Colombo” ou, se preferir, pode ser outro grande nome da História. O intuito é você observar os números relacionados à busca que aparece na página. Veja que, logo abaixo da barra de pesquisas, temos apresentados algumas ferramentas, como: Todas, Imagens, Maps, Vídeos, Notícias etc. e, abaixo desses ícones, a frase “Aproximadamente xx.xxx.xxx resultados (x,xx) segundos”. Encontrou?
Bem, na busca que realizei, aparece a frase e, então, é me apresentado que o Google gastou 0,48 segundos, ou seja, menos de meio segundo, para encontrar, aproximadamente, 2 milhões e 840 mil resultados. E na sua busca, qual foi o resultado? De fato, esse é um grande exemplo de eficiência e eficácia, não é mesmo?
É muito interessante analisar essa diferença do Google porque, até antes da existência dele, as pessoas utilizavam outros buscadores, como: AltaVista, Yahoo, Cadê. Mas quando o Google chegou, ele simplesmente desbancou todos esses. O motivo? Era um algoritmo muito melhor do que os outros.
Na programação de computadores, isso também pode acontecer. Você, talvez, proporá algumas estruturas de computação e, mais tarde poderá perceber que há maneiras mais interessantes de resolver o problema em questão. À medida que você programar mais e lidar com mais problemas complexos, as suas soluções também melhorarão e atingirão melhor eficiência computacional.
Ascencio e Campos (2012) descrevem as etapas para o desenvolvimento de um programa como:
Análise: envolve estudar o problema para que seja possível a definição dos dados de entrada, o processamento e os dados de saída.
Algoritmo: utilização de ferramentas de descrição narrativa, fluxograma ou português estruturado, de maneira que a descrição do problema e a sua solução sejam possíveis de serem realizadas.
Codificação: transformação do algoritmo em códigos por meio de uma linguagem de programação.
Dessa maneira, é possível dizer que um “programa é a codificação de um algoritmo em uma linguagem de programação” (ASCENCIO; CAMPOS, 2012, p. 1).
Daremos como um exemplo de algoritmo uma receita de cozinha. Já percebeu que ela é uma sequência de passos para executar uma tarefa? Na verdade, todos os dias, executamos vários algoritmos, como: escovar os dentes, trocar de roupa, trocar uma lâmpada, ir à escola etc.
Veja o exemplo de uma soma de dois números:
Receber os dois números.
Somar os dois números.
Mostrar o resultado obtido da soma.
Percebe que, mesmo em uma tarefa simples, é possível organizar em passos sequenciais e a realizar?
Ascencio e Campos (2012) apresentam os passos para construir qualquer tipo de algoritmo:
Entender o problema a ser resolvido dando destaque aos pontos mais importantes.
Definir os dados de entrada.
Definir o processamento, o que inclui os cálculos necessários e as suas restrições possíveis. Ele deve transformar os dados de entrada em dados de saída.
Definir os dados de saída que serão gerados após o processamento.
Construir o algoritmo por meio de um dos tipos existentes.
Testar o algoritmo por meio de simulações.
Conforme você percebeu, para construir um algoritmo precisamos de um algoritmo!
Há pelo menos três tipos diferentes de construir algoritmos. Não há um modelo melhor ou pior do que o outro, a escolha depende de como você se sente mais à vontade para planejar a sua solução.
O primeiro tipo é a descrição narrativa. Ele consiste em escrever os passos a serem seguidos para a solução. Sabe a receita do macarrão lámen no verso da embalagem? É um bom exemplo de uma descrição narrativa. O exemplo de soma de dois números que demos há pouco é, também, outro bom exemplo.
Outro tipo é aquele que ocorre por meio de fluxogramas. Ele utiliza símbolos predefinidos (inclusive, é possível encontrar no Word) que, por meio de uma sequência, representam como solucionar o problema tratado.
Veja o exemplo, a seguir, para o mesmo problema de soma de dois números:
Conforme você vê, ao utilizar fluxogramas, pode ocorrer o entendimento até mais simples do que por texto. No exemplo, é possível perceber as delimitações de início e fim e a sequência que deve ser percorrida. Fica clara a entrada de dados, como N1 e N2, o processamento e a atribuição da soma para a variável M e, depois, a simbologia para a saída de dados em M.
O outro tipo possível é o pseudocódigo, portugol ou português estruturado. Este é um tipo que se assemelha mais à linguagem de programação, pois tem regras predefinidas para construir a solução.
Veja, a seguir, um exemplo com a proposta do mesmo problema:
ALGORITMO
DECLARE N1, N2, M NUMÉRICO
ESCREVA “Digite dois números”
LEIA N1, N2
M ←N1+N2
ESCREVA “Soma = ”, M
FIM_ALGORITMO
Percebeu como ele se parece mais com uma linguagem de programação do que os tipos anteriores? Há declaração de variáveis, como na linha 2, comando para entrada de dados na linha 3, atribuição de valores em uma variável, como na linha 5, e a saída de dados na linha 6.
Dessa maneira, a recomendação é: sempre antes de iniciara sua codificação, construa um algoritmo em um dos tipos que mostramos. Isso auxilia no planejamento, na visão global do problema e no entendimento de como codificar. Além disso, também facilita a posterior utilização de uma linguagem de programação. Muitos programadores programam diretamente sem a utilização de algoritmos, e o efeito disso é que a programação se torna uma fase de verificação de erros sem fim. Os algoritmos auxiliam em uma construção mais próxima da solução no momento da codificação.
A tabela, a seguir, apresenta as vantagens e desvantagens de cada tipo que mostramos, de acordo com Ascencio e Campos (2012):
A construção de algoritmos passa pelo entendimento claro de algumas estruturas da computação, por exemplo, as variáveis e seus tipos.
Uma variável pode ser entendida como um espaço possível de receber valores: texto, números etc. Então, sempre que ouvir a palavra “variável”, você deve entender que é um espaço de memória, como quando alguém te passa uma informação, por exemplo, o número da casa onde mora. Quando você ouve o número, armazena essa informação em algum lugar da sua memória.
Na computação, além de criar o espaço de memória, precisamos, também, na maioria das linguagens, escolher que tipo de dado esse espaço armazenará. Você ainda verá, em outras lições, a existência de diferentes tipos, até mesmo, aos mesmos dados, como números ou caracteres. A escolha desses tipos é fundamental para a boa execução do software.
ASCENCIO, A. F. G.; CAMPOS, E. A. V. de. Fundamentos da Programação de Computadores: algoritmos, Pascal, C/C++ (padrão ANSI) e JAVA. 3. ed. São Paulo: Pearson Education do Brasil, 2012.