#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%, чтобы заставить его работать (индекс , функция вызова, два аргумента в функции оценки …) Спасибо вам обоим 😉