package org.c3sl.ufpr.br.correction;
import br.ufpr.c3sl.mistakes.MistakeOccurrence;
import br.ufpr.c3sl.virtualkeyboard.mathevaluator.MathEvaluator;
public class CorrectionOne extends AbstractCorrection{
public CorrectionOne() {
super(1);
}
private static final long serialVersionUID = 2412805759758300505L;
private double firstAnswer;
@Override
public boolean isCorrect(String answer, int row, int column) {
MathEvaluator math = new MathEvaluator();
math.addVariable("n", 0.8);
math.setExpression(answer);
answerDouble = math.getValue();
math.reset();
if (row == 0)
if (answerDouble != 0)
firstAnswer = answerDouble;
else{
saveState(answer, "answer != 0", row, column);
return false;
}
if(row == 4){
math.addVariable("n", 0.8);
math.setExpression(firstAnswer + "/( 2 ^ n )");
}else
math.setExpression(firstAnswer + "/" + Math.pow(2, row));
correctAnswer = math.getValue();
int comparationReturn = compareDouble(correctAnswer, answerDouble, 0.009);
String stVCorrectAnswer = "";
if (row == 4)
stVCorrectAnswer = (firstAnswer + "/( 2 ^ n )");
else
stVCorrectAnswer = correctAnswer+"";
switch (comparationReturn) {
case 1:
this.message = null;
saveHit(answer, stVCorrectAnswer, row, column);
return true;
case -1:
this.message = MistakeOccurrence.getMistakeMessage("1", 0);
saveState(answer, stVCorrectAnswer, row, column);
return false;
case -2:
this.message = MistakeOccurrence.getMistakeMessage("2", 0);
saveState(answer, stVCorrectAnswer, row, column);
return false;
default:
this.message = null;
return false;
}
}
/*
* verify if the answer is similar to the answer
* @param correctAnswer The answer expected
* @param answer The answer entered
* @param error The error accepted
* @return 1 If correct
* @return -1 If size smaller than the correct size
* @return -2 If size bigger than the correct size
*/
public int compareDouble(double correctAnswer, double answer, double error){
correctAnswer = correctAnswer * 1000;
int changeValue = (int) (correctAnswer);
correctAnswer = (double) changeValue / 1000;
answer = answer * 1000;
changeValue = (int) (answer);
answer = (double) changeValue / 1000;
int greaterOrSmaller = (answer < correctAnswer)?-1:-2;
if (correctAnswer == answer)
return 1;
if (correctAnswer + 0.001 == answer)
return 1;
correctAnswer = correctAnswer * 100;
changeValue = (int) (correctAnswer);
correctAnswer = (double) changeValue / 100;
if (correctAnswer == answer)
return 1;
if (correctAnswer + 0.01 == answer)
return 1;
correctAnswer = correctAnswer * 10;
changeValue = (int) (correctAnswer);
correctAnswer = (double) changeValue / 10;
if (correctAnswer == answer)
return 1;
if (correctAnswer + 0.1 == answer)
return 1;
return greaterOrSmaller;
}
}