From f710b37befa1e3be5a7d14fdf312b251e1c20d30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= Date: Fri, 29 May 2026 21:44:13 -0300 Subject: [PATCH 1/2] 29/05/2026 --- Guia3/src/alternativa.py | 17 ++++++++- Guia3/src/pergunta.py | 30 ++++++++++++++- Guia3/src/perguntadiscursiva.py | 30 ++++++++++++++- Guia3/src/perguntamultiplaescolha.py | 28 +++++++++++++- Guia3/src/questionario.py | 21 ++++++++++- Guia3/src/resposta.py | 25 ++++++++++++- Guia3/src/respostadiscursiva.py | 14 ++++++- Guia3/src/respostaobjetiva.py | 37 ++++++++++++++++++- Guia3/src/tentativaquestionario.py | 55 +++++++++++++++++++++++++++- 9 files changed, 242 insertions(+), 15 deletions(-) diff --git a/Guia3/src/alternativa.py b/Guia3/src/alternativa.py index 4dde61f..c526377 100644 --- a/Guia3/src/alternativa.py +++ b/Guia3/src/alternativa.py @@ -1,4 +1,19 @@ from typing import List, Tuple, Dict class Alternativa: - pass \ No newline at end of file + 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 \ No newline at end of file diff --git a/Guia3/src/pergunta.py b/Guia3/src/pergunta.py index 5b3763d..ca6a4c6 100644 --- a/Guia3/src/pergunta.py +++ b/Guia3/src/pergunta.py @@ -1,4 +1,30 @@ from typing import List, Tuple, Dict +from abc import ABC, abstractmethod -class Pergunta: - pass \ No newline at end of file +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 \ No newline at end of file diff --git a/Guia3/src/perguntadiscursiva.py b/Guia3/src/perguntadiscursiva.py index f4c26af..d10e2ba 100644 --- a/Guia3/src/perguntadiscursiva.py +++ b/Guia3/src/perguntadiscursiva.py @@ -1,4 +1,30 @@ from typing import List, Tuple, Dict +from pergunta import Pergunta +from abc import ABC -class PerguntaDiscursiva: - pass \ No newline at end of file +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" \ No newline at end of file diff --git a/Guia3/src/perguntamultiplaescolha.py b/Guia3/src/perguntamultiplaescolha.py index bcbe94d..8f31ca9 100644 --- a/Guia3/src/perguntamultiplaescolha.py +++ b/Guia3/src/perguntamultiplaescolha.py @@ -1,4 +1,28 @@ from typing import List, Tuple, Dict +from abc import ABC +from pergunta import Pergunta -class PerguntaMultiplaEscolha: - pass \ No newline at end of file +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" \ No newline at end of file diff --git a/Guia3/src/questionario.py b/Guia3/src/questionario.py index 7525582..b42dfb7 100644 --- a/Guia3/src/questionario.py +++ b/Guia3/src/questionario.py @@ -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) \ No newline at end of file diff --git a/Guia3/src/resposta.py b/Guia3/src/resposta.py index 846d771..8ac3cbe 100644 --- a/Guia3/src/resposta.py +++ b/Guia3/src/resposta.py @@ -1,4 +1,25 @@ from typing import List, Tuple, Dict +from abc import ABC +from abc import abstractmethod -class Resposta: - pass \ No newline at end of file +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 \ No newline at end of file diff --git a/Guia3/src/respostadiscursiva.py b/Guia3/src/respostadiscursiva.py index 4ea6dbb..bbcfc83 100644 --- a/Guia3/src/respostadiscursiva.py +++ b/Guia3/src/respostadiscursiva.py @@ -1,4 +1,14 @@ from typing import List, Tuple, Dict +from resposta import Resposta -class RespostaDiscursiva: - pass \ No newline at end of file +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 diff --git a/Guia3/src/respostaobjetiva.py b/Guia3/src/respostaobjetiva.py index 72ed2d0..48ef430 100644 --- a/Guia3/src/respostaobjetiva.py +++ b/Guia3/src/respostaobjetiva.py @@ -1,4 +1,37 @@ from typing import List, Tuple, Dict +from abc import ABC +from resposta import Resposta -class RespostaObjetiva: - pass \ No newline at end of file +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 + diff --git a/Guia3/src/tentativaquestionario.py b/Guia3/src/tentativaquestionario.py index 9947dd1..2c826d7 100644 --- a/Guia3/src/tentativaquestionario.py +++ b/Guia3/src/tentativaquestionario.py @@ -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 \ No newline at end of file + 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 \ No newline at end of file From 57aee507f9a32a8779958217aabde312911613a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= Date: Sat, 30 May 2026 13:35:04 -0300 Subject: [PATCH 2/2] 29/05/2026 --- Guia3/tests/test_questionario.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Guia3/tests/test_questionario.py b/Guia3/tests/test_questionario.py index c592025..965e8ff 100644 --- a/Guia3/tests/test_questionario.py +++ b/Guia3/tests/test_questionario.py @@ -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" \ No newline at end of file