Fundamentos da Programação...Cifra de substituição •Cada letra da mensagem é substituída...

Post on 02-Apr-2021

0 views 0 download

Transcript of Fundamentos da Programação...Cifra de substituição •Cada letra da mensagem é substituída...

Fundamentos da Programação

Capítulo 4: Tuplos e ciclos contados (ciclos contados e cadeias de caracteres revisitadas)

Ciclos contados• Semântica

Ao encontrar a instrução:

for var in exp:

<instruções>

• O Python executa as instruções correspondentes a <instruções> para os valores da variável var correspondentes aos elementos da sequência resultante da avaliação de exp

• No corpo do ciclo de uma instrução for pode também ser utilizada a instrução break

Expressão rangeSintaxe

Todas as expressões têm um valor inteiro

Expressão rangeSemântica• range(n) devolve a sequência contendo os inteiros entre 0 e n-1. Se

n ≤ 0, devolve a sequência sem elementos• range(n1, n2) devolve a sequência contendo os inteiros entre n1 e n2-1.

Se n2 ≤ n1, devolve a sequência sem elementos• range(n1, n2, n3) devolve a sequência contendo os inteiros que

começam em n1 e nunca sendo superiores a n2-1 (ou nunca sendo inferiores a n2+1, no caso de n3 < 0), em que cada elemento da sequência é obtido do anterior somando n3, ou seja corresponde à sequência n1, n1+n3, n1+2*n3, ....

Ciclos contados – Exemplo def soma_elementos(t):

soma = 0

for i in range(len(t)):

soma = soma + t[i]

return soma

>>> soma_elementos((1, 2, 3, 4))

10

Exemplo• Predicado tuplo_ordenado, devolve True apenas se o tuplo que é seu

argumento estiver ordenado

Exemplo• Predicado tuplo_ordenado, devolve True apenas se o tuplo que é seu

argumento estiver ordenado

def tuplo_ordenado(t):

for i in range(len(t)-1):

if t[i] > t[i+1]:

return False

return True

Funções com número arbitrário de argumentos• A função print aceita qualquer número de argumentos

print()

print(x, ‘é o resultado de elevar ‘, y, ‘a ‘, x)

• Como escrever funções deste tipo?

Número arbitrário de argumentos• Sintaxe

• Semântica• Ao encontrar a chamada, o Python associa os n-1 primeiros parâmetros

formais com os n-1 primeiros parâmetros concretos e associa o último parâmetro formal (o nome antecedido por *) com o tuplo constituído pelos restantes parâmetros concretos

Exemplodef ex_fn(a, b, *c):

print('a =', a)print('b =', b)print('c =', c)

>>> ex_fn(3, 2)a = 3b = 2c = ()>>> ex_fn(3, 2, 5, 6, 7, 8)a = 3b = 2c = (5, 6, 7, 8)>>> ex_fn(3)TypeError: ex_fn() missing 1 required positional argument: 'b'

Cadeias de caracteres• Introduzidas como constantes – qualquer sequência de caracteres delimitada

por plicas ou por aspas• Usadas para produzir mensagens para o utilizador

Cadeias de caracteres• Introduzidas como constantes – qualquer sequência de caracteres delimitada

por plicas ou por aspas• Usadas para produzir mensagens para o utilizador

• As cadeias de caracteres correspondem a um tipo estruturado de dados, designado por string, o qual corresponde a uma sequência de caracteres individuais

Cadeias de caracteres• Representação externa

<cadeia de caracteres> ::= '<carácter>*' |

"<carácter>*" |

"""<carácter>*"""

''e "" correspondem à cadeia de caracteres vazia

Cadeias de caracteres"""<carácter>*"""

• Cadeias de caracteres de documentação

• Quando o Python encontra uma cadeia de caracteres de documentação, na linha imediatamente a seguir a uma linha que começa pela palavra def, associa o conteúdo dessa cadeia de caracteres à entidade que está a ser definida

• Permite a consulta rápida da informação associada com a entidade definida, recorrendo à função help

Operações sobre cadeias de caracteres

Exemplo – caracteres em comumdef c_comum(cc1, cc2):

res = ''for e1 in cc1:

for e2 in cc2:if e1 == e2 and e1 not in res:

res = res + e1return res

>>> c_comum('agbdcu', 'ggat')'ag'

Representação interna de caracteres• Cada carácter é representado internamente por um inteiro

• Vários modos de codificar carateres

• ASCII (American Standard Code for Information Interchange) – 128 caracteres

• Unicode

ASCII

Funções embutidas• ord

• recebe um carácter (sob a forma de uma cadeia de caracteres) e devolve o inteiro correspondente ao código decimal que o representa

• chr• recebe um número inteiro positivo e devolve o carácter (sob a forma de uma

cadeia de caracteres) representado por esse número>>> ord('R')

82

>>> chr(125)

''

Operadores relacionais<, >, >=, <=, ==, !=

>>> 'a' < 'b'True>>> 'a' > 'A'True>>> 'abc' > 'adg'False>>> 'abc' < 'abcd'True

Exemplo

ABB33BBBC

Cifragem de mensagens• Cifra corresponde a substituir as letras da mensagem por outras letras através

de um algoritmo conhecido pelo recetor da mensagem• Cifra de substituição, substitui cada letra da mensagem por outra letra de

acordo com um certo padrão• A primeira utilização foi feita por Júlio César (100-44 a.C.) durante as Guerras Gálicas,

sendo também conhecida por cifra de César

Cifra de substituição• Cada letra da mensagem é substituída pela letra que está um certo número de

posições à sua direita no alfabeto, o deslocamento• Se o deslocamento for 5, A será substituída por F, B por G e assim

sucessivamente

ABCDEFGHIJKLMNOPQRSTUVWXYZ

FGHIJKLMNOPQRSTUVWXYZABCDE

• A cifra de César corresponde a 26 cifras de substituição, uma para cada letra do alfabeto

Cifra de substituição• Cada letra da mensagem é substituída pela letra que está um certo número de

posições à sua direita no alfabeto, o deslocamento• Se o deslocamento for 5, A será substituída por F, B por G e assim

sucessivamente

ABCDEFGHIJKLMNOPQRSTUVWXYZ

FGHIJKLMNOPQRSTUVWXYZABCDE

Exemplo• Função codifica recebe uma maiúscula, c, e o deslocamento, desloc (apenas

considera letras maiúsculas)1. Calcula o seu código ASCII: ord(c)

2. Calcula a distância a c se encontra em relação ao início do alfabeto, ord(c)-ord(’A’)

3. Soma desloc a essa distância e determina qual a distância a que a letra resultante está do início do alfabeto, (ord(c)-ord(’A’)+desloc)%26

4. Soma a distância à posição da letra ’A’, ord(’A’)+(ord(c)-ord(’A’)+desloc)%26

5. A função chr, calcula qual a letra que substitui a letra original

Exemplo

Exemplo• À mensagem cifrada é adicionada, na última posição, a letra que define a cifra

usada

Dígito de controle• Problema relevante em situações em que se lida com números muito grandes

• Número do cartão de cidadão, números de cartões de crédito, números de cheques, códigos de barras de produtos, identificadores de livros (código ISBN)

• É comum a introdução de um dígito adicional, o dígito de controle que permite detetar os erros mais comuns na introdução ou transmissão de grandes números:

1. a alteração de um único algarismo2. a troca de pares de algarismos subjacentes

• O dígito de controle é calculado de acordo com determinado algoritmo e permite verificar se o número introduzido está ou não correto

Dígito de controle – cartão de cidadão

1º dígito de controle: o valor da soma

adicionado ao dígito de controle é um múltiplo de 11

02038801 2 ZZ9

1º dígito de controle

2º dígito de controle

Dígito de controle – cartão de cidadão

def gera_dc_1(num_id_civil):if len(num_id_civil) != 8:

raise ValueError ('Numero incorreto')else:

soma = 0for i in range(8):

soma = soma + eval(num_id_civil[i]) * (9 - i)return 11 - soma % 11