Primzahlenrechner mit While - Wend Schleife

  • Sonstige

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Mono.

    Primzahlenrechner mit While - Wend Schleife

    Hallo ich soll als Aufgabe einen Primzahlenrechner erstellen mit einer While - Wend schleife, jedoch kommt immer 0 herraus. Habe ihr auch schon die Suchfukti., benutzt war dar nur einer mit For - Next Schleife. Bin dankbar für hilfe bzw, Denkanstoss.




    Private Sub cmdBerechnen_Click()
    Dim intEingabe As Integer
    Dim intErgebnis As Integer
    Dim intWert As Integer
    Dim intI As Integer

    Me.txtEingabe.Text = intEingabe
    Me.txtErgebnis.Text = intErgebnis

    intI = 2
    While intI <= intEingabe
    intI = intI + 1
    Wend
    intWert = intEingabe Mod intI

    If intWert = 0 Then
    Me.txtErgebnis.Text = Me.txtEingabe.Text & " ist keine Primzahl!" & vbCr & "Der erste ganzzählige Teiler" & vbCr & "ist: " & intWert
    End If

    End Sub
    Cool :thumbup:

    Mein Sourcecode wird als Tipp verwendeit :)

    Jedoch: Auch meine Methode benutzt eine For...Next-Schleife.

    Obwohl: Statt

    Visual Basic-Quellcode

    1. For i = a To b
    2. 'irgendwas
    3. Next


    kann man auch das machen:

    Visual Basic-Quellcode

    1. i = a
    2. While i <= b
    3. i = i + 1
    4. 'irgendwas
    5. Wend


    Das hätte das gleiche Ergebnis.

    Und im Prinzip machst du das ja auch.

    Aber:

    Deine While-Schleife sorgt lediglich dafür, dass intI den Wert von intEingabe übernimmt, es sei denn, intEingabe ist kleiner als 2. intEingabe hat den Wert 0, da nach der Deklaration der Variablen kein Wert zugewiesen wird. intWert ergibt sich dann aus 2 Mod 2, was 0 ist. Deshalb kommt immer 0 heraus.

    Als Denkanstoß: Nimm mal meinen Code (Link, den Agent vorschlägt) als Inspiration. Bedenke dabei, dass es bei While so etwas wie Exit For nicht gibt. Vielleicht kannst du aber die Bedingung, die zu Exit For führt, als deine While-Bedingung einsetzen.

    Falls dich das nicht weiterbringt, kann ich auch noch konkreter werden. Durchdenke aber erst einmal obige Dinge. Am meisten lernt man, wenn man versucht, selbst zu einer Lösung zu kommen. Aber wenn man nach sorgfältigem Nachdenken, Nachschlagen etc. nicht weiterkommt, kann man natürlich Hilfe zu Rate ziehen.

    Ich erwähne das deshalb, weil du schreibst, dass du das als Aufgabe hast, wahrscheinlich in einem Kurs oder in der Schule oder so. Und der Sinn einer solchen Aufgabe besteht ja darin, dass man selbst ein wenig tüftelt und probiert.

    Eigentlich nicht schwer

    Hallo, lieber Mituser!

    Die Aufgabe ist eigentlich nicht schwer zu lösen. Zur Primzahlenberechnung habe ich immer mit zwei Schleifen gearbeitet. Einer äußeren und einer inneren. Die äußere Schleife geht die zu testenden Zahlen durch, sie nimmt also z.B. die 5 und fragt sich: Ist das eine Primzahl? Jetzt kommt die innere Schleife zum Zuge. Von 2 bis 4 (denn durch 1 und sich selbst ist ja jede Zahl teilbar) testet sie, ob Teiler existieren. Das ist aber nicht der Fall, also wird 5 als Primzahl ausgegeben. Nehmen wir zur 5 als Beispiel noch die 9 hinzu. Bei 9 ist die äußere Schleife angelangt und das Programm fragt sich: Ist 9 eine Primzahl? Die innere Schleife testet von 2 bis 8 durch. (1 und 9 ist ja Quatsch, weil jede Zahl durch eins und durch sich selbst teilbar ist.) Aber hallo! Ist die innere Schleife bei 3, dann ist glattes Teilen möglich, 9 kann also keine Primzahl sein. 9 wird nicht ausgegeben, weil sie keine Primzahl ist. In dem Moment, wo die innere Schleife 9 durch 3 gerechnet hat und ein glattes Ergebnis herausgekommen ist, muss das Programm denken: aha, 9 ist keine Primzahl, dann kann die äußere Schleife um eins erhöht werden und die 10 wird getestet.

    :)

    "while ... wend" kannst du für die innere Schleife benutzen: 9 ist auf Primzahl oder nicht zu testen. WHILE kein glatter Teiler existiert, zähle weiter hoch, WENN ein glatter Teiler existiert, raus aus der Schleife und äußere um 1 hoch. (9 durch 3 gleich 3, damit ist 9 keine Primzahl.) Kein glattes Ergebnis? Dann WEND, der nächste Teiler wird getestet.

    "while ... wend" würde ich nicht für die äußere Schleife benutzen. Hier besser FOR ... NEXT, denn da kannst du auch bestimmen, bis zu welcher Höhe auf Primzahlen getestet werden soll. 1.000.000.000.000 würde schon sehr lange dauern. Du kannst ja damit beginnen, erst mal bis 10.000 alle Primzahlen zu berechnen.

    Freue mich über ein Feedback

    dein

    Streethawk
    Danke für die schnellen Antworten

    @Streethawk danke für Antwort, muss aber While Wend schleife sein.

    @Roddy du hast recht es handelt sich um einen Kurs, deshalb will ich am liebsten selber darauf kommen. Muss mann ja später auch können.

    @Agent auch dir vieleln dank.

    Sollte ich wiedererwartend doch nicht weiter kommen, werde ich mich nochmal melden.

    ncxb schrieb:

    Me.txtEingabe.Text = intEingabe

    Bei so einer Zuweisung vermute ich irgendwie, dass du bislang nicht wirklich gut im Unterricht aufgepasst hast ...

    Es soll doch sicher:
    intEingabe = Me.txtEingabe.Text sein, oder nicht?
    Besser: If not Integer.TryParse(Me.txtEinagbe.Text, intEingabe) Then MachMalFehlerAusgabeWeilDaKeineZahlDrinIst!
    Aha... Doch sehr nett...

    Also um diese Zuweisung ging es mir jetzt weniger, sondern um die Schleife.

    Ich dachte, ich bekomme hier etwas Hilfe. Gelesen habe ich schon 'ne Menge, aber trotzdem funktioniert es nicht. Mit einer For-next-Schleife kriege ich es hin, aber nicht mit while-wend.

    Private Sub cmdBerechnen_Click()
    Dim intI As Integer
    Dim intERG As Integer
    Dim intIERG As Integer

    intERG = 1
    For intI = 2 To Me.txtZahl - 1

    If Me.txtZahl Mod intI = 0 Then
    intERG = 0
    intIERG = intI
    Exit For
    End If
    Next intI
    If intERG = 0 Then
    Me.txtErgebnis = Me.txtZahl & " ist keine Primzahl!" & vbCr & _
    "Der erste ganzzählige Teiler ist: " & intIERG
    Else
    Me.txtErgebnis = Me.txtZahl & " ist eine Primzahl"
    End If
    End Sub

    bella schrieb:

    Also um diese Zuweisung ging es mir jetzt weniger, sondern um die Schleife.

    Das blöde ist, egal was du am Code änderst, durch diese Zuweisung KANN es nicht funktionieren.

    Dim intEingabe As Integer | intEingabe ist jetzt 0
    ..
    Me.txtEingabe.Text = intEingabe | Das Textfeld zeigt "0", und intEingabe bleibt 0
    ..
    intI = 2
    While intI <= intEingabe | da 2 nie kleiner gleich 0 ist, wird die Schleife NIE durchlaufen


    Mit einer For-next-Schleife kriege ich es hin, aber nicht mit while-wend.

    EDIT: Quatsch ;) Ne For-Schleife IST eine While Schleife! Nur halt eine mit automatischem Index.

    Wenn also FOR bis 10 läuft, muss bei while auf "<= 10" geprüft werden.
    Na ja und bei While muss man natürlich noch seinen eigenen Index jeweils erhöhen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()

    Um eine einzige Zahl zu prüfen, braucht man keine zwei Schleifen.

    Ich hab es mal in VBS geschrieben und 2 Schleifen genommen, musst du halt nach VBA etwas umschreiben.
    Vielleicht ist es ja ein Denkanstoß.

    Visual Basic-Quellcode

    1. Eingabe = 1
    2. While Eingabe <> 0
    3. Eingabe = InputBox("Gib eine Zahl ein","Primzahltest")
    4. If IsNumeric(Eingabe) Then
    5. If Eingabe <= 0 Then
    6. If Eingabe < 0 Then MsgBox ("Eingabe muss größer 0 sein")
    7. Else
    8. Primzahl = True
    9. zahl = 2
    10. While Primzahl <> False And zahl-1 < Eingabe-1
    11. If Eingabe Mod Zahl = 0 Then Primzahl = False
    12. zahl = zahl +1
    13. Wend
    14. If primzahl = True Then
    15. MsgBox Eingabe & " ist eine Primzahl"
    16. Else
    17. MsgBox Eingabe & " ist keine Primzahl, der kleinste Teiler ist: " & zahl-1
    18. End If
    19. End If
    20. Else
    21. MsgBox "Nur Zahlen können Primzahlen sein.."
    22. Eingabe = 1
    23. End If
    24. Wend

    (bei vba packst du es in dein Button_Click Sub, nimmst die äussere schleife raus und änderst Eingabe = Inputbox...
    in Eingabe = DeineTextboxform.value, wenn du "Option Explicit" hast musst du natürlich noch sämtliche variablen deklarieren, was sicher empfehlenswert ist)

    gruß Mono
    Das ist meine Signatur und sie wird wunderbar sein!

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