Primzahlberechner :S wie erstellt man so einen? + Generelle Schwierigkeiten beim Programmieren :(

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von ThePlexian.

    Primzahlberechner :S wie erstellt man so einen? + Generelle Schwierigkeiten beim Programmieren :(

    Hey Leute,

    also ich muss einen Primzahlberechner mit VB programmieren und krieg es ehrlich gesagt einfach nicht auf die Reihe. Also ein Struktogramm hab ich schon angefertigt(müssen wir in der Schule immer machen, also zur Hilfe), das war auch einfach aber das programmieren krieg ich nicht hin :S
    Also ich hab jetzt eine Textbox zum eintragen der zu überprüfenden Zahl erstellt einen Button und ein Label,wo später das Ergebnis : ist eine Pimzahl oder ist keine Primzahl stehen soll.
    Nur jetzt hört es schon auf ;(

    Also ich hab mich dann mal so über google informiert und dann kam sowas:
    Function IsPrimeNumber(ByVal Number As Long) As Boolean

    also Boolean ist mir klar :) aber wir haben noch nie Function vor etwas stehen gehabt :S sonst hatten wir immer Private Sub ... wäre es irgendwie auch damit machbar?

    dann kam bei Google dieser Teil:

    If Number Mod 2 = 0 Or Number = 1 Then 'Wenn die angegebene Zahl
    If Number <> 2 Then 'durch 2 teilbar ist (jedoch
    IsPrimeNumber = False 'ungleich 2) oder gleich 1 ist,
    Exit Function 'ist es keinesfalls eine Primzahl
    End If
    End If

    Also hier wär ich zwar alleine nicht drauf gekommen ^^ aber es ist nachvollziehbar.

    Naja und jetzt kommt die Schleife und die versteh ich schon mal so überhaupt nicht.

    For Counter = 1 To Number - 1 Step 2 'Eine Schleife von
    If Number Mod Counter = 0 Then '1 bis zur angegebenen
    If Counter <> 1 Then 'Zahl - 1 durchlaufen,
    IsPrimeNumber = False 'wobei jede 2. Zahl aus-
    Exit Function 'gelassen wird, da die
    End If 'Teilbarkeit durch 2 bereits
    End If 'geprüft wurde. Wird ein
    Next Counter 'Teiler <> 1 gefunden, ist
    'die Zahl keine Primzahl.
    IsPrimeNumber = True


    Also insgesamt hab ich verstand was der Computer nun machen muss um eine Primzahl "zu finden", doch ich weiß halt nicht wie man das in VB aufschreibt :S und noch so ne Frage zu Schleifen generell was hat es mit dem i oder j immer auf sich ( zum Beispiel: for i=1 to 100)




    Vielleicht kann mir das hier ja jemand erklären :) Bei meinem Lehrer versteh ich das nämlich mal so überhaupt nicht :((
    Willkommen im Forum. :thumbup:

    Charlie.. schrieb:

    Also ein Struktogramm hab ich schon angefertigt
    Bevor Du hier falschen und grottigen Code schreibst, sollten wir doch mal den Algorithmus durchsprechen.
    Poste mal bitte Dein Struktogramm.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hey,

    kannst du deinen Code in einen Tag packen d.h. im Editor gibts zweite Reihe rechts alle Symbole für die jeweilige Sprache ;)
    Weiters kannst du mal schauen ob du hier durchblickst --> funktion um auf primzahl zu testen (zahlengröße 10000stellen und mehr)
    oder Hier --> vbarchiv.net/tipps/tipp_342-pr…-ermitteln-optimiert.html (Achtung VB6, müsstest du umschreiben)

    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Naja das Struktogramm ist ja mehr oder weniger eine Zeichnung also gestaltet sich das etwas schwierig, aber ich versuchs mal irgendwie aufzuschreiben:

    Von ZV=1
    -----------------------------------------------------------------------------------------------------
    •nehme die zu untersuchende Zahl durch jede niedrigere natürliche Zahl und sich selbst
    -----------------------------------------------------------------------------------------------------
    Zu untersuchende Zahl
    ------------------------------------------
    >2 mögliche Teiler
    ----------------------- ----------------------
    Ja Nein
    ------------------------ -----------------------
    Es ist keine Primzahl Es ist eine Primzahl
    Wenn ihr funktionen noch nie benutzt habt lässt sich das auch einfach mit ner sub lösen.
    Generell ist eine Funktion eine Methode, die einen Wert zurückgibt.
    Über die Definitionen der Begriffe Funktion und Methode lässt sich allerdings streiten.

    Eine "Function" muss mithilfe des "Return"-Schlüsselworts einen Wert zurückgeben,
    eine "Sub" nicht.

    Das mit dem i und j ist auch einfach zu erklären:
    Eine For-Schleife benötigt einen sogenannten Iterator, der meist inkrementiert bzw. dekrementiert wird.
    Hier werden einfach zwei verschiedene Variablennamen für die Iteratoren verwendet,
    da man ja sonst den ersten Iterator i in der zweiten Schleife überschreiben würde.

    Der Aufbau einer For-Schleife in VB ist folgendermaßen:
    For iterator [ As datentyp ] = startWert To endWert [ Step schrittgroesse ]

    Wenn kein Step angegeben wird, wird der iterator bei jedem Durchlaufen der Schleife inkrementiert.

    Falls du das Mod-Schlüsselwort auch nicht verstehst:
    Mod führt eine Modulo-Division durch (nähere Informationen lassen sich z.B. ganz gut auf Wikipedia erhalten).

    Das sind eigentlich alles Basics.
    Es gibt einige (bessere und schlechtere) kostenlose VB.Net Bücher (bzw. E-Books) im Internet,
    ich denke mal dass dir das ein tieferes und umfassenderes Verständnis der Sprache bringen würde.

    Grüße

    Charlie.. schrieb:

    durch jede niedrigere natürliche Zahl
    Wenn Du 17 auf Primzahl testest, bis zu welcher Zahl musst Du denn die Division durchführen?
    16 ist falsch.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Charlie.. Du hast meine Frage nicht verstanden. ;(
    Schreib mal alle Zahlen auf, durch die Du 17 teilen musst, um sicher zu wissen, ob das ne Primzahl ist oder nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Einzeiler:

    VB.NET-Quellcode

    1. If Enumerable.Range(1, CInt(NumericUpDown1.Value)).Where(Function(item) CInt(NumericUpDown1.Value) Mod item = 0).Count() = 2 Then MessageBox.Show("Primzahl") Else MessageBox.Show("Nix Primzahl")



    (Brauchst ein NumericUpDown und ein Button)

    Hier die etwas längere Lösung (mit Erklärung):

    VB.NET-Quellcode

    1. Dim lZahl As Decimal = NumericUpDown1.Value 'Zahl die geprüft werden soll
    2. Dim lAnfang As Integer = 1 'Ab hier wird geteilt
    3. Dim lGefundeneGanzzahlen As Integer = 0 'Anzahl der gefundenen Teiler
    4. For lZaehler As Decimal = lAnfang To lZahl 'Es wird lZahl durch jede Zahl zwischen 1 und lZahl geteilt
    5. If lZahl Mod lZaehler = 0 Then
    6. lGefundeneGanzzahlen += 1
    7. End If
    8. Next
    9. If lGefundeneGanzzahlen = 2 Then 'Wenn nur 2 Teiler gefunden worden sind, dann ist es eine Primzahl
    10. MessageBox.Show("Primzahl")
    11. Else
    12. MessageBox.Show("Keine Primzahl")
    13. End If

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „RushDen“ ()

    reicht es eigentlich nicht sie durch 2 zu teilen? weil 17 ist ja klar und 1 auch und wenn man es noch durch eine 3 zahl außer 1 uns sich selbst teilen kann ist es doch keine primzahl mehr oder bring ich da was ducrheinander?
    @WhitePage
    Du solltest erstmal den Code testen, bevor du urteilst.
    Der zweite Code ist richtig, weil am Ende geprüft wird ob genau 2 Teiler gefunden worden sind (1 und man selber), falls Ja wurde eine Primzahl gefunden, wenn nicht wurde keine gefunden.

    @Charlie..

    Eigentlich reicht es durch alle Zahlen von 1 bis (Gesuchte Zahl / 2) zu teilen und am Ende zu gucken ob ein Teiler gefunden worden ist (1; Primzahl). Hab das nur so gemacht, da das ja in dem Struktogram so erklärt wurde.

    Charlie.. schrieb:

    reicht es eigentlich nicht sie durch 2 zu teilen?
    Bitte keine Gegenfrage:

    RodFromGermany schrieb:

    Schreib mal alle Zahlen auf, durch die Du 17 teilen musst, um sicher zu wissen, ob das ne Primzahl ist oder nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RushDen
    Gut, der Code war so dermaßen nicht lesbar, dass ich es nicht erkannt habe. Wie kommt man auf die Idee, ein Divisionsergebnis in String umzuwandeln und dann zu parsen, um festzustellen, ob die Division restlos war? 8o 8o Ist dir Mod nicht geläufig?

    Und wozu durch 1 und sich selbst teilen und das Ergebnis wieder korrigieren, wenn man es gleich lassen kann? Ab 2 teilen und bis zur richtigen Grenze (und nein, n-1 ist es nicht).

    RushDen schrieb:

    hab Ich ganz vergessen
    Warum nimmst Du nicht einfach Integer-Division:

    VB.NET-Quellcode

    1. Dim ii = lZahl \ lZaehler
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    WhitePage schrieb:

    restlos
    Double reicht da nicht aus, da muss nach der Integer-Division noch die Rückrechnung gemacht werden, Modulo-0-Test, wie gesagt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @WhitePage

    Weil wenn man eine Zahl durch eine andere Zahl teilt die größer als die Hälfte der Zahl ist, kommt immer ein Rest dabei raus (also nicht teilbar). Von daher ist das nicht notwendig.
    Beispiel:

    18

    Die Hälfte ist: 9

    18/10 = nicht teilbar
    18/11 = nicht teilbar
    18/12 = nicht teilbar
    18/13 = nicht teilbar
    ...


    das gilt für jede zahl.


    Auserdem geht es hier um die Umsetzung des Struktograms - dort wird gesagt man solle prüfen ob die Zahl durch eine niedrigere natürliche Zahl bzw sich selbst teilbar ist.
    Hab mich also nur daran gehalten.

    RushDen schrieb:

    Von daher ist das nicht notwendig.
    Die Menge Deiner Teiler ist allerdings viel zu groß.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!