Ошибка сравнивания массивов

96
18 января 2021, 11:10

решил написать программу, как она работает, написано в комментариях в коде.

Проблема будет описана ниже:

/* Программа генерирует пять случайных чисел,
* Затем вводятся пять чисел с клавиатуры.
* Далее считается количество чисел на месте и не на месте.
* Если количество чисел на месте равно пяти(сгенерированные числа равны 
введённым),
* То программа заканчивает работу
*/
namespace Console_password
{
class Program
{
    static void Main(string[] args)
    {
        Console.ForegroundColor = ConsoleColor.Green; 
        Random random = new Random();
        int[] pass = { 1, 2, 3, 4, 5 };  //тестовые значения (закомментированные строчки ниже заполняют рандомными значениями)
        //for (int i = 0; i < 4; i++)
            //vs[i] = random.Next() % 10;
        int[] input = { 0, 0, 0, 0, 0 }; //пустые значения для ввода
        while (true)
        {
            Console.Write(">> ");
            string[] s = Console.ReadLine().Split(' ');                      //
            int[] a = new int[5];                                            // заполняем с консоли массив
            for (int i = 0; i < s.Length; i++) input[i] = Int32.Parse(s[i]); //
            int InPlace = 0; //цифр на месте
            int OutOfPlace = 0; //цифр не на месте
            bool[] nums = { false, false, false, false, false }; // номера цифр, которые на месте
            for (int i = 0; i < 5; i++)
            {
                if (pass[i] == input[i]) 
                {
                    InPlace++;       //проверяем количество цифр на месте
                    nums[i] = true;    //запоминаем позиции чисел, которые на месте
                }
            }
            for (int i = 0; i < 5; i++)
                for (int j = 0; j < 5; j++)
                {
                    if (nums[j] == true)            //проверяем количество чисел не на месте
                        continue;                   //тут логическая ошибка
                    if (pass[i] == input[j])
                        OutOfPlace++;
                }
            if (InPlace == 5)
            {
                Console.WriteLine("Доступ разрешён!");
                break;
            }
            Console.WriteLine($"Значений на месте {InPlace}, значений не на месте {OutOfPlace}.");
        }
        Console.ReadKey(true);
    }
}
}

А проблема в том, что если в тестовых значениях есть число 1, и в консоль ввести пять единиц, то выведет "Значений на месте 1, значений не на месте 4" Можете скопировать код и убедиться в этом сами. Я не понимаю как исправить эту проблему, обращаюсь к вам за помощью.

Если в коде есть другие ошибки или это очень плохой код, напишите, я просто не понимаю, как надо, ведь я недавно начал программирование изучать.

Answer 1

Если у вас числа в небольшом диапазоне, вы можете сделать так:

public static void Main (string [] args) {
    const int n = 5,
              m = 10; // от 0 до 9
    int x = 0,                 // совпавшие местами
        y = 0;                 // совпавшие но не на месте
    int[] a = {1, 2, 3, 4, 5}, // загаданные числа, n штук
          b = {5, 3, 4, 2, 1}, // что игрок ввел
          aa = new int[m],     // m это верхняя граница диапазона чисел, если от 0 до 9 то там 10
          bb = new int[m];
    for (int i = 0; i < n; i++) {
        if (a[i] == b[i]) {
            x++;
        }
        else {
            aa[a[i]]++;
            bb[b[i]]++;
        }
    }
    for (int i = 0; i < m; i++) {
        y += Math.Min(aa[i], bb[i]);
    }
    Console.WriteLine ($"{x} на месте {y} не на месте");
}

Я добавил инициализацию сравниваемых массивов, чтобы доказать, что все работает. Ожидаемый вывод: 0 на месте 5 не на месте

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

То есть например для данных 55571 в массиве будет 0,1,0,0,0,3,0,1,0,0.

READ ALSO
редактирование xml файла в c#

редактирование xml файла в c#

вот есть у меня список в xml файле, я по нему прохожусь и вывожу в textbox, но что если нужно добавить/удалить элемент в xml файле? как через код это...

109
Не работает часть скрипта Unity C#

Не работает часть скрипта Unity C#

Часть кода работает, при столкновении с пулей (hp1 -= damage1;), а вторая часть не работаетПодскажите, в чем ошибся?

125
Создание scope: разница между IServiceProvider и IServiceScopeFactory

Создание scope: разница между IServiceProvider и IServiceScopeFactory

В некотором aspnet mvc приложении (под

105
Книги и учебные ресурсы по Python

Книги и учебные ресурсы по Python

Рекомендуемая литература, курсы и документация по Python

109