-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathLSeq.py
220 lines (191 loc) · 9.45 KB
/
LSeq.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
from tkinter import *
#Classe que cria a lista sequencial
class ListaSequencial:
#Inicializa a lista
def __init__(self):
self.lista = []
#Define o tamanho máximo da lista (20 no caso)
self.tamanho_maximo = 20
for i in range(self.tamanho_maximo):
self.lista.insert(i, "")
#Verifica se a lista está cheia, retorna True se está e False se não
def lista_cheia(self):
tam = self.tamanho_maximo
for i in range(self.tamanho_maximo):
if i == self.tamanho_maximo - 1 and self.lista[tam - 1] != "":
return True
else:
return False
#Define um tamanho máximo para a lista
def definir_tamanho_maximo(self, tamanho):
self.tamanho_maximo = tamanho
if len(self.lista) > tamanho:
self.lista = self.lista[:tamanho]
#Insere elementos novos na lista, retorna True caso consiga e False caso não
def inserir(self, valor, posicao):
tam = len(self.lista)
#Verifica se a lista possui tamanho máximo e se está cheia
if self.tamanho_maximo is not None and ListaSequencial.lista_cheia(self):
return False
else:
#Verifica se o elemento anterior ao da posição especificada está vazio,
#excluindo as posições 1 e 2 para a subtração do índice
if posicao != 2 and posicao != 1 and self.lista[posicao - 2] == "":
return False
else:
#Verifica se o elemento 1 está vazio para que seja possível
#inserir na posição 2
if posicao == 2 and self.lista[0] == "":
return False
else:
#Verifica se o último elemento está vazio para ser inserido nessa posição
if self.lista[self.tamanho_maximo - 1] != "":
return False
else:
#Move os elementos para a direita da posição especificada
for i in range(tam - 1, posicao - 1, -1):
aux = self.lista[i - 1]
if self.lista[i] == "" and self.lista[i - 1] == "":
continue
else:
self.lista.pop(i)
self.lista.insert(i, aux)
#Adiciona o novo elemento
self.lista.pop(posicao - 1)
self.lista.insert(posicao - 1, valor)
return True
#Remove elementos da lista, retorna True caso o elemento esteja na lista e False caso não
def remover(self, posicao):
tam = len(self.lista)
#Verifica se a posição está dentro dos limites da lista
if posicao > 0 and posicao <= tam:
#Verifica se o elemento após a posição especificada está vazio (seria o último elem.)
if self.lista[posicao] != "":
del self.lista[posicao - 1]
self.lista.insert(posicao - 1, "")
for i in range(posicao - 1, tam - 1):
aux = self.lista[i + 1]
self.lista.pop(i)
self.lista.insert(i, aux)
self.lista.pop(i + 1)
self.lista.insert(i + 1, "")
#Remoção do último elemento apenas
else:
self.lista.pop(posicao - 1)
self.lista.insert(posicao - 1, "")
return True
else:
return False
#Consulta o elemento através do seu valor inserido, retorna a posiçao caso esteja na lista
#ou -1 caso não
def consulta_por_valor(self, valor):
for i in range(len(self.lista)):
if self.lista[i] == valor and valor != "":
return i + 1
return -1
#Consulta o elemento pela posição especificada, retorna o valor caso a posiçao seja válida
#ou None se for inválida
def consulta_por_posicao(self, posicao):
if posicao >= 0 and posicao < len(self.lista) and self.lista[posicao] != "":
valor = self.lista[posicao]
return valor
else:
return None
#Criação da interface gráfica em si
class InterfaceGrafica:
#Inicialização da interface gráfica e de seus prompts(labels), botões e caixas de
#inserção de valores(check box)
def __init__(self, master):
self.lista_sequencial = ListaSequencial()
master.title("Lista Sequencial")
self.label = Label(master, text="Lista Sequencial", font=("Arial", 15))
self.label.pack(padx=20, pady=20)
self.frame_caixas = Frame(master)
self.frame_caixas.pack(side=TOP, pady=10)
self.label_inserir_valor = Label(self.frame_caixas, text="Valor")
self.label_inserir_valor.pack(side=LEFT, padx=5)
self.caixa_inserir_valor = Entry(self.frame_caixas)
self.caixa_inserir_valor.pack(side=LEFT)
self.label_inserir_posicao = Label(self.frame_caixas, text="Posição")
self.label_inserir_posicao.pack(side=LEFT)
self.caixa_inserir_posicao = Entry(self.frame_caixas)
self.caixa_inserir_posicao.pack(side=LEFT, padx=5)
self.button_inserir = Button(self.frame_caixas, text="Inserir", command=self.inserir)
self.button_inserir.pack(side=LEFT, padx=5)
self.label_erro_inserir = Label(self.frame_caixas, text="", fg="red")
self.label_erro_inserir.pack(side=LEFT)
self.label_remover_posicao = Label(master, text="Posição")
self.label_remover_posicao.pack()
self.caixa_remover_posicao = Entry(master)
self.caixa_remover_posicao.pack()
self.button_remover = Button(master, text="Remover", command=self.remover)
self.button_remover.pack(pady=10)
self.label_erro_remover = Label(master, text="", fg="red")
self.label_erro_remover.pack()
self.label_consulta_valor = Label(master, text="Valor")
self.label_consulta_valor.pack()
self.caixa_consulta_valor = Entry(master)
self.caixa_consulta_valor.pack()
self.button_consulta = Button(master, text="Consultar", command=self.consulta_por_valor)
self.button_consulta.pack(pady=10)
self.label_resultado_consulta = Label(master, text="", fg="green")
self.label_resultado_consulta.pack()
self.label_consulta_posicao = Label(master, text="Posição")
self.label_consulta_posicao.pack()
self.caixa_consulta_posicao = Entry(master)
self.caixa_consulta_posicao.pack()
self.button_consulta_posicao = Button(master, text="Consultar por Posição", command=self.consulta_por_posicao)
self.button_consulta_posicao.pack(pady=10)
self.label_resultado_consulta_posicao = Label(master, text="", fg="green")
self.label_resultado_consulta_posicao.pack()
self.frame_lista = Frame(master)
self.frame_lista.pack()
self.atualizar_listbox()
#Exibição do elemento inserido, erro caso não for bem sucedido
def inserir(self):
valor = self.caixa_inserir_valor.get()
posicao = int(self.caixa_inserir_posicao.get())
if self.lista_sequencial.inserir(valor, posicao):
self.label_erro_inserir.config(text="")
self.atualizar_listbox()
else:
self.label_erro_inserir.config(text="ERROR")
#Remoção visual do elemento na lista, erro caso não for bem sucedido
def remover(self):
posicao = int(self.caixa_remover_posicao.get())
if self.lista_sequencial.remover(posicao):
self.label_erro_remover.config(text="")
self.atualizar_listbox()
else:
self.label_erro_remover.config(text="ERROR")
#Exibição da posição do valor especificado na tela, erro caso não for bem sucedido
def consulta_por_valor(self):
valor = self.caixa_consulta_valor.get()
posicao = self.lista_sequencial.consulta_por_valor(valor)
if posicao != -1:
self.label_resultado_consulta.config(text=f"Valor encontrado na posição {posicao} da lista.", fg="green")
else:
self.label_resultado_consulta.config(text="Valor não encontrado na lista.", fg="red")
#Exibição do valor na posição especificada, erro caso não for bem sucedido
def consulta_por_posicao(self):
posicao = self.caixa_consulta_posicao.get()
if posicao.isdigit():
posicao = int(posicao)
valor = self.lista_sequencial.consulta_por_posicao(posicao-1)
if valor is not None:
self.label_resultado_consulta_posicao.configure(text=f"Valor na posição {posicao} = {valor}", fg="green")
else:
self.label_resultado_consulta_posicao.configure(text="Posição inválida", fg="red")
else:
self.label_resultado_consulta_posicao.configure(text="Posição inválida", fg="red")
#Atualiza a tela
def atualizar_listbox(self):
for widget in self.frame_lista.winfo_children():
widget.destroy()
for i in range(len(self.lista_sequencial.lista)):
caixa = Label(self.frame_lista, text=self.lista_sequencial.lista[i], width=4, height=2, borderwidth=2, relief="solid", padx=1)
caixa.pack(side=LEFT, pady=15)
def LSeq():
root = Tk()
interface = InterfaceGrafica(root)
root.mainloop()