Introdução aos Algoritmos

O que são Algoritmos?

Algoritmos são conjuntos de passos finitos e organizados que, quando executados, resolvem um determinado problema.

Os algoritmos estão presentes em todas as áreas de nossas vidas mais do que podemos imaginar. Os algoritmos fazem parte no nosso dia a dia quando navegamos na internet, assistimos um vídeo no Youtube, jogamos no celular ou num console um jogo qualquer, etc.

E aprender algoritmos é simples. No início, tentamos criar rotinas para resolver pequenos problemas ou tarefas, como, por exemplo, somar dois números. Conforme os estudos avançam e nosso conhecimento a respeito do assunto melhora, os problemas ou tarefas a serem resolvidos vão ficando mais complexos.


Primeiro Algoritmo

Algoritmos Computacionais

São passos a serem seguidos por um módulo processador - qualquer equipamento capaz de efetuar processamento - e seus respectivos usuários que, quando executados na ordem correta, conseguem realizar determinada tarefa. Ou seja, são rotinas também, só que executadas pelo computador ou algum outro módulo processador.

Como são criados os algoritmos computacionais?

Todo algoritmo começa com a lógica de programação. Essa lógica de programação está na nossa cabeça e desenvolvemos ela através do raciocínio lógico.

Após desenvolver sua lógica, podemos partir para uma linguagem de programação qualquer e essa linguagem de programação vai ser utilizada para criar um sistema completo, que é o app ou software que o usuário vai usar.

Formas de representar a lógica de programação

Variáveis

Variáveis são espaços na memória que vão guardar valores.

E para guardar esses valores, usamos essa estrutura:

var identificador: tipo

Exemplo:

var bola: brinquedo

Lê-se: vou guardar na memória a variável bola, que é um tipo de brinquedo.

Ou, em algoritmos...

var mensagem: caractere

Lê-se: vou guardar na memória a variável mensagem, que é do tipo caractere.

Comando de atribuição

É formado pelo sinal de menor que e o sinal de menos: <-

mensagem <- "Olá, Mundo!"

Lê-se: a variável mensagem recebe o conteúdo que está entre aspas.

Comandos de saída

escreva e escreval

var mensagem: caractere Criei uma variável do tipo caractere.

mensagem <- "Olá, mundo!" Atribuí um valor a essa variável.

escreva ("mensagem") Vai escrever na tela: mensagem;

escreva (mensagem) Vai escrever na tela o conteúdo da variável mensagem;

escreva ("mensagem", mensagem) Vai escrever na tela: mensagem + o conteúdo dessa variável.

Identificadores

mensagem <- "Olá, Mundo!"

Regras para o uso de identificadores:

Tipos Primitivos

São tipos de variáveis que a memória do visualg pode guardar:

Inteiro
Ex: 1, 3, -5

Real
Ex: 0.5, 5.0, -77.3

Caractere
Ex: "Gustavo", "Algoritmo", "123"

Lógico
Ex: verdadeiro, falso


Comando de Entrada e Operadores

Comando de Entrada

Usamos o comando leia.

Esse comando recebe os valores digitados pelo usuário para guardá-los na memória.

escreva ("Digite um número: ")
leia (numero)


Operadores Lógicos e Relacionais

Operadores Relacionais

Vão criar relações entre variáveis, valores ou expressões e gerar resultados lógicos, verdadeiro ou falso, sempre.

Operadores Lógicos

e = conjunção
ou = disjunção
não = negação

Não servem para comparar resultados de expressões ou números e sempre retornam resultados lógicos também.

Os operadores relacionais e os operadores lógicos resultam sempre em valores lógicos VERDADEIRO ou FALSO.


Estruturas Condicionais 1

Estrutura Condicional Simples

Caso a expressão seja verdadeira, executa-se somente um bloco.

Estrutura do comando:

        Se (expressao) entao
            Bloco
        FimSe

Exemplo:

Se eu tiver dinheiro então, vou fazer uma viagem pra Disney.

Uma forma de representar a frase acima em um algoritmo computacional seria essa:

        Se (dinheiro >= 10000) entao
            Escreva ("Partiu Disney")
        FimSe

Estrutura Condicional Composta

Caso a expressão seja verdadeira, executa-se um bloco, caso contrário, se for falsa, executa-se outro bloco.

Estrutura do comando:

        Se (expressão) entao
           Bloco A
        senao
           Bloco B
        FimSe

Exemplo:

Se eu tiver dinheiro, então vou fazer uma viagem pra Disney. Senão, vou ficar em casa.

Representando a frase acima em algoritmo computacional:

        Se (dinheiro >= 10000) entao
           Escreva ("Partiu Disney")
        senao
           Escreva ("#chateado")
        FimSe

Estruturas Condicionais 2

Estrutura Condicional Aninhada

Estrutura do comando:

        Se (situação 1) entao
           Bloco A
        senao
           Se (situação 2) entao
              Bloco B
           senao
              Bloco C
           FimSe
        FimSe

Exemplo:

Se eu tiver muito dinheiro, então vou fazer uma viagem pra Disney. Senão, se tiver uma graninha, então vou visitar minha cidade natal, senão, aí sim, vou ficar em casa.

Agora, vamos usar uma linguagem formal de algoritmo para descrever o exemplo acima:

        Se (dinheiro >= 10000) entao
           Escreva ("Partiu Disney")
        senao
           Se (dinheiro >= 5000) e (dinheiro < 10000) entao
              Escreva ("Visitar família")
           senao
              Escreva ("#chateado")
           FimSe
        FimSe

Estrutura de Múltipla Escolha | Escolha...caso

Com a estrutura Escolha...caso, você pode testar uma série de valores distintos dentro de uma mesma variável e executar blocos específicos para cada caso.

Estrutura do comando:

        Escolha (variável)
           caso valor
              Bloco A
           caso valor
              Bloco B
           caso valor
              Bloco C
           OutroCaso
              Bloco D
        FimEscolha

Estruturas de Repetição 1

A estrutura de repetição enquanto vai permitir que você execute blocos de comandos várias vezes e simplificar a forma de representar lógicas que vão construir programas. Nessa estrutura, o teste lógico é feito no início. Perceba também que precisamos do operador lógico não para criar o loop.

Estrutura:

        Enquanto (expressão) faca
          bloco
        FimEnquanto
        Enquanto (não arrumar o quarto)* faca
          castigo
        FimEnquanto

*Se arrumar o quarto, estará liberado e sairá da repetição.


Estruturas de Repetição 2

A estrutura repita é uma estrutura de repetição com teste lógico no final, o que permite que você execute o bloco interno pelo menos uma vez, independente do resultado do teste. Repita...até é a inversão lógica da estrutura enquanto...faça.

Estrutura:

        repita
          bloco
        ate (expressao)
        repita
          castigo
        Até (arrumar o quarto)*

*Se arrumar o quarto, estará liberado e sairá da repetição.


Estruturas de Repetição 3

A estrutura para é uma estrutura de repetição com variável de controle, o que permite que você execute o bloco interno uma quantidade determinada de vezes.

Essa estrutura já vem com a atribuição e com o incremento incluídos.

O [passo salto] é opcional. O default dele é 1.

O para é diferente das outras duas estruturas de repetição por não precisar utilizar expressões lógicas para resolver o problema.

Um ponto de atenção: não utilizar essa estrutura quando não souber o número de repetições.


Procedimentos

Procedimento é um tipo de rotina.

Passagem de Parâmetro

Por valor

Quando a passagem é por valor, apenas o valor é passado - ou copiado - pra dentro do parâmetro do procedimento. Os valores iniciais, no programa principal, não são alterados.

Esse tipo de passagem não modifica em nada a variável do programa principal.

Por Referência

Quando a passagem se dá por referência, o parâmetro do procedimento tem uma referência automática ao valor da variável original. Qualquer alteração no parâmetro vai afetar a variável original, no programa principal.

Utiliza-se, nesse caso, a palavra var para sinalizar que a passagem de parâmetro é por referência. O var não que dizer que você esteja declarando uma variável, e sim que você está fazendo uma referência às variáveis do programa principal.

Escopo

Escopo é o local onde uma determinada variável vai funcionar.


Funções

Função é um outro tipo de rotina. A principal diferença entre usar funcões e procedimentos é que durante um procedimento não tem como retornar um valor diretamente no programa principal, e durante uma função você tem um valor de retorno, ou seja, é possível retornar um resultado.

Notas

No exemplo abaixo:
funcao soma (a, b: inteiro) : inteiro
O último inteiro quer dizer que o valor de retorno que essa função dará é também um valor inteiro.

Já nesse outro exemplo:
funcao parOuImpar (v: inteiro): caractere
A função parOuImpar vai receber uma variável do tipo inteiro e retornar um valor do tipo caractere.

O uso de parênteses no retorne da função é opcional.

Ao trabalhar com função, o ideal é não escrever nada dentro do corpo da função, e sim retornar ao algoritmo principal pra que você possa escrever da maneira que achar melhor.


Vetores

Definição

Vetores são Variáveis Compostas Homogêneas Unidimensionais, pois conseguem armazenar vários valores de um mesmo tipo em uma mesma variável.

Um vetor pode ter vários espaços internos, identificados por índices. A maneira correta de se declarar um vetor está na linha a seguir:

var v: vetor[1..10] de inteiro

A linha acima vai declarar uma variável v com 10 posições. Para inserir um valor dentro do vetor acima, podemos realizar a seguinte atribuição:

v[1] <- 100

Na linha acima, o valor 100 será colocado na posição 1 do vetor v.

Podemos também, permitir que o usuário digite os valores de cada posição, usando uma estrutura de repetição qualquer. Por exemplo:

        Para contador <- 1 ate 10 faca
        Escreva ("Digite um valor: ")
        Leia v[contador]
        FimPara

A variável contador, do trecho acima, será um valor inteiro que vai contar cada uma das 10 posições. O usuário digitará cada um dos 10 valores e eles serão armazenados no vetor.


Matrizes

Definição

Matrizes são Variáveis Compostas Homogêneas Multidimensionais. Ao contrário dos vetores, para identificar um elemento em uma matriz é necessário usar mais de um índice (na maioria dos casos, apenas dois).

Para declarar uma matriz 3x3, podemos usar a linha:

m: vetor[1..3, 1..3] de inteiro

Para referenciar um elemento da matriz declarada acima, fazemos assim:

m[2,3] <- 5

O número 5 ficará, dentro dessa matriz, na linha 2 e na coluna 3.


O material acima faz parte das minhas anotações do Curso de Algorítimo, do site Curso em Vídeo.