Criada: 2016-03-12
Seu desafio envolvendo a linguagem Prolog será ler e resolver uma equação de primeiro grau em uma variável.
Você deverá receber do dispositivo de entrada padrão um texto
contendo uma equação. Esta equação poderá ser composta de várias
linhas. A equação deverá possuir um único sinal de igual (=). De
cada lado desse sinal, deverá haver uma expressão aritmética
envolvendo apenas variáveis, números inteiros ou em ponto
flutuante, os sinais aritméticos +, -, *, / e parênteses para
agrupar expressões aritméticas. Ao final da equação, deverá
haver um ponto final (".") para indicar ao Prolog o fim de um
termo. Desta forma, a equação poderá ser lida com o predicado
pré-definido read/1
de Prolog.
A equação poderá conter espaços em branco, caracteres de tabulação e caracteres de quebra de linha à vontade. Devem ser aceitos como nomes de variáveis sequências de caracteres constituídas de letras e dígitos, com inicial minúscula. Outros nomes de variáveis podem ser aceitos a critério do implementador, porém não podem ser aceitos nomes com inicial maiúscula. A equação deverá envolver apenas uma variável e possuir apenas termos de grau no máximo um com respeito a esta variável.
Seu programa deverá verificar a entrada e acusar erro caso ela não esteja dentro do esperado. Casos de erro devem incluir:
x y = 3e outras do gênero;
x + * 3 = 4
a + ( b = 5
x * x - 2 * x = 8
x + 1 = x + 2Esta entrada poderia também ser recusada por não ser do primeiro grau: seria de grau zero, pois os termos em x se cancelam.
Alguns casos dúbios serão deixados a cargo do implementador. Por exemplo, a seguinte equação é do primeiro grau ou não?
x * x * 0 - 2 * x = 4
Deixaremos a cargo do implementador a decisão de aceitar ou não tal equação. Da mesma forma, equações como:
0 * y = 3 * x - 1
contém mais de uma variável ou não? Fica a cargo do implementador decidir. Outro caso dúbio:
x * x + 2 * x = 3 * x + x * x + 8 - 4
Neste caso, os termos quadráticos se cancelam. Poderia ser aceita como de primeiro grau, mas também poderia ser recusada, a critério do implementador.
Na equação a seguir, o mesmo caso ocorre com os termos em y. Poderia ser aceita ou recusada.
y + x = y + 3
Na equação a seguir, o coeficiente de x é zero, mas pode não ser devido a problemas de arredondamento. Fica a cargo do implementador decidir o que fazer.
9 + (((1/1000001 - 1)*1000001)/1000000 + 1) * x = 2
No caso a seguir, ao ser realizada a multiplicação de cada lado da equação por um fator conveniente, resulta uma equação do primeiro grau. Mas a equação original envolve a divisão por (x - 2), o que impede que seja atribuído o valor x = 2. Isto pode servir de base para que esta equação seja considerada não de grau 1, pois expressões de grau 1 não têm limitações de domínio.
(x + 3)/(x - 2) = 3
No caso a seguir, pode-se tanto recusar a equação como soltar qualquer valor para sua resposta, já que qualquer valor será válido:
x + 1 = x + 1
Todos estes casos e outros semelhantes não serão usados nos testes abertos nem fechados do sistema de submissão (SuSy), e portanto o encaminhamento que for dado a eles pelo implementador é irrelevante para a avaliação de correção do programa, embora possa influir na avaliação das mensagens de diagnóstico.
Seu programa deverá imprimir no dispositivo de saída padrão o valor numérico da resposta à equação lida, ou a palavra "erro" se a entrada não for válida de acordo com as diretrizes descritas acima.
Para facilitar a depuração, outras informações podem ser escritas na saída padrão, da seguinte forma. Após o resultado, imprimir ponto-e-vírgula (";") seguido da informação extra desejada. O verificador de respostas corretas será instruído a ignorar tudo o que vier após o ponto-e-vírgula. Porém, em todos os casos, a saída padrão deverá ser constituída de uma única linha.
Em princípio, a nota recebida será composta da seguinte forma:
A nota de correção será o quociente entre o número de testes abertos e fechados acertados e o número total de testes abertos e fechados.
A nota de estilo avaliará o bom estilo declarativo do programador. Serão levados em conta aspectos como warnings, predicados ou cláusulas não usados ou desnecessários, nomes de predicados e variáveis, modularização, etc.
A nota de comentários avaliará a qualidade dos comentários dispostos no código. Este poderia ser um quesito do estilo, mas comentários são tão importantes que merecem um item de avaliação à parte.
A nota de mensagens de diagnóstico avaliará a qualidade da informação extra impressa a título de diagnóstico, especialmente nos casos em que a saída for "erro" e nos casos dúbios. Note que, apesar dos casos dúbios não constarem do SuSy, eles poderão ser usados em avaliações adicionais para o quesito de mensagens de diagnóstico.
© 2016 João Meidanis