Announcement

Collapse
No announcement yet.

Frage zu Primzahlrechnercode

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Frage zu Primzahlrechnercode

    hi
    ich habe vorkurzem mit c# angefangen und bin gerade dabei verschiedene versuchsprogramme wie taschenrechner, pc, usw zu schreiben. vor kurzem hab ich folgenden code für einen Primzahlrechner geschrieben:
    [highlight=c#]
    namespace Primzahlenrechner
    {
    class Program
    {
    static void Main(string[] args)
    {
    Top:
    string eingabe1 = Console.ReadLine();
    int zahl = 0;
    if (Int32.TryParse(eingabe1, out zahl))
    {
    for (double divisor = 2; divisor <= 10; divisor++)
    {
    if (divisor != zahl)
    {
    double ergebnis = zahl / divisor;
    string textErgebnis = Convert.ToString(ergebnis);
    int iErgebnis = 0;
    if (Int32.TryParse(textErgebnis, out iErgebnis))
    {
    Console.WriteLine("Zahl ist keine Primzahl");
    goto Top;
    }
    if (divisor == 10)
    {
    Console.WriteLine("Zahl ist eine Primzahl");
    goto Top;
    }
    }
    }
    }
    Console.ReadLine();
    }
    }
    }
    [/highlight]
    das funktioniert zwar soweit, aber der code erscheint mir schon ganz schön umständlich. Daher würde ich mich freuen, wenn ihr mir vllt verbesserungsvorschläge geben könntet.

    mfg
    Tarik
    mfg,
    Tarik

  • #2
    Im Zuge der strukturierten Programmierung ist die Nutzung von goto nicht mehr erforderlich. In jedem Fall läst sich dies durch

    - entsprechende Schleifen
    - Umstellung der Bedingung

    ersetzen. Es sollte nicht mehr genutzt werden -> hier Nutzung von break

    Zur Berechnung von Primzahlen
    http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes
    Christian

    Comment


    • #3
      ok. na meine methode funktioniert ja auch , wenn vllt auch nicht so elegant.
      mfg,
      Tarik

      Comment


      • #4
        Originally posted by tarik View Post
        ok. na meine methode funktioniert ja auch , wenn vllt auch nicht so elegant.
        ???

        Du wollstest doch

        Daher würde ich mich freuen, wenn ihr mir vllt verbesserungsvorschläge geben könntet.
        Funktioniert heisst dann noch lange nicht, das der Code ok ist. Mittlerweile gibt es auch in der Programmierung "Best Practice". Und goto gehört definitiv nicht dazu
        Christian

        Comment


        • #5
          ok, stimmt. aber mit diesem sieb des eratosthenes wird das ja komplett anders geschrieben. ich meinte jetzt verbesserungsvorschläge für den code an sich, nicht für das rechensystem.
          wenn ich break verwende müsste ich dann doch den code nochmal in eine extra schleife packen, oder? von daher fand ich goto am einfachsten.
          mfg,
          Tarik

          Comment


          • #6
            Hallo,

            ja - aber lagere die Berechnung in eine Methode aus und dann kannst du in Main die Schleife um den Methodenaufruf machen.


            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              ok. das ist ne gute idee. eig hätt ich da auch selbst drauf kommen können.
              das mach ich jetzt erstmal
              Zuletzt editiert von tarik; 13.11.2010, 21:08.
              mfg,
              Tarik

              Comment


              • #8
                Hallo,

                wenn du dann den Code noch besser machen willst wende Memoization an. Dies deshalb wenn der Benutzer zB 2x dieselbe Zahl eingibt braucht nicht 2x berechnet werden, sondern es kann direkt der gespeicherte Wert (in einem Dictionary<string, bool>) gelesen werden. Wenn du diese Überleung vorantreibst und auch Zwischenergebnisse der Berechnung speichert bist du wieder beim Vorschlag von Christian das Sieb des Erastosthenes zu verwenden.

                Beim Programmstart sollte dem Benutzer auch angezigt werden dass er eine Zahl eingeben soll. Bei einem DAU wartet so das Programm bis er etwas eingibt und der DAU wartet bis das Programm sagt was er tun soll


                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  ok, das werd ich auch mal probieren. ich hab jetzt noch ne konkrete frage.
                  um zu überprüfen, ob das ergebnis eine natürliche zahl ist hab ich ja diesen code verwendet, weil man ja kein double in die TryParse Methode schreiben kann:
                  [highlight=c#]
                  double ergebnis = zahl / divisor;
                  string textErgebnis = Convert.ToString(ergebnis);
                  int iErgebnis = 0;
                  if (Int32.TryParse(textErgebnis, out iErgebnis))[/highlight]
                  geht das nicht einfacher? (mit google konnte ich da nichts passendes finden.)

                  mfg
                  mfg,
                  Tarik

                  Comment


                  • #10
                    Hallo,

                    beim Sieb brauchst du keine doubles.

                    Sonst kannst du per
                    [highlight=c#]
                    double realNumber = 3.14;
                    bool isNaturalNumber = (int)realNumber == realNumber; // ergibt false ;-)
                    [/highlight]
                    prüfen.


                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      ok. dann danke an alle. wenn noch jemand vorschläge hat, kann er gerne noch schreiben. ansonsten ist das thema soweit abgeschlossen würde ich sagen.
                      mfg,
                      Tarik

                      Comment

                      Working...
                      X