-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprojeto.py
More file actions
317 lines (276 loc) · 12.1 KB
/
projeto.py
File metadata and controls
317 lines (276 loc) · 12.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
5#import matplotlib.pyplot as plt #para testar no exercicio 1
import random #utilizado para o exercicio 3 e 4
#exercicio 1- Criar um histograma com uma frase de um ficheiro.
#procurar se existe ficheiro
try:
f = open('TESTE.txt','r') #abrir o ficheiro 'TESTE.txt' em modo leitura
texto = f.readlines() #pega no ficheiro 'TESTE.txt' le e manda para a variavel texto
f.close()
except:
print('O arquivo não existe!')
dicionario = {}
for linhas in texto: #percorrer cada linha do texto
for letra in linhas: #percorrer cada letra da linha
if letra.isalpha(): #verificar se é letra
if letra in dicionario.keys(): #verificar se a letra está no dicionario
dicionario[letra] += 1 #nº de vezes que a letra está no dicionario
else:
dicionario[letra] = 1
def histograma(dicionario): #chama dicionario
for letra in sorted(dicionario.keys()): #retorna lista de objetos especificos
print(letra + "=" + "*"*dicionario[letra]) #coloca um * vezes a quantidade que existe no dicionario
#para testar graficamente o histograma pode testar este codigo aqui é onde é usado o primeiro import
# plt.title("Histograma de Letras")
# plt.xlabel('Letras')
# plt.ylabel('Numero de Letras')
# plt.bar(list(dicionario.keys()), dicionario.values(), color='#7eb54e')
# plt.show()
#exercicio 2- Encripta uma frase a partir de uma chave e desencripta a mesma.
def encriptaçao(frase, chave):
alfabeto = 'ABCDEFGHIJKLMNOPQRSTUVWYZ'
novafrase = '' #frase vazia que irá ser retornada com texto no final
for letra in frase: #percorrer cada letra da frase
indice = alfabeto.find(letra) #encontra uma letra no alfabeto e coloca-a no indice
if letra in alfabeto:
if indice == -1: #se não encontrar o caracter presente no alfabeto ele adiciona esse caracter à nova frase
novafrase = novafrase + letra
else:
novoindice = indice + chave #isto avança no indice criando um novo alfabeto
novoindice = novoindice % len(alfabeto) #garante que a conta não passa o nº total do nosso alfabto, ou seja, o valor está dentro do intervalo
novafrase += alfabeto[novoindice:novoindice+1] #calcula a nova string
return novafrase
#exatamente igual ao 'def encriptaçao(frase, chave):' mas desencripta
def desencriptaçao(frase, chave):
alfabeto = 'ABCDEFGHIJKLMNOPQRSTUVWYZ'
novafrase = ''
for letra in frase:
indice = alfabeto.find(letra)
if letra in alfabeto:
if indice == -1:
novafrase = novafrase + letra
else:
novoindice = indice - chave #desencriptar
novoindice = novoindice % len(alfabeto)
novafrase += alfabeto[novoindice:novoindice+1]
return novafrase
#exercicio 3- Permite codificar e descodificar um texto, utilizando um alfabeto misturado.
alfabeto = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#------------------------------- criar chave
def criar_chave():
lista = []
contador1 = 0
chave = ""
while contador1 < 26: #garante o nº do alfabeto
contador1 = contador1 + 1 #conta o nº de vezes que fazemos o ciclo while
num=random.randint(1,26) #dá um numero entre 1 e 26
flag=0
for x in lista: #verificar a lista toda uma a uma
if x==num:
contador1 = contador1 - 1
flag = 1
if flag == 0:
lista.append(num) #adiciona à lista a variavel (num)
contador2 = 0
for y in alfabeto: #percorre alfabeto
contador2 = contador2 + 1
if contador2==num: #quando o contador for igual ao aleatorio, a letra que está no alfabeto vai ser igual ao nº aleatorio (o num corresponde a uma letra aleatoria do alfabeto)
chave = chave + y #adiciona a letra à nova chave
return(chave)
chave1 = criar_chave() #armazena a chave aleatoria
def encode_ale(x, chave):
contador3 = -1
contador4 = -1
if x == " ":
return x
else:
for y in alfabeto:
contador3 = contador3 + 1
if x == y:
for z in chave:
contador4 = contador4 + 1
if contador3 == contador4:
return z
def decode_ale(x, chave):
contador3 = -1
contador4 = -1
if x == " ":
return x
else:
for y in chave:
contador3 = contador3 + 1
if x==y:
for z in alfabeto:
contador4 = contador4 + 1
if contador4 == contador3:
return z
def encode1(frasedescodificada):
contador3 = 0
codificada = "" # decifrar segundo a chave
for x in frasedescodificada: #A
a= encode_ale(x, chave1)
codificada = codificada + a
contador3 = contador3 + 1
return codificada
def decode1(frasecodificada):
contador3=0
descodificada= ""
for x in frasecodificada:
a = decode_ale(x, chave1)
descodificada = descodificada + a
contador3 = contador3 + 1
return descodificada
#exercicio 4- Codificar e descodificar um ficheiro de texto utilizando duas strings com o alfabeto numa ordem pré-estabelecida.
alfabeto = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
chavep="ZSBTRQLAMUWDVPNCXGEIFYJHOK" #igual ao criar_chave
chavei="CBHDIGPXWJVQANETORYKZUFSLM" #igual ao criar_chave
#faz exatamente o mesmo que a criar_chave1()
def criar_chave2():
lista = []
contador3 = 0
chavex = ""
while contador3 < 26:
contador3 = contador3 + 1
num=random.randint(1,26)
flag=0
for x in lista: #verificar a lista toda uma a uma
if x==num:
contador3 = contador3 - 1
flag = 1
if flag == 0:
lista.append(num) #[1,4,6,2,5,8]
contador4 = 0
for y in alfabeto: #ABCDEFGHIJKLMNOPQRSTUVWXYZ
contador4 = contador4 + 1
if contador4==num:
chavex = chavex + y
return(chavex)
chave3 = criar_chave2()
chave2 = criar_chave2()
try:
file1 = open("ProjetoFile.txt" , "r") #abrir o ficheiro 'ProjetoFile.txt' em modo leitura
frasedescodificada1 = file1.read()
frasedescodificada1 = ''.join(char for char in frasedescodificada1 if char.isalnum()) #deteta qualquer valor alfa númerico junta tudo
frasedescodificada1 = frasedescodificada1.upper() #coloca em maiusculo
f.close()
except:
print('O arquivo não existe!')
def encode_par_impar(x, chavex): #chave par
contador3 = -1
contador4 = -1
if x == " ":
return x
else:
for y in alfabeto:
contador3 = contador3 + 1
if x == y:
for z in chavex:
contador4 = contador4 + 1
if contador3 == contador4:
return z
def decode_par_impar(x, chavex):
contador3 = -1
contador4 = -1
if x == " ":
return x
else:
for y in chavex:
contador3 = contador3 + 1
if x==y:
for z in alfabeto:
contador4 = contador4 + 1
if contador4 == contador3:
return z
def encode2(frasedescodificada1):
contador3 = 0
codificada = "" # decifrar segundo a chave
for x in frasedescodificada1: #A
if contador3 % 2 == 0: #par
a= encode_par_impar(x, chave3)
codificada = codificada + a
contador3 = contador3 + 1
else: #impar
a = encode_par_impar(x, chave2)
codificada = codificada + a
contador3 = contador3 + 1
return codificada
def decode2(frasedescodificada1, chave3, chave2):
descodificada = ""
contador = 0
for x in frasedescodificada1:
if contador == 0 or 0 == contador % 2:
a = decode_par_impar(x, chave3)
else:
a = decode_par_impar(x, chave2)
descodificada += a
contador += 1
return descodificada
#menu
print("----------------------------------MENU----------------------------------")
print("| CIFRA DE CESAR |")
print("| Escolha uma das seguintes opções: |")
print("| |")
print("| 0) Para encerrar o programa. |")
print("| 1) Criar um histograma com uma frase de um ficheiro. |")
print("| 2) Encripta uma frase a partir de uma chave e desencripta a mesma. |")
print("| 3) Permite codificar e descodificar um texto, utilizando um |")
print("| alfabeto misturado. |")
print("| 4) Codificar e descodificar um ficheiro de texto utilizando duas |")
print("| strings com o alfabeto numa ordem pré-estabelecida. |")
print("| 5) Autores |")
print("------------------------------------------------------------------------")
#cada opção do menu
while True:
escolha = input("Introduza uma opção do menu: ")
match escolha:
case '0':
print("Programa encerrado")
break
case '1':
print(dicionario)
print(histograma(dicionario))
case '2':
escolha1 = (int)(input("Digite 1 para encriptar ou digite 2 para desencriptar: "))
chave = (int)(input("Coloque a quantidade de casas que quer avançar no alfabeto: "))
original = (str)(input("Introduze uma frase: "))
original = original.upper()
while True:
if escolha1 == 1:
encode = encriptaçao(original, chave)
print('Encriptada:', encode)
break
elif escolha1 == 2:
decode = desencriptaçao(original, chave)
print('Descriptada:', decode)
break
else:
escolha1 = (int)(input("Erro!! Por favor, coloque um número entre 1 e 2 para escolher a opção de encriptar e desencriptar. Introduza novamente: "))
case '3':
escolha2 = (int)(input("Digite 1 para encriptar ou digite 2 para desencriptar: "))
while True:
if escolha2 == 1:
frasedescodificada = (str)(input("Frase: "))
frasedescodificada = frasedescodificada.upper()
print("Frase: " , encode1(frasedescodificada))
break
elif escolha2 == 2:
frasecodificada=(str)(input("Frase: "))
frasecodificada = frasecodificada.upper()
print("Frase: " , decode1(frasecodificada))
break
else:
escolha2 = (int)(input("Erro!! Por favor, coloque um número entre 1 e 2 para escolher a opção de encriptar e desencriptar. Introduza novamente: "))
case '4':
chave3 = criar_chave()
chave2 = criar_chave()
codificada = encode2(frasedescodificada1)
print("Codificada: ", codificada)
print("Descodificada: ", decode2(codificada, chave3, chave2))
case '5':
print("Trabalho de Laboratório de Programação: ")
print(" Projeto Final- Encriptação")
print(" Diogo Vieira al76191")
print(" João Monteiro al76117")
print(" Jorge Pereira al14023")
print(" Tiago Moreira al76741")
case _:
print("Opçao indisponivel")