“Olá, querido diário! Hoje eu acordei, tomei um banho, me vesti, tomei meu café e fui para o trabalho. Mudei o percurso que costumo fazer de carro pois fiquei sabendo que estava congestionado. Quando cheguei ao meu destino, a única vaga disponível na garagem era uma bem complicada de estacionar. Manobrei, manobrei e manobrei enquanto o carro não estava corretamente alinhado à vaga. Afinal, não queria que o segurança viesse me dar uma advertência. Na parte da manhã, meu trabalho foi normal: segui direitinho o novo processo de trabalho que a consultoria desenvolveu. O almoço foi interessante, pois eu e meus colegas fomos ao novo restaurante. A cozinha tem uma janela enorme de vidro e é possível ver o cozinheiro preparando as diversas receitas que são pedidas! Como ele consegue dar conta? Já na parte da tarde, fui para o programa de treinamento. Estamos aprendendo métodos mais eficientes de fazer nosso trabalho. São muitas instruções novas, mas acho que vai ser bom a médio prazo. Ao terminar o expediente, passei na padaria e comprei pão, queijo e presunto para fazer um sanduíche. Na hora de prepará-lo, pela primeira vez me perguntei: coloco o queijo ou o presunto primeiro? Lógico, não perdi muito tempo com isso e escolhi ao acaso, pois ainda precisava ligar para minha mãe que passou por um procedimento cirúrgico. Nada complicado, mas queria saber se ela estava tomando os remédios de acordo com as instruções do médico. Após nossa conversa, fui assistir à TV. Fiquei trocando de canal até achar algo legal, mas a programação não estava lá essas coisas. Assim, resolvi ler um livro enquanto o sono não chegava. Pois não é que chegou de repente? Dormi sem programar meu celular para despertar! Sorte que era sexta e, no dia seguinte, não haveria a rotina da semana! 🙂 Aproveitei para planejar a viagem que farei nas minhas férias.”
O texto acima foi retirado do diário da Maria, nossa personagem fictícia. Ela é uma pessoa comum como você e eu! Como podemos notar, sua vida é cheia de atividades. E é nesse ponto que nossa jornada para entender programação começa. Já percebeu que muitas das coisas que fazemos em nosso dia-a-dia possuem uma sequência de passos para serem feitas? Quantas vezes não planejamos o nosso dia com uma lista de tarefas e vamos completando uma a uma? Existem muitas palavras para descrever isso: planejamento, rotina, programa, instruções, procedimento, método, receita, processo, tarefa, técnica, fórmula… e, algoritmo! Sim! Algoritmo, essa palavrinha esquisita, deve nos passar a ideia de:
Uma sequência de passos que devemos fazer para chegarmos à solução de um problema.
Vejamos um dos casos da Maria: ela disse que tem um processo de trabalho, ou seja, ela tem vários problemas para os quais ela foi contratada para resolver e, para cada um deles, ela tem uma sequência de atividades que ela deve cumprir para que o problema seja solucionado. Dessa forma, podemos dizer que ela segue um ou mais algoritmos para solucionar os problemas do trabalho!
Representação dos Algoritmos
Provavelmente, esse processo de trabalho que a Maria comentou deve estar escrito em algum manual da empresa. Toda empresa tem algum manual que o funcionário recebe no momento de sua contratação, não é mesmo? 😉 Pois bem, o fato desses processos estarem escritos é importante para que o funcionário saiba quais as ações que ele deve tomar nas mais diferentes situações dentro da empresa. Ou, falando de outra forma, é importante que os algoritmos a serem seguidos pelos funcionários estejam registrados em algum lugar. Mas, de que forma que esses algoritmos são registrados? É nesse momento que precisamos conhecer as formas de representá-los, isto é, quais as possíveis maneiras de se passar essas informações para outras pessoas.
A primeira forma de se fazer isso é por meio da linguagem natural, ou seja, por meio da linguagem que usamos naturalmente para se comunicar. No nosso caso, como estamos no Brasil, usamos a Língua Portuguesa. Se pararmos para pensar, isso é mais do que esperado, não é mesmo? Se voltarmos no texto que a Maria escreveu em seu diário, encontraremos o momento em que ela comenta sobre o cozinheiro preparando algumas receitas. Tenho certeza que você já pegou um livro de receitas. Se nunca fez isso, procure um agora e abra-o. Veja quantas receitas! Cada uma delas é um algoritmo para resolver um problema que enfrento todo dia: comer uma deliciosa refeição! 😉 Tente fazer uma delas! Como você consegue segui-la? Oras, você consegue porque ela está escrita em Português, sua linguagem natural. Detalhe: estou realmente falando sério quando disse para você ir atrás de um livro de receitas. Vá lá e veja-as! Você terá vários exemplos de como é a representação de algoritmos por meio da linguagem natural.
Bom, outra forma de se representar um algoritmo é por meio de um fluxograma, uma linguagem gráfica onde temos diversos símbolos que descrevem o que a pessoa que está executando o algoritmo deve fazer. Cada passo é conectado ao próximo por meio de uma flecha, indicando o fluxo de passos a ser seguido. É daí que vem o nome dessa ferramenta! De forma simplificada, temos os seguintes símbolos que podem ser usados:
Nome | Símbolo | Descrição |
---|---|---|
Início | O símbolo de “Início” serve para indicarmos para quem for seguir o algoritmo onde se deve começar sua execução. | |
Entrada | Algumas vezes, é necessário obter informações para dar prosseguimento ao algoritmo. O símbolo de “Entrada” descreve essa possibilidade. Dentro dele, devemos listar o que precisamos saber para continuar. | |
Processo | O símbolo de “Processo” é onde descrevemos a ação que deve ser executada naquele passo do algoritmo. | |
Decisão | Quando precisamos descrever uma decisão a ser tomada por quem está executando o algoritmo, devemos usar o símbolo de “Decisão”, escrevendo dentro a condição a ser analisada. Note que saem duas flechas desse símbolo: uma que indica para onde prosseguir caso a condição seja Verdadeira e outra para o caso contrário, ou seja, quando a condição for Falsa. | |
Saída | O símbolo de “Saída” descreve um ou mais resultados decorrentes da execução do algoritmo até aquele ponto. | |
Fim | E, finalmente, o símbolo “Fim” serve para marcarmos onde o algoritmo termina. |
Vejamos um exemplo: quando a Maria chegou no trabalho, ela teve que estacionar o carro. Para isso, ela manobrou enquanto o carro não estava alinhado à vaga. Podemos descrever esse algoritmo por meio do seguinte fluxograma:
Ou, para um caso um pouco mais complexo, voltemos ao exemplo do cozinheiro preparando as receitas pedidas pelos clientes. Primeiramente, ele deve saber qual é o pedido. Logo após, ele verifica no livro de receitas (ou de cabeça, mesmo) como fazê-la. Nesse momento, ele pode não encontrar uma que satisfaça o pedido do cliente ou, se encontrar, deve preparar o prato. Tão logo esteja pronto, ele é entregue ao cliente. Quanto texto! Vamos ver como isso fica em um fluxograma:
Com certeza, uma imagem vale mais do que mil palavras! 🙂
Mas, o que isso que nós vimos até agora tem a ver com programação de computadores? Bom, o fato é que os computadores foram inventados para automatizar tarefas repetitivas com rapidez e precisão, liberando nosso precioso tempo para fazer outras atividades! 😉 Para que isso aconteça, é necessário, antes, ensiná-lo como fazer a tarefa em questão, ou seja, qual o algoritmo ele deve seguir. Logicamente, isso não é feito por meio da linguagem natural, pois, como você já deve ter ouvido falar, os computadores só entendem zeros e uns. O fluxograma, apesar de ser uma ferramenta muito usada quando estamos criando e projetando algoritmos, não são entendidos diretamente pelas máquinas. Como fazer, então, para ensinar um algoritmo para um computador de forma que ele possa executá-lo?
É aí que entram as famosas linguagens de programação. Elas são uma forma de representação de algoritmos capaz de ser lida, entendida e seguida por um computador. Um algoritmo escrito em uma linguagem de programação também é conhecido como código ou programa. É por isso que chamamos de programação o ato de escrever algoritmos para computadores executarem e de programador a pessoa que os desenvolvem. Assim como o fluxograma possui uma série de símbolos gráficos para representar as diversas possibilidades do que pode ser feito, as linguagens de programação possuem uma série de palavras, símbolos e regras com o mesmo propósito. Dessa forma, temos um jeito de descrever algo que a máquina pode fazer sem ter que usar apenas zeros e uns e, além disso, temos um conjunto de conceitos que você pode usar quando for pensar sobre o que pode ser feito com um computador.
Existem diversas linguagens de programação. Cada uma tem suas próprias características, seus pontos fracos e seus pontos fortes. Como havia comentado anteriormente, para nossa caminhada no entendimento de programação, iremos usar uma chamada Portugol. Um dos seus pontos fortes é ser bem parecida com a linguagem natural e, por isso, é muito comum aprendê-la primeiro. Pelo mesmo motivo, também é costume chamar um algoritmo escrito com ela de pseudocódigo. Como qualquer linguagem, ela possui vários dialetos. Nesse caso, temos o dialeto do VisuAlg, do Portugol Studio, do Portugol IDE, entre outros. Cada um possui pequenas variações na forma de descrever as possíveis ações que podem ser efetuadas. Por isso, não se assuste se você vir um algoritmo escrito em Portugol em algum lugar e ele não ser exatamente igual ao que foi visto aqui no nosso curso.
Cada linguagem segue uma linha principal de raciocínio, ou seja, na forma que ela tem de resolver os problemas. À essa linha de raciocínio damos o nome de paradigma de programação, assunto que será estudado em uma outra ocasião. Mas, para fins de referência, saiba que o Portugol segue um paradigma de programação chamado Procedimental.
Características Fundamentais dos Algoritmos
Agora que você já sabe o que é um algoritmo e quais as possíveis formas de representá-los, é importante que você entenda que eles possuem cinco características fundamentais:
- Entradas: todo algoritmo tem zero ou mais entradas, ou seja, ele pode precisar de alguma informação que será fornecida por quem estiver executando-o.
- Definição: todo algoritmo é composto por uma sequência de passos que devem estar muito bem definidos e que não podem ser ambíguos.
- Efetividade: todo algoritmo é composto por uma sequência de passos que devem ser básicos o suficiente para que possam ser efetivados em um tempo finito.
- Saídas: todo algoritmo produz uma ou mais saídas, ou seja, resultados que são fornecidos para quem estiver executando-o.
- Finitude: todo algoritmo deve terminar em algum momento, após um certo número de passos.
Veja que, nesse ponto, já estou falando na possibilidade de criarmos nossos próprios algoritmos. É por isso que essas características fundamentais são importantes: para que possamos verificar se o algoritmo que estamos criando para resolver um problema é realmente um algoritmo e se ele é capaz de ser executado por qualquer um, inclusive um computador, quando for o caso.
Vamos voltar na descrição que eu fiz, anteriormente, do algoritmo para a Maria estacionar o carro:
Você consegue notar algum problema? Dois, talvez? O fato é que se eu passar esse algoritmo para alguém executar, provavelmente, me perguntariam com o quê o carro tem que estar alinhado. Ou seja, faltou definição nesse algoritmo. Algo não está bem definido. Além disso, esse algoritmo não tem registrado qual o resultado dele, isto é, qual a sua saída. E, também poderíamos, para fins de clareza, colocar a sua entrada:
No caso de estarmos criando um algoritmo para um computador executar, ou seja, um programa, essas características fundamentais se tornam ainda mais importantes, uma vez que precisamos ensinar para a máquina passos básicos muito bem definidos! Para entender isso, vamos recorrer ao diário da Maria, no momento em que ela fala que vai fazer um sanduíche de presunto e queijo. Imagina que pudéssemos pedir para um computador fazer esses sanduíche. Como seria o seu algoritmo? Algo assim?
- Abrir o pão
- Colocar o presunto
- Colocar o queijo
Hum… Acho que não está bem definido, hein? Como você abre o pão? Colocar o presunto e o queijo onde? Vamos tentar novamente?
- Cortar o pão no meio usando uma faca
- Colocar a metade de baixo do pão em cima da mesa
- Colocar o presunto em cima da metade de baixo do pão
- Colocar o queijo em cima do presunto
- Colocar a metade de cima do pão em cima do queijo
Acho que ficou um pouco melhor, não? Mas, mesmo assim, ainda teríamos que considerar um computador capaz de executar as instruções “cortar algo usando uma faca” e “colocar algo em cima de outra coisa”. Melhor dizendo, teríamos que considerar que essas operações sejam básicas o suficientes para ele poder realizar. Só dessa forma poderíamos considerar o algoritmo efetivo.
Lógica de Programação
Outro ponto importante a se considerar é que quando estamos criando um algoritmo, precisamos pensar na ordem da sequência de passos que queremos que a outra pessoa ou o computador siga. Por exemplo, eu não posso alterar muito a sequência de passos do algoritmo para fazer um sanduíche de presunto e queijo que acabamos de ver. Se, por acaso, eu apenas inverter os passos 1 e 2, eu já não conseguiria executá-los, uma vez que não haveria uma metade de cima do pão para eu colocar o presunto. Damos o nome de Lógica de Programação à esse raciocínio que temos que ter para criarmos a ordem correta em que colocamos as diversas instruções possíveis para se desenvolver um algoritmo. Convém notar que é possível criar mais de um algoritmo para resolver o mesmo problema. Nesse mesmo exemplo, a Maria nos dá a dica: ela poderia ter colocado o presunto primeiro ou o queijo. Nos dois casos ela acabaria tendo, como resultado, o seu sanduíche.
Essa é, talvez, a parte mais difícil para quem está começando no entendimento de programação, uma vez que não existe uma fórmula mágica que possamos decorar para a criação de soluções para os problemas por meio de algoritmos. No entanto, existem três formas de se aprender lógica de programação:
- Treinando
- Exercitando
- Praticando
Ou seja, somente por meio da experiência é que você conseguirá desenvolver excelentes algoritmos, que tenham o mínimo de erros, não travem o computador, etc.! 😉
Fases de um Algoritmo
Apesar disso, existe uma forma de enxergarmos os algoritmos que facilita muito a sua criação. É dividi-los em três partes:
- Entrada
- Processamento
- Saída
Ou, de forma gráfica:
Nós iremos voltar à essas fases quando estivermos colocando a mão na massa e criando nossos códigos. Por enquanto, gostaria apenas que você deixasse essas fases guardadas em sua cabeça, amadurecendo a ideia de que criar programas não é um bicho de sete cabeças. Sistemas inteiros são criados dessa forma, onde cada parte deles é um programa com essas três fases.
Próximos Passos
Será que eu perdi a aposta? Ou você não conhecia os algoritmos? Não vem, não! Conhecia, sim! Talvez, não com esse nome, mas como processo, receita, procedimento, etc. não é mesmo? Se você foi um dos que não conhecia, nesse artigo você passou a conhecê-los! Vimos o que são e algumas maneiras de representá-los, isto é, de como registrar um conjunto de passos para que outra pessoa ou um computador possa segui-los. Também vimos que todo algoritmo tem cinco características fundamentais e a importância de se praticar a lógica de programação. Os próximos passos são: aprender os fundamentos da lógica de programação e aprender Portugol para poder praticar!!! 🙂
Enquanto o próximo artigo não vem, gostaria de deixar alguns exercícios para vocês:
- Reveja o trecho do diário da Maria e procure pelas palavras em itálico. Você consegue criar um fluxograma para cada um dos algoritmos dos quais elas fazem parte?
- Além das receitas, você conseguiria dizer outros exemplos de algoritmos descritos em linguagem natural?
- Imagine que você foi até uma pastelaria. Tente descrever todos os passos envolvidos desde o momento em que você escolhe o seu pedido, até o momento em que você paga por ele, passando, inclusive, pelos passos que o garçom, cozinheiro e outras pessoas envolvidas têm que fazer.
Seria muito legal se você registrasse suas respostas, caso queira, na área de comentários abaixo. Caso não queira, deixe, pelo menos, suas impressões, dúvidas e sugestões sobre o texto! Elas são muito importantes para o aprimoramento dos artigos! Até a próxima!
Muito bom o artigo, Prof. Ramon!
Uma aplicação insuspeitada de algoritmos que descobri recentemente pode ser encontrada em (https://en.wikipedia.org/wiki/Genetic_algorithm). O artigo descreve algoritmos genéticos aplicados à seleção natural, utilizando por analogia a procura heurística. Cada provável solução tem um conjunto de propriedades (cromossomos e genótipos). A evolução é um processo de iteração (loop). A cada iteração do laço (geração) são incrementados os valores de “fitness” de cada indivíduo da população, sendo cada genoma individual modificado e, possivelmente, é gerada uma mutação aleatoriamente para formar uma nova geração. A nova geração (população) é então usada na próxima iteração do laço do algoritmo. O algoritmo termina quando o máximo número de gerações é produzido ou nível de “fitness” satisfatório é alcançado para a população. As condições de finalização do algoritmo são as seguintes:
– Uma solução que satisfaz critérios mínimos é encontrada;
– um número fixo de gerações é alcançado;
– um valor de tempo/dinheiro alocado (budget) é alcançado;
– o mais alto ranking de soluções “fitness” é alcançado ou um patamar que sucessivas iterações do laço não produzirão mais resultados melhores;
– inspeção manual;
– combinações das condições acima.
Vale a pena ler o artigo completo.
Oi, Emmanuel!
Que bom que gostou! Espero que esteja ajudando a entender programação! 🙂
Saber o conceito de algoritmos é o primeiro passo para esse mundo!
Sobre algoritmos genéticos, é uma das áreas que eu gosto bastante, assim como algumas áreas correlatas: vida artificial, autômatos celulares, comportamento emergente, etc.
Lá pelos idos de 1994 (!) eu fiz um programa que implementava o algoritmo descrito por um artigo da Scientific American que é uma brincadeira com algoritmos genéticos.
Infelizmente, não tenho como reproduzir o artigo aqui, mas o encontrei para compra.
Também encontrei o começo da descrição e uma implementação que você pode visualizar no próprio site.
Aguarde pelos próximos posts! 🙂
2) Manual de Instruções
3)
EU:
Escolher sabor
Chamar o atendente
Fazer o pedido
Receber o pastel
Pagar
ATENDENTE:
Me atender
Anotar o pedido
Passar o pedido pra quem ta fritando
Verificar se meu pastel está pronto
Me entregar o pastel
Receber o dinheiro
A PESSOA QUE FRITA:
Fritar meu pastel
Avisar o atendente quando estiver pronto
Olá, Lucas!
Muito boas suas respostas!
É isso mesmo!
E, conforme ganha experiência, você irá notar que os algoritmos precisarão de um pouco mais de detalhes.
Para me fazer entender melhor, o que eu quero dizer é que existem algoritmos dentro do algoritmo que você criou.
Exemplo: no passo “Escolher sabor”, como você faz isso? Qual o algoritmo para escolher sabor?
E, no passo “Fritar meu pastel”, qual seria o algoritmo para isso?
Grande abraço e bons estudos!