14/03/2011
Trabalho de LP
Prof. Flávio Miguel Varejão I. Descrição
Sucuri é uma linguagem de programação criada com o intuito de ser utilizada no ensino de programação básica. Sucuri possui um conjunto pequeno e restrito de tipos de dados,
Apresenta-se, a seguir, uma especificação mais detalhada dos tipos usados na construção de programas em Sucuri:
1. Lógico
Valores: V ou F
Operações: E OU NAO 2. Número
Valores: intervalo do conjunto dos números inteiros ou reais Exemplos de Valores: 2 3 12.34 77 8.82
Operações: +−∗ / < <= > >= = <> % ** 3. Lista
Valores: listas de valores de qualquer tipo
Exemplos de Valores: [ ] [ 2 3 5 ] [ 2 3.2 "Flavio" ] [ 2 [ 3 4 5 ] [ 7 8 ] ] Operações: + = += <> []
4. String
Valores: conjunto de cadeias de caracteres delimitados por "" Exemplos de Valores: "Flavio" "adicao" "char" "323" "3det 5" Operações: + <> = += []
Sucuri diferencia letras maiúsculas e minúsculas e possui vários tipos de comandos, descritos a seguir:
1. Atribuição
Formato: @variável <− @expressão
Tipo
Número Lista String
Exemplos: A <− 10
lista <− [ 1 [ 2 3 ] [ 2 [ 4.3 5 ] ] 89 ] lista [ 0 ] <− 13 + A ** 2
2. Entrada
Formato: LEIA ( @string ) Exemplos:
LEIA ( “Numero:#“ ) LEIA ( “Nome:#“ ) LEIA ( “Numero:#“ ) 3. Saida
Formato: APRESENTA ( @string , @valor ) Exemplos:
APRESENTA ( “Valor#Verdadeiro:#“ , V ) APRESENTA (“Uma#Lista:#“ , lista )
APRESENTA (“Um#Valor #nteiro:#“ , lista [ 3 ] + 7 ) APRESENTA (“Uma#String:#“ , “teste” )
4. Condicional Formato: SE ( @valorLógico ) ENTAO @sequênciaComandos {SENAO @sequênciaComandos} FIM-SE Exemplos: SE ( A < 30 ) ENTAO A <− A + 70 SENAO SE ( A > 70 ) ENTAO A <− A − 10 FIM-SE A <− A + 15 FIM-SE 5. Repetição Formato: REPITA @sequênciaComandos {{{SAIA-QUANDO ( @valorLógico ) @sequênciaComandos}}} FIM-REPITA Exemplos: i <− 3
REPITA i <− i + 3 SAIA-QUANDO ( i > 345 ) i <− i + 7 FIM-REPITA i <− 3 REPITA i <− i + 3 SAIA-QUANDO ( i % 11 = 0 ) i <− i + 7 SAIA-QUANDO ( i % 17 = 0 ) i <− i + 22 FIM-REPITA 6. Subprograma Formato:
SUBPROGRAMA @nome ( @listaParâmetros ) INICIO @sequênciaComandos {{RETORNE {@valor} @sequênciaComandos}} FIM-SUBPROGRAMA Exemplo: SUBPROGRAMA fatorial ( n ) INICIO SE ( n < 2 ) ENTAO RETORNE 1 SENAO RETORNE n * fatorial ( n – 1 ) FIM-SUBPROGRAMA 7. Programa Formato: PROGRAMA @nome {{@subprograma}} INICIO @sequênciaComandos FIM-PROGRAMA Exemplo: PROGRAMA Exemplo
SUBPROGRAMA somaMatriz ( matriz , nlinhas , ncolunas ) INICIO
soma <− 0 i <− 0
j <− 0 REPITA
soma <− soma + matriz [ i ] [ j ] SAIA-QUANDO ( j = ncolunas – 1 ) j <− j + 1 FIM-REPITA SAIA-QUANDO ( i = nlinhas – 1 ) i <− i + 1 FIM-REPITA RETORNE soma FIM-SUBPROGRAMA INICIO matrizQuadrada <− [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ]
somaMatrizQuadrada <− somaMatriz ( matrizQuadrada , 3 , 3 ) x <− matrizQuadrada [ 1 ] [ 2 ]
APRESENTA ( “” , “\n” )
APRESENTA ( “Soma#dos#Valores#da#Matriz:#“ , somaMatrizQuadrada ) APRESENTA ( “Um#Valor#da#Matriz:#“ , x )
APRESENTA ( “Uma#Soma:#“ , somaMatrizQuadrada + x ) APRESENTA ( “” , “\n” )
FIM-PROGRAMA
Faça um programa em Python que traduza programas na linguagem Sucuri para a própria linguagem Python e os execute apropriadamente. Em caso de erro sintático na codificação do programa em Sucuri, o programa tradutor deve indicar em qual linha do código Sucuri que o erro ocorre.
Por uma questão de simplificação, assuma que tudo que não foi explicitamente especificado nesse documento (por exemplo, regras sintáticas de construção de expressões) segue exatamente a sintaxe de python. Tipicamente, o que não foi explicitado aqui foi apresentado no formato @algumacoisa, como por exemplo, @variavel ou @expressao. Assim, a menos de diferenças explicitamente descritas nessa especificação (por exemplo, na forma dos operadores de igualdade e desigualdade e na forma de separação de elementos de uma lista), a sintaxe é exatamente a mesma de python.
Considere também que erros nos arquivos de programa sucuri só ocorrerão na sintaxe dos comandos descritos aqui. Por exemplo, como aqui não são descritas as regras de construção de expressões, você não precisa verificar se uma expressão é bem formada ou não.
Note que na especificação de comandos tudo que se encontra entre chaves significa que pode ocorrer ou não, tudo que se encontra entre chaves duplas significa que pode ocorrer zero ou mais vezes, tudo que se encontra entre chaves triplas significa que pode ocorrer uma ou mais vezes.
Todos arquivos sucuri devem ser arquivos texto com extensão .su (por exemplo, matriz.su ou fatorial.su). Seu programa deve se chamar sucuri.py. Assim para executar o programa matriz.su você deve digitar a seguinte linha de comando:
python sucuri.py < matriz.su
Toda e qualquer informação produzida pelo comando APRESENTA deve ser gravada no arquivo saida.txt. Note ainda que é necessário gerar também um arquivo .py (no caso do exemplo, matriz.py) com o código do programa traduzido para python, que será usado para ajudar na correção dos trabalhos.
II. Especificações Complementares
1. As strings de sucuri não possuem internamente caracteres brancos, aspas simples ou duplas. Espaços são representados através do caractere #. Quando o programa sucuri for executado e apresentar uma string, eventuais caracteres # que possam existir devem ser substituídos e impressos como espaços brancos.
2. Haverá obrigatoriamente espaço em branco separando os símbolos e identificadores de sucuri. Exemplos:
A <- i + soma ( a , b ) SE ( x < 3 ** y ) ENTAO
3. Pode haver parênteses internos nas condições dos comandos SE e do SAIA-QUANDO. Portanto, os exemplos a seguir são válidos:
SE ( x < ( y + ( x - 3 * z) ) / 2 ) ENTAO SE ( a < divide ( 30 , 3 ) ) ENTAO
4. É necessário validar a quantidade de parâmetros na chamada de um subprograma. Considere que toda chamada de subprograma só aparece depois dele ter sido definido.
5. A mensagem a ser impressa no arquivo saida.txt em caso de erro na tradução é: Erro na linha <numero da linha>
Por exemplo: Erro na linha 13
6. Palavras reservadas de Python como True e while não podem ser usados como identificadores em programas sucuri.
7. As palavras que designam valores (V e F), comandos (SE, REPITA) e operadores (E, OU, NÃO) de Sucuri são reservadas e, portanto, não podem ser usadas como identificadores.
8. Ao final de um programa sucuri (após o FIM-PROGRAMA) nunca será colocado qualquer outro caractere seja espaço em branco, nova linha ou qualquer outro. 9. Não é permitido usar no programa tradutor operações que leiam o buffer de
entrada inteiro como readlines() ou similares. III. Requisitos da implementação
1. Modularize seu código adequadamente. O uso de variáveis globais é proibido.
2. Crie códigos claros e organizados. Utilize um estilo de programação consistente, Comente seu código.
3. Os arquivos .su devem ser colocados na mesma pasta onde se encontram os arquivos fonte do seu programa. Os arquivos saida.txt e .py devem ser gerados nesta mesma pasta.
IV. Condições de Entrega
O trabalho deve ser feito individualmente e submetido por e-mail até as 23:59 horas das datas limites especificadas. Note que as datas limites já levam em conta um dia adicional de tolerância para o caso de problemas de submissão via rede. Isso significa que o aluno deve submeter seu trabalho até no máximo um dia antes da data limite. Se o aluno resolver submeter o trabalho na data limite, estará fazendo isso assumindo o risco do trabalho ser cadastrado no sistema após o prazo. Em caso de recebimento do trabalho após a data limite, o trabalho não será avaliado e a nota será ZERO. Aluno que receber zero por este motivo e vier pedir para o professor considerar o trabalho estará cometendo um ato de DESRESPEITO ao professor e estará sujeito a perda adicional de pontos na média.
V. Formato de Entrega dos Trabalhos
O recebimento dos trabalhos é automatizado. Portanto, as regras a seguir devem ser seguidas à risca para evitar que seu trabalho não possa ser avaliado.
O código-fonte de sua solução deverá ser compactado e entregue por mail (anexo ao e-mail) para o endereço fvarejao@ninfa.inf.ufes.br.
Serão aceitos trabalhos entregues até as 23h59 da data limite. O assunto do e-mail deverá ser o seguinte:
lp:trab<id>:<nome>:
O termo “<id>” deve ser substituído pelo número correspondente do trabalho (1, 2 ou 3). O termo “<nome>” deverá ser substituído pelo nome e o último sobrenome do aluno, sem acentos, til ou cedilha, como no exemplo abaixo:
lp:trab1:Flavio Varejao:
Atenção: o e-mail não deve ser enviado por servidores de emails que não seguem padrões normais de envio, tais como, TERRA, HOTMAIL ou BOL, pois o recebimento automatizado não consegue reconhecer seu trabalho.
O arquivo compactado deve estar no formato tar.gz com o nome trab<id>.tar.gz e conter apenas os arquivos fonte do programa (não deve conter arquivos compilados nem arquivos texto usados para teste). Para isso, abra um console, mude o diretório de trabalho para a pasta onde se encontra o código-fonte do trabalho e execute o seguinte comando (no caso do trabalho 1):
tar -zcvf trab1.tar.gz *
Preste bastante atenção para fazer com que o codigo fonte não seja colocado em subdiretórios dentro do arquivo compactado. Se isso ocorrer a compilação automática não funcionará e sua nota será ZERO. Atente também que os nomes usados no arquivo principal dos trabalhos DEVEM ser: trab1.py, trab2.py e trab3.py.
Para: fvarejao@ninfa.inf.ufes.br De: Joao da Silva
Assunto: lp:trab1:Joao Silva: Anexo: trab1.tar.gz
Para a compilação e execução dos programas, em princípio, serão utilizadas as versões de python instaladas no labgrad. Caso haja alguma modificação de versão de correção, ela será divulgada oportunamente. Os programas serão executados no sistema operacional linux. Para que não haja problemas na correção do seu trabalho e você seja prejudicado, garanta que ele é executado na versão de correção e no sistema operacional linux.
Se tudo correr bem, você receberá um e-mail de confirmação do recebimento do trabalho. Neste e-mail haverá um hash MD5 do arquivo recebido. Para garantir que o arquivo foi recebido sem ser corrompido, gere o hash MD5 do arquivo que você enviou e compare com o hash recebido na confirmação. Para gerar o hash, utilize o seguinte comando:
md5sum trab1.tar.gz
Caso você não receba o e-mail de confirmação ou caso o valor do hash seja diferente, envie o trabalho novamente.
VI. Avaliação
Os trabalhos terão nota zero se:
1) A data de entrega for fora do prazo estabelecido; 2) O trabalho não estiver correto sintaticamente;
3) O trabalho não gerar o arquivo com o resultado e formato esperado; 4) For detectada a ocorrência de plágio pelo sistema.
Ainda, os trabalhos poderão ser avaliados segundo os seguintes critérios: 1) Cumprimento das restrições estabelecidas no ítem III deste documento;
2) Modularização (considerando o uso de arquivos separados para os diversos tipos abstratos de dados);
3) Ausência de uso de variáveis globais;
4) Legibilidade (nomes de variáveis bem escolhidos, código bem formatado, uso de comentários quando necessário, etc.);
5) Consistência (utilização de um mesmo padrão de código);
6) Eficiência (sem exageros, tentar evitar grandes desperdícios de recursos); Será adotado o seguinte procedimento de correção dos trabalhos:
1. Os programas serão executados automaticamente com baterias de teste criadas especialmente para isso. Algumas dessas baterias serão divulgadas antes da submissão dos trabalhos para que os alunos possam verificar seus programas. 2. A nota do aluno será obtida automaticamente comparando-se os arquivos saida.txt
3. Alguns dos trabalhos serão selecionados para inspeção (verificação dos critérios de correção) e adequação da nota.
4. No caso dos trabalhos que falharem nos testes automáticos será dada uma oportunidade de revisão da nota para que os autores apresentem as razões pelas quais o teste falhou. Para isso, serão divulgadas as baterias utilizadas e o aluno deverá enviar e-mail para fvarejao@ninfa.inf.ufes.br com assunto: lp - revisão do trabalho <id> e contendo seu nome completo e as modificações que devem ser feitas no código para que o trabalho funcione perfeitamente. Em função dessas modificações uma nova nota pode ser dada. Em caso de necessidade, será marcado um horário para esclarecimentos in loco.
Observação importante:
Caso haja algum erro neste documento, serão publicadas novas versões e divulgadas erratas em sala de aula. É responsabilidade do aluno manter-se informado, freqüentando as aulas ou acompanhando as novidades na página da disciplina na Internet.