-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathclientes.py
225 lines (192 loc) · 7.54 KB
/
clientes.py
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
class Cliente:
"""
Classe Cliente: Representa um cliente de uma loja.
"""
def __init__(self, nome, endereco, codCliente):
self.nome = nome
self.endereco = endereco
self.codCliente = codCliente
def __str__(self):
"""
Método str: Retorna uma string com os dados do cliente.
"""
return f"Nome: {self.nome}\nEndereço: {self.endereco}\nID: {self.codCliente}"
def menu():
"""
Função menu: Imprime o menu de opções do programa.
não recebe parâmetros e não retorna nada.
"""
print(f'====== <<< \033[36m{"MENU"}\033[m >>> ======')
print(f'| [\033[36m1\033[m] {"ADICIONAR CLIENTE":<18} |')
print(f'| [\033[36m2\033[m] {"BUSCAR POR NOME":<18} |')
print(f'| [\033[36m3\033[m] {"BUSCAR POR CÓDIGO":<18} |')
print(f'| [\033[36m4\033[m] {"VER OS CLIENTES":<18} |')
print(f'| [\033[36m5\033[m] {"SAIR":<18} |')
print('-' * 26)
def lerArquivo():
"""
Lê o arquivo "clientes.txt", cria e retorna uma lista de objetos Cliente.
Se o arquivo não for encontrado, retorna uma lista vazia.
"""
try:
try:
with open("clientes.txt", 'r', encoding='utf-8') as arquivo:
linhas = arquivo.readlines()
lista_clientes = []
for linha in linhas:
nome, endereco, codCliente = linha.strip().split(',')
cliente = Cliente(nome.title(), endereco.title(), int(codCliente))
lista_clientes.append(cliente)
return lista_clientes
except UnicodeDecodeError:
with open("clientes.txt", 'r', encoding='iso-8859-1') as arquivo:
linhas = arquivo.readlines()
lista_clientes = []
for linha in linhas:
nome, endereco, codCliente = linha.strip().split(',')
cliente = Cliente(nome.title(), endereco.title(), int(codCliente))
lista_clientes.append(cliente)
return lista_clientes
except FileNotFoundError:
return []
def escreverArquivo(cliente):
"""
Função escreverArquivo: Escreve os dados do cliente no arquivo clientes.txt.
"""
with open("clientes.txt", "a", encoding='utf-8') as arquivo:
arquivo.write(
f'{cliente.nome}, {cliente.endereco}, {cliente.codCliente}\n')
def preenche(lista):
"""
Função preenche: Preenche a lista de clientes com os dados dos clientes.
receberá a lista de clientes e retornará a lista atualizada.
"""
print("Informe os dados do Cliente:")
nome = str(str_input('Nome: '))
endereco = str(input("Endereço: "))
codCliente = verificarID(lista)
cliente = Cliente(nome, endereco, codCliente)
lista.append(cliente)
escreverArquivo(cliente)
return cliente
def verClientes(lista):
"""
Mostra na tela a quantidade e as infomações de todos os clientes cadastrados.
"""
lista.sort(key=lambda x: x.nome)
for cliente in lista:
print(f'{cliente.nome:<30} | {cliente.endereco:<30} | {cliente.codCliente}')
print('-=' * 37)
print(f'Total de clientes: {len(lista)}')
def busca_interpolacao_codigos(lista_codigos, chave, contagem=False):
"""
Função busca_interpolacao_codigos: Realiza a busca por um código na lista de clientes utilizando o método de busca por interpolação.
"""
import time
if contagem:
start_time = time.time()
lista_clientes = lista_codigos
lista_codigos = [cliente.codCliente for cliente in lista_clientes]
lista_codigos.sort()
inicio = 0
fim = len(lista_codigos) - 1
if(fim == inicio):
return 0
while inicio <= fim and lista_codigos[inicio] <= chave <= lista_codigos[fim]:
try:
# Calcula a posição utilizando uma média ponderada das posições dos códigos
posicao = inicio + int(((chave - lista_codigos[inicio]) / (
lista_codigos[fim] - lista_codigos[inicio])) * (fim - inicio))
except ZeroDivisionError:
return -1
if lista_codigos[posicao] == chave:
if contagem:
end_time = time.time() - start_time
print(f'Tempo de execução: {end_time} segundos')
return posicao # Chave encontrada
elif lista_codigos[posicao] < chave:
inicio = posicao + 1
else:
fim = posicao - 1
if contagem:
end_time = time.time() - start_time
print(f'Tempo de execução: {end_time} segundos.')
return -1
def busca_interpolacao_nomes(lista_nomes, chave, contagem=False):
"""
Função busca_interpolacao_nomes: Realiza a busca por um nome na lista de clientes utilizando o método de busca por interpolação.
"""
import time
if contagem:
start_time = time.time()
lista_clientes = lista_nomes
lista_nomes = [cliente.nome for cliente in lista_clientes]
lista_nomes.sort()
inicio = 0
fim = len(lista_nomes) - 1
if (inicio == fim):
return 0
while inicio <= fim and ord(lista_nomes[inicio][0]) <= ord(chave[0]) <= ord(lista_nomes[fim][0]):
try:
# Calcula a posição utilizando uma média ponderada das posições dos caracteres
posicao = inicio + int(((ord(chave[0]) - ord(lista_nomes[inicio][0])) / (
ord(lista_nomes[fim][0]) - ord(lista_nomes[inicio][0]))) * (fim - inicio))
except ZeroDivisionError:
return -1
if lista_nomes[posicao] == chave:
if contagem:
end_time = time.time() - start_time
print(f'Tempo de execução: {end_time} segundos.')
return posicao # Chave encontrada
elif lista_nomes[posicao] < chave:
inicio = posicao + 1
else:
fim = posicao - 1
if contagem:
end_time = time.time() - start_time
print(f'Tempo de execução: {end_time} segundos.')
return -1 # Chave não encontrada
def int_input(msg):
"""
Função para ler apenas números.
"""
while True:
try:
num = int(input(msg))
except (ValueError, TypeError, NameError, EOFError):
print(
'\033[31mERRO! Por favor, digite um número inteiro válido.\033[m')
except KeyboardInterrupt:
print('\033[31mUsuário preferiu digitar nada.\033[m')
return 0
else:
return num
def str_input(msg):
"""
Função para ler apenas nomes.
"""
while True:
try:
nome = input(msg) # Converte o nome para minúsculas
if not nome.replace(" ", "").isalpha():
raise ValueError('O nome deve conter apenas letras.')
except ValueError as ve:
print('\033[31mERRO! Por favor, digite um nome válido.\033[m')
except EOFError:
print('\033[31mERRO! Por favor, digite um nome válido.\033[m')
except KeyboardInterrupt:
print('\033[31mUsuário preferiu digitar nada.\033[m')
return 'NULL'
else:
return nome.title().strip()
def verificarID(lista):
"""
Função verificarID: Recebe uma lista e verifica o ID fornecido está disponível.
Caso o ID já esteja em uso, a função pedirá ao usuário para fornecer um novo ID até que um ID válido seja inserido.
"""
while True:
id = int_input('ID: ')
if any(cliente.codCliente == id for cliente in lista):
print('\033[31mID já existe. Tente novamente.\033[m')
else:
return id