Сравните 7 входных чисел с 7 случайными числами - PullRequest
0 голосов
/ 26 мая 2019

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

List<int> lista1 = new List<int>(); 
for (int i = 1; i <= 7; i++) 
{ 
    try { 
        Console.Write("First Number {0}: ", i); 
        int x = Convert.ToInt16(Console.ReadLine()); 
        lista1.Add(x); 
    } catch (Exception ex){ 
        Console.WriteLine("The input number is incorret! It has to be whole number"); 
        Console.WriteLine("Error: {0}", ex.Message); 
        i--; 
    } 
    Console.WriteLine("Random Numbers are: "); 
    InitArray(); 
    Console.WriteLine(item); 
}

Ответы [ 5 ]

1 голос
/ 26 мая 2019

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


inputs.Intersect(randoms).Count

0 голосов
/ 27 мая 2019

Попробуйте этот проверенный и рабочий пример. Если вы запустите этот метод execRandomNumber (); Вы получите этот вывод ::

Возвращенные цифры: 18
Соответствующие цифры 18
Возвращенные числа 15
Соответствующие числа 15
Возвращенные числа 17
Возвращенные числа 19
Совпадение номеров 19
Возвращенные цифры: 16
Соответствующие цифры 16
Возвращенные цифры: 14
Возвращенные числа 20
Использование директив ::

using System.Collections.Generic;

Объявления ::

        public static List<int> lista1 = new List<int>();
        public static List<int> returnedRandomList = new List<int>();
        public static int[] myArrNums = new[] { 12, 25, 15, 16, 18, 19 };
        public static int[] myRandArr = new[] { 14, 15, 16, 17, 18, 19, 20 };

Метод 1 предназначен для генерации случайных чисел ::

private void execRandomNumber()
{
    //==============Don't have the numbers but need to generate them?==============
    returnedRandomList = Gen(returnedRandomList, null);
    returnedRandomList.ForEach(delegate (int num)
    {
        Console.WriteLine(string.Concat("The numbers returned are ", num));
        if (numIsMatch(num) == true)
        {
            lista1.Add(num);
            Console.WriteLine(string.Concat("The numbers matching are ", num));
        }
    });
    //==============Generator will return list of random numbers, then we compared them==============
}

Ваш генератор чисел ::

    //==============Your number generator==============
    private List<int> Gen(List<int> randGenerator, Random ranNum)
    {
        ranNum = new Random();
        var rn = 0;
        returnedRandomList.Clear();
        do
        {
            if (randGenerator.Count == 7)
                    break;
            rn = ranNum.Next(14, 21);
            if (!(randGenerator.Contains(rn)) && randGenerator.Count <= 7)
                randGenerator.Add(rn);
        }
        while (randGenerator.Count <= 7);
        return randGenerator;
    }

А для второго метода, предполагая, что у вас уже есть числа, сгенерированные и сохраненные в списке или массиве чисел, вы можете сделать следующее: *

private void runArgs()
{
    //==============Already have the numbers? Loop through them and compare==============
    foreach (int i in myRandArr)
    {
        if (numIsMatch(i) == true)
        {
            lista1.Add(i);
        }
    }
    lista1.ForEach(delegate (int num)
    {
        Console.WriteLine(string.Concat("The numbers that match are ", num));
    });
}

И для сравнения ваших чисел, чтобы убедиться, что они совпадают, вы можете сделать что-то вроде этого:

//==============Check is numbers are a match==============
private bool numIsMatch(int inValue)
{
    foreach (int ii in myArrNums)
    {
        if (ii.Equals(inValue))
            return true;
        else
            continue;
    }
    return false;
}

Если у вас есть какие-либо вопросы, я перезвоню вам завтра, потому что сейчас уже довольно поздно. Надеюсь это поможет.

0 голосов
/ 27 мая 2019

Это моя интерпретация.

    class Program
{
    private static Random rnd = new Random();
    static void Main(string[] args)
    {
        do
        {
            uint[] myRandoms = GetRandoms();
            uint[] userInput = GetUserInput();
            List<uint> matches = GetMatches(userInput, myRandoms);
            Console.WriteLine("Your Numbers");
            PrintEnumerable(userInput);
            Console.WriteLine("The Lottery Winners");
            PrintEnumerable(myRandoms);
            Console.WriteLine("Numbers You Matched");
            PrintEnumerable(matches);
            int NumOfMatches = matches.Count;
            if (matches.Count >= 4)
                Console.WriteLine($"You win! You matched {NumOfMatches} numbers.");
            else
                Console.WriteLine($"Sorry, you only matched {NumOfMatches} numbers.");
            Console.WriteLine("Play again? Enter Y for yes and N for no.");
        } while (Console.ReadLine().ToUpper() == "Y");
    }
   private static uint[] GetRandoms()
    {
        uint[] newRandoms = new uint[7];
        int index = 0;
        while (index < 7)
        {
            //.Next(int, int) limits the return to a non-negative random integer 
            //that is equal to or greater than the first int and less than the second the int.
            //Said another way, it is inclusive of the first int and
            //exclusive of the second int.
            uint r = (uint)rnd.Next(1, 40);
            if (!newRandoms.Contains(r)) //prevent duplicates
            {
                newRandoms[index] = r;
                index++;
            }
        }
        return newRandoms.OrderBy(x => x).ToArray();
    }
    private static uint[] GetUserInput()
    {
        uint[] inputs = new uint[7];
        int i = 0;
        while (i < 7)
        {
            Console.WriteLine("Enter a whole number between 1 and 39 inclusive. No duplicates, please.");
            //Note: input <= 39 would cause an error if the first part of the
            // if failed and we used & instead of && (And instead of AndAlso in vb.net).
            //The second part of the if never executes if the first part fails
            //when && is used.                                                             //prevents duplicates
            if (uint.TryParse(Console.ReadLine(), out uint input) && input <= 39 && input >0 && !inputs.Contains(input))
            {
                inputs[i] = input;
                i++; //Note: i is not incremented unless we have a successful entry
            }
            else
                Console.WriteLine("Try again.");
        }
        return inputs.OrderBy(x => x).ToArray();
    }
    //I used a List<T> here because we don't know how many elements we will have.
    private static List<uint> GetMatches(uint[] input, uint[] rands)
    {
        List<uint> matches = new List<uint>();
        int i;
        for (i=0; i<7; i++)
        {
            if(rands.Contains(input[i]))
                matches.Add(input[i]);
        }
        //Or skip the for loop and do as Sunny Pelletier answered
        //matches = input.Intersect(rands).ToList();
        return matches.OrderBy(x=>x).ToList();
    }
    //You are able to send both List<T> and arrays to this method because they both implement IEnumerable
    private static void PrintEnumerable(IEnumerable<uint> ToPrint)
    {
        foreach (uint item in ToPrint)
            Console.WriteLine(item);
    }
}
0 голосов
/ 26 мая 2019

Вот как бы я подошел к нему чисто, используя CSharp.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
    class Program
    {
        public List<List<int>> Players { get; set; } //Your Players
        public List<int> RandomNumbers { get; set; } //Your Random numbers enerated my Computer
        public List<List<int>> MatchedNumbers { get; set; } //to store Matched Numbers for each player
        public int NumbersRequiredCount { get; set; } = 7; //Depends on how many numbers the players must guess, initialize to 7 numbers

        Program()
        {
            //Instantiate your objects
            Players = new List<List<int>>(); //List of Players with their list of guessed numbers
            RandomNumbers = new List<int>(); 
            MatchedNumbers = new List<List<int>>(); //To hold Matched Values
        }

        private List<int> GenerateAutoNumbers(int Count, int Min, int Max)
        {
            var Result = new List<int>(); //Result Container - will be returned
            var Random = new Random(); //Create Random Number Object
            for(int i = 0; i < Count; i++)
            {
                //Generate your random number and save
                Result.Add(Random.Next(Min, Max));
            }
            //Return "Count" Numbers of Random Numbers generated
            return Result;
        }

        public List<int> EvaluateMatches(List<int> Inputs, List<int> Bases)
        {
            var result = new List<int>();
            //Inplement a counter to check each value that was inputted
            for(int i = 0; i <  Inputs.Count; i++)
            {
                for (int r = 0; r < Bases.Count; r++)
                {
                    //Check if the current input equals the current Random Number at the given index
                    if(Inputs[i] == Bases[r])
                    {
                        //If matched. Add the matched number to the matched list
                        result.Add(Inputs[i]);
                    }
                }
            }

            //At this point, all matched numbers are organized in result object
            return result; //return result object
        }

        static void Main(string[] args)
        {
            Program App = new Program();

            //Players must input numbers - Assuming they must guess between 1 - 100
            //It can be as many players

            //Player 1
            App.Players.Add(new List<int> { 5, 47, 33, 47, 36, 89, 33 });
            //Player 2
            App.Players.Add(new List<int> { 1, 17, 38, 43, 34, 91, 24 });
            //Player 3
            App.Players.Add(new List<int> { 6, 74, 39, 58, 52, 21, 9 });

            //At this point the inputs are all in for the 3 players
            //Now generate your RandomNumbers
            App.RandomNumbers = App.GenerateAutoNumbers(App.NumbersRequiredCount, 1, 100);

            //Now you need to evaluate the guessed numbers
            //For each Player
            for(int p = 0; p < App.Players.Count; p++)
            {
                //Create the list for each user to hold the matched numbers
                App.MatchedNumbers.Add(App.EvaluateMatches(App.Players[p], App.RandomNumbers));
            }

            //Now all Players numbers are evaluated, all you need is to print the results
            Console.WriteLine("Results has been retrieved");
            Console.Write("Generated Numbers are: ");
            foreach(int i in App.RandomNumbers)
            {
                Console.Write(i + " ");
            }
            Console.WriteLine();
            Console.WriteLine();

            Console.WriteLine("Following Matches were Found: ");
            for(int p = 0; p < App.Players.Count; p++)
            {
                Console.Write($"Player {p + 1} has {App.MatchedNumbers[p].Count} Matches: ");
                foreach(int i in App.MatchedNumbers[p])
                {
                    Console.Write(i + "  ");
                }
                Console.WriteLine();
            }
            Console.Write("\n");
            Console.WriteLine("Press any Key to Exit!");
            Console.ReadKey();

        }
    }
}

Он выведет числа, совпадающие на экране.

0 голосов
/ 26 мая 2019

Есть много способов сделать это, но простой способ состоит в том, чтобы использовать цикл for внутри другого цикла for. * 1001 то есть *

int[] userInputNumbers = {1,2,3,4,5,6,7};
int[] numbersToCompareTo = {1,9,11,12,4,6,16};
int countOfNumbersThatAreTheSame = 0;
for(int i=0; i<userInputNumbers.Length; i++)
{
   for(int j=0; j<numbersToCompareTo.Length; j++)
   {
       if(userInputNumbers[i] == numbersToCompareTo[j])
       {
           countOfNumbersThatAreTheSame++;
       }
   }
}

Console.Write(countOfNumbersThatAreTheSame);
Console.Read();
...