Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion Guia3/src/alternativa.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,19 @@
from typing import List, Tuple, Dict

class Alternativa:
pass
def __init__(self, texto, correta, explicacao=None):
self._texto = texto
self._correta = correta
self._explicacao = explicacao

@property
def texto(self):
return self._texto

@property
def correta(self):
return self._correta

@property
def explicacao(self):
return self._explicacao
30 changes: 28 additions & 2 deletions Guia3/src/pergunta.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,30 @@
from typing import List, Tuple, Dict
from abc import ABC, abstractmethod

class Pergunta:
pass
class Pergunta(ABC):
def __init__(self, texto, explicacao_geral=None):
self._texto = texto
self._explicacao_geral = explicacao_geral

@property
def texto(self):
return self._texto

@property
def respostas(self):
return self._respostas

@property
def explicacao_geral(self):
return self._explicacao_geral

@abstractmethod
def validar_resposta(self, resposta):
pass

@abstractmethod
def get_tipo(self):
pass

def get_explicacao(self):
return self.explicacao_geral
30 changes: 28 additions & 2 deletions Guia3/src/perguntadiscursiva.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,30 @@
from typing import List, Tuple, Dict
from pergunta import Pergunta
from abc import ABC

class PerguntaDiscursiva:
pass
class PerguntaDiscursiva(Pergunta):
def __init__(self, texto, explicacao_geral=None, resposta_esperada=None, case_sensitive=False):
super().__init__(texto, explicacao_geral)
self._resposta_esperada = resposta_esperada
self._case_sensitive = case_sensitive

@property
def resposta_esperada(self):
return self._resposta_esperada

@property
def case_sensitive(self):
return self._case_sensitive

def validar_resposta(self, texto):
if self.resposta_esperada is None:
return False

if self.case_sensitive:
return texto == self.resposta_esperada

return texto.strip().lower() == \
self.resposta_esperada.strip().lower()

def get_tipo(self):
return "discursiva"
28 changes: 26 additions & 2 deletions Guia3/src/perguntamultiplaescolha.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,28 @@
from typing import List, Tuple, Dict
from abc import ABC
from pergunta import Pergunta

class PerguntaMultiplaEscolha:
pass
class PerguntaMultiplaEscolha(Pergunta):
def __init__(self, texto, alternativas=[], explicacao_geral=None):
super().__init__(texto, explicacao_geral)
self._alternativas = alternativas

@property
def alternativas(self):
return self._alternativas

def validar_resposta(self, indice):
if indice < 0 or indice >= len(self.alternativas):
return False

return self.alternativas[indice].correta

def get_alternativa_correta(self):
for alternativa in self.alternativas:
if alternativa.correta:
return alternativa

return None

def get_tipo(self):
return "multipla_escolha"
21 changes: 20 additions & 1 deletion Guia3/src/questionario.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,23 @@
from typing import List, Tuple, Dict
from abc import ABC

from src.tentativaquestionario import TentativaQuestionario

class Questionario:
pass
def __init__(self, titulo):
self._titulo = titulo
self._perguntas = []

@property
def titulo(self):
return self._titulo

@property
def perguntas(self):
return self._perguntas

def adicionar_pergunta(self, pergunta):
self._perguntas.append(pergunta)

def criar_attempt(self, usuario):
return TentativaQuestionario(self, usuario)
25 changes: 23 additions & 2 deletions Guia3/src/resposta.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,25 @@
from typing import List, Tuple, Dict
from abc import ABC
from abc import abstractmethod

class Resposta:
pass
class Resposta(ABC):
def __init__(self, pergunta, pontuacao_obtida, esta_correta=False):
self._pergunta = pergunta
self._pontuacao_obtida = pontuacao_obtida
self._esta_correta = esta_correta

@property
def pergunta(self):
return self._pergunta

@property
def esta_correta(self):
return self._esta_correta

@property
def pontuacao_obtida(self):
return self.pontuacao_obtida

@abstractmethod
def calcular_pontuacao():
pass
14 changes: 12 additions & 2 deletions Guia3/src/respostadiscursiva.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
from typing import List, Tuple, Dict
from resposta import Resposta

class RespostaDiscursiva:
pass
class RespostaDiscursiva(Resposta):
def __init__(self, pergunta, esta_correta, texto_resposta):
super().__init__(pergunta, esta_correta)
self._texto_resposta = texto_resposta

@property
def texto_resposta(self):
return self._texto_resposta

def calcular_pontuacao(self):
return 1.0 if self.esta_correta else 0.0
37 changes: 35 additions & 2 deletions Guia3/src/respostaobjetiva.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,37 @@
from typing import List, Tuple, Dict
from abc import ABC
from resposta import Resposta

class RespostaObjetiva:
pass
class RespostaObjetiva(Resposta):
def __init__(self, pergunta, esta_correta, pontuacao_obtida, indice_escolhido, alternativa_selecionada=None):
super().__init__(pergunta, esta_correta, pontuacao_obtida)
self._indice_escolhido = indice_escolhido
self._alternativa_selecionada = alternativa_selecionada

if 0 <= indice_escolhido < len(pergunta.alternativas):
self.alternativa_selecionada = \
pergunta.alternativas[indice_escolhido]
else:
self.alternativa_selecionada = None

self.esta_correta = pergunta.validar_resposta(
indice_escolhido
)

self.pontuacao_obtida = self.calcular_pontuacao()

@property
def indice_escolhido(self):
return self._indice_escolhido

@property
def alternativa_selecionada(self):
return self._alternativa_selecionada

def calcular_pontuacao(self):
# return 1.0 if self.esta_correta else 0.0
if self.esta_correta:
return 1
else:
return 0

55 changes: 54 additions & 1 deletion Guia3/src/tentativaquestionario.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,57 @@
from typing import List, Tuple, Dict
from src.perguntamultiplaescolha import PerguntaMultiplaEscolha
from src.perguntadiscursiva import PerguntaDiscursiva
from src.respostaobjetiva import RespostaObjetiva
from src.respostadiscursiva import RespostaDiscursiva
from datetime import datetime

class TentativaQuestionario:
pass
def __init__(self, questionario, usuario):
self.questionario = questionario
self.usuario = usuario
self.data_inicio = datetime.now()
self.data_fim = None
self.respostas = []

def registrar_resposta(self, indice_pergunta, valor):
pergunta = self.questionario.perguntas[
indice_pergunta
]

if isinstance(pergunta, PerguntaMultiplaEscolha):
resposta = RespostaObjetiva(
pergunta,
valor
)

elif isinstance(pergunta, PerguntaDiscursiva):
resposta = RespostaDiscursiva(
pergunta,
valor
)

else:
raise TypeError("Tipo de pergunta inválido")

self.respostas.append(resposta)

def calcular_pontuacao(self):
return sum(
resposta.calcular_pontuacao()
for resposta in self.respostas
)

def finalizar(self):
self.data_fim = datetime.now()

pontuacao = self.calcular_pontuacao()

feedback = (
f"Usuário {self.usuario} finalizou o quiz "
f"com {pontuacao} ponto(s)."
)

return pontuacao, feedback

def is_finalizado(self):
return self.data_fim is not None
3 changes: 1 addition & 2 deletions Guia3/tests/test_questionario.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,4 @@ def test_criar_attempt():
tentativa = questionario.criar_attempt("valter")

assert isinstance(tentativa, TentativaQuestionario)
assert tentativa.usuario == "valter"

assert tentativa.usuario == "valter"