Skip to content

Documento 01 - Primeiro Trimestre

Pensamento Computacional

O pensamento computacional é uma abordagem para resolver problemas de forma sistemática e eficiente, utilizando as mesmas técnicas utilizadas pelos computadores para processar informações.

Essa abordagem envolve a divisão de um problema em partes menores e mais gerenciáveis, a identificação de padrões e a criação de algoritmos para resolver esses problemas.

Nem sempre a melhor forma de resolver um problema é utilizar um computador, mas o pensamento computacional pode ser aplicado a qualquer problema, desde que seja possível dividir o problema em partes menores e mais gerenciáveis.

Exemplos de Aplicação

  • Resolução de problemas matemáticos
  • Desenvolvimento de jogos
  • Desenvolvimento de aplicativos
  • Tarefas domésticas
  • Planejamento de viagens
  • Entre outros

Pilares do Pensamento Computacional

O pensamento computacional pode ser dividido em 4 pilares:

  • Decomposição
  • Reconhecimento de Padrões
  • Abstração
  • Algoritmos

Decomposição

A decomposição é o processo de dividir um problema em partes menores e mais gerenciáveis.

Ex.: Você precisa fazer um bolo. Você precisa separar os ingredientes, misturar os ingredientes, assar o bolo, etc. Cada parte do processo é um problema menor que pode ser resolvido separadamente.

Reconhecimento de Padrões

O reconhecimento de padrões é o processo de identificar padrões em um conjunto de dados.

Ex.: Existem várias formas diferentes de fazer um bolo, mas em geral todo bolo é feito usando processos parecidos. Reconhecer essa relação entre os diferentes tipos de bolo pode ajudar a resolver o problema de forma mais eficiente.

Abstração

A abstração é o processo de identificar as características mais importantes de um conjunto de dados.

Ex.: No processo de fazer um bolo, existem algumas características que são mais importantes do que outras. Por exemplo, podemos substituir a calda de morango por calda de chocolate, ou mesmo deixá-lo sem a calda. Isso significa que a calda não é uma característica essencial do bolo.

Algoritmos

Os algoritmos são sequências de instruções que resolvem um problema.

Ex.: O algoritmo para fazer um bolo é o seguinte: separar os ingredientes, misturar os ingredientes, assar o bolo, etc. Cada passo do algoritmo é uma instrução que resolve um problema menor. Essa sequência precisa ser lógica de forma que o problema seja resolvido de forma eficiente.

Algoritmos

Um algoritmo é um conjunto de instruções que resolvem um problema de maneira lógica e eficiente.

Um algoritmo pode resolver um problema muito específico, mas é melhor que ele consiga resolver problemas parecidos também. Por isso, ao criar um algoritmo, consideramos que ele seja capaz de receber dados de entrada para que ele possa ser reutilizado.

Entrada e Saída

Todo algoritmo possui uma entrada e uma saída. A entrada é o conjunto de dados que o algoritmo recebe para ser processado. A saída é o conjunto de dados que o algoritmo retorna após ser processado.

Um algoritimo para fazer bolos pode receber como entrada o tipo de bolo que deseja fazer, a quantidade de bolos que deseja fazer, a quantidade de ingredientes que deseja usar, etc. E a saída pode ser o bolo pronto, o bolo assado, o bolo com a calda, etc.

Representação de Algoritmos

Um algoritmo é um conceito abstrado. Ou seja, podemos elaborar um algoritmo na nossa cabeça e até executá-lo como se fossemos um computador. No entanto, para comunicar a ideia de um algoritmo para outras pessoas ou mesmo ensinar ao computador o que desejamos, usamos diferentes formas de representação, como:

  • Linguagem Natural
  • Pseudocódigo
  • Fluxograma
  • Linguagem de Programação

Linguagem Natural

A linguagem natural é a forma mais simples de representar um algoritmo. Ela é uma forma de representar um algoritmo de forma mais simples e fácil de entender.

Vamos usar como exemplo uma parte de um algoritmo para fazer um bolo:

Comece separando o ingrediente do bolo, se você tiver morangos, faça um bolo de morango, se não, faça um bolo de chocolate.

Esse algoritmo representa um problema de forma simples e fácil de entender para seres humanos. No entanto, o computador tem dificuldades de interpretar esse tipo de instrução, já que ela possui muitas ambiguidades.

Ambiguidade

Ambiguidade é um termo usado para descrever uma situação em que uma palavra pode ter mais de um significado. O que acontece se

Observe como exemplo o seguinte algoritmo:

Minha esposa pediu que eu fosse ao mercado comprar leite. Ela disse: "Compre leite, se tiver ovo, compre 2."

Ao chegar em casa, o marido comprou 2 litros de leite. Ele não comprou o ovo, pois assumiu que "compre 2" estava relacionado com o leite.

Pseudocódigo

O pseudocódigo é uma forma de representar um algoritmo de forma simples, mas que procura reduzir algumas das ambiguidades presentes na linguagem natural. Ele é uma mistura de linguagem natural e linguagem de programação.

INICIO
    LEIA recheio
    SE recheio = "morango"
        ESCREVA "Bolo de morango"
    SENAO
        ESCREVA "Bolo de chocolate"
    ESCREVA "Bom apetite"
FIM

Esse código é mais próximo da linguagem de programação, mas possui uma estrutura mais rígida. Repare que utilizamos palavras como INICIO e FIM para indicar o início e o fim do algoritmo.

Também usamos as palavras LEIA e ESCREVA para indicar a leitura e escrita de dados. Essas palavras são chamadas de comandos, que nesse caso servem para representar a entrada e saída de dados do nosso algoritmo.

Fluxogramas

Fluxogramas são outra maneira de representar um algoritmo. Eles são representações mais visuais, de forma que seja mais fácil de entender por qual comandos o algoritmo vai passar.

Introdução ao Portugol

O Portugol é uma linguagem de programação que foi criada para ensinar programação de forma mais simples e intuitiva.

Ela é uma linguagem de programação que é muito parecida com a linguagem C, mas é mais simples de entender, especialmente porque usa palavras em português.

Estrutura de um Programa

Todo programa em Portugol possui uma estrutura básica que é composta por:

programa {
  funcao inicio() {
    escreva("Olá mundo!")
  }
}

O programa é composto por um cabeçalho, que é o nome do programa, e um bloco de código, que é o corpo do programa.

Repare que o bloco de código é delimitado por chaves { e }. Nos chamamos isso de escopo. O escopo delimita qual parte do código está diretamente ligada com outras estruturas do programa.

Nesse caso, o comando escreva está dentro do escopo da funçção inicio. Isso significa que o comando escreva só pode ser executado dentro da função inicio.

A função inicio é uma função especial que é executada quando o programa é iniciado. Ela é chamada de função principal.

O algoritmo por sua vez é delimitado pelo escopo programa. Assim como em pseudocódigo usamos INICIO e FIM, em portugol teremos as { e } que estão diretamente conectadas à palavra programa.

Declaração de Variáveis

Uma variável é um espaço na memória do computador que armazena um valor.

Quando criamos um algoritmo que precisa armazenar dados, também precisamos declarar onde isso será armazenado. Toda variável deve ser declarada antes de ser usada.

Para declarar uma variável no portugol, usamos o tipo de dado seguido do nome da variável.

cadeia nome

Isso significa que a variável nome é uma variável do tipo cadeia. Cadeias são estruturas que podem armazenar sequencias de caracteres, como por exemplo, o nome de uma pessoa.

Caracteres são os símbolos que usamos para escrever. Por exemplo, o a é um caractere.

Lembre-se de que devemos declarar todas as variáveis que vamos usar dentro do escopo do nosso programa, ficando assim:

programa {
  funcao inicio() {
    cadeia nome
  }
}

Atribuindo valor para variáveis

Existem duas maneiras de atribuir um valor para uma variável:

  • Usando o operador de atribuição =
  • Usando o comando leia
  • Atribuindo o valor de outra variável

No primeiro caso, usamos o operador de atribuição = para atribuir um valor para uma variável, de forma que a variável recebe um valor que nós já conhecemos.

Ex.:

programa {
  funcao inicio() {
    cadeia nome
    nome = "Ronaldinho"
  }
}

Dessa forma, a variável nome recebe o valor Ronaldinho.

Outra forma de atribuir um valor para uma variável é usando o comando leia. Esse comando é usado para ler um valor do teclado e atribuir para uma variável.

Ex.:

programa {
    funcao inicio() {
        cadeia nome
        leia(nome)
    }
}

Dessa forma, assim que o programa passar pelo comando leia(nome), o usuário será solicitado a digitar um valor que será atribuído para a variável nome.

Acessando o valor de uma variável

Para acessar o valor de uma variável, basta usar o nome da variável. Isso pode ser usado por exemplo em combinação com o comando escreva, que é usado para escrever algo na tela.

Ex.:

programa {
    funcao inicio() {
        cadeia nome
        leia(nome)
        escreva("Meu nome é " + nome)
    }
}

Resultado na tela:

Meu nome é Ronaldinho

Repare que usamos o operador + para concatenar (juntar) a string Meu nome é com o valor da variável nome.

Por fim, outra forma de atribuir-mos um valor para uma variável é atribuindo o valor de outra variável, usando o operador =. Observe o exemplo abaixo:

programa {
    funcao inicio() {
        cadeia nome
        cadeia sobrenome
        leia(nome)
        leia(sobrenome)
        nome_completo = nome + " " + sobrenome
        escreva("Meu nome é " + nome)
    }
}

Dessa forma, o valor da variável nome_completo será o valor da variável nome concatenado com o valor da variável sobrenome. Se o usuário digitar Ronaldinho para a variável nome e Gaucho para a variável sobrenome, o valor da variável nome_completo será Ronaldinho Gaucho.

Lembre-se de que leia irá ler o valor digitado pelo usuário e atribuir para a variável. Esse valor será aquilo que o usuário digitar e não é conhecido pelo programa antes disso.

Nomenclatura de Variáveis

O nome de uma variável deve ser composto por letras, números e o caractere _.

Não é possível nomear variáveis com:

  • Palavras reservadas do Portugol (por exemplo: inicio, fim, se, senao, etc.)
  • Números no começo do nome (ex.: 123nome)
  • Espaços (ex.: nome completo)

Tipos de Dados

Além de cadeia, existem outros tipos de dados que podem ser usados em um programa.

Um programa de computador geralmente é composto por dados, que são informações que o programa precisa para funcionar. Esses dados podem ser de diferentes tipos, como por exemplo, números, textos, datas, etc.

Os tipos de dados mais comuns são:

  • inteiro: usado para armazenar números inteiros, como por exemplo, 1, 2, 3, 4, 5, etc.
  • real: usado para armazenar números reais, como por exemplo, 1.5, 2.5, 3.5, 4.5, etc.
  • caractere: usado para armazenar um único caractere, como por exemplo, 'a', 'b', 'c', 'd', etc.
  • cadeia: usado para armazenar uma sequência de caracteres, como por exemplo, "Olá", "Mundo", "Portugol", etc.
  • logico: usado para armazenar valores lógicos, como por exemplo, verdadeiro ou falso.

Podemos utilizar cada um deles para declarar uma variável:

programa {
    funcao inicio() {
        inteiro numero = 10
        cadeia nome = "Ronaldinho"
        caractere letra = 'a'
        logico chuva = verdadeiro
        real pi = 3.14
    }
}

Repare que tipos de dados cadeira precisam ser declaradas com aspas duplas (") e tipos de dados caractere precisam ser declarados com aspas simples ('). Outros tipos de dados não devem conter aspas.

Quando declaramos uma variável de um determinado tipo, não podemos atribuir valores de outro tipo para ela. Por exemplo, não podemos atribuir um valor do tipo cadeia para uma variável do tipo inteiro.

Observe o exemplo abaixo:

programa {
    funcao inicio() {
        inteiro numero
        numero = "10"
    }
}

Isso gera um erro de compilação, pois não podemos atribuir um valor do tipo cadeia para uma variável do tipo inteiro.

Operadores Aritméticos

Quando utilizamos números em um programa, podemos realizar operações com eles. Essas operações são chamadas de operações aritméticas. As operações aritméticas mais comuns são:

  • Adição: +, que soma os números.
  • Subtração: -, que subtrai os números.
  • Multiplicação: *, que multiplica os números.
  • Divisão: /, que retorna o resultado da divisão inteira entre dois números.
  • Módulo: %, que retorna o resto da divisão entre dois números.

Observe o uso de cada um desses operadores:

programa {
    funcao inicio() {
        inteiro numero1 = 35
        inteiro numero2 = 4
        inteiro soma = numero1 + numero2 // 39
        inteiro subtracao = numero1 - numero2 // 31
        inteiro multiplicacao = numero1 * numero2 // 140
        inteiro divisao = numero1 / numero // 8
        inteiro modulo = numero1 % numero2 // 3
    }
}

No código acima, usamos o // para destacar o resultado de cada operação. Essa de notação é chamada de comentário e é utilizada para explicar o que está acontecendo no código. Tudo o que estiver depois do // será ignorado pelo compilador.

Essas operações podem ser realizadas com variáveis do tipo inteiro ou real.

No caso do uso do +, se utilizado com variáveis do tipo cadeia, ele irá concatenar as strings, tornado-se um operador de concatenação. Não é recomendado concatenar strings com números, pois isso pode gerar resultados inesperados.

Comentários

Comentários são trechos de código que não são executados pelo programa. Eles são utilizados para explicar o que está acontecendo no código.

Podemos utilizar comentários de uma linha ou de várias linhas.

Para comentar uma linha, utilizamos o // no início da linha.

programa {
    funcao inicio() {
        // Isso é um comentário de uma linha
    }
}

Também podemos comentar várias linhas de uma vez. Para isso, utilizamos o /* no início do comentário e o */ no final.

programa {
    funcao inicio() {
        /*
        Isso é um comentário de várias linhas
        Ele pode ser usado para explicar porque o código está
        fazendo o que está fazendo ou para documentar o código.
        */
    }
}

Operadores Lógicos

Os operadores lógicos são usados para realizar operações lógicas em valores lógicos. Os operadores lógicos mais comuns são:

  • e: retorna verdadeiro se ambos os valores forem verdadeiros.
  • ou: retorna verdadeiro se pelo menos um dos valores for verdadeiro.
  • nao: retorna verdadeiro se o valor for falso.

Observe o uso de cada um desses operadores:

programa {
    funcao inicio() {
        logico chuva = verdadeiro
        logico frio = falso
        logico casaco
        casaco  = chuva e frio // falso
        casaco = chuva ou frio // verdadeiro
        casaco = nao chuva // falso
        casaco = nao frio // verdadeiro
    }
}

Operadores de Comparação

Os operadores de comparação são usados para comparar valores. Os operadores de comparação mais comuns são:

  • ==: retorna verdadeiro se os valores forem iguais.
  • !=: retorna verdadeiro se os valores forem diferentes.
  • >: retorna verdadeiro se o valor à esquerda for maior que o valor à direita.
  • <: retorna verdadeiro se o valor à esquerda for menor que o valor à direita.
  • >=: retorna verdadeiro se o valor à esquerda for maior ou igual ao valor à direita.
  • <=: retorna verdadeiro se o valor à esquerda for menor ou igual ao valor à direita.

Observe o uso de cada um desses operadores:

programa {
    funcao inicio() {
        inteiro numero1 = 35
        inteiro numero2 = 4
        logico comparacao1 = numero1 == numero2 // falso
        logico comparacao2 = numero1 != numero2 // verdadeiro
        logico comparacao3 = numero1 > numero2 // verdadeiro
        logico comparacao4 = numero1 < numero2 // falso
        logico comparacao5 = numero1 >= numero2 // verdadeiro
        logico comparacao6 = numero1 <= numero2 // falso
    }
}

Estruturas Condicionais

Estruturas condicionais são usadas para tomar decisões em um programa. Elas definem um bloco de código que será executado de acordo com a condição previamente estabelecida.

As estruturas condicionais mais comuns são:

  • se: executa um bloco de código se uma condição for verdadeira.
  • se-entao: executa um bloco de código se uma condição for verdadeira, caso contrário, executa outro bloco de código.
  • escolha-caso: executa um bloco de código caso a comparação seja verdadeira.

Estrutura Condicional se

A estrutura condicional se é usada para executar um bloco de código se uma condição for verdadeira.

A condição é uma expressão que retorna um valor lógico, ou seja, um valor verdadeiro ou falso.

programa {
    funcao inicio() {
        inteiro numero = 5
        se (numero > 0) {
            escreva("O número é positivo")
        }
    }
}

Repare que usamos o operador > para comparar o valor da variável numero com o valor 0. Se o valor da variável numero for maior que 0, o bloco de código dentro do se será executado.

O bloco de código dentro do se é delimitado por chaves { }. Tudo que estiver dentro deste escopo será executado se a condição for verdadeira.

Estrutura Condicional se-entao

A estrutura condicional se-entao é usada para executar um bloco de código se uma condição for verdadeira, caso contrário, executa outro bloco de código.

programa {
    funcao inicio() {
        inteiro numero = 5
        se (numero > 0) {
            escreva("O número é positivo")
        senao {
            escreva("O número é negativo")
        }
        escreva("Resposta final")
    }
}

Se o valor da variável numero for maior que 0, o bloco de código dentro do se será executado. Caso contrário, o bloco de código dentro do senao será executado.

Reforçando:

  • o bloco de código dentro do se é delimitado por chaves { }. Tudo que estiver dentro deste escopo será executado se a condição for verdadeira.
  • o bloco de código dentro do senao é delimitado por chaves { }. Tudo que estiver dentro deste escopo será executado se a condição for falsa.

Estrutura Condicional escolha-caso

A estrutura condicional escolha-caso é usada para executar um bloco de código caso a comparação seja verdadeira.

programa {
    funcao inicio() {
        inteiro portao = 3
        escolha (portao) {
            caso 1:
            escreva("Portão A")
            pare

            caso 2:
            escreva("Portão B")
            pare

            caso 3:
            escreva("Portão C")
            pare

            caso contrario:
            escreva("Portão Inválido")
            pare
        }
    }
}

Essa estrutura é muito útil quando precisamos comparar um valor com vários valores diferentes. No entanto, ela pode ser um pouco mais complexa do que as outras estruturas condicionais, tornando o código mais difícil de entender e verboso.

Verboso é um termo usado para descrever um texto ou código que é muito longo e detalhado, o que pode tornar a leitura e a compreensão mais difícil.