2009-05-20 12 views
6

Ich bin neu in C#. Und ich würde gerne etwas programmieren, das die Primzahlen in einer Listbox anzeigt, wenn der Benutzer eine ganze Zahl in das Textfeld eingibt. (Das heißt, wenn sie 10 schreiben, werden die Primzahlen von 0-10 oder 20 von 0-20 usw. angezeigt).Primzahlen C#

Was sollte ich zuerst beachten, bevor ich die Programmierung mache? Ich weiß, es gibt viele Beispiele im Internet, aber zuerst würde ich gerne wissen, was ich brauche?

Danke für den Tipp ;-)

=== Danke Jungs. Sie schlagen also vor, dass es zuerst in der Konsolenanwendung gemacht wird? Ich habe ein Beispiel für "For Loop" mit Console Application eine sehr einfache, aber wenn ich es in der Windows Form Application zu tun versucht, bin ich mir nicht sicher, wie es zu implementieren ist. Ich fürchte, wenn ich weiterhin Beispiele in der Konsole mache, habe ich Schwierigkeiten, dies in Windows Form Apps zu tun. Was denkst du?

====== wieder Hallo,

Ich brauche ein Feedback mit meinem 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); 
      } 

     } 
+1

Das ist nicht, wie Sie nach Primzahlen suchen ... Dieser Code prüft, ob eine Zahl ungleich ist (oder zwei ist) ... Sie brauchen einen schlaueren Algorithmus wie http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes – toxvaerd

+1

Nur um zu veranschaulichen, warum Ihr Algorithmus nicht funktioniert: Es wird 9 ausdrucken, das ist kein Prime ... – toxvaerd

Antwort

11

Nun, zuerst würde ich darüber nachdenken, wie man Primzahlen findet, und schreibe das in einer Konsolen-App, die eine Zeile liest, die Mathematik macht und die Ergebnisse schreibt (nur weil das das Einfachste ist, was du kannst tun, und deckt die gleiche Logik Parsing etc. Sie später benötigen).

Wenn Sie mit der Primzahlgenerierung zufrieden sind, dann schauen Sie sich an, wie man Winforms erstellt - wie man eine Listbox, ein Textfeld und eine Schaltfläche in ein Formular einfügt; wie man mit dem Click-Ereignis (der Schaltfläche) umgeht und wie man aus der Textbox liest und Werte in die Listbox schreibt. Ihr primärer Code sollte ziemlich in Ordnung sein, so wie er ist ...

Wenn Sie noch keine IDE haben, dann beachten Sie, dass C# Express kostenlos ist und alle oben genannten Punkte abdecken wird.

+0

Eher Express als SharpDevelop? Ihre kühne Verweigerung, Addins zu unterstützen, machte es ein Nogo für mich, oder verpasse ich etwas? – Peter

+1

Tatsächlich unterstützt es keine Add-Ins. Jedes Produkt wäre wahrscheinlich in Ordnung; Einfach, dass IMO es einfacher ist, Beispiele usw. zu erhalten, die die Terminologie/das Layout (usw.) von der MS-Version verwenden. Für jemanden "neu in C#", der wichtig sein kann. –

+1

Ok Ich denke ich werde das zuerst in der Konsole machen und wenn es funktioniert dann übertrage ich es auf winforms. Danke Marc für die Eingabe – tintincutes

6

Sie wissen müssen:

  • Wie Benutzer lesen Eingabe aus einer Windows-Anwendung
  • So generieren Sie Primzahlen innerhalb eines Bereichs
  • So schreiben Sie die Ausgabe so, wie Sie möchten

Ich empfehle dringend, diese Aufgaben zu trennen. Sobald Sie alle separat arbeiten, können Sie sie zusammenstellen. (Marc schlägt vor, eine Konsolen-App für die Primzahl-Sektion zu schreiben - das ist ein guter Vorschlag, wenn Sie noch nicht in Komponententests kommen wollen. Wenn Sie Komponententests in anderen Sprachen verwendet haben, ist es relativ einfach, aufzustehen NUnit.Eine Konsolen-App wird sicherlich schneller zu beginnen mit aber.)

In der Theorie, für eine potenziell lang laufende Aufgabe (zB der Benutzer 1000000 als erste Nummer eingegeben) sollten Sie in der Regel einen Hintergrund-Thread zu halten die Benutzeroberfläche reagiert. Allerdings würde ich das zunächst ignorieren. Seien Sie sich bewusst, dass Ihre Anwendung während der Berechnung der Primzahlen scheinbar "hängt", aber zuerst funktioniert. Sobald Sie mit der einfachen Version vertraut sind, können Sie auf BackgroundWorker und dergleichen schauen, wenn Sie sich abenteuerlustig fühlen.

+0

Ich denke, du solltest den Ausdruck "Ich würde das ignorieren, um damit zu beginnen" als Fett markieren. Gute Antwort, wie immer, John! :) – Galilyou

+0

Danke Jon Ich nehme diesen Ratschlag zur Kenntnis ;-) – tintincutes

1

Hier ist eine Antwort auf die edit:

Danke Jungs. Sie schlagen also vor, dass es zuerst in der Konsolenanwendung gemacht wird? Ich habe ein Beispiel für "For Loop" mit Console Application eine sehr einfache, aber wenn ich es in der Windows Form Application zu tun versucht, bin ich mir nicht sicher, wie es zu implementieren. Ich befürchte, dass ich Probleme mit Windows Form Apps habe, wenn ich weiterhin Beispiele in der Konsole mache. Was denken Sie?

Wenn Sie die Primzahlen als Windows Forms-Anwendung darstellen möchten, müssen Sie auch die Benutzeroberfläche dafür entwerfen. Das ist ein bisschen übertrieben für ein so kleines zu lösendes Problem. Das einfachste Design, das Sie tun können, ist ein ListBox in Ihrem Formular (example) zu füllen. Wenn Sie wirklich daran interessiert sind, Windows Forms oder WPF zu lernen, dann gibt es several resources dafür.

+0

danke Spoike, was ich gerne machen würde, zeige einfach die Primzahlen in der Listbox mit einer einzigen Taste an. vielleicht könnte ich anfangen, den Bereich 1-100 anzugeben. und es mit einem einzigen Klick anzeigen. Was denken Sie? – tintincutes

+0

Sie können versuchen, ein TextBox zu haben, um die Nummer einzugeben, wenn der Bereich gestoppt werden soll (anstatt einen Bereich wie "1-100" einzugeben, weil Sie dann eine String-Manipulation durchführen müssen), eine Taste, um das Prim zu finden Nummern und ein Listenfeld, um die Ergebnisse anzuzeigen. So einfach ist das. – Spoike

4

diskutierte ich die Sieve of Eratosthenes auf meinem Blog Primzahlen zu schaffen hier mit:

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

Der Code sieht wie folgt aus ...

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

Mit diesem Code Sie Aussagen wie diese schreiben kann ...

var primes = SieveOfEratosthenes.GetPrimes(2000); 

.. Um einen IEnumerable von Primzahlen bis 2000 zu erhalten.

Der gesamte Code kann auf CodePlex bei http://FSharpCSharp.codeplex.com gefunden werden.

Der Code ist "wie er ist" und so sollten Sie es betrachten, um zu bestimmen, ob es Ihren Bedürfnissen entspricht, ob Sie Fehlerprüfung usw. hinzufügen müssen, also behandeln Sie es als ein Beispiel.

+0

das ist sehr elegant. Ich werde dieses Beispiel studieren, danke Martin ;-) – tintincutes

+0

Gutes Beispiel und Blogpost, aber Sie verlieren Stilpunkte für Ihre Verwendung von '== false' im Konditional. –

0

Ich schrieb vor kurzem eine Routine zur Implementierung von Sieve Of Eratosthenes und stieß auf diesen Thread. Gerade für die Archive, hier ist meine Implementierung:

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

Man kann immer Samt es mit „1, 2“, wenn Sie 1 in der Liste der Primzahlen benötigt.

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

Ihre Vorgehensweise ist völlig falsch. Primzahlen sind absolut und werden sich niemals ändern. Am besten erstellen Sie eine lange Liste von Primzahlen. Dann schlagen Sie einen Algorithmus vor, um schnell nach dieser Nummer zu suchen, um festzustellen, ob sie auf der Liste steht. Dann in Ihrem Fall (da Sie alle im angegebenen Bereich auflisten möchten). Diese Lösung wird viel schneller sein als jeder Primzahlsuchalgorithmus, der während der Laufzeit implementiert wird. Wenn die eingegebene Ganzzahl größer als Ihre Liste ist, können Sie den Algorithmus immer an diesem Punkt implementieren.

Verwandte Themen