Pensamento Computacional e Algoritmos
Aprenda a decompor problemas, identificar padrões, abstrair informações e formular instruções lógicas e sequenciais.
Introdução ao Pensamento Computacional
O Pensamento Computacional (PC) é um conjunto de habilidades originadas na ciência da computação que podem ser amplamente aplicadas para a formulação e resolução de problemas em diversas áreas do conhecimento [1].
O conceito foi cunhado inicialmente por Seymour Papert na década de 80, que o definiu como as habilidades para solucionar problemas multidisciplinares [1]. Mais tarde, por volta de 2006, o termo foi popularizado pela pesquisadora Jeannette Wing, ao defender que o pensamento computacional representa uma "habilidade fundamental para todos, não somente para os cientistas da computação" [1]. Segundo a definição da UNIVESP (2023), o PC consiste na "capacidade de sistematizar, representar, analisar e resolver problemas" [1].
É importante ressaltar que o desenvolvimento do pensamento computacional não exige obrigatoriamente o uso de computadores ou tecnologias digitais [2]. Essa abordagem prática e teórica que utiliza jogos lúdicos, tabuleiros, dinâmicas em grupo ou atividades manuais para fixar conceitos de lógica e algoritmo é chamada de Computação Desplugada [2].
Os 4 Pilares do Pensamento Computacional
Para construir soluções de forma lógica e estruturada, dividimos o Pensamento Computacional em quatro pilares essenciais [3]:
- Decomposição: Considerada a primeira etapa do processo, consiste em dividir um problema complexo e desafiador em partes menores e mais fáceis de serem gerenciadas e resolvidas separadamente [4].
- Reconhecimento de Padrões: Envolve a identificação de semelhanças ou características comuns compartilhadas entre problemas [5]. Ao identificar similaridades com "problemas parecidos que já foram solucionados anteriormente", gera-se uma grande economia de tempo e esforços [5].
- Abstração: É a habilidade de identificar e focar apenas nos aspectos e informações essenciais de um problema, ignorando propositalmente os detalhes irrelevantes para a solução [6].
- Algoritmo: A última etapa, que consiste na criação de uma solução passo a passo estruturada e lógica para resolver o problema mapeado [3].
O que é um Algoritmo?
A grosso modo, um algoritmo serve de ponte ordenada e lógica para guiar o processo de resolução de um problema até a sua respectiva solução final [7, 8]. Tecnicamente, as definições clássicas o consolidam como:
- "Conjunto de regras [...] definidos e ordenados usados na solução de um problema [...] em um número finito de etapas" (Dicionário Michaelis, 2018) [9].
- "Descrição de uma sequência de passos [finitos] que deve ser seguida para a realização de uma tarefa" (Lopes & Garcia / Ascencio, 1999) [9, 10].
Em suma, trata-se de um passo a passo finito, ordenado e lógico usado na solução de um problema de qualquer natureza [7, 9]. Uma das principais vantagens é que, uma vez projetada e consolidada uma boa solução algorítmica, ela pode ser facilmente traduzida e implementada em qualquer linguagem de programação disponível no mercado [11].
Exemplo Clássico: O Algoritmo para Trocar o Pneu de um Carro
Diferentes níveis de detalhamento podem ser aplicados ao mesmo problema, dependendo do público ou da necessidade da solução [12, 13]:
- Pegar o estepe;
- Levantar o carro;
- Tirar o pneu furado;
- Colocar o estepe;
- Descer o carro.
- Abrir a mala do carro e pegar o estepe;
- Posicionar o macaco e destravar os parafusos;
- Levantar o carro e soltar totalmente os parafusos;
- Retirar a roda com o pneu furado;
- Colocar o estepe no local e prender os parafusos;
- Descer o carro e travar firmemente os parafusos.
"Ambos os algoritmos resolvem o mesmo problema perfeitamente. Isso nos prova que podem existir múltiplos algoritmos diferentes para solucionar um único problema." [13]
Formas de Representação de Algoritmos
Existem três formas clássicas de representar a lógica de nossos algoritmos antes de codificá-los para valer [8, 16]:
| Forma de Representação | Vantagens | Desvantagens |
|---|---|---|
| Descrição Narrativa [16] (Texto livre em linguagem natural) |
É uma forma amplamente conhecida, estruturada diretamente na forma como a mente humana já executa os pensamentos lógicos [17]. | A linguagem natural traz imprecisão e ambiguidade, o que pode gerar instruções que não são matematicamente bem definidas (ex: "uma pitada de sal") [17]. |
| Fluxograma [16] (Representação gráfica) |
Os símbolos visuais são mais intuitivos e simples de compreender do que blocos densos de texto corrido [17, 18]. É uma forma recomendada na BNCC [13, 19]. | Problemas muito complexos resultam em desenhos gráficos gigantescos e cheios de ramificações, dificultando a visualização geral da lógica [17, 18]. |
| Pseudocódigo [16] (Ex: Portugol) |
Como simula uma estrutura de programação formal, a passagem para qualquer linguagem real é quase imediata [20]. | Exige que o estudante aprenda as regras e o padrão de escrita do pseudocódigo utilizado [20]. |
Introdução ao Portugol
O Portugol é um pseudocódigo que utiliza palavras-chave em português, minimizando a barreira do idioma inglês no início dos estudos e permitindo que o aluno foque exclusivamente na lógica de programação [19]. Para programar em Portugol, utilizamos o software Portugol Studio, que pode ser acessado de duas maneiras [21-23]:
- Versão Online: https://portugol.dev/ [22]
- Versão Instalada (Computador): https://univali-lite.github.io/Portugol-Studio [22]
Estrutura Padrão de um Programa:
Todo algoritmo no Portugol Studio deve respeitar a delimitação do escopo principal programa e possuir a função inicial funcao inicio(), que indica onde a execução começará [20]:
programa { funcao inicio() { // Seu algoritmo e instruções devem ser escritos aqui } }
A Função escreva() e a quebra de linha:
A função escreva() é responsável por exibir informações de texto ou resultados numéricos na tela do computador [24].
Podemos passar um ou múltiplos parâmetros para ela, contanto que eles sejam devidamente separados por uma vírgula [24]. O caractere especial \n serve para realizar uma quebra de linha ("pular de linha") na saída da tela [24]. Veja o exemplo:
escreva("Bom dia") // Exibe: Bom dia escreva("Bom ", "Dia") // Exibe: Bom Dia (parâmetros separados) escreva("Bom \n Dia") // Exibe "Bom", quebra a linha, e escreve "Dia"
Variáveis, Memória e Atribuição
As variáveis são "espaços" temporários na memória do computador reservados para armazenar dados que podem sofrer modificações ao longo da execução do nosso programa [25]. Para cada variável que declaramos, o sistema operacional reserva e separa fisicamente uma área da memória RAM, identificando essa posição pelo "apelido" (nome) que escolhemos [26].
Os 4 Tipos de Variáveis Suportados:
No Portugol, toda variável deve ter seu tipo explicitamente declarado antes de ser utilizada [27]:
inteiro: Armazena números inteiros positivos ou negativos (ex: 3, 42, -15) [28].real: Armazena números reais que possuem casas decimais/fracionários (ex: 3.1415, 65.5, 1200.50) [29].caracter: Guarda apenas um único caractere envolto por aspas simples (ex: 'A', '7', '*', '#') [30].cadeia: Guarda um conjunto de caracteres, ou seja, textos completos (ex: "São Paulo", "Olá Mundo!") [31].
Sintaxe de Declaração e Atribuição:
A definição de um valor para uma variável é chamada de atribuição e utiliza o operador de igualdade (=) [32].
// Exemplos de declaração de variáveis real salario inteiro idade cadeia nome // Atribuindo valores idade = 50 salario = 3300.00 nome = "Rafael" // Declaração e atribuição na mesma linha inteiro quantidade = 10
Operadores Aritméticos e Precedência
Utilizamos operadores aritméticos para processar dados numéricos dentro do programa [33]:
- Soma:
+ - Subtração:
- - Multiplicação:
* - Divisão:
/ - Resto da Divisão (Módulo):
%
A ordem de precedência matemática obrigatória que o Portugol segue é: primeiro o conteúdo dentro de parênteses (), seguido por multiplicação *, divisão /, resto %, e por último, adições + e subtrações - [33].
Sempre que for resolver um problema computacional, faça a si mesmo as seguintes perguntas antes de codificar [34]:
- Quais são os dados de entrada? (O que o algoritmo precisa receber ou ler) [34]
- Qual será o processamento necessário? (Quais cálculos ou operações devem ser realizados) [34]
- Quais serão os dados de saída? (Qual resultado deve ser exibido na tela) [34]
Exercícios de Fixação Propostos
Aplique os conceitos vistos programando os exercícios práticos propostos abaixo diretamente no Portugol Studio [35-37]:
Olá Mundo
Construa um algoritmo que apresente na tela a mensagem: "Boa noite turma !!!" [35].
programa { funcao inicio() { escreva("Boa noite turma !!!") } }
Cálculo Direto
Construa um algoritmo que mostre na tela diretamente o resultado da soma de dois números (ex: 10 + 5 = 15) [35].
programa { funcao inicio() { escreva(10 + 5) } }
Variáveis de Apoio
Altere o Exercício 2 para que os números 10 e 5 sejam obrigatoriamente armazenados em variáveis (ex: numero1 e numero2) antes de calcular e exibir a soma [36].
programa { funcao inicio() { inteiro numero1 = 10 inteiro numero2 = 5 inteiro soma = numero1 + numero2 escreva("A soma é: ", soma) } }
Previsão do Futuro (Idade)
Construa um algoritmo que possua uma variável chamada nascimento contendo o ano de nascimento de uma pessoa. Em seguida, calcule e apresente na tela quantos anos essa pessoa fará no ano de 2035 (desconsidere o mês de aniversário para esta conta) [36].
programa { funcao inicio() { inteiro nascimento = 2000 inteiro idadeEm2035 = 2035 - nascimento escreva("Em 2035 a pessoa terá ", idadeEm2035, " anos.") } }
Materiais Complementares de Apoio
Slides: Pensamento Computacional
Acesse o slide de apoio técnico para fixar os conceitos visuais e os 4 pilares básicos do Pensamento Computacional.
Videoaula: Pensamento Computacional
Assista à explicação detalhada com exemplos práticos, os conceitos de algoritmos e as técnicas de resolução lógica.
Repositório de Código Fonte
Explore, acesse e faça o download de todos os códigos-fonte de exemplo e exercícios estruturados nesta trilha.