Тест по кодированию Javascript не складывается

#javascript #arrays #sum

#javascript #массивы #сумма

Вопрос:

Я пытаюсь выполнить простой тест, в котором должны суммироваться правильные и неправильные ответы. Дело в том, что, хотя я поставил два из трех правильных ответов, я продолжаю получать один и тот же результат для правильного и неправильного массива: 0. Значит, в конце должно быть что-то не так, в функции оценки. Заранее спасибо

 var responsesArray= [];
var correct=[];
var incorrect= [];




function question2() {

  var firstQuestion = prompt('Does null === 0 ? (Yes or No)')

// why do you need to convert the answer to lowercase?
  if (firstQuestion.toLowerCase() === 'yes') {
    firstQuestion = true
  } else if (firstQuestion.toLowerCase() === 'no') {
    firstQuestion = false
  } else {
// what if the user writes something other than yes or no? 
// they will have to answer the question again
    alert("Please answer either Yes or No");
    return question2();
  }
  responsesArray.push(firstQuestion); // add the true or false value to the responses array
}

question2();



function question3() {
  var js = prompt('What was the original name for JavaScript: Java, LiveScript, JavaLive, or ScriptyScript?');
  js = js.toLowerCase();
  switch (js) {
    // your own answers
    
    case "livescript":
    console.log("Correct!");
    break;
    case "Java":
    console.log("wrong");
    break;
    case "JavaLive":
    console.log("wrong");
    break;
    case "ScriptyScript":
    console.log("wrong");
    break;
  default:
    console.log("Sorry the answer is LiveScript");
  }
  responsesArray.push(js);
  
  var mine = prompt('What coding language is exclusively related to the back-end: Ruby, JavaScript, HTML?');
  mine= mine.toLowerCase();
  switch (mine) {
    // your own answers
  	case "ruby":
    console.log("Yeah!");
    break;
    case "html":
    console.log("ouuu I'm sorry for you");
    break;
    case "javascript":
    console.log("Yeah but so so");
    break;
  }
  responsesArray.push(mine);
}

question3();

function evaluate(responsesArray) 
{

for (var i = 0; i < responsesArray.length; i  ) 
	{
		if (responsesArray[i] === true|| "livescript" || "ruby") 
    {
      correct  ;

    } else{
      if (responsesArray[i] !== true|| "livescript" || "ruby") {
      incorrect  ;
    }
	}
}  

Комментарии:

1. У вас много синтаксических ошибок. Запустите его и посмотрите.

2. @PraveenKumar, не было никаких других синтаксических ошибок, кроме одной отсутствующей закрывающей фигурной скобки….

3. @trincot Ну, да.

Ответ №1:

Определите массив для хранения правильного ответа, а затем сравните правильный и пользовательский ответ и легко определите, правильный он или нет.

Пожалуйста, проверьте приведенный ниже фрагмент.

 var responsesArray= [];
var correct=0;
var incorrect= 0;
//Correct answer key initialize
var index = 0;
//Initialize array to store correct answer.
var correctAnswers = [];


function question2() {
  //Save correct answer.
  correctAnswers[index  ] = "yes";
  var firstQuestion = prompt('Does null === 0 ? (Yes or No)')

  // why do you need to convert the answer to lowercase?
  if (firstQuestion.toLowerCase() === 'yes') {
    console.log("correct");
    firstQuestion = 'yes'
  } else if (firstQuestion.toLowerCase() === 'no') {
    console.log("in-correct");
    firstQuestion = 'no'
  } else {
    // what if the user writes something other than yes or no? 
    // they will have to answer the question again
    alert("Please answer either Yes or No");
    return question2();
  }
  responsesArray.push(firstQuestion); // add the true or false value to the responses array
}

question2();



function question3() {
  //Save correct answer.
  correctAnswers[index  ] = "livescript";
  var js = prompt('What was the original name for JavaScript: Java, LiveScript, JavaLive, or ScriptyScript?');
  js = js.toLowerCase();
  switch (js) {      
      // your own answers

    case "livescript":
      console.log("Correct!");
      break;
    case "Java":
      console.log("wrong");
      break;
    case "JavaLive":
      console.log("wrong");
      break;
    case "ScriptyScript":
      console.log("wrong");
      break;
    default:
      console.log("Sorry the answer is LiveScript");
  }
  responsesArray.push(js);
  
  //Save correct answer.
  correctAnswers[index  ] = "ruby";
  var mine = prompt('What coding language is exclusively related to the back-end: Ruby, JavaScript, HTML?');
  mine= mine.toLowerCase();
  switch (mine) {
      // your own answers
    case "ruby":
      console.log("Yeah!");
      break;
    case "html":
      console.log("ouuu I'm sorry for you");
      break;
    case "javascript":
      console.log("Yeah but so so");
      break;
  }
  responsesArray.push(mine);
  //Call function to evaluate correct or incorrect answer
  evaluate(responsesArray,correctAnswers)
}

question3();

function evaluate(responsesArray,correctAnswers) 
{
  for (var i = 0; i < responsesArray.length; i  ) 
  {
    //Match response with correct answer.
    if (responsesArray[i] === correctAnswers[i]) 
    {
      correct  ;

    } else{
      if (responsesArray[i] !== correctAnswers[i]) {
        incorrect  ;
      }
    }
  }
  alert("Correct : " correct " and Incorrect : " incorrect);
}  

Комментарии:

1. Не могли бы вы обновить фрагмент в рабочем режиме в своем вопросе. Так что я могу отлаживать в нем и могу вам помочь.

2. Я вижу, вы повторно correctAnswers использовали переменную, которую я уже предложил в своем ответе. Хорошо для вас 😉

3. @trincot да, я создал фрагмент, используя эту идею. Спасибо, чувак

4. Спасибо @Rahul Patel

Ответ №2:

Способ проверки правильных ответов неверен. Вместо этого определите массив с правильными ответами и проверьте их следующим образом:

 var correct = incorrect = 0; // better initialise your variables 

function evaluate(responsesArray) {
  var correctAnswers = [true,"livescript","ruby"];
  for (var i = 0; i < responsesArray.length; i  ) {
    if (responsesArray[i] === correctAnswers[i]) {
      correct  ;
    } else {
      incorrect  ;
    }
  }
}
  

То, что у вас было, было:

 if (responsesArray[i] === true|| "livescript" || "ruby"){
  

Но это означает:

 if the answer was true, or .... "livescript" is true, or ... "ruby" is true, then
  

Поскольку JavaScript считает строки правдивыми, if условие всегда будет истинным.

Обратите внимание также, что нет необходимости выполнять второй if , поскольку else часть выполняется только в том случае, если первое if условие было ложным, что означает, что вы уже отфильтровали случаи, когда ответ был неправильным.

Наконец, ваши переменные счетчика должны быть определены до того, как вы начнете их увеличивать. Он работает без этого определения, но если одна из двух переменных не увеличивается, она все равно будет не определена после вашего вызова evaluate . Лучше всегда определять свои переменные.

Комментарии:

1. нет, ваше решение просто сохраняет правильные ответы, которые вы им даете, уже в переменной correctAnswers внутри правильной переменной.

2. Я думаю, вы неправильно поняли. Я просто перевел ваш неправильный if код в правильный синтаксис, поместив правильные значения не в if переменную, а в переменную. Но я вижу, что вы предпочли ответ от Рахула, который фактически скопировал мою идею. Но нет проблем 😉

3. Да, вы правы, однако Рахул добавил еще 50%, чтобы заставить его работать (индекс , функция вызова, два аргумента в функции оценки …) Спасибо вам обоим 😉