(→Mostrar inquéritos de uma disciplina) |
(→Mostrar resultados de inquérito) |
||
Line 424: | Line 424: | ||
{{CollapsedCode|Formato de apresentação| | {{CollapsedCode|Formato de apresentação| | ||
− | ''Nome da disciplina - Nome do projecto | + | ''Nome da disciplina - Nome do projecto'' |
* ''1ª resposta'' | * ''1ª resposta'' | ||
... | ... | ||
Line 430: | Line 430: | ||
}} | }} | ||
{{CollapsedCode|Exemplo de apresentação|<text> | {{CollapsedCode|Exemplo de apresentação|<text> | ||
− | Programação com Objectos - Gatos Simples | + | Programação com Objectos - Gatos Simples |
* Great project. | * Great project. | ||
* Wow, such feline! | * Wow, such feline! |
AVISOS - Avaliação em Época Normal |
---|
Esclarecimento de dúvidas:
|
Requisitos para desenvolvimento, material de apoio e actualizações do enunciado (ver informação completa em Projecto de Programação com Objectos):
|
Processo de avaliação (ver informação completa em Avaliação do Projecto):
|
Material de Uso Obrigatório |
---|
As bibliotecas po-uuilib e o conteúdo inicial do CVS são de uso obrigatório: |
|
A máquina virtual, fornecida para desenvolvimento do projecto, já contém todo o material de apoio. |
Uso Obrigatório: Repositório CVS |
Apenas se consideram para avaliação os projectos existentes no repositório CVS oficial.
Trabalhos não presentes no repositório no final do prazo têm classificação 0 (zero) (não são aceites outras formas de entrega). Não são admitidas justificações para atrasos em sincronizações do repositório. A indisponibilidade temporária do repositório, desde que inferior a 24 horas, não justifica atrasos na submissão de um trabalho. |
O objectivo do projecto é criar uma aplicação que gere parte da actividade dos cursos de uma universidade. Em particular, a aplicação faz a gestão de inquéritos aos projectos realizados pelos alunos nas várias disciplinas do curso.
Neste texto, o tipo negrito indica um literal (i.e., é exactamente como apresentado); o símbolo indica um espaço; e o tipo itálico indica uma parte variável (i.e., uma descrição).
Existem vários conceitos importantes neste contexto: universidade, curso, aluno, professor, funcionário, projecto, inquérito.
Os conceitos listados não são os únicos possíveis no modelo e as suas relações (assim como relações com outros conceitos não mencionados) podem depender das escolhas do projecto.
Uma universidade tem um nome e pode ter vários cursos, tendo ainda funcionários, docentes e alunos. Os alunos estão exclusivamente associados a um curso. Os funcionários e os docentes podem estar associados a vários cursos.
Cada curso tem um nome (único no contexto da universidade) e é constituído por várias disciplinas. Cada curso tem ainda um conjunto de alunos que podem inscreverem-se nas várias disciplinas do curso. Cada aluno pode inscrever-se, no máximo, em 6 disciplinas.
Cada disciplina tem um nome e apenas pertence a um curso. O nome da disciplina é o identificador único dentro do curso respectivo. Cada disciplina é leccionada por um ou mais docentes e tem 0 ou mais alunos inscritos. Os alunos inscritos numa disciplina têm que pertencer ao curso da disciplina. Existe uma capacidade máxima relativamente aos alunos que se podem inscrever numa disciplina. Um docente pode estar associado a várias disciplinas.
Os utilizadores da aplicação correspondem aos vários tipos de pessoa que existem na universidade: alunos, docentes e funcionários. Alunos, docentes e funcionários têm nome (cadeia de caracteres), número de telefone (cadeia de caracteres) e um identificador único (inteiro com 6 dígitos). Este identificador é atribuído automaticamente (de forma incremental) e começa em 100000. Um aluno pode ainda ser delegado do curso em que o aluno está inscrito. O número máximo de delegados de um curso é 7. Em qualquer instante, um aluno pode tornar-se delegado ou deixar de ser delegado.
Os docentes podem criar projectos associados às disciplinas que leccionam. Cada projecto tem um nome e descrição. O nome deve ser único no contexto da disciplina. Quando o projecto é criado fica automaticamente aberto.
Um aluno pode submeter a sua versão do projecto desde que o projecto ainda esteja aberto e o aluno esteja inscrito na disciplina do projecto. Os alunos podem realizar várias submissões no mesmo projecto, sendo preservada a ordem de submissão. Por razões de simplificação, a submissão é representada por uma cadeia de caracteres introduzida pelo aluno.
A cada projecto pode ser associado, no máximo, um inquérito. Só é possível associar um inquérito a um projecto se este não estiver fechado.
Cada inquérito tem um identificador único no contexto da disciplina (número inteiro único e sequencial, atribuído automaticamente na altura da criação do inquérito). O inquérito, além do identificador recolhe informação sobre o número de horas gastas na execução do projecto (número inteiro) e um comentário livre por parte do aluno que responde (cadeia de caracteres).
Um inquérito pode estar em várias situações: criado, aberto, fechado e finalizado. O comportamento do inquérito dependa da situação em que ele esteja. A mudança de situação é explícita, excepto quando o projecto associado termina (ou seja, é fechado): neste caso, o inquérito do projecto passa automaticamente da situação criado para aberto.
Só os alunos que entregaram o projecto (ou seja, realizaram pelo menos uma submissão) podem responder ao inquérito. Cada aluno só pode responder uma única vez. As respostas devem ser anónimas, ou seja, o sistema não deve guardar informação que permita saber qual a resposta de um dado aluno a um inquérito.
Só os delegados de um curso é que podem alterar a situação de um inquérito que diga respeito a um projecto de uma disciplina do curso (com a excepção indicada acima).
É possível realizar várias operações sobre um inquérito: cancelar, abrir, fechar, finalizar, submeter resposta e obter resultados. Cancelar um inquérito criado ou aberto (e sem respostas) corresponde a remover o inquérito. Se o inquérito estiver aberto mas já tiver pelo menos uma resposta, então não pode ser removido e deve ser assinalado um erro. Cancelar um inquérito fechado corresponde a abri-lo outra vez. Finalmente, cancelar um inquérito finalizado é impossível, pelo que deve ser assinalado um erro.
Um inquérito criado é aberto quando o projecto que lhe está associado fica fechado. Caso se tente abrir um inquérito que não obedeça a estas duas restrições deve ser assinalado um erro. Um delegado pode fechar um inquérito que esteja aberto. Se estiver fechado, a operação não faz nada. Em qualquer outra situação deve dar um erro. Finalmente, um delegado pode finalizar um inquérito que esteja fechado. Se o inquérito já estiver finalizado, a operação não tem efeito. Nas restantes situações deve ser assinalado um erro.
Os alunos podem submeter uma resposta a um inquérito aberto. Em qualquer outra situação, esta operação deve assinalar um erro. Alunos, docentes e delegados podem obter o resultado de um inquérito que esteja finalizado. Adicionalmente, um delegado pode obter os resultados de um inquérito que esteja aberto ou fechado. Esta operação deve assinalar um erro em qualquer outra situação.
Note-se que tanto um delegado, como um aluno ou um docente podem realizar as operações indicadas anteriormente desde que pertençam ao mesmo curso do inquérito. Adicionalmente, o aluno tem ainda de ter feito pelo menos uma submissão no projecto associado ao inquérito.
Deve existir um mecanismo de mensagens que permita avisar determinados utilizadores quando os inquéritos associados a uma dada disciplina ficam em determinadas situações:
Nota: dado que um aluno pode também ser delegado, o mecanismo de envio de mensagens deve tratar este como se fosse uma única entidade. Assim, um aluno de uma disciplina que seja também delegado deve receber apenas uma mensagem e não duas cada vez que o sistema tem que enviar uma mensagem.
A apresentação das mensagens enviadas para um dado utilizador deve ser feita quando o utilizador faz login no sistema. Após o login ter sido realizado com sucesso devem ser apresentadas todas as mensagens que tenham sido enviadas para o utilizador em causa desde a última vez que se registou no sistema. Após esta visualização considera-se que o utilizador fica sem mensagens. As mensagens devem ser apresentadas pela mesma ordem em que enviadas pelo sistema.
Devem ser possíveis extensões ou alterações de funcionalidade com impacto mínimo no código já produzido para a aplicação. O objectivo é aumentar a flexibilidade da aplicação relativamente ao suporte de novas funções. Assim:
A aplicação permite manter informação sobre as entidades do modelo, permitindo, em particular, gerir projectos e inquéritos. Possui ainda a capacidade de preservar o seu estado (não é possível manter várias versões do estado da aplicação em simultâneo).
A base de dados com os conceitos pré-definidos é carregada no início da aplicação. Não é possível adicionar ou remover pessoas durante a execução da aplicação. Não é possível a um utilizador alterar a informação pessoal de outros utilizadores.
A aplicação tem comportamento que depende do utilizador, pelo que deve permitir o estabelecimento de uma identidade inicial (login). Um utilizador que tenha estabelecido a sua identidade com sucesso é dito como estando registado. Em cada momento, a aplicação tem, no máximo, um utilizador registado.
Um utilizador registado pode ver todos os utilizadores ou só um dado utilizador, procurar um utilizador e actualizar o seu número de telefone.
Um utilizador registado que seja aluno pode realizar as seguintes tarefas: entregar um projecto, preencher um inquérito e ver resultados de um inquérito.
Um utilizador registado que seja delegado tem à sua disposição as seguinte funcionalidade: criar inquéritos, apagar inquéritos, abrir inquéritos, fechar inquéritos, finalizar inquéritos, mostrar inquéritos de uma disciplina, enviar avisos e ver os resultados de inquéritos.
Um utilizador registado que seja um docente pode realizar as seguintes actividades: criar projectos, fechar projectos, ver as submissões de um projecto, ver os alunos de uma disciplina leccionada e ver resultados de inquéritos.
É possível guardar e recuperar o estado actual da aplicação, preservando toda a informação relacionada com a universidade e que foi descrita acima.
Descreve-se nesta secção a funcionalidade máxima da interface com o utilizador. Em geral, os comandos pedem toda a informação antes de proceder à sua validação (excepto onde indicado). Todos os menus têm automaticamente a opção Sair (fecha o menu).
As operações de pedido e apresentação de informação ao utilizador devem realizar-se através dos objectos form e display, respectivamente, presentes em cada comando. As mensagens são produzidas pelos métodos das bibliotecas de suporte (po-uuilib e sth-app). As mensagens não podem ser usadas no núcleo da aplicação (sth-core). Além disso, não podem ser definidas novas. Potenciais omissões devem ser esclarecidas antes de qualquer implementação.
As excepções usadas na interacção, excepto se indicado, são subclasses de pt.tecnico.po.ui.DialogException, são lançadas pelos comandos e tratadas por pt.tecnico.po.ui.Menu. Outras excepções não devem substituir as fornecidas nos casos descritos.
As acções deste menu permitem gerir a salvaguarda do estado da aplicação e abrir submenus. A lista completa é a seguinte: Reiniciar, Abrir, Guardar e Portal Pessoal, Portal do Docente, Portal do Estudante e Portal do Delegado. Inicialmente, a aplicação apenas tem informação sobre as pessoas, cursos e disciplinas que foram carregados no arranque. Note-se que nem todas as opções do menu estão disponíveis para todos os utilizadores (ver abaixo).
As etiquetas das opções deste menu estão definidas na classe sth.app.main.Label. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe sth.app.main.Message.
O conteúdo da aplicação (toda a informação detida pela universidade actualmente em memória) pode ser guardado para posterior recuperação (via serialização Java: java.io.Serializable). Na leitura e escrita do estado da aplicação, devem ser tratadas as excepções associadas. A funcionalidade é a seguinte:
A opção Sair nunca guarda o estado da aplicação, mesmo que existam alterações.
Este menu permite efectuar operações sobre a base de dados de pessoal da universidade, estando disponível para todos os utilizadores. A lista completa é a seguinte: Mostrar pessoa, Alterar número de telefone, Mostrar pessoas, Procurar pessoa.
As etiquetas das opções deste menu estão definidas na classe sth.app.person.Label. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe sth.app.person.Message.
Sempre que for pedido o identificador de uma pessoa (requestPersonId()) e a pessoa não existir, é lançada a excepção sth.app.NoSuchPersonException.
Apresenta as informações sobre a pessoa especificada pela identificação fornecida pelo processo de login, de acordo com o seguinte formato (e variações descritas abaixo).
Formato de apresentação (cabeçalho) |
---|
TIPO|identificador|telefone|nome |
Dependendo do tipo de pessoa, TIPO pode tomar os valores FUNCIONÁRIO, DOCENTE, ALUNO e DELEGADO (para alunos que são delegados). Se os utilizadores forem do tipo DOCENTE, então à linha de identificação devem seguir-se as linhas com os nomes dos cursos e das disciplinas que lecciona nesses cursos, ordenados por ordem alfabética do nome do curso e da disciplina (dentro do curso). Se os utilizadores forem do tipo ALUNO ou DELEGADO, então à linha de identificação devem seguir-se as linhas com os nomes das disciplinas em que está inscrito, ordenados por ordem alfabética do nome da disciplina.
Exemplo de apresentação (professor) |
---|
DOCENTE|100050|987 654 321|Maria João * Informática - Análise e Síntese de Algoritmos * Matermática - Algebra |
Exemplo de apresentação (aluno) |
---|
ALUNO|101090|123 456 789|João Maria * Informática - Análise e Síntese de Algoritmos * Informática - Inteligência Artificial * Informática - Sistemas Operativos * Informática - Fundamentos da Programação * Informática - Programação com Objectos |
Pede o novo número de telefone (requestPhoneId()). De seguida, altera o número de telefone da pessoa registada e apresenta as informações da pessoa (tal como descrito em Mostrar pessoa).
Apresenta informações sobre todas as pessoas conhecidas.
A lista é ordenada pelo identificador da pessoa e o formato é o descrito em Mostrar pessoa.
Pede o nome da pessoa a procurar (requestName()). A operação apresenta a lista de pessoas (ordenadas por ordem alfabética do nome) cujo nome satisfaz a procura (o nome da pessoa deve conter a cadeia de caracteres em questão). O formato de apresentação é o descrito em Mostrar pessoa.
Este menu apresenta as operações disponíveis para docentes, estando apenas disponível para estes utilizadores. A lista completa é a seguinte: Criar projecto, Fechar projecto, Ver submissões de um projecto, Ver alunos de disciplina leccionada, Ver resultados de um inquérito.
As etiquetas das opções deste menu estão definidas na classe sth.app.teaching.Label. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe sth.app.teaching.Message.
É pedido o identificador da disciplina (requestDisciplineName()), e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se o docente não leccionar a disciplina em causa, e DuplicateProjectException, se o projecto já existir. Em caso de identificação bem sucedida, o projecto é criado.
É pedido o identificador da disciplina (requestDisciplineName()), e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se o docente não leccionar a disciplina em causa, e NoSuchProjectException, se o projecto não existir. Em caso de identificação bem sucedida, o projecto é fechado.
Se o projecto já estiver fechado, o comando não executa nenhuma acção.
É pedido o identificador da disciplina (requestDisciplineName()), e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se o docente não leccionar a disciplina em causa, e NoSuchProjectException, se o projecto não existir. Em caso de identificação bem sucedida, as submissões do projecto são apresentadas, ordenadas pelo número de aluno que realizou a submissão, e com o seguinte formato.
Formato de apresentação |
---|
Nome da Disciplina - Nome do Projecto * Identificador do 1º aluno - submissão do 1º aluno ... * Identificador do Nº aluno - submissão do Nº aluno |
Exemplo de apresentação |
---|
<text>
Programação com Objectos - Gatos Simples
</text> |
Este comando pode operar, tanto sobre projectos abertos, como sobre projectos fechados.
É pedido o identificador da disciplina (requestDisciplineName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se o docente não leccionar a disciplina em causa. Em caso de identificação bem sucedida, é apresentada a lista de alunos, ordenada pelo identificador de aluno, no formato definido em Mostrar pessoa.
É pedido o identificador da disciplina (requestDisciplineName()), o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se o docente não leccionar a disciplina em causa, NoSuchProjectException, se o projecto não existir, e NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa. Em caso de identificação bem sucedida, os resultados do inquérito são apresentados de acordo com o formato seguinte, ordenados por ordem de resposta.
Formato de apresentação para inquéritos criados (por abrir) |
---|
Nome da disciplina - Nome do projecto (por abrir) |
Formato de apresentação para inquéritos abertos |
---|
Nome da disciplina - Nome do projecto (aberto) |
Formato de apresentação para inquéritos fechados |
---|
Nome da disciplina - Nome do projecto (fechado) |
Formato de apresentação para inquéritos finalizados |
---|
Nome da disciplina - Nome do projecto * Número de submissões: Número de submissões * Número de respostas: Número de respostas * Tempos (mínimo, médio, máximo): Tempo mínimo de resolução do projecto, Tempo médio de resolução do projecto, Tempo máximo de resolução do projecto |
Exemplo de apresentação |
---|
<text>
Programação com Objectos - Coisas Estranhas (aberto) Programação com Objectos - Gatos Simples * Número de submissões: 30 * Número de respostas: 20 * Tempos de resolução (horas) (mínimo, médio, máximo): 10, 16, 20 Programação com Objectos - Gatos Sofisticados (fechado) </text> |
CONDIÇÕES ESPECIAIS
Este menu apresenta as operações disponíveis para alunos, estando apenas disponível para estes utilizadores. A lista completa é a seguinte: Entregar projecto, Preencher inquérito, Ver resultados de inquérito.
As etiquetas das opções deste menu estão definidas na classe sth.app.student.Label. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe sth.app.student.Message.
É pedido o identificador da disciplina (requestDisciplineName()), o nome do projecto no contexto dessa disciplina (requestProjectName()) e o texto relativo à sumissão (requestSubmissionMessage()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se o aluno não estiver inscrito, e NoSuchProjectException, se o projecto não existir ou não estiver aberto.
Em caso de identificação bem sucedida, a submissão é registada no projecto. Para tal, é pedida uma mensagem de registo da entrega do projecto (requestDeliveryMessage()).
É pedido o identificador da disciplina (requestDisciplineName()) e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se o aluno não estiver inscrito, NoSuchProjectException, se o projecto não existir ou o aluno não tiver feito nenhuma submissão, e NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa ou não estiver aberto.
Em caso de identificação bem sucedida, a resposta ao inquérito é registada. Para tal, é pedido o número de horas gasto a realizar o projecto (requestProjectHours()) e o comentário ao projecto (requestComment()).
É pedido o identificador da disciplina (requestDisciplineName()) e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir, NoSuchProjectException, se o projecto não existir, e NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa. Em caso de identificação bem sucedida, os resultados do inquérito são apresentados de acordo com o formato seguinte, ordenados por ordem de resposta.
Formato de apresentação para inquéritos criados (por abrir) |
---|
Nome da disciplina - Nome do projecto (por abrir) |
Formato de apresentação para inquéritos abertos |
---|
Nome da disciplina - Nome do projecto (aberto) |
Formato de apresentação para inquéritos fechados |
---|
Nome da disciplina - Nome do projecto (fechado) |
Formato de apresentação para inquéritos finalizados |
---|
Nome da disciplina - Nome do projecto * Número de respostas: Número de respostas * Tempo médio (horas): Tempo médio |
Exemplo de apresentação |
---|
<text>
Programação com Objectos - Coisas Estranhas (aberto) Programação com Objectos - Gatos Simples * Número de respostas: 30 * Tempo médio (horas): 12 Programação com Objectos - Gatos Sofisticados (fechado) </text> |
CONDIÇÕES ESPECIAIS
Este menu apresenta as operações disponíveis para delegado, estando apenas disponível para estes utilizadores. A lista completa é a seguinte: Criar inquérito, Apagar inquérito, Abrir inquérito, Fechar inquérito, Finalizar inquérito, Mostrar inquéritos de uma disciplina, Enviar aviso, Mostrar resultados de inquérito.
As etiquetas das opções deste menu estão definidas na classe sth.app.representative.Label. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe sth.app.representative.Message.
É pedido o identificador da disciplina (requestDisciplineName()) e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se não for do curso do delegado, NoSuchProjectException, se o projecto não existir, e DuplicateSurveyException, se o inquérito já existir. Em caso de identificação bem sucedida, o novo inquérito é criado.
CONDIÇÕES ESPECIAIS
É pedido o identificador da disciplina (requestDisciplineName()) e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se não for do curso do delegado, NoSuchProjectException, se o projecto não existir, e NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa.
Se o inquérito estiver criado ou aberto e não tiver respostas, esta operação remove o inquérito.
Se o inquérito estiver aberto e já tiver pelo menos uma resposta, não pode ser removido, devendo ser lançada a excepção NonEmptySurveyException.
Se o inquérito estiver fechado, então esta operação abre-o novamente.
Não é possível cancelar inquéritos finalizados, pelo que, neste caso, deve ser lançada a excepção SurveyFinishedException.
É pedido o identificador da disciplina (requestDisciplineName()) e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se não for do curso do delegado, e NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa.
Em caso de identificação bem sucedida, o inquérito passa ao estado aberto se estiver no estado criado e o seu projecto associado estiver fechado. Todas as outras combinações levam ao lançamento da excepção OpeningSurveyException.
É pedido o identificador da disciplina (requestDisciplineName()) e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se não for do curso do delegado, e NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa.
Em caso de identificação bem sucedida, se o inquérito estiver aberto, passa ao estado fechado. Se estiver fechado, a operação não tem efeito. Outras condições causam o lançamento da excepção ClosingSurveyException.
É pedido o identificador da disciplina (requestDisciplineName()) e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se não for do curso do delegado, e NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa.
Em caso de identificação bem sucedida, se o inquérito estiver fechado, passa ao estado finalizado. Se já estiver finalizado, a operação não tem efeito. Outras condições causam o lançamento da excepção FinishingSurveyException.
É pedido o identificador da disciplina (requestDisciplineName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se não for do curso do delegado. Em caso de identificação bem sucedida, os inquéritos são apresentados de acordo com o formato seguinte, ordenados por ordem alfabética de nome de projecto.
Formato de apresentação para inquéritos criados (por abrir) |
---|
Nome da disciplina - Nome do projecto (por abrir) |
Formato de apresentação para inquéritos abertos |
---|
Nome da disciplina - Nome do projecto (aberto) |
Formato de apresentação para inquéritos fechados |
---|
Nome da disciplina - Nome do projecto (fechado) |
Formato de apresentação para inquéritos finalizados |
---|
Nome da disciplina - Nome do projecto - Número de respostas respostas - Tempo médio de execução horas |
Exemplo de apresentação |
---|
<text>
Programação com Objectos - Coisas Estranhas (aberto) Programação com Objectos - Gatos Simples - 30 respostas - 13 horas Programação com Objectos - Gatos Sofisticados - 40 respostas - 20 horas Programação com Objectos - Mais Gatos - 10 respostas - 2 horas Programação com Objectos - Zap to it! (fechado) </text> |
Caso uma disciplina não tenha projectos ou projectos com inquéritos, não deve ser apresentada nenhuma saída.
É pedido o identificador da disciplina (requestDisciplineName()) e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se não for do curso do delegado, NoSuchProjectException, se o projecto não existir, e NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa. Em caso de identificação bem sucedida, é enviado aviso a todos os alunos que entregaram o projecto e que ainda não preencheram o inquérito.
É pedido o identificador da disciplina (requestDisciplineName()) e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se não for do curso do delegado, NoSuchProjectException, se o projecto não existir, e NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa. Em caso de identificação bem sucedida, os resultados do inquérito são apresentados de acordo com o formato seguinte, ordenados por ordem de resposta.
Formato de apresentação |
---|
Nome da disciplina - Nome do projecto * 1ª resposta ... * Nª resposta |
Exemplo de apresentação |
---|
<text>
Programação com Objectos - Gatos Simples
</text> |
CONDIÇÕES ESPECIAIS
Além das opções de manipulação de ficheiros descritas no menu principal, é possível iniciar a aplicação com um ficheiro de texto especificado pela propriedade Java import.
Cada utilizador tem uma descrição distinta mas que segue o seguinte formato.
TIPO|identificador|telefone|nome
Dependendo do tipo de pessoa, TIPO pode tomar os valores FUNCIONÁRIO, DOCENTE, ALUNO e DELEGADO (para alunos que são delegados).
A seguir à linha da descrição, podem seguir-se outras (iniciadas pelo carácter #) que acrescentam informação adicional para o utilizador em causa. A informação adicional para os alunos (delegados ou não) e para os docentes é uma lista de cursos e disciplinas (uma por linha): para os alunos, são as disciplinas que frequentam; para os docentes, são as disciplinas que leccionam. Para os funcionários, não há informação adicional a processar.
<text> FUNCIONÁRIO|100001|123789456|Maria José ALUNO|100010|123456789|João Maria
ALUNO|100011|123456789|João Manuel
ALUNO|100012|123456789|João Maria
DOCENTE|100100|987654321|Maria João
FUNCIONÁRIO|101010|789456123|José Maria DELEGADO|Informática|100010 DELEGADO|Informática|100011 DELEGADO|Matemática|100012 </text>
A codificação dos ficheiros a ler é garantidamente UTF-8.
Usando os ficheiros test.import, test.in e test.out, é possível verificar automaticamente o resultado correcto do programa. Note-se que é necessária a definição apropriada da variável CLASSPATH (ou da opção equivalente -cp do comando java), para localizar as classes do programa, incluindo a que contém o método correspondente ao ponto de entrada da aplicação (sth.app.App.main). As propriedades são tratadas automaticamente pelo código de apoio.
java -Dimport=test.import -Din=test.in -Dout=test.outhyp sth.app.App
Assumindo que aqueles ficheiros estão no directório onde é dado o comando de execução, o programa produz o ficheiro de saída test.outhyp. Em caso de sucesso, os ficheiros das saídas esperada (test.out) e obtida (test.outhyp) devem ser iguais. A comparação pode ser feita com o comando:
diff -b test.out test.outhyp
Este comando não deve produzir qualquer resultado quando os ficheiros são iguais. Note-se, contudo, que este teste não garante o correcto funcionamento do código desenvolvido, apenas verificando alguns aspectos da sua funcionalidade.
Tal como indicado acima, algumas classes fornecidas como material de apoio, são de uso obrigatório e não podem ser alteradas. Outras dessas classes são de uso obrigatório e têm de ser alteradas.
A serialização Java usa as classes da package java.io, em particular, a interface java.io.Serializable e as classes de leitura java.io.ObjectInputStream e escrita java.io.ObjectOutputStream (entre outras).