diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..dc9ea49
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..65b5b08
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/python_poo.iml b/.idea/python_poo.iml
new file mode 100644
index 0000000..8437fe6
--- /dev/null
+++ b/.idea/python_poo.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/eleicoes/Interface_Eleicao.py b/eleicoes/Interface_Eleicao.py
new file mode 100644
index 0000000..ff709bd
--- /dev/null
+++ b/eleicoes/Interface_Eleicao.py
@@ -0,0 +1,14 @@
+from abc import ABCMeta, abstractmethod
+
+class Transparencia(metaclass=ABCMeta):
+ def __init__(self):
+ pass
+
+ @abstractmethod
+ def to_csv(self):
+ pass
+
+ @abstractmethod
+ def to_txt(self):
+ pass
+
diff --git a/eleicoes/common.py b/eleicoes/common.py
new file mode 100644
index 0000000..b8e134e
--- /dev/null
+++ b/eleicoes/common.py
@@ -0,0 +1,101 @@
+from abc import ABC, abstractmethod
+import hashlib
+
+class Pessoa(ABC):
+ __nome : str
+ __RG : str
+ __CPF : str
+
+ def __init__(self, nome, RG, CPF):
+ self.__nome = nome
+ self.__RG = RG
+ self.__CPF = CPF
+
+ def __str__(self):
+ info = (f'Nome: {self.__nome}\n'
+ f'RG: {self.__RG}\n'
+ f'CPF: {self.__CPF}\n')
+ return info
+
+ def __repr__(self):
+ return f"Pessoa(nome='{self.__nome}', RG='{self.__RG}', CPF='{self.__CPF}')"
+
+ def get_nome(self):
+ return self.__nome
+
+ @abstractmethod
+ def assinatura_eletronica(self):
+ pass
+
+class Eleitor(Pessoa):
+ __titulo : int
+ secao : int
+ zona : int
+
+ def __init__(self, nome, RG, CPF, titulo, secao, zona):
+ super().__init__(nome, RG, CPF)
+ self.__titulo = titulo
+ self.secao = secao
+ self.zona = zona
+
+ def __str__(self):
+ info = super().__str__()
+ info += (f'Titulo: {self.__titulo}\n'
+ f'Seção: {self.secao}\n'
+ f'Zona: {self.zona}\n')
+ return info
+
+ def __repr__(self):
+ return f"Eleitor({super().__repr__()}, titulo='{self.__titulo}', secao='{self.secao}', zona='{self.zona}')"
+
+ def get_titulo(self):
+ return self.__titulo
+
+ def assinatura_eletronica(self):
+ dados_para_hash = self.__str__()
+ dados_em_byte = dados_para_hash.encode('utf-8')
+ hash = hashlib.sha256(dados_em_byte)
+ return hash.hexdigest()
+
+class Candidato(Pessoa):
+ __numero : int
+
+ def __init__(self, nome, RG, CPF, numero):
+ super().__init__(nome, RG, CPF)
+ self.__numero = numero
+
+ def __str__(self):
+ info = super().__str__()
+ info += (f'Numero: {self.__numero}\n')
+ return info
+
+ def __repr__(self):
+ return f"Candidato({super().__repr__()}, numero='{self.__numero})'"
+
+ def get_numero(self):
+ return self.__numero
+
+ def assinatura_eletronica(self):
+ dados_para_hash = self.__str__()
+ dados_em_byte = dados_para_hash.encode('utf-8')
+ hash = hashlib.md5(dados_em_byte)
+ return hash.hexdigest()
+
+class Juiz(Pessoa):
+ __registro : int
+
+ def __init__(self, nome : str, RG : str , CPF : str, registro :int):
+ super().__init__(nome, RG, CPF)
+ self.__registro = registro
+
+ def __str__(self):
+ info = super().__str__()
+ info += f'Registro: {self.__registro}'
+ return info
+
+ def assinatura_eletronica(self):
+ dados_para_hash = self.__str__()
+ dados_em_byte = dados_para_hash.encode('utf-8')
+ hash = hashlib.sha1(dados_em_byte)
+ return hash.hexdigest()
+
diff --git a/eleicoes/eleicao.py b/eleicoes/eleicao.py
new file mode 100644
index 0000000..7300049
--- /dev/null
+++ b/eleicoes/eleicao.py
@@ -0,0 +1,82 @@
+import pickle
+from typing import List
+from common import *
+from Interface_Eleicao import Transparencia
+import csv
+
+class Urna(Transparencia):
+ mesario : Pessoa
+ __secao : int
+ __zona : int
+ __eleitores_presentes : List[Eleitor] = []
+ __votos = {} #dicionario chave = numero do candidato, valor é a quantidade de votos
+
+ def __init__(self, mesario : Pessoa, secao : int, zona : int,
+ candidatos : List[Candidato], eleitores : List[Eleitor]):
+ self.mesario = mesario
+ self.__secao = secao
+ self.__zona = zona
+ self.__nome_arquivo = f'{self.__zona}_{self.__secao}'
+ self.__candidatos = candidatos
+ self.__eleitores = []
+ for eleitor in eleitores:
+ if eleitor.zona == zona and eleitor.secao == secao:
+ self.__eleitores.append(eleitor)
+
+ for candidato in self.__candidatos:
+ self.__votos[candidato.get_numero()] = 0
+ self.__votos['BRANCO'] = 0
+ self.__votos['NULO'] = 0
+
+ with open(self.__nome_arquivo+'.pkl', 'wb') as arquivo:
+ pickle.dump(self.__votos, arquivo)
+
+ def get_eleitor(self, titulo : int):
+ for eleitor in self.__eleitores:
+ if eleitor.get_titulo() == titulo:
+ return eleitor
+ return False
+
+ def get_zona(self):
+ return self.__zona
+
+ def get_secao(self):
+ return self.__secao
+
+ def registrar_voto(self, eleitor : Eleitor, n_cand : int):
+ self.__eleitores_presentes.append(eleitor)
+ if n_cand in self.__votos:
+ self.__votos[n_cand] += 1
+ else:
+ self.__votos['NULO'] += 1
+
+ with open(self.__nome_arquivo+'.pkl', 'wb') as arquivo:
+ pickle.dump(self.__votos, arquivo)
+
+ def __str__(self):
+ info = f'Urna da seção {self.__secao}, zona {self.__zona}\n'
+ info += f'Mesario {self.mesario}\n'
+ return info
+
+ def to_csv(self):
+ with open(self.__nome_arquivo+'.csv', mode='w', newline='') as file:
+ writer = csv.writer(file)
+ writer.writerow(['Seção', 'Zona', 'Eleitores Presentes'])
+ for eleitor in self.__eleitores:
+ writer.writerow([self.get_secao(), self.get_zona(), eleitor.get_titulo()])
+
+ def to_txt(self):
+ with open(self.__nome_arquivo+'.txt', mode='w') as file:
+ file.write(f'{self.__str__()}\n')
+ for eleitor in self.__eleitores:
+ file.write(f'{eleitor.get_titulo()}\n')
+
+if __name__ == "__main__":
+ c1 = Candidato("ADADADA", "223", "23123", 1)
+ c2 = Candidato("xxxxxxx", "333", "444", 2)
+ e1 = Eleitor("Jorge Pascal", "12389172389", "129837", 123123, 23, 4)
+ e2 = Eleitor("Olavo de Caralho", "9182738", "02984719", 343434, 23, 4)
+ mesario = Eleitor("Orasmo Reis", "10298730987123", "1928469", 9889889, 23, 4)
+ urna = Urna(mesario,23, 4, [c1, c2], [e1, e2])
+ urna.to_txt()
+ urna.to_csv()
diff --git a/eleicoes/gerenciar_urna.py b/eleicoes/gerenciar_urna.py
new file mode 100644
index 0000000..9bee094
--- /dev/null
+++ b/eleicoes/gerenciar_urna.py
@@ -0,0 +1,30 @@
+from common import *
+from eleicao import Urna
+
+def iniciar_urna(eleitores, candidatos):
+ print("Iniciando Urna")
+ print("==============")
+ secao = int(input("Número da secao: "))
+ zona = int(input("Número da zona: "))
+
+ nome_mes = input("Nome do Mesario: ")
+ rg_mes = input("RG do Mesario: ")
+ cpf_mes = input("CPF do Mesario: ")
+
+ mesario = Pessoa(nome_mes, rg_mes, cpf_mes)
+
+ return Urna(mesario, secao, zona, candidatos, eleitores)
+
+def votar(urna : Urna):
+ titulo_eleitor = int(input("Digite o titulo do eleitor: "))
+ eleitor = urna.get_eleitor(titulo_eleitor)
+
+ if not eleitor:
+ raise Exception("Eleitor não é desta Urna")
+
+ print(eleitor)
+ print("Pode votar!")
+ print("===========")
+ voto = int(input("Digite o numero do candidato: "))
+ urna.registrar_voto(eleitor, voto)
+
diff --git a/eleicoes/main.py b/eleicoes/main.py
new file mode 100644
index 0000000..ada9874
--- /dev/null
+++ b/eleicoes/main.py
@@ -0,0 +1,130 @@
+import pickle
+import traceback
+import gerenciar_urna
+from common import *
+
+FILE_ELEITORES = 'eleitores.pkl'
+FILE_CANDIDATOS = 'candidatos.pkl'
+
+def menu():
+ print("1-Novo Eleitor")
+ print("2-Atualizar Eleitor")
+ print("3-Inserir Candidato")
+ print("4-Listar Candidatos")
+ print("5-Iniciar Urna")
+ print("6-Testar Urna")
+ print("7-Sair")
+ op = int(input("Digite a opcao [1 a 7]? "))
+ while op not in range(1, 8):
+ op = int(input("Digite a opcao [1 a 7]? "))
+ return op
+
+def inserir_eleitor(eleitores):
+ titulo = int(input("Digite o Títlulo: "))
+
+ if titulo in eleitores:
+ raise Exception("Titulo já existente!")
+
+ nome = input("Digite o nome: ")
+ RG = input("Digite o RG: ")
+ CPF = input("Digite o CPF: ")
+ secao = int(input("Digite a secao: "))
+ zona = int(input("Digite a zona: "))
+
+ eleitor = Eleitor(nome, RG, CPF, titulo, secao, zona)
+ eleitores[eleitor.get_titulo()] = eleitor
+
+ with open(FILE_ELEITORES, 'wb') as arquivo:
+ pickle.dump(eleitores, arquivo)
+
+ print('Eleitor gravado com sucesso!')
+ print(eleitor)
+
+def atualizar_eleitor(eleitores):
+ titulo = int(input('Digite o titulo do eleitor: '))
+
+ if titulo in eleitores:
+ eleitor = eleitores[titulo]
+ print(eleitor)
+ secao = int(input("Digite a nova secao: "))
+ zona = int(input("Digite a nova zona: "))
+ eleitor.secao = secao
+ eleitor.zona = zona
+
+ with open(FILE_ELEITORES, 'wb') as arquivo:
+ pickle.dump(eleitores, arquivo)
+
+ print('Atualizados dados do eleitor!')
+ print(eleitor)
+ else:
+ raise Exception('Titulo inexistente')
+
+def inserir_candidato(candidatos):
+ numero = int(input("Digite o número do candidato: "))
+
+ if numero in candidatos:
+ raise Exception("Candidato já existente!")
+
+ nome = input("Digite o nome: ")
+ RG = input("Digite o RG: ")
+ CPF = input("Digite o CPF: ")
+
+ candidato = Candidato(nome, RG, CPF, numero)
+ candidatos[candidato.get_numero()] = candidato
+
+ with open(FILE_CANDIDATOS, 'wb') as arquivo:
+ pickle.dump(candidatos, arquivo)
+
+ print('Candidato gravado com sucesso!')
+ print(candidato)
+
+def listar_candidatos(candidatos):
+ for candidato in candidatos.values():
+ print(candidato)
+
+if __name__ == "__main__":
+ eleitores = {} #dicionário a chave será o titulo
+ try:
+ print("Carregando arquivo de eleitores ...")
+
+ with open(FILE_ELEITORES, 'rb') as arquivo:
+ eleitores = pickle.load(arquivo)
+ except FileNotFoundError as fnfe:
+ print(fnfe)
+ print("Arquivo nao encontrado, nenhum eleitor carregado!")
+
+ candidatos = {} # dicionário a chave será o titulo
+ try:
+ print("Carregando arquivo de candidatos ...")
+
+ with open(FILE_CANDIDATOS, 'rb') as arquivo:
+ candidatos = pickle.load(arquivo)
+ except FileNotFoundError as fnfe:
+ print(fnfe)
+ print("Arquivo nao encontrado, nenhum candidato carregado!")
+
+ opcao = 1
+ while opcao in range(1,8):
+ try:
+ opcao = menu()
+
+ if opcao == 1:
+ inserir_eleitor(eleitores)
+ elif opcao == 2:
+ atualizar_eleitor(eleitores)
+ elif opcao == 3:
+ inserir_candidato(candidatos)
+ elif opcao == 4:
+ listar_candidatos(candidatos)
+ elif opcao == 5:
+ urna = gerenciar_urna.iniciar_urna(eleitores.values(),
+ candidatos.values())
+ elif opcao == 6:
+ gerenciar_urna.votar(urna)
+ elif opcao == 7:
+ print("Saindo!")
+ break
+ except Exception as e:
+ #traceback.print_exc()
+ print(e)
+
diff --git a/eleicoes/tribunal.py b/eleicoes/tribunal.py
new file mode 100644
index 0000000..0151a87
--- /dev/null
+++ b/eleicoes/tribunal.py
@@ -0,0 +1,93 @@
+from Interface_Eleicao import *
+from typing import List
+from common import *
+import csv
+
+class Denuncia:
+ __numero : int
+ __denunciante : Pessoa
+ __denunciado : Pessoa
+ __juiz : Juiz
+ __txt_denuncia : str
+ __txt_sentenca : str
+
+ def __init__(self, n: int, denunciante : Pessoa,
+ denunciado : Pessoa, txt_denuncia : str):
+ self.__numero = n
+ self.__denunciante = denunciante
+ self.__denunciado = denunciado
+ self.__txt_denuncia = txt_denuncia
+
+ def julgar(self, j : Juiz, txt_sentenca : str):
+ self.__juiz = j
+ self.__txt_sentenca = txt_sentenca
+
+ def __str__(self):
+ if self.__txt_sentenca == None:
+ info = f'Denuncia {self.__numero}. Sentenca não proferida'
+ else:
+ info = f'Denuncia {self.__numero}\n'
+ info += f'Denunciante\n{self.__denunciante}\n'
+ info += f'Assinatura: {self.__denunciante.assinatura_eletronica()}\n'
+ info += f'Denunciado\n{self.__denunciado}\n'
+ info += f'Assinatura: {self.__denunciado.assinatura_eletronica()}\n'
+ info += f'Denuncia: {self.__txt_denuncia}\n'
+ info += f'Sentença\n{self.__txt_sentenca}\n'
+ info += f'Juiz\n{self.__juiz}\n'
+ info += f'Assinatura: {self.__juiz.assinatura_eletronica()}'
+ return info
+
+ def get_denunciante(self):
+ return self.__denunciante
+
+ def get_denunciado(self):
+ return self.__denunciado
+
+ def get_juiz(self):
+ return self.__juiz
+
+ def get_txt_sentenca(self):
+ return self.__txt_sentenca
+
+ def get_txt_denuncia(self):
+ return self.__txt_denuncia
+
+class Jurisprudencia(Transparencia):
+ ano : int
+ denuncias : List[Denuncia]
+
+ def __init__(self, a:int):
+ self.ano = a
+ self.denuncias = []
+
+ def add_denuncia(self, d: Denuncia):
+ self.denuncias.append(d)
+
+ def to_csv(self):
+ with open(f'juris_{self.ano}.csv', mode='w', newline='') as file:
+ writer = csv.writer(file)
+ writer.writerow(['Denunciante', 'Denunciado', 'Denuncia', 'Sentença', 'Juiz'])
+
+ for denuncia in self.denuncias:
+ writer.writerow([denuncia.get_denunciante().get_nome(), denuncia.get_denunciado().get_nome(),
+ denuncia.get_txt_denuncia(), denuncia.get_txt_sentenca(),
+ denuncia.get_juiz().get_nome()])
+
+ def to_txt(self):
+ with open(f'juris_{self.ano}.txt', mode='w') as file:
+ for denuncia in self.denuncias:
+ file.write(denuncia.__str__())
+
+
+if __name__ == "__main__":
+ j1 = Juiz("Alex Morales", "12312", 123123, 4456)
+ #p1 = Pessoa("Jose", 123123, 123123)
+ c1 = Candidato("ADADADA", "223", "23123", 1)
+ c2 = Candidato("xxxxxxx", "333", "444", 2)
+ denun = Denuncia(1, c1, c2, "Fake News!")
+ denun.julgar(j1, 'O denunciado é obrigado a pagar uma multa ao denunciante!')
+ juris1 = Jurisprudencia(2024)
+ juris1.add_denuncia(denun)
+ juris1.to_csv()
+ juris1.to_txt()
+ print(denun)
diff --git a/src/frota.py b/exemplo_carro/frota.py
similarity index 59%
rename from src/frota.py
rename to exemplo_carro/frota.py
index a4b3891..a77339a 100644
--- a/src/frota.py
+++ b/exemplo_carro/frota.py
@@ -2,39 +2,42 @@ class Carro:
modelo : str
marca : str
cor : str
- odometro : 0.0
- motor_on : False
+ __odometro = 0.0
+ __motor_on = False
def __init__(self, modelo : str, marca : str, cor : str,
odometro : float, motor : bool):
self.modelo = modelo
self.marca = marca
self.cor = cor
- self.odometro = odometro
- self.motor_on = motor
+ self.__odometro = odometro
+ self.__motor_on = motor
def ligar(self):
- if not self.motor_on:
- self.motor_on = True
+ if not self.__motor_on:
+ self.__motor_on = True
else:
raise Exception("Erro: Motor já ligado!")
def acelerar(self, velocidade : float, tempo : float):
- if self.motor_on:
- self.odometro += velocidade * tempo
+ if self.__motor_on:
+ self.__odometro += velocidade * tempo
else:
raise Exception("Erro: Não é possível acelerar! Motor desligado!")
def desligar(self):
- if self.motor_on:
- self.motor_on = False
+ if self.__motor_on:
+ self.__motor_on = False
else:
raise Exception("Erro: Motor já desligado!")
+ def get_odometro(self):
+ return self.__odometro
+
def __str__(self):
info = (f'Carro {self.modelo}, marca {self.marca}, '
- f'cor {self.cor}\n{self.odometro} Km, '
- f'motor {self.motor_on}')
+ f'cor {self.cor}\n{self.__odometro} Km, '
+ f'motor {self.__motor_on}')
return info
diff --git a/src/main.py b/exemplo_carro/main.py
similarity index 96%
rename from src/main.py
rename to exemplo_carro/main.py
index 49c199e..782dc3a 100644
--- a/src/main.py
+++ b/exemplo_carro/main.py
@@ -13,7 +13,7 @@
'''
Controlando o carro até ele atingir 10000 Km
'''
- while carro1.odometro < 10000:
+ while carro1.get_odometro() < 10000:
try:
print('1- Ligar motor')
print('2- Desligar motor')