Сравнение массивов без использования linq - PullRequest
0 голосов
/ 10 сентября 2018

Я делаю лотерею, в которой у пользователя запрашивают 10 номеров, а затем сравнивают его со случайными числами, которые я создал в массиве. Мне нужно сравнить два, но мне не разрешено использовать метод содержимого.

Я думаю, что мне нужно использовать цикл foreach для сравнения массивов, но на самом деле я не знаю, что делать. Я собрал это воедино из того, что знаю, и хотел бы знать, нахожусь ли я на правильном пути.

Является ли цикл foreach правильным способом сравнения двух массивов?

Пока это мой код.

using System;

namespace lotto2
{
class Program
{
    static void Main(string[] args)
    {

        //an array named "input" to hold the users' 10 guesses
        int[] inputs = new int[10];

        //an array named "lotNum" to hold 10 random numbers
        int[] lotNums = new int[10];

        //a for loop to loop over the inputs array. each loop will ask the user for a number
        Console.WriteLine("Enter your 10 lottery numbers one at a time. The numbers must be between 1 and 25.");
        for (int i = 0; i < inputs.Length; i++)
        {
            inputs[i] = Convert.ToInt32(Console.ReadLine());
        }

        //a random number generator  
        Random ranNum = new Random();

        //loop to call the random generator 10 times and store 10 random numbers in the "lotNum" array
        for (int i = 0; i < 10; i++)
        {
            lotNums[i] = ranNum.Next(1, 26); //chooses random numbers between 1 and 25
        }

        //writes out the randomly generated lotto numbers
        Console.Write("\nThe lottery numbers are: ");
        for (int i = 0; i < 10; i++)
        {
            Console.Write("{0}  ", lotNums[i]);
        }

        //loop for checking users inputs against random generated numbers..
        //foreach loop maybe?
        foreach (var input in lotNums)
        {
        }

        //print out if there are any matches, which numbers matched

        //declared integer for the correct numbers the user guessed
        int correct;

        //end progam
        Console.WriteLine("\n\nPress any key to end the program:");
        Console.ReadKey();
    }
}

}

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Вот программа, которая правильно делает то, что вы хотите.Это даже гарантирует, что у вас нет дублирующих номеров лото.

void Main()
{
    const int count = 10;
    const int max = 25;

    //an array named "input" to hold the users' 10 guesses
    int[] inputs = new int[count];

    //a for loop to loop over the inputs array. each loop will ask the user for a number
    Console.WriteLine("Enter your {0} lottery numbers one at a time. The numbers must be between 1 and {1}.", count, max);
    for (int i = 0; i < inputs.Length; i++)
    {
        inputs[i] = Convert.ToInt32(Console.ReadLine());
    }

    //a random number generator  
    Random ranNum = new Random();

    //an array named "allNums" to hold all the random numbers
    int[] allNums = new int[max];
    for (int i = 0; i < allNums.Length; i++)
    {
        allNums[i] = i + 1;
    }

    //shuffle
    for (int i = 0; i < allNums.Length; i++)
    {
        int j = ranNum.Next(0, allNums.Length);
        int temporary = allNums[j];
        allNums[j] = allNums[i];
        allNums[i] = temporary;
    }

    //an array named "lotNum" to hold 10 random numbers
    int[] lotNums = new int[count];

    Array.Copy(allNums, lotNums, lotNums.Length);

    //writes out the randomly generated lotto numbers
    Console.Write("\nThe lottery numbers are: ");
    for (int i = 0; i < lotNums.Length; i++)
    {
        Console.Write("{0}  ", lotNums[i]);
    }

    int correct = 0;
    Console.Write("\nThe correct numbers are: ");
    for (int i = 0; i < lotNums.Length; i++)
    {
        for (int j = 0; j < inputs.Length; j++)
        {
            if (lotNums[i] == inputs[j])
            {
                Console.Write("{0}  ", lotNums[i]);
                correct++;
            };
        }
    }

    Console.Write("\nYou got {0} correct. ", correct);

    Console.WriteLine("\n\nPress any key to end the program:");
    Console.ReadLine();
}
0 голосов
/ 10 сентября 2018

Это то, что я пробовал. Надеюсь, это имеет смысл?

static void LottoMethod(int[] randNums,int[] userNums)
    {
        Console.WriteLine("Guess 10 numbers");
        for(int i = 0; i <= userNums.Length-1; i++)
        {
            userNums[i] = Int32.Parse( Console.ReadLine());
        }
        Console.WriteLine("The numbers you entered: ");
        foreach(int k in userNums)
        {
            Console.Write(k+"   ");
        }
        //generate 10 numbers randomly
        Random rnds = new Random();
        for(int k = 0; k <= randNums.Length - 1; k++)
        {
            randNums[k] = rnds.Next(1, 26);
        }
        Console.WriteLine("Random Numbers");
        foreach(int i in randNums)
        {
            Console.Write(i + "   ");
        }
        int correctNums = 0;
        //Check if random numbers correspond with entered numbers
        try
        {
            for(int i = 0; i <= randNums.Length-1; i++)
            {
                for(int j = 0; j <= userNums.Length-1; j++)
                {
                    if (randNums[i] == userNums[j])
                    {
                        correctNums++;
                    }
                }
            }
            Console.WriteLine($"There are {correctNums} numbers ");
        }
        catch(Exception e) {
            throw new Exception(e.ToString());
        }
    }
0 голосов
/ 10 сентября 2018

Вы должны рассчитать пересечение двух последовательностей. У вас есть три варианта:

  • Двойной цикл foreach. Этого следует избегать, поскольку он имеет временную сложность O (m * n). Это не проблема для 10 пунктов, но мы должны делать программы такого масштаба.
  • Использование хеш-соединения. Вы можете использовать HashSet для этого, и это будет мой предпочтительный метод. Но поскольку это подразумевает использование Contains, это не вариант здесь.
  • Объединение отсортированных последовательностей. Это был бы способ пойти сюда.

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

static Random rnd = new Random((int)DateTime.Now.Ticks);

static int[] GetRandomArray(int arrSize, int minNumber, int maxNumber)
{
    int[] tmpArr = new int[maxNumber - minNumber + 1];
    for (int i = 0; i < tmpArr.Length; ++i)
    {
        tmpArr[i] = i + minNumber; // fill with 1, 2, 3, 4,...
    }

    int[] ret = new int[arrSize];
    for (int i = 0; i < ret.Length; ++i)
    {
        int index = rnd.Next(tmpArr.Length - i); //choose random position
        ret[i] = tmpArr[index];
        tmpArr[index] = tmpArr[tmpArr.Length - 1 - i]; //fill last of the sequence into used position
    }

    return ret;
}

static IEnumerable<int> GetMatches(int[] a, int[] b)
{
    Array.Sort(a);
    Array.Sort(b);

    for (int i = 0, j = 0; i < a.Length && j < b.Length;)
    {
        if (a[i] == b[j])
        {
            yield return a[i];
            ++i;
            ++j;
        }
        else if (a[i] > b[j])
        {
            ++j;
        }
        else
        {
            ++i;
        }
    }
}

static void Main(string[] args)
{
    var a = GetRandomArray(5, 3, 7);
    var b = GetRandomArray(10, 1, 25);

    Console.WriteLine("A: " + string.Join(", ", a));
    Console.WriteLine("B: " + string.Join(", ", b));
    Console.WriteLine("Matches: " + string.Join(", ", GetMatches(a, b)));
    Console.ReadKey();
}

Результат примерно такой:

A: 7, 4, 6, 3, 5
B: 17, 1, 8, 14, 11, 22, 3, 20, 4, 25
Matches: 3, 4

Вы можете подумать о том, что произойдет, если одна или обе последовательности содержат дубликаты.

0 голосов
/ 10 сентября 2018

Вы на правильном пути.

Моя реализация будет:

foreach (var input in inputs)
{
    for (int i = 0; i < lotNums.Length; i++){
        if(input == lotNums[i]){
            Console.WriteLine(lotNums[i]);
        }
    }
}

Это сравнит каждое число входного массива с массивом лотереи. Я печатаю каждое совпадение, но вы можете установить для переменной значение True, если оно найдет совпадение, или добавить каждое совпадающее число в массив, если вам это нужно.

...