Domanda

Sono nuovo di C #. E vorrei programmare qualcosa di simile, la visualizzazione dei numeri primi in una casella di riepilogo se l'utente sarà in ingresso un numero intero nella casella di testo. (Che significa, se scrivono 10, mostrerà i numeri primi 0-10 o 20 0-20, ecc).

Che cosa devo prendere in considerazione in primo luogo, prima di fare la programmazione? So che ci sono molti esempi in internet, ma prima vorrei sapere che cosa ho bisogno?

Grazie per la punta; -)

=== Grazie ragazzi. Quindi stai suggerendo che è meglio farlo prima nella console? Ho fatto un esempio di "For Loop" utilizzando Applicazione console molto semplice, ma poi quando ho provato a farlo nel modulo di domanda di Windows, non sono sicuro di come implementarlo. Ho paura che se continuo a fare esempi nella console, quindi dovrò difficoltà a farlo in Windows Form Apps. Cosa ne pensi?

====== Ciao di nuovo,

Ho bisogno di un feedback con il mio codice:

        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);
            }

        }
È stato utile?

Soluzione

Bene, prima di tutto mi piacerebbe pensare a come trovare i numeri primi, e scrivere che, in una console app che legge una riga, fa la matematica, e scrive i risultati (puramente perché questa è la cosa più semplice che si può fare , e copre la stessa logica di analisi ecc avrete bisogno più avanti).

Quando si è soddisfatti con la generazione numero primo, poi guarda come fare WinForms - come mettere una casella di riepilogo, casella di testo e pulsante di un modulo; come gestire l'evento click (del tasto), e come leggere dalla casella di testo e scrivere i valori nella casella di riepilogo. Il codice di primo dovrebbe essere abbastanza OK a prendere "così come sono" ...

Se non si dispone già di un IDE, quindi notare che C # Express è libero e coprirà tutto quanto sopra.

Altri suggerimenti

È necessario sapere:

  • Come leggere l'input dell'utente da un'applicazione Windows
  • Come generare numeri primi in un intervallo
  • Come scrivere l'output nel modo in cui si desidera

Suggerisco vivamente di separare queste attività. Una volta che hai ciascuno di essi lavorano a parte, li si può mettere insieme. (Marc suggerisce scrivere una console app per la sezione numero primo -. Che è una buona idea se non si vuole entrare in unit testing ancora Se hai utilizzato unit testing in altre lingue, è abbastanza facile da ottenere installato e funzionante con NUnit . Una console app sarà certamente più veloce per iniziare con se.)

In teoria, per un'attività potenzialmente esecuzione prolungata (ad esempio gli input dell'utente 1000000 come primo numero) di solito si dovrebbe utilizzare un filo di fondo per mantenere l'interfaccia utente reattiva. Tuttavia, vorrei ignorare che per cominciare. Essere consapevoli del fatto che, mentre si sta calcolando i numeri primi, apparirà l'applicazione per essere "appeso", ma farlo funzionare a tutti di prima. Una volta che siete sicuri con la versione semplice, si può guardare BackgroundWorker e simili, se vi sentite avventurosi.

ho discusso la creazione di numeri primi che utilizzano il Crivello di Eratostene sul mio blog qui:

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

Il codice simile a questo ...

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;
        }
    }
}

Con questo codice è possibile scrivere istruzioni come questo ...

var primes = SieveOfEratosthenes.GetPrimes(2000);

... per ottenere un IEnumerable di numeri primi fino a 2000.

Tutto il codice può essere trovato su CodePlex a http://FSharpCSharp.codeplex.com .

Il codice è "così com'è" e così si dovrebbe guardare per determinare se si adatta alle vostre esigenze, se è necessario aggiungere il controllo degli errori, ecc, in modo da trattare come un campione.

Ecco una grande numero primo algoritmo di "naive", che sarebbe perfetto per le vostre esigenze: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

Ecco una risposta alla modifica:

  

Grazie ragazzi. Quindi stai suggerendo che è meglio farlo prima nella console? Ho fatto un esempio di "For Loop" utilizzando Applicazione console molto semplice, ma poi quando ho provato a farlo nel modulo di domanda di Windows, non sono sicuro di come implementarlo. Ho paura che se continuo a fare esempi nella console, quindi dovrò difficoltà a farlo in Windows Form Apps. Cosa ne pensi?

Se si desidera presentare i numeri primi come applicazione Windows Form allora avete bisogno di progettare l'interfaccia utente per esso pure. Che è un po 'eccessivo per un piccolo problema così da risolvere. Il design più semplice che si può fare è quello di riempire un ListBox nel modulo ( esempio ).

Se siete veramente appassionati di imparare Windows Form o WPF poi ci sono diverse risorse per questo.

Mi è stato recentemente scrivendo una routine per implementare crivello di Eratostene e sono imbattuto in questo thread. Solo per gli archivi, qui è la mia realizzazione:

    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;
    }

Si può sempre seminare con "1, 2" se avevi bisogno 1 nella lista dei numeri primi.

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();
   }
}

Il tuo approccio è del tutto sbagliato. I numeri primi sono assoluti e non cambieranno mai. La cosa migliore è quello di pre-generare una lunga lista di numeri primi. Poi venire con un algoritmo per cercare velocemente quel numero per determinare se è sulla lista. Quindi nel tuo caso (dal momento che si desidera elencare tutti nella gamma data solo farlo). Questa soluzione sarà molto più veloce rispetto a qualsiasi numero trovando primo algoritmo implementato durante il run-time. Se il numero immesso è superiore la vostra lista, allora si può sempre implementare l'algoritmo di partenza in quel punto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top