Question

Je suis nouveau à C #. Et je voudrais programmer quelque chose comme l'affichage des nombres premiers dans une zone de liste si l'utilisateur saisira tout entier dans la zone de texte. (Ce qui signifie, s'ils écrivent 10, il affiche les nombres premiers de 0-10, ou 0-20 20, etc).

Que dois-je considérer d'abord, avant de faire la programmation? Je sais qu'il ya beaucoup d'exemples dans Internet, mais d'abord je voudrais savoir ce que dois-je?

Merci pour la pointe; -)

=== Merci les gars. Vous dites donc qu'il est préférable de le faire d'abord dans l'application de la console? Je l'ai fait un exemple de « boucle For » à l'aide de la console d'application très simple, mais quand j'ai essayé de le faire dans le formulaire d'application Windows, je ne suis pas sûr de savoir comment le mettre en œuvre. Je crains que si je continue à faire des exemples dans la console, je vais avoir du mal à le faire dans Windows Form Apps. Que pensez-vous?

====== Bonjour à nouveau,

J'ai besoin des commentaires avec mon code:

        Console.WriteLine("Please enter your integer: ");
        long yourInteger;
        yourInteger = Int32.Parse(Console.ReadLine());

        //displaying the first prime number and comparing it to the given integer
        for (long i = 2; i <= yourInteger; i = i + 1)
        {
            //Controls i if its prime number or not
            if ((i % 2 != 0) || (i == 2))
            {
                Console.Write("{0} ", i);
            }

        }
Était-ce utile?

La solution

Eh bien, tout d'abord je pense à la façon de trouver les nombres premiers et écrire que dans une application console qui lit une ligne, fait le calcul, et écrit les résultats (uniquement parce que c'est la chose la plus simple que vous pouvez faire , et couvre la même analyse logique, etc, vous aurez besoin plus tard).

Lorsque vous êtes satisfait de la génération des nombres premiers, alors regardez comment faire WinForms - comment mettre un ListBox, TextBox et bouton sur un formulaire; comment gérer l'événement clic (le bouton), et comment lire et écrire le champ de saisie des valeurs dans la zone de liste. Votre code premier devrait être assez OK pour prendre « tout comme » ...

Si vous ne possédez pas déjà un IDE, notez que C # Express est libre et couvrira tous les ci-dessus.

Autres conseils

Vous devez savoir:

  • Comment lire l'entrée de l'utilisateur à partir d'une application Windows
  • Comment générer des nombres premiers dans une plage
  • Comment écrire la sortie de la manière que vous voulez

Je suggère fortement que vous séparer ces tâches. Une fois que vous avez chacun d'entre eux travaillant séparément, vous pouvez les mettre ensemble. (Marc suggère d'écrire une application console pour la section des nombres premiers - c'est une bonne suggestion si vous ne voulez pas entrer dans Si vous avez utilisé des tests unitaires dans d'autres langues tests unitaires encore, il est assez facile de se lever et courir avec. NUnit . Une application console sera certainement plus rapide pour commencer à bien.)

En théorie, pour une tâche potentiellement longue en cours d'exécution (par exemple les entrées utilisateur 1000000 comme le premier numéro), vous devez généralement utiliser un fil d'arrière-plan pour maintenir l'interface utilisateur réactive. Cependant, je ne pas tenir compte que pour commencer. Sachez que si vous le calcul des nombres premiers, votre application semble être « accroché », mais le faire fonctionner du tout premier. Une fois que vous êtes à l'aise avec la version simple, vous pouvez regarder BackgroundWorker et comme si vous vous sentez aventureux.

Je discutais la création de nombres premiers en utilisant le Sieve d'Eratosthène sur mon blog ici:

http://blogs.msdn.com/mpeck/archive/2009/03/03/Solving-Problems-in-CSharp-and-FSharp-Part-1.aspx

Le code ressemble à ceci ...

public IEnumerable<long> GetPrimes(int max)
{
    var nonprimes = new bool[max + 1];

    for (long i = 2; i <= max; i++)
    {
        if (nonprimes[i] == false)
        {
            for (var j = i * i; j <= max; j += i)
            {
                nonprimes[j] = true;
            }

            yield return i;
        }
    }
}

Avec ce code, vous pouvez écrire des déclarations comme celle-ci ...

var primes = SieveOfEratosthenes.GetPrimes(2000);

... pour obtenir un IEnumerable de nombres premiers jusqu'à 2000.

Tout le code est disponible sur CodePlex http://FSharpCSharp.codeplex.com .

Le code est « comme est » et donc vous devriez regarder pour déterminer si elle répond à vos besoins, que vous devez ajouter le contrôle d'erreur etc, donc le traiter comme un échantillon.

Voici un algorithme de nombre premier « naïf », ce serait parfait pour vos besoins: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

Voici une réponse à la modifier:

  

Merci les gars. Vous dites donc qu'il est préférable de le faire d'abord dans l'application de la console? Je l'ai fait un exemple de « boucle For » à l'aide de la console d'application très simple, mais quand j'ai essayé de le faire dans le formulaire d'application Windows, je ne suis pas sûr de savoir comment le mettre en œuvre. Je crains que si je continue à faire des exemples dans la console, je vais avoir du mal à le faire dans Windows Form Apps. Que pensez-vous?

Si vous voulez présenter les nombres premiers comme une application de formulaires Windows vous devez concevoir l'interface utilisateur pour elle aussi. C'est un peu exagéré pour un petit problème à résoudre. La conception la plus facile que vous pouvez faire est de remplir un ListBox dans votre formulaire ( exemple ).

Si vous êtes vraiment désireux d'apprendre Windows Forms ou WPF alors il y a plusieurs ressources pour cela.

J'écrivais récemment une routine pour mettre en œuvre de Eratosthène et Sieve suis tombé sur ce fil. Juste pour les archives, voici ma mise en œuvre:

    static List<int> GetPrimeNumbers(int maxNumber)
    {
        // seed the master list with 2
        var list = new List<int>() {2};

        // start at 3 and build the complete list
        var next = 3;
        while (next <= maxNumber)
        { 
            // since even numbers > 2 are never prime, ignore evens 
            if (next % 2 != 0) 
                list.Add(next);

            next++;
        }

        // create copy of list to avoid reindexing
        var primes = new List<int>(list);

        // index starts at 1 since the 2's were never removed
        for (int i = 1; i < list.Count; i++)
        {
            var multiplier = list[i];
            // FindAll Lambda removes duplicate processing
            list.FindAll(a => primes.Contains(a) && a > multiplier)
                .ForEach(a => primes.Remove(a * multiplier));
        }

        return primes;
    }

Vous pouvez toujours graines avec « 1, 2 » si vous avez besoin 1 dans la liste des nombres premiers.

using System;
class demo
{
   static void Main()
   {
      int number;
      Console.WriteLine("Enter Number you Should be Checked Number is Prime or not Prime");
      number = Int32.Parse(Console.ReadLine());
      for(int i =2;i {
         if(number % i == 0)
         {
            Console.WriteLine("Entered number is not Prime");
            break;
         }
      }
      if(number % i !=0)
      {
         Console.WriteLine("Entered Number is Prime");
      }

      Console.ReadLine();
   }
}

Votre approche est tout à fait tort. Les nombres premiers sont absolus et ne changera jamais. Votre meilleur pari est de pré-générer une longue liste de nombres premiers. Viennent ensuite avec un algorithme pour rechercher rapidement ce nombre pour déterminer si elle est sur la liste. Ensuite, dans votre cas (puisque vous voulez énumérer tous dans la plage donnée ne vient donc). Cette solution sera beaucoup plus rapide que tout nombre premier algorithme de calcul mis en œuvre au cours d'exécution. Si l'entier est entré supérieur à votre liste, vous pouvez toujours mettre en œuvre l'algorithme à partir de ce moment-là.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top