01.MA - Lógica de Programação e Estrutura de Dados
01.MA - Lógica de Programação e Estrutura de Dados
01.MA - Lógica de Programação e Estrutura de Dados
ESTRUTURAS DE DADOS
2
1 NOÇÕES BÁSICAS DE LÓGICA DE PROGRAMAÇÃO
3
Na memória principal, também chamada memória RAM (Read and Access Memory), são
armazenados temporariamente os dados que estão sendo processados; é como se fosse
uma mesa de trabalho, onde o material é colocado, trabalhado e depois armazenado
em outro lugar: na memória secundária, ou disco rígido. Nele ficam guardados
programas e dados enquanto não estão em uso ou quando o micro é desligado.
Se você quer que ele faça projetos de engenharia, ou seja capaz de interpretar
programas escritos em linguagem Python, ou qualquer outra tarefa, basta instalar o
software adequado.
4
SAIBA MAIS
Você trabalha com algoritmos todos os dias e talvez não tenha se dado conta ainda.
Pense um pouco: quais as ações que você faz para sair de casa ao acordar e ir trabalhar?
Despertar
Abrir os olhos
Levantar da cama
Calçar os chinelos
Ir ao banheiro
Abrir o armário
Pegar a escova
Pegar a pasta de dentes
Colocar pasta na escova
Escovar os dentes
Enxaguar a boca
Lavar a escova
Guardar a escova
Guardar a pasta
5
Ir à cozinha
Fazer a refeição matinal
Trocar de roupa
Abrir a porta
Sair de casa
Fechar a porta
Ir até o ponto de ônibus
Pegar o ônibus
Descer no ponto do trabalho
Entrar na empresa
Esse é o algoritmo que resolve o problema que você precisa resolver de ir de casa ao
trabalho. Existem algumas formas de representar um algoritmo.
A descrição narrativa;
O fluxograma convencional;
O pseudocódigo, também conhecido como linguagem estruturada ou Portugol.
Alguns problemas didáticos são usados para que o aluno adquira a capacidade de
desenvolver algoritmos bem estruturados. Veja alguns deles:
6
Torre de Hanói: você deve transferir três discos sobrepostos em ordem descendente do
menor para o maior encaixados em um pino para o terceiro pino, obedecendo a seguinte
regra: os discos maiores devem ficar embaixo dos menores durante a transferência.
Um homem tem que atravessar um rio com uma ovelha, um lobo e uma caixa de alfaces.
Eles devem ser atravessados um por vez, com o homem e um deles no barco, até a outra
margem. Se o lobo ficar sozinho com a ovelha em uma das margens, ele a atacará; se a
ovelha ficar sozinha com as alfaces, ela os comerá.
7
• Desembarcar o cordeiro;
• Navegar até a outra margem;
• Colocar o lobo no barco;
• Navegar até a outra margem;
• Desembarcar o lobo;
• Embarcar o cordeiro;
• Navegar até a outra margem;
• Desembarcar o cordeiro;
• Embarcar a alface;
• Navegar até a outra margem;
• Desembarcar a alface;
• Navegar até a outra margem;
• Embarcar o cordeiro;
• Navegar até a outra margem;
• Desembarcar o cordeiro.
Os padres e os canibais
Três padres e três canibais precisam atravessar um rio em um barco que cabe apenas
duas pessoas. Não pode haver mais canibais que padres em qualquer uma das duas
margens do rio.
8
Desembarcar os dois canibais.
A travessia da família
Uma família composta por um casal com duas filhas e dois filhos precisa atravessar um
rio com um policial e um delinquente juvenil. O barco só comporta duas pessoas. A mãe
não pode ser deixada sem a presença do pai quando os filhos estão com ela, senão ela
bate neles. O pai não pode ser deixado sem a presença da mãe quando as filhas estão
com ele, senão ele bate nelas. O delinquente juvenil deve estar sempre acompanhado
do policial, senão ele bate em quem estiver presente. Só adultos pilotam o barco.
Embarcar o policial;
Embarcar o delinquente;
Navegar até a outra margem;
Desembarcar o delinquente;
Navegar até a outra margem;
Embarcar um dos filhos;
Navegar até a outra margem;
Desembarcar o filho;
Embarcar o delinquente;
Navegar até a outra margem;
Desembarcar o policial;
Desembarcar o delinquente;
Embarcar o pai;
Embarcar o filho;
Navegar até a outra margem;
Desembarcar o filho;
Navegar até a outra margem;
Embarcar a mãe;
Navegar até a outra margem;
9
Desembarcar o pai;
Navegar até a outra margem;
Desembarcar a mãe;
Embarcar o policial;
Embarcar o delinquente;
Navegar até a outra margem;
Desembarcar o policial;
Desembarcar o delinquente;
Embarcar o pai;
Navegar até a outra margem;
Embarcar a mãe;
Navegar até a outra margem;
Desembarcar o pai;
Navegar até a outra margem;
Embarcar uma filha;
Navegar até a outra margem;
Desembarcar uma filha;
Desembarcar a mãe;
Embarcar o policial;
Embarcar o delinquente;
Navegar até a outra margem;
Desembarcar o delinquente;
Embarcar a filha;
Navegar até a outra margem;
Desembarcar a filha;
Navegar até a outra margem;
Embarcar o delinquente;
Navegar até a outra margem;
Desembarcar o policial;
Desembarcar o delinquente.
10
1.4 Fluxograma e blocos
SETA
Conecta outros símbolos indicando o sentido
do fluxo de dados.
TERMINAL
Indica começo ou término de processamento.
PROCESSAMENTO
Exemplo: cálculo de dois valores.
ENTRADA/SAÍDA (Genérica)
Indica entrada ou saída de dados. Exemplo:
armazenamento de valores em variáveis.
CONECTOR
Conecta um ponto qualquer do fluxograma.
ENTRADA MANUAL
Representa entrada de dados via
teclado. Exemplo: digitar a nota da prova
1.
11
SAÍDA – IMPRIMIR
Mostra informações ou resultados via
impressão em papel. Exemplo: imprimir o
resultado do cálculo.
DECISÃO
Permite elaborar processos de decisão “se isto,
faça isto; senão, faça aquilo”
CONECTOR DE PÁGINA
Conecta uma página qualquer do fluxograma.
1.5 Linguagem
Você notou que para um software existir, ele precisa ser desenvolvido. A outra etapa de
seu desenvolvimento é a escrita do algoritmo em uma linguagem de programação. Ela
pode ser de alto ou baixo nível, ou ainda interpretada ou compilada.
12
Linguagens de baixo nível conseguem operar diretamente no hardware dos
computadores; linguagens de alto nível têm a necessidade de fazer com que as
instruções e comandos feitos nela sejam transformados em instruções e comandos de
baixo nível. Surgem então os interpretadores e compiladores.
Conclusão
Como vimos, construir um programa não consiste apenas em escrever códigos; há uma
lógica envolvida em sua construção, que é essencial para o seu correto funcionamento.
Antes de escrevermos o programa em si, é necessário estudarmos como abordaremos
o problema a ser resolvido, desenvolver os passos para sua solução e depois passar essa
solução escrita em uma linguagem que um computador está apto a entender.
Referências
13
2 INTRODUÇÃO À PROGRAMAÇÃO USANDO LINGUAGEM PYTHON
Neste tópico, você terá o primeiro contato com uma linguagem de programação, a
linguagem Python, e verá como ela trabalha. Verá também quais as vantagens de
aprender a programar nessa linguagem. Ao final deste bloco, você será capaz de
identificar constantes e variáveis; saber como trabalhar com operadores e operandos
em Python; identificar entradas e saídas de um programa Python e criar um programa
básico em Python.
Variável será o primeiro assunto que abordaremos. Como o próprio nome diz, ele
trabalha com valores que mudam de acordo com as circunstâncias. Variável é a
representação de uma região de memória utilizada para armazenar, acessar e modificar
certo valor por um determinado espaço de tempo. Podemos denominá-la como
quisermos, desde que não usemos palavras reservadas da linguagem usada para a
construção do programa, e seja um nome contido em uma string contínua, sem espaços.
Em muitas linguagens de programação, ela deve ser declarada; na linguagem Python,
não há necessidade, pois Python é dinamicamente tipada, não havendo a necessidade
de se declarar variáveis, pois intuitivamente o tipo de variável é identificado pelo
sistema. Veja na prática essa afirmação: imagine um programa que calcule a média entre
dois valores digitados pelo usuário. A seguir, tal informação escrita na linguagem C:
#include <stdio.h>
float x, y, media;
int main(void)
14
printf("Digite o primeiro valor: ");
scanf("%f", &x);
scanf("%f", &y);
media=(x+y)/2;
return 0;
c=(a+b)/2
SAIBA MAIS
Entenda melhor sobre o assunto no seguinte vídeo, que explica o uso de constantes e
variáveis em Python.
15
2.2 Atribuição e operadores
Para atribuirmos valor a uma variável ou constante, ou ainda a outros elementos, como
listas, dicionários ou tuplas, usamos o caractere “=”. Veja exemplos a seguir:
# Exemplo 1:
a = 10
# Exemplo 2:
b = 7.4
# Exemplo 3:
# Exemplo 4:
d = [0, 1, 2]
No exemplo 1, a variável de nome “a” tem o valor 10, sendo do tipo “inteiro”; no
exemplo 2, a variável de nome “b” tem o valor 7.4, sendo do tipo “float”; no exemplo 3,
a variável de nome “c” contém uma string (sequência de caracteres), sendo do tipo
“string”. O exemplo 4 contém uma variável denominada “d” que inclui uma lista
(também chamada de “array” em outras linguagens de programação).
Note que não precisamos declarar o tipo de variável, pois como a linguagem Python é
dinamicamente tipada, o tipo de variável ou constante está implícito nos dados que ela
contém.
Operadores são símbolos especiais que representam cálculos como adição, subtração e
divisão. Os valores que são chamados pelo operador são denominados operandos. Em
Python, os símbolos + (adição), - (subtração), / (divisão), * (multiplicação), **
(potenciação) e demais símbolos, como os parênteses, têm a mesma função que em
uma expressão matemática.
16
na entrada de dados como na saída, deve-se usar o ponto flutuante ao escrever o
número. Veja a sequência de operações a seguir (o símbolo >>> é do prompt da
linguagem Python):
>>> 1 + 1
3.0
>>> 3.1 + 4
7.1
>>> 4 * (3 + 9)
48
>>> 2/3
41.45454545454545
>>> -7+9
>>> -5**2
-25
>>> (-5)**2
25
>>> a = 64
>>> b = 17
>>> a+b
81
17
Note que a divisão 2 / 3 em Python, citada nos exemplos acima, fornece 0 como
resultado porque a linguagem Python está considerando apenas a divisão inteira
(somente o número 0 do resultado real que é 0.66666...). A ordem de execução dos
operadores obedece à mesma regra da matemática.
Quando o operador + é usado em strings, ele faz uma operação chamada concatenação
de strings. O operador * também tem a mesma função, porém como multiplicador. Veja,
a seguir, alguns exemplos:
'goiabagoiabagoiaba'
>>> 'python' * 3
'pythonpythonpython'
Operações modulares em Python são realizadas pelo operador %; veja alguns exemplos:
>>> 15%7
>>> 17%3
>>> 10 == 10
True
>>> 5 == 7
False
18
Caso você queira realizar operações lógicas (E, OU, OU EXCLUSIVO), poderá usar os
operadores:
>>> 5&6
>>> 5|6
>>> 5^6
x != y (x é diferente de y)
A linguagem Python trabalha com entrada de dados com o comando input. Na versão
atual da linguagem Python, o comando input considera como do tipo “string” todo valor
19
colocado em uma variável através dele. Se você quiser usar valores numéricos, deverá
convertê-los. Veja um exemplo:
Nesse exemplo, a variável “a” recebe inicialmente um valor literal, ou seja, considerado
como caractere, que posteriormente é convertido em número real (que aceita valores
fracionados) através do comando float.
Exemplo de print:
a = ‘mostrando na tela’
print a
Exemplo de return:
return (a*0.4)+(b*0.6)
Aparentemente podem parecer a mesma coisa, mas não são. O comando print, a partir
de qualquer parte de programa, exibe na tela uma informação, que pode ser o conteúdo
de uma variável, o resultado de uma operação, ou outro item; no caso do return, ele
“retorna” um valor. Geralmente é uma resposta a um chamado de alguma função ou
biblioteca.
20
SAIBA MAIS
Para saber mais sobre esse assunto, assista ao vídeo sugerido, que explica o conceito de
entradas e saídas em Python.
Para construir um programa em Python, não é necessário nem uma IDE (Integrated
Development Environment, ou Ambiente Integrado de Desenvolvimento). Basta
escrever seu programa usando um editor de texto não formatado, como Notepad
(Windows) ou gedit (Linux), e salvar esse arquivo em formato .py.
Para que possamos acessar o programa pelo prompt do Windows, devemos indexar a
pasta que contém os arquivos da linguagem Python nas variáveis de ambiente do
Windows.
Para fazer isso, tomando por base o Windows 7, clique com o botão direito do mouse
em Meu Computador, e depois em Propriedades; abra a opção Configurações
Avançadas de Sistema, e aperte o botão Variáveis de Ambiente. Dentro de variáveis de
Sistema, selecione a opção Path; acrescente o caminho do executável da linguagem
Python (normalmente basta acrescentar C:\Python36-32;C:\Python36-32\Scripts;).
Aperte OK em todas as janelas abertas. Preste atenção, pois a pasta onde o Python foi
instalado no Windows pode variar. Aí você terá que colocar o caminho correto, não este
que está escrito.
Uma vez isso feito, é só digitar no prompt do Windows, estando na mesma pasta em
que o programa criado está:
python nome_do_programa.py
21
No caso do Linux, é só acessar o programa pelo prompt ou executá-lo diretamente,
como no Windows.
Embora não haja a necessidade de IDE para construir um programa em Python, há IDE
desenvolvidas para esta linguagem. Entre elas, podemos citar:
PythonWin
PyCharm
22
PyScripter
Se você já estudou programação alguma vez, deve estar se perguntando por que a
escolha da linguagem Python como instrumento de ensino de programação, uma vez
que muitos professores usam Java ou C. Vamos explicar:
Hello world em C:
#include <stdio.h>
23
int main(void)
{
printf("Hello world!\n");
return (0);
}
Em Python, versão 3:
print(“Hello world!”)
Veja, a seguir, um exemplo de um programa escrito em Java que cria uma lista, ou array,
e conta quantas vezes aparece o valor “5” dentro dela (ENADE, 2014, p. 13):
if (array[i] == searchValue)
return true;
else
return hasValue(searchValue, array, i + 1);
}
int c = 0;
if (array[i] == countValue)
c++;
24
return c;
}
a = [2, 3, 5, 6, 9, 7, 8, 8, 9]
contador = 0
for x in a:
if x == 5:
contador +=1
print(contador)
Conclusão
Neste bloco, você tomou o primeiro contato com uma linguagem de programação. No
próximo, continuaremos a falar sobre os principais comandos da linguagem Python.
25
Referências
26
3 PRINCIPAIS COMANDOS
Neste bloco, você aprenderá como usar estruturas de repetição e laço na linguagem
Python, bem como montar estruturas de verificação de listas, dicionários e tuplas, e
outros comandos muito usados nessa linguagem. Também aprenderá como converter
tipos de variáveis e valores numéricos entre bases numéricas na linguagem Python.
Esses comandos são usados quando o programa deve analisar uma situação e tomar
uma decisão baseada nas informações fornecidas.
As decisões tomadas são do tipo “se ocorrer condição x, faça tal coisa; senão, faça essa
outra coisa”. Outra situação é ter várias condições para serem analisadas: “se ocorrer
situação x, faça tal coisa; senão, se acontecer situação y, faça essa outra coisa; senão,
faça essa coisa que é diferente das outras coisas”. Veja um exemplo nesse programa que
diz qual a categoria do atleta em relação à sua idade:
if idade<5:
print("Sem classificacao")
elif idade<11>5:
print("Infantil")
elif idade<16>10:
27
print("Juvenil")
elif idade<21>15:
print("Junior")
elif idade<40>20:
print ("Profissional")
else:
print "Senior"
SAIBA MAIS
Neste vídeo, você poderá ver um pouco mais sobre comandos if, elif e else aplicados a
Python.
Vídeo: Aulas Python - 011 - Estrutura de Decisões II: if, elif e else
AULAS Python - 011 - Estrutura de Decisões II: if, elif e else. 2014. Disponível em:
<https://www.youtube.com/watch?v=kY47B3StnWg>. Acesso em: 14 fev. 2019.
O comando while faz com que o programa execute uma instrução enquanto uma
condição determinada existir.
Exemplo: suponhamos que o professor lhe mande escrever 500 vezes “Não posso fazer
bagunça na aula”. Dá para escrever um programa que automatize essa tarefa? Claro...
a=0
while a<500:
28
print("Não posso fazer bagunça na aula")
a=a+1
Ao usar o comando while, cuidado com o loop infinito, que é uma condição na qual o
programa nunca para de funcionar, se não for interrompido manualmente:
a=0
while True:
print(a)
a=a+1
O comando for permite percorrer os itens de uma lista, tupla ou dicionário, e executar
o código escrito:
a = [1, 2, 3]
b = (4, 5, 6)
for i in a:
if i == 1:
for i in b:
if i == 5:
for i in c:
print c[i]
29
Existe o numeral 1
Existe o numeral 5
abacate
laranja
lima
O comando print, como você já deve ter notado, exibe na tela o valor solicitado. Na
versão atual do Python, a versão 3, a sintaxe de sua escrita é:
Versão 2:
Versão 3:
Agora, em outro exemplo, suponhamos que queremos exibir na tela o valor de uma
variável de nome “controle”:
Versão 2:
print controle
30
Versão 3:
print(controle)
Exibimos as sintaxes nas duas versões da linguagem Python porque nos seus estudos
pessoais você pode se deparar com programas feitos na versão 2.
O comando input serve para criarmos um prompt de interação com o usuário, onde ele
preenche dados, que serão armazenados em uma variável:
31
len: calcula o tamanho de uma string.
Exemplo:
a = ‘banana’
print(len(a))
Saída:
count: função embutida que conta quantas ocorrências há dentro de uma string, lista ou
tupla de uma determinada busca.
32
find: função embutida que informa a 1ª posição onde se encontra determinada busca
dentro de uma string.
33
3.5 Conversão de valores
b = hex(a)
c = b.split('0x')
Agora, este outro exemplo, que converte números inteiros binários para seu respectivo
valor em base decimal, com prompt em inglês:
i = int(a, 2)
O exemplo a seguir converte números inteiros binários para respectivo valor em base
hexadecimal, com prompt em inglês:
34
a=input('Digit your binary value: ')
b=hex(int(a,2))
c = b.split('0x')
Conclusão
Referência
35
4 FUNÇÕES E RECURSOS
Nesse tópico, você irá conhecer para que servem as funções em Python, e como elas
facilitam a programação e auxiliam na tarefa de tornar programas menos complexos.
Também irá conhecer a função dos argumentos e parâmetros na linguagem Python,
como usar recursão nessa linguagem, trabalhar com bibliotecas e fazer comentários em
seus programas em Python.
Com frequência, há certos trechos em um programa que precisam ser executados várias
vezes, ou algumas vezes. Ao invés de escrevê-los várias vezes no programa, há como
registrá-lo uma só vez e chamá-los quando necessário. A esses "subprogramas" dentro
de um programa principal dá-se o nome de funções.
Há funções nativas no Python, ou seja, aquelas que vêm junto com a linguagem, por
exemplo, as funções type, pow (potenciação), len (medir comprimento de string), entre
outras.
Você pode criar sua própria função. Para fazer isso em Python, deve-se iniciar a função
com o comando def <nome_da_função>(): Exemplo:
def prompt_do_usuário():
prompt_do_usuário()
36
No script acima, tudo o que estiver indentado abaixo do nome da função pertence a ela,
e serão as instruções a serem executadas na função. A quarta linha nesse script chama
a função para ser executada, e já não pertence à função.
SAIBA MAIS
Neste livro da Minha Biblioteca, você aprenderá mais sobre funções aplicadas a Python.
Algumas funções nativas da linguagem Python requerem argumentos, que são valores
que controlam como essa função faz seu trabalho.
Por exemplo, se você quer achar o cosseno de um número, você deve usar a biblioteca
math, a função cos e indicar o número a que você se refere, por exemplo, math.cos(25).
Deste modo, a função cos recebe um valor numérico, no caso acima o valor é igual a 25,
como um argumento.
Há funções que requerem mais de um argumento; tudo dependerá de como ela foi
escrita.
37
4.3 Recursão
Como exemplo, considere uma função que soma os números de uma lista, escrito a
seguir:
lista = [1, 2, 3, 4, 5]
def somalista(lista):
if len(lista) == 1:
return lista[0]
else:
Um programa que calcula um fatorial de um número também usa função recursiva. Veja
um exemplo:
def fatorial(n):
if n ==1:
return n
else:
38
return fatorial(n-1) * n
print(fatorial(n))
Note que a função chama a si mesma subtraindo 1 do argumento n, que é o valor que
você preencherá na variável ao executar o programa.
SAIBA MAIS
Neste vídeo, você aprenderá mais sobre funções recursivas aplicadas a Python.
4.4 Bibliotecas
import Image
import sys
import os
39
from Crypto.Cipher import AES
IV_SIZE = 16
block_size = 16
return (a*0.4)+(b*0.6)
Salve esse script em formato .py; depois faça esse outro script, e salve-o no mesmo local
da biblioteca, também com extensão .py:
import media_unisa_lib
40
Você usou uma biblioteca criada por você para executar um programa de cálculo de
média. Toda universidade que usar o mesmo método de cálculo contido nessa biblioteca
pode empregá-la para compor seus programas de cálculo de média.
4.5 Comentários
Veja um exemplo:
print(“Qualquer coisa”) # Esse comando vai mostrar na tela a string “Qualquer coisa”
Tudo o que estiver escrito na linha depois do caractere # será considerado comentário.
Nesse caso, estamos dizendo ao programa que a codificação de teclado a ser usada é a
UTF-8.
Conclusão
Nesse tópico, você aprendeu sobre a importância da linguagem Python e como fazer
uso de suas funções e outros recursos. No próximo tópico você verá como representar
e trabalhar com estruturas de dados na linguagem Python.
41
Referência
42
5 ESTRUTURA DE DADOS
Neste bloco, você irá aprender como usar estruturas de dados dos tipos tuplas,
dicionários, listas, pilhas, filas e deques; também verá como aplicar o conceito de
matrizes na matemática em criptografia e aplicação prática de estruturas de dados.
Lista é uma sequência ordenada e armazenada de valores, que podem ser do tipo literal
ou numérico, armazenados dentro de colchetes, separados por vírgulas. Cada valor em
uma lista é localizado por um índice. Esses valores são chamados itens ou elementos de
uma lista. Listas também são conhecidas como arrays em outras linguagens de
programação. Exemplo: [1, 2, 3, 4].
SAIBA MAIS
Neste vídeo, você aprenderá mais sobre listas, dicionários e tuplas aplicados a Python.
43
5.2 Matrizes
São estruturas bidimensionais, semelhantes a tabelas, com colunas e linhas, que contém
valores numéricos. Veja um exemplo:
Em Python, uma matriz pode ser representada por uma lista composta por listas:
Para realizar operações matemáticas com matrizes, você pode usar a biblioteca numpy;
para tal, importe-a com o comando import numpy.
import numpy
a = [[1,2], [3,4]]
a = numpy.array(a)
b = numpy.array(b)
print(numpy.dot(a, b))
print(matriz[0][0])
44
print(matriz[0][1])
print(matriz[0][2])
print(matriz[1][0])
print(matriz[1][1])
print(matriz[1][2])
print(matriz[2][0])
print(matriz[2][1])
print(matriz[2][2])
matriz = [[0]*2]+[[0]*2]
print(matriz)
print(matriz)
Note que ao invés de usar a multiplicação para criar as linhas da matriz, usamos
concatenação; isso se dá porque se usarmos multiplicação, todas as posições da matriz
serão consideradas 0,0 e 0,1 no caso dessa matriz. Então, somente serão preenchidos
os dois últimos valores que preenchermos no input em todas as posições.
45
5.3 Aplicação prática de matrizes
Agora vamos ver uma aplicação prática de matrizes. Você sabia que dá para criptografar
mensagens usando matrizes? É nisso que se baseia a cifra de Hill. Vejamos:
Escolha uma matriz 2×2 cuja determinante seja diferente de zero. Usaremos esta:
Vamos cifrar a palavra “TOUPEIRA”; atribua um valor numérico de acordo com a posição
de cada letra no alfabeto, e separe as letras em pares:
46
Que fornece o valor cifrado R-M (valores 18 e 13, respectivamente).
HGSLAKRM.
Para decifrar as cifras de Hill, usamos a matriz inversa (mod 26) da matriz codificadora;
daí a razão da determinante ser diferente de 0, pois só assim uma matriz quadrada é
inversível.
Como estamos trabalhando em mod 26, vamos usar a tabela de inversos multiplicativos
nesse valor modal:
Aplicando a fórmula:
8-7-19-12-1-11-18-13
47
Para obter os pares de texto plano, multiplicamos cada vetor pela inversa da matriz A:
Para obter os pares de texto plano, multiplicamos cada vetor pela inversa da matriz A:
Para obter os pares de texto plano, multiplicamos cada vetor pela inversa da matriz A:
Para obter os pares de texto plano, multiplicamos cada vetor pela inversa da matriz A:
Pilha é uma lista que permite acesso em somente uma extremidade. Os dados inseridos
vão se “empilhando”, de modo que o último que entrou será o primeiro a sair. Um
exemplo de uso dessa estrutura são as calculadoras que usam notação polonesa inversa
(A HP é uma delas).
48
Deques são listas que permitem remover elementos de qualquer lugar. São usados, por
exemplo, em gerenciamento de memória RAM e em construção de programas diversos.
SAIBA MAIS
Neste vídeo, você aprenderá mais sobre pilhas, filas e deques aplicados a Python.
Veja um exemplo de como usar pilhas na vida real: imagine uma calculadora HP. Como
ela processa as informações da expressão matemática a seguir?
((1 + 1) * 4) + 3
Veja na tabela:
1 entra operando 1
1 entra operando 1, 1
+ adicionar 2
4 entra operando 2, 4
* multiplicar 8
3 entra operando 8, 3
+ adicionar 11
49
Deques possuem várias aplicações. Quando você termina um processo em um
computador, o espaço da memória RAM que ele estava ocupando é disponibilizado para
uso, podendo ter antes e depois do seu endereçamento outros processos alocados. Essa
é uma operação típica de deques, que permitem adição e remoção de elementos.
Conclusão
Nesse tópico, você aprendeu sobre como trabalhar com estruturas de dados na
linguagem Python. No próximo tópico, você verá como representar e trabalhar com
árvores binárias na linguagem Python.
Referências
50
6 ÁRVORES BINÁRIAS
Neste bloco, você irá aprender os principais conceitos e aplicações de árvores binárias,
saberá como uma máquina decide qual o menor caminho entre um ponto e outro, e
também como representar árvores binárias em Python.
Nota que uma árvore é composta pelo nó raiz, do qual saem todos os outros nós e/ou
folhas.
51
Essa outra figura contém um exemplo de uma árvore que representa a hierarquia de
uma empresa:
52
Esse processo é repetido até que o valor seja encontrado. Se o valor não for encontrado,
então o valor não deve estar presente na árvore.
Uma árvore binária de busca aceita outras operações além de busca. Na inserção, a raiz
é verificada e introduz-se um nó novo na subárvore da esquerda, se o novo valor for
menor do que a raiz, ou na subárvore da direita, se o valor novo for maior do que a raiz.
53
Removendo um nó com uma folha
SAIBA MAIS
54
6.2 Balanceamento de árvores binárias
Dizemos que uma árvore está balanceada quando a altura das duas subárvores da raiz
for igual a 1, -1 ou 0. Veja um exemplo de uma árvore desbalanceada:
Árvore desbalanceada
Árvore balanceada
55
Rotação à esquerda simples
56
Rotação à direita dupla
Veja os grafos a seguir expondo um problema a ser resolvido com esse algoritmo. Qual
o caminho mais curto em ter os pontos A e F?
57
Vértice Passo 1 Passo 2 Passo 3 Passo 4 Passo 5 Passo 6
A 0, A - - - - -
B 5, A 5, B 5, B - - -
C 3, A 3, A - - - -
D ∞ 12, C 11, B 11, B - -
E ∞ 14, C 14, C 14, D 14, D -
F ∞ ∞ ∞ 17, D 17, E 17, E
58
Transformaremos o cenário em um sistema de grafos:
Para mapear o cenário, traçaremos uma reta entre o ponto inicial (robô) e o ponto final
(bola) e também traçaremos retas perpendiculares à essa reta nos outros grafos:
Traçaremos um círculo em torno de cada grafo com distância de 2r (2 vezes seu raio)
para evitar colisões ao estabelecer a rota do robô. Os pontos de intersecção das retas
perpendiculares e os círculos serão considerados grafos do nosso sistema.
59
Então ligamos os grafos uns com os outros a partir do ponto de origem:
Este é nosso grafo, já com o cálculo dos custos de percurso entre os pontos,
considerando a distância entre eles:
60
Aplicando o algoritmo de Dijkstra, chega-se a esta solução de percurso:
Mostrando no cenário:
61
Os valores estão em branco, pois iremos escolhê-los durante a execução do programa.
Eis o código:
class Tree:
def __init__(self, cargo, left=None, right=None):
self.cargo = cargo
self.left = left
self.right = right
printTreeIndented(tree.right, level+1)
printTreeIndented(tree.left, level+1)
def abertura():
printTreeIndented(tree, level=0)
62
elif b < a and c > a:
printTreeIndented(tree, level=0)
else:
abertura()
abertura()
O número mais à esquerda é a raiz; as folhas e nós da ramificação esquerda estão abaixo
do número mais à esquerda; as folhas e nós da ramificação direita estão acima do
número mais à esquerda.
Para criarmos uma árvore com mais ramificações, é só alterarmos o código. Vejamos o
trecho alterado para criarmos uma árvore com uma raiz e quatro elementos, com os
seguintes formatos:
63
(…)
printTreeIndented(tree.right, level+1)
printTreeIndented(tree.left, level+1)
printTreeIndented1(tree.left, level+1)
printTreeIndented1(tree.right, level+1)
def abertura():
64
d = input("Digite o valor de uma das folhas: ")
if b > a and c > b > a and d > c > a and e > d > a:
printTreeIndented(tree, level=0)
elif b < a and c < b < a and d < c < a and e < d < a:
printTreeIndented1(tree, level=0)
elif b < a and c < b < a and d < c < e and e > c < b and e > c > d and e > d:
printTreeIndented(tree, level=0)
elif b > a and c > b > a and d < c < e and e > c > b and e > c > d and e > d:
printTreeIndented1(tree, level=0)
elif a > b > d and b > d and a < c < e and c < e:
printTreeIndented1(tree, level=0)
else:
65
abertura()
abertura()
Conclusão
Neste bloco, você aprendeu sobre como trabalhar com árvores binárias, seus principais
conceitos e aplicações práticas e também como representá-las na linguagem Python.
Por aqui terminamos esta disciplina. Nos vemos nas avaliações!
Referências
66