Je crée un programme de loterie, c'est basique et visible uniquement via console pour le moment.

Le programme exécute ce qui suit:

  1. L'utilisateur entre 6 nombres allant de 1 à 46.

  2. Le programme génère 6 nombres aléatoires avec la même plage.

  3. Le programme compare les index pour voir quels nombres l'utilisateur a réussi à faire correspondre avec le programme.

  4. Le programme affiche les mêmes nombres que l'utilisateur a obtenus.

Mais, actuellement, il y a un bogue dans mon code et je ne sais pas trop comment procéder.

Par exemple, mes entrées sont: 1, 2, 3, 4, 5, 6

Le programme a généré 6 numéros et j'ai réussi à frapper les numéros 2 et 6. Mais, le programme n'affiche que le numéro 2. Cela signifie que mon code ne compare pas chaque index, et je ne sais pas pourquoi.

Le tableau utilisateur est lucky et le tableau généré par le programme est numbers.

Console.WriteLine("The winning numbers are: , " );

int[] winning = new int[6];
int w = 0;
var x = 0;
var j = 0;
Console.WriteLine("The winning numbers are: , " );

int[] winning = new int[6];
int w = 0;
var x = 0;
var j = 0;
while (x< 6)
{    
   if (lucky[j] == numbers[x])
   {
       winning[w] = numbers[x];
       Console.WriteLine(winning[w]);
       w++;
   }
   j++;

   if (j == 5)
   {
       x++;
       j = 0;
   }
}
c#
1
Shlomi U 19 juin 2019 à 10:10

5 réponses

Meilleure réponse

Il n'est pas nécessaire de faire tout cela en boucle ces jours-ci. Fonction d'intersection en fait un seul appel de fonction:

var Matches = lucky.Intersect(numbers);

Renverra tous les numéros correspondants des deux listes dans Matches.

Un équivalent en boucle pourrait ressembler à ceci (en écrivant le haut de ma tête):

List<int> winning = new List<int>();
for(int i=0; i<numbers.Length; i++)
{
  if(numbers.Contains(lucky[i])
    winning.Add(lucky[i]);
}

Pour l'afficher sur console, utilisez une simple boucle:

for(int i=0; i<winning.Length; i++)
{
    Console.WriteLine(winning[i]);
}
4
dotNET 19 juin 2019 à 10:31

Puisque vous exécutez sur un tableau, la procédure standard serait d'utiliser une boucle for. Voici trois solutions qui résolvent le problème.
Chacun est complet et peut être testé sur https://dotnetfiddle.net/

Linq: utilisez le Intersects méthode pour trouver les éléments communs entre deux IEnumerables.

using System;

using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        // at this point unique numbers have been generated and inputted
        int[] numbers = { 1, 2, 3, 4, 5, 6 };
        int[] guesses = { 2, 6, 7, 8, 9, 10 };

        List<int> matches = new List<int>(numbers.Intersect(guesses));
        foreach (int n in matches)
        {
            Console.WriteLine("Hit: " + n.ToString());
        }
    }
}

Utilisation d'une seule boucle for et vérification avec le Contains (Array implémente l'interface IList) si l'autre tableau contient le nombre à l'index courant. Vous pouvez également utiliser une boucle foreach, car vous ne vous souciez pas des index.

using System;

using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        // at this point unique numbers have been generated and inputted
        int[] numbers = { 1, 2, 3, 4, 5, 6 };
        int[] guesses = { 2, 6, 7, 8, 9, 10 };
        List<int> matches = new List<int>();

        for (int i = 0; i < guesses.Length; i++)
        {
            if (numbers.Contains(guesses[i]))
            {
                Console.WriteLine("Hit: " + guesses[i].ToString());
                matches.Add(guesses[i]);
            }
        }
    }
}

Vous pouvez utiliser des boucles for imbriquées, une pour chaque tableau, pour vérifier chaque numéro d'un tableau par rapport à chaque nombre de l'autre.
Encore une fois, vous pouvez utiliser des boucles foreach.

using System;

using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        // at this point unique numbers have been generated and inputted
        int[] numbers = { 1, 2, 3, 4, 5, 6 };
        int[] guesses = { 2, 6, 7, 8, 9, 10 };
        List<int> matches = new List<int>();

        for (int i = 0; i < guesses.Length; i++)
        {
            for (int j = 0; j < numbers.Length; j++)
            {
                if (guesses[i] == numbers[j])
                {
                    Console.WriteLine("Hit: " + guesses[i].ToString());
                    matches.Add(guesses[i]);
                    break; // optional, we found the number and can leave the loop. Not optional if your lottery allows numbers to happen more than once.
                }
            }
        }
    }
}

Quant à la question de savoir pourquoi votre code ne fonctionne pas:
Vous définissez j = 0 quand j == 5 juste après j++, ce qui signifie que vous définissez j sur 0 après avoir vérifié l'index 4. Même si je ne veux pas encourager ces styles peu orthodoxes, vous pouvez le corriger en comparant j == 6. Encore une fois, cette approche rend votre code illisible, veuillez utiliser l'une des autres solutions.

using System;

public class Program
{
    public static void Main()
    {
        // at this point unique numbers have been generated and inputted
        int[] numbers = { 1, 2, 3, 4, 5, 6 };
        int[] guesses = { 2, 6, 7, 8, 9, 10 };

        int[] winning = new int[6];
        int w = 0;
        var x = 0;
        var j = 0;
        while (x < 6)
        {
            if (guesses[j] == numbers[x])
            {
                winning[w] = numbers[x];
                Console.WriteLine(winning[w]);
                w++;
            }
            j++;
            if (j == 6)
            {
                x++;
                j = 0;
            }
        }
    }
}
2
FalcoGer 19 juin 2019 à 09:52

Je pense que ce que vous recherchez, c'est de trouver des éléments communs à partir de deux tableaux.

var ar1 = new int[] {1,2,3,4,5,6}; 
var ar2 = new int[] {2,3,4,6,7,8}; 
var common = ar1.Intersect(ar2);

Dans ton cas

var common = lucky.Intersect(numbers);

Utilisation de boucles

// Array size is fixed here.
for (int i = 0; i < 6; i++) // OR i < lucky.Length (guessing numbers)
{
    if (numbers.Contains(lucky[i]))
    {
        // NUMBERS DETECTED
    }
}
0
Gaurang Dave 19 juin 2019 à 07:27

J'ai fini par construire 2 méthodes qui font essentiellement ce que tout le monde ici m'a dit. Comme je n'ai pas encore appris LinQ, je ne pouvais pas comprendre, je n'ai pas appris LIST aussi, donc je ne pouvais pas l'utiliser non plus.

Mes fonctions sont comme ceci:

Première fonction: vérifie les index d'un code tableau spécifié:

static bool DoesExists(int[] a, int Value)
        {
            for (int i = 0; i < a.Length; i++)
            {
                if (Value == a[i])
                {
                    return true;
                }
            }

            return false;
        }

La deuxième fonction vérifie le nombre d'éléments répétés dans le code de 2 tableaux:

static int CountCorrect(int[] pc, int[] user)
        {
            int count = 0;
            for (int i = 0; i < user.Length; i++)
            {
                if (DoesExists(pc, user[i]))
                {
                    count++;
                }
            }

            return count;
        }

En utilisant ces 2 en conjonction, cela résout mon problème. merci à tous d'avoir pris le temps de me donner de bonnes idées.

0
Shlomi U 20 juin 2019 à 11:37

Le problème est avec la vérification du dernier index (5 dans ce cas). Cela ne se produit jamais !

//say j = 4

lucky[4] == numbers[x] // false / true, quelle que soit la valeur de x

Vous incrémentez j //j is now 5

if(j==5)

Oui, puis vous le réinitialisez à 0. le dernier index qui est 5 dans ce cas ne sera jamais vérifié à l'itération suivante

Solution- if(j == 6)

0
Shad 19 juin 2019 à 08:02