Как исправить вывод после сравнения двух массивов в C #? - PullRequest
1 голос
/ 18 апреля 2019

Итак, у меня есть домашнее задание, которое требует от меня назначить вывод меткам после сравнения двух массивов.Моя проблема в том, что после сравнения двух массивов вывод, который я назначаю, неверен.Я должен вывести «Y», если при определенном индексе два массива равны, и «N», если они не равны, но каждый раз, когда я запускаю код, он выводит «Y» на все метки, независимо от того, что,Как я могу исправить то, что выводится после сравнения?

     private void evaluateStudentAnswers()
        {
            /* Use a "for" loop to cycle through the answerKey[] and studentAnswers[] arrays, and compare the answers
             * in the two arrays at each index.  If they match, then increment the global variable "correctAnswers"
             * and assign the value 'Y' to the corresponding index in the correctOrIncorrect[] array.  if they
             * don't match, then increment the global variable "incorrectAnswers" and assign the value 'N' to the
             * corresponding indes in the correctOrIncorrec[] array.  These two variables will be used to calculate
             * the grade percentage.
             */

            for (int i = 0; i < studentAnswers.Length; i++)
            {
                for(int j = 0; j < answerKey.Length; j++)
                {
                    // I think the indexes below are being checked if they're the same and I need to make sure not just the
                    //indexes are the same but the values as well 
                    if (studentAnswers[i] == answerKey[j]) 
                    {
                        correctAnswers++;

                        for(int k = 0; k < correctOrIncorrect.Length; k++)
                        {
                            correctOrIncorrect[k] = 'Y';
                        }
                    }

                    else
                    {
                        incorrectAnswers++;

                        for (int k = 0; k < correctOrIncorrect.Length; k++)
                        {
                            correctOrIncorrect[k] = 'N';
                        }
                    }
                }
            }
        }

Ответы [ 5 ]

5 голосов
/ 18 апреля 2019

Я думаю, ваш код может быть значительно упрощен. при условии, что есть соответствие 1-1 между studentAnswers и answerKey.

for (int i = 0; i < studentAnswers.Length; i++)
{
    var studentAnswer = studentAnswers[i];
    var answer = answerKey[i];
    if (studentAnswer == answer)
    {
        ++correctAnswers;
        correctOrIncorrect[i] = 'Y';
    }
    else
    {
        ++incorrectAnswers;
        correctOrIncorrect[i] = 'N'
    }
}

Все массивы одинакового размера. Поэтому, когда мы зацикливаемся на каждом ответе, предоставленном студентом, мы знаем, что можем найти соответствующий правильный ответ в answerKey. Кроме того, отслеживание правильных ответов также следует той же схеме: для каждого studentAnswer мы хотим записать правильность в correctOrIncorrect, что соответствует конкретному ответу, предоставленному студентом. Таким образом, нам нужно выполнить только один цикл, поскольку i ссылается на соответствующий индекс во всех массивах, которые мы обрабатываем.

1 голос
/ 18 апреля 2019

Поскольку массивы должны иметь одинаковый размер / порядок, вам нужно всего лишь пройти их один раз.Также я нахожу троичные назначения более четкими, чем если бы блоки:

Func<bool, int> toInt = (b) => b ? 1 : 0;
for (int i = 0; i < studentAnswers.Length; i++)
{
    var studentAnswer = studentAnswers[i];
    var answer = answerKey[i];
    var isCorrect = studentAnswer == answer;
    correctOrIncorrect[i] = isCorrect ? 'Y' : 'N';
    correctAnswers = isCorrect ? 1 : 0; // toInt(isCorrect)
    incorrectAnswers = !isCorrect ? 1 : 0; // toInt(!isCorrect)
   }
}
1 голос
/ 18 апреля 2019

Так как это задание, я не буду давать ответ :), но так как вы застряли, я призываю вас использовать приведенные ниже рекомендации.

Эти два не нужны в вашем коде

  1. внутренний цикл for на правильным или неправильном []
  2. переменная "k", вместо нее можно использовать "i" для правильного или неправильного присвоения значения
1 голос
/ 18 апреля 2019

Если studentAnswers.Length == answerKey.Length == correctOrIncorrect.Length

Тогда

for (int i = 0; i < studentAnswers.Length; i++)
{
  if(studentAnswers[i] == answerKey[j])
  {
    correctAnswers++;
    correctOrIncorrect[k] = 'Y';
  }
  else
  {
    incorrectAnswers++;
    correctOrIncorrect[k] = 'N';
  }
}
0 голосов
/ 18 апреля 2019

Или в LINQ (только потому, что это стоит учиться, но, вероятно, не подходит для домашней работы):

correctOrIncorrect = answerKey.Zip(studentAnswer, (a,b) => a == b ? "Y" : "N").ToArray();
incorrectAnswers = correctOrIncorrect.Count(x => x == "Y");
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...