Ir para "dicas avaliador"

Introdução ao editor em linha: como fazer, editar e verificar se um programa foi enviado

Sobre o editor em linha: como fazer, editar e verificar se um programa foi enviado

Neste roteiro explicarei de modo resumido como utilizar o editor em linha do ambiente Moodle para envio e auto-avaliação de tarefas de programação. O processo de submissão de uma tarefa implica na realização de 3 passos básicos: o registro de seu programa, o registro da avaliação dele e a verificação se, de fato, seu programa está registrado no sistema. ambiente possibilita 2 modos distintos para registro de seu programa, o que deve ser privilegiado é o uso do editor em linha on-line). Apresentarei os 3 passos nas seções "2. Editar", "3. Enviar" e "4. Visualizar envios".

Inicialmente vale ressaltar que praticamente todos os atuais ambientes Web que gerenciam o envio de arquivos dispõem de mecanismo para, após o envio do arquivo, verificar se de fato ele foi enviado! Assim, é fortemente recomendável que você sempre verificar se seu arquivo foi carregado/submetido com sucesso. Veja ao final deste roteiro onde está o recurso que permite que você verifique se o seu arquivo foi registrado com sucesso, mais ainda, se está registrado o resultado da avaliação automática do mesmo.

Outras duas dicas iniciais importantes são relacionadas ao seu código (seja ele C ou Python):

  1. Não use caracteres acentuados ou caracteres especiais, nem mesmo nos comentários de código, pois isso também pode gerar erros (existe modos de permitir acentos e outros caracteres, mas não os examinaremos nas primeiras semans de aula).
  2. Não use qualquer impressão de texto além das solicitadas pelo exercício, pois um caractere errado poderia produzir nota zero. Por exemplo, não precisa usar mensagens auxiliares como printf("Digite um valor: ") para C ou print("Digite um valor: "); n1 = int(input()); para Python (exceto se o enunciado solicitou tal mensagem).
  3. Para dar nomes aos arquivos não use caracteres especiais e use a extensão correta.
  4. Para ter sua nota na tarefa você deve estar atento à estas dicas.

Vale destacar a segunda recomendação. Se você imprimir qualquer mensagem adicional (não solicitada no exercício), muito provavelmente a nota que receberá do Avaliador Automático (AA) no exercício será 0.0. A razão disso é que o AA usa as saídas de seu programa para verificar se elas estão iguais ao esperado (mais detalhes: o AA pega algumas entradas pré-cadastradas associadas ao exercício, as submete ao seu programa e as respostas obtidas são comparadas com as saídas esperadas, também pré-cadastradas). Assim, se o exercício solicita que seu código imprima 2 valores digitados pelo usuário, supondo que você tenha usado os nomes n1 e n2 para guardar os valores a serem digitados, então você não deve fazer printf("n1+n2=%d\n", n1+n2); (C) ou print("n1+n2=%d" % n1+n2); (Python), mas apenas: printf("%d\n", n1+n2); (C) ou print(n1+n2); (Python).

Apresentarei as 4 seções na ordem sugerida para o aprendiz realizar a tarefa, a saber "Descrição", "Editar", "Enviar" e "Visualizar envios" (que são as abas principais do editor em linha). Para ativar cada uma das aba, basta clicar próximo ao seu título, e.g., para ativar a edição, clique sobre o texto "Editar". Após isso, deverá ser observada uma mudança na interface, o título da aba clicada deverá aparecer em negrito e em outr cor.

  1. Descrição
    Ao acessar a página da atividade, pode-se observa a presença de 4 abas, a ativa terá o nome "Descrição" e contéra o enunciado da atividade e data limite para submissão da mesma ("Disponível até:").
    A imagem abaixo apresenta um exemplo da seção "Descrição". Nela pode-se observar, pela ordem, o título da atividade, seu prazo para entrega, se individual e o enunciado da mesma.
    descricao da atividade
    Fig. 1. Interface inicial do ambiente de submissão de tarefa, com as 4 abas ("descrição", "enviar", "editar", "visualizar envios").
  2. Editar
    Esta é a opção que você deve usar para testar seu código! É com ela que é possível receber a nota automaticamente atribuida pelo avaliador do VPL.
    A aba "Editar" contém o editor em linha para o aprendiz digitar e testar seu programa.
    O editor foi desenvolvido usando a linguagem JavaScript, portanto, para funcionar o JavaScript deve estar habilitado em seu navegador. Em alguns navegadores, o editor pode não funcionar bem devido a alguma incompatibilidade com a implementação do navegador, deste modo sugiro fortemente que se utilize o navegador livre Firefox.
    Se o JavaScript funcionar bem em seu navegador, deverá aparecer uma pequena janela com título "Criar um novo arquivo" (se estiver usando o ambiente em Português). Nesta janela deve-se digitar um nome para seu arquivo, sendo recomendável não utilizar caracteres especiais e nem acentos.
    Nota importante: o nome do arquivo deve necessariamente ter a extensão .c para a linguagem C e .py para a linguagem Python. Ou seja, se você digitar algo como nome_arquivo o VPL não conseguirá identificar qual compilador ou interpretador usar, daí resultará erro! (algo como I'm sorry, but I haven't a default action to run these type of submitted files).
    A imagem abaixo ilustra esta situação, com o aprendiz digitando como nome de seu arquivo nome_sem_acentos.c (neste caso para programar usando a linguagem C).
    digitando o nome do arquivo
    Fig. 2. Criando um novo arquivo na linguagem adequada (necessário a extensão compatível).

    Depois de criar um arquivo, pode-se alterar o seu nome. Isso é importante no caso de esquecer a extensão do arquivo, pois sem a extensão do arquivo o avaliador automático não pode reconher o tratamento a ser dado ao mesmo. Isso quer dizer que, sem a extensão o ambiente não tem como tratar seu arquivo, mas com a extensão, se fosse um código em linguagem C o sistema conseguiria submetê-lo para o compilador C, ou analogamente, se fosse um código em Python, a partir da extensão py o sistema poderia submetê-lo ao interpretador Python. Assim, para renomear clique no ícone do "lápis" (terceiro da esquerda para a direita), como indicado na imagem abaixo e depois digite o novo nome (com a extensão).
    alterando o nome arquivo
    Fig. 3. Renomeando um arquivo já iniciado (eventualmente para corrigir a extensão).

    Atenção 1: Após digitar seu programa é necessário registrá-lo (gravá-lo no sistema), o que pode ser feito clicando-se sobre o ícone "Gravar" (icone gravar). A imagem abaixo ilustra esta situação destacando 4 aspectos: na área de trabalho existe o código (no exemplo em C, mas com comentário de como seria em Python); no canto superior esquerdo está o nome do arquivo; na barra de opções, existem 2 ícones destacados (contornados por retângulos azuis); e na área de trabalho, o código está destacado, cada item léxico da linguagem em uma cor (indicando que foi reconhecido).
    seu programa ainda NAO foi enviado/gravado
    Fig. 4. Editor com o código ainda não gravado (após qualquer edição) e consequentemente a opção de avaliação está desabilitada.
    Na situação acima o código ainda não foi gravado (desde a última alteração)! Isso pode ser identificado comparando a situação dos ícones para gravar icone gravar e para avaliar icone avaliar com a situação abaixo. Na imagem acima a opção para gravar está habilitada (em fundo branco), enquanto o avaliador está desabilitado (em fundo cinza). Após o usuário clicar no ícone gravador, o estado muda, o gravador fica desabilitado enquanto o avaliador passa a ficar habilitado (pode-se clicar nele para ter seu código avaliado). A imagem abaixo ilustra essa segunda situação: código gravado, faltando avaliá-lo (note que se avaliar, mas depois alterar algo no código e gravar novamente, a tarefa fica sem nota!)
    seu programa foi enviado/gravado
    Fig. 5. Editor com o código já gravado e por isso com a opção de avaliação habilitada.

    Atenção 2: Assim, estando o gravador desabilitado (portanto a última alteração está gravada), consequentemente o avaliador estará habilitado. Então deve-se clicar nele para ter seu programa avaliado. Sua nota depende desse passo!
    A figura abaixo ilustra como fica a interface após a avaliação, no caso, a tarefa tinha 10 casos-de-teste e o código passou pelos 10 testes, portanto com 100% de aproveitamento.
    seu programa foi avaliado
    Fig. 6. Situação do editor após "clicar" no avaliador (note que aparece uma nova janela à direita com o resultado da avaliação).

    Atenção 3: Mesmo que seu programa tenha sido avaliado e recebido nota máxima (passou em 100% dos testes), se você realizar qualquer alteração no código e gravar novamente, sua nota será automaticamente eliminada pelo VPL, sendo necessário clicar novamente no "Avaliar". Ou seja, ao finalizar sua atividade a interface tem que estar semelhante à imagem acima, na qual nota-se à direita uma coluna sob título "Nota proposta", "Comentários" e abaixo "Summary of tests".
  3. Enviar
    Não use esta opção! Ela não permite que seu código receba uma nota do avaliador do VPL, o que poderá implicar em você ficar com zero na tarefa!
    Esta interface não precisará ser utilizada, dependendo da configuração do exercício, ela não estará disponível. Ela é necessária apenas quando o JavaScript falhar e você não tiver tiver mais tempo (aquela história de "deixar para o último minuto"...). Mas havendo tempo contate a equipe para saber o que fazer, em geral instalar uma versão recente do Firefox resolve.
    Assim, se não houver tempo e, ao entrar na edição da atividade, não aparecer a janela para digitar o nome do arquivo (como na figura 2), então, para garantir que você consiga entregar sua atividade em tempo, pode-se submeter seu programa a partir dessa aba. Sua interface é apresentada na figura abaixo (após ter sido selecionado o arquivo, no exemplo, de nome nome_sem_acentos.c).
    interce que indica carga com sucesso
    Fig. 7. Interface para envio de arquivos (útil apenas quando seu navegador não funciona com JavaScript.
    Após clicar no botão "Enviar" (caso esteja usando o ambiente no padrão Português), deverá aparecer uma mensagem indicando que seu programa foi de fato gravado no sistema. Neste caso, você também poderá editá-lo usando a interface do editor JavaScript (eventualmente mais tarde, usando outro navegador...).
  4. Visualizar envios
    Nesta interface deverá aparecer informações sobre todos os seus "envios" de programas, na verdade, a cada clique no botão de gravação, um novo envio é registrado!
    Se aparecer uma tela apenas escrito "Não há envio disponível" é por que o registro de seu programa NÃO foi feito! Muito provavelmente por ter esquecido de clicar no botão de gravação...
    Se o registro foi efetuado, na primeira linha aparecerá a data/horário do último registro ("Revisado em..." - se estiver configurado para a lingua Portuguesa). Logo abaixo tem que aparecer a linha com a nota da avaliação automática, e.g., "Nota 10 / 10" (para as atividades registradas com nota entre 0 e 10, neste caso indicando que passou em todos os casos de teste).
    Ainda considerando que o registro tenha sido feito, abaixo aparecerá o nome que você deu ao seu programa e logo depois o código de seu último envio. Se a extensão foi reconhecida corretamente, o código terá que aparecer com cores distintas para cada tipo de item léxico (e.g., com tipos de variáveis em azul e nomes de variáveis e de funções em preto).
    A situação de registro com sucesso está indicada na imagem abaixo. Note na imagem a seta azul indicando 100% de aproveitamento!
    imagem de registro feito e nota maxima!
    Fig. 8. Interface para confirmar que arquivo foi enviado com sucesso (atenção à "nota proposta", procure obter 100%)

Volto a insistir na importância de conferir se sua atividade está registrada com sucesso e se sua nota automática foi de fato atribuida, ou seja, se entrar na aba de visualização, ela tem que estar parecida com a imagem imediatamente acima, que indicada haver um programa de nome nome_sem_acentos.c registrado e com a nota máxima atribuida a ele.

Algumas dicas para usar as mensagens do avaliador para identicar o que está errando

Nessa seção apresento dicas básicas de como usar as mensagens do avaliador para conseguir identificar o que deve ser corrigido em seu código.

  1. Entender a semântica dos casos-de-teste do avaliador do VPL
    A primeira dica é lembrar o funcionamento do avaliador automático VPL. Ele é baseado em casos-de-teste, que é composto por uma lista de valores para serem usadas como entradas de dados para seu código (input), seguido de uma lista de valores que são as saídas esperadas (Expected output) para aquelas entradas.
    Assim, quando "clicar" no botão Avaliar, seu código é compilado/interpretado, pegando-se as entradas do primeiro caso-de-teste e submetendo-as a cada comando de leitura de seu programa (na ordem dada).
    Logo, se você receber a mensagem de erro EOFError: EOF when reading a line é porque seu código tem mais comandos para leitura de dados do que o número de dados disponĩveis!
    Nesse processo, assim que seu programa faz uma impressão (Program output), essa é comparada com a primeira saída esperada. Se houver divergência, sua nota "cai".
    Por exemplo, um dos primeiros desafios de um curso de introdução à programação poderia ser obter a média aritmética de 2 valores inteiros. Para essa atividade, poderíamos usar como casos-de-teste (usando a sintaxe do VPL) os seguintes:
    case=teste1     
    input= -1
    1
    output= 0
    case=teste2
    input= -1
    -1
    output= -2
    case=teste3
    input= 1
    2
    output= 1.5
    case=teste4
    input= 123
    322
    output= 222.5
    case=teste5
    input= 3245
    23452
    output= 13348.5
    case=teste6
    input= -3245
    -23452
    output= -13348.5
    Assim, você precisa de muita atenção às saídas de seu código (Program output) comparando-as com as saídas esperadas (Expected output).
    Você deve almejar que seu código passe em todos os testes. Se o seu programa passou em todos os testes ele deve receber uma mensagem do tipo (no exemplo existem 11 casos-de-teste)
       +------------------------------+
       | 11 tests run/11 tests passed |
       +------------------------------+
  2. Nunca imprima qualquer mensagem que NÃO foi solicitada (evite caracteres especiais, como letras acentuadas)
    Se falhou em algum teste, muita atenção às saídas de seu código (Program output), que devem ser comparadas com as saídas esperadas (Expected output).
    Desse modo, a primeira dica para depuração é: nunca imprima qualquer mensagem que NÃO foi solicitada. Complemento da dica: evite caracteres especiais ou assentuados (mesmo em comentários no código fonte)! (pois eles podem ser interpretados de modo diferente em diferentes sistemas).
    Por exemplo, nos casos de teste do item 1 percebe-se que não deve ser impresso qualquer texto de aviso ao usuário, como solicitar que ele digite um valor... Em geral as atividade de um curso de introdução à computação almejam a compreensão de uma linguagem de programação e principalmente o aprendizado de resolução de problemas na forma de algoritmos. Por isso, em geral, não é necessário atenção à detalhes para avisar o usuário, afinal você ou nós somos os usuários e nós sabemos o que digitar e quando...
    Vejamos um exemplo de erro desse tipo para o exemplo de imprimir a média aritmética de 2 valores inteiros
     Incorrect program result      
     --- Input ---
     -1
     1
     --- Program output ---
     
     digite um numero:digite outro numero:0
     
     
     --- Expected output (numbers)---
     
     0
    Explicado desse modo o erro acima parece claro: o programa imprimiu digite um numero:digite outro numero:0, mas o esperado era 0.
    Entretanto os alunos iniciantes podem ter dificuldade para "isolar" esse erro, pois eles podem estar convencidos que seu código esteja correto (uma vez que ele computa e imprime corretamente a média, o valor 0), mas os caracteres impressos a mais impedem que o avaliador perceba sua corretude! Então, nao imprima sujeiras.
  3. Se não enxergar onde está o erro, use um programa para detectar diferença em textos (como o diff no Linux)
    Se você não está percebendo onde está a diferença entre a saída esperada e a saída efetiva de seu código, gere um arquivo texto (txt sem formatação) com a primeira, outro com a segunda e rode o comparador de textos.
    Por exemplo, nas saídas o item 2 acima, teríamos os arquivos:
    Arquivo 1: saidas_efetivas.txt Arquivo 2: saidas_esperadas.txt
    digite um numero:digite outro numero:0      0
    Nesse exemplo simples, talvez ao gerar os arquivos já não seja preciso rodar o comparador. Mas e se as saídas forem mais complexas, como indicado na tabela abaixo?
    Arquivo 1: saidas_efetivas.txt Arquivo 2: saidas_esperadas.txt
    Digite o tamanho do tabuleiro (linhas<19 e colunas<53):    
    Digite o numero de naves (par maior que 1):
    |V   |
    |V   |
    | A  |
    'e'=esquerda; 'd'=direita; e 'l'=emitir laser:
    |V   |
    |V   |
    |*   |
    >>> GAME OVER! Voce perdeu!
    >>> Pontuacao: 0
    Digite o tamanho do tabuleiro (linhas<19 e colunas<56):
    Digite o numero de naves (par maior que 1):
    |V   |
    |V   |
    | A  |
    'e'=esquerda; 'd'=direita; 'l'=emitir laser:
    |V   |
    |V   |
    |*   |
    >>> GAME OVER! Voce perdeu!
    >>> Pontuacao: 0

    Nesse exemplo talvez seja mais dificil perceber onde erramos e o processo sistemático (gerando arquivos e detectando automaticamente as diferenças) podem ser de grande ajuda.
    Se você estiver usando alguma distribuição Linux (ou Unix), esse sistema dispõe do comando diff. Assim, digitando: diff saidas_efetivas.txt saidas_esperadas.txt, recebemos as seguintes linhas:
    1c1
    < Digite o tamanho do tabuleiro (linhas<19 e colunas<53):
    ---
    > Digite o tamanho do tabuleiro (linhas<19 e colunas<56):
    6c6
    < 'e'=esquerda; 'd'=direita; e 'l'=emitir laser:
    ---
    > 'e'=esquerda; 'd'=direita; 'l'=emitir laser:
    Na primeira linha aparece o termo 1c1 indicando as linhas da primeira difença nos 2 arquivos (no caso, ambos na linha 1). Examinando-se as primeiras linhas, percebe-se o único caractere distindo: o antepenúltimo de cada linha (3 e 6).
    No segundo bloco, percebe-se que na linha 6 do arquivo de saídas efetivas termina com |V | enquanto que no esperado existem duas linhas (6 e 7). Ou seja, faltou uma quebra de linha antes de imprimir |V |.

Este é o resumo de como utilizar o ambiente de edição e avaliação automática.

Leônidas de Oliveira Brandão
http://line.ime.usp.br

Alterações:
2022/05/10: pequeno acerto léxico
2020/08/15: novo formato, pequenas revisões
2018/05/21: nova secao "dicas para encontrar erro" (segunda, 23:00)
2018/04/26: mais detalhes sobre VPL, novas imagens agora do VPL 3.2.4 (quarta, 17:19)
2017/03/20: versão inicial (segunda, 17:02)