Verflixte Sieben

  • VB.NET

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Verflixte Sieben

    Ich soll / muss eine Konsolen-Anwendung schreiben, die "Die verflixte Sieben" heißt.

    Aufgabe ist: Erstelle ein Konsolenprogramm, dass bis zum Erreichen der Zahl 100 alle Zahlen durchläuft und anstelle von Zahlen, die nicht erlaubt sind, die Zeichenfolge "Piep" ausgibt.

    Nicht erlaubte Zahlen sind:
    • alle Vielfachen von 7
    • alle Zahlen, welche die Ziffer 7 enthalten (z.B. 27)
    Hat da jemand nen Denkanstoß / Lösung für mich? Wär lieb, Danke schonmal.
    Mod 7 == 0 liefert die Vielfachen. Der Test, ob eine 7 enthalten ist, ist nicht in konstant vielen Schritten zu lösen (er hängt von der Eingabelänge ab) - Mod 10 ist aber trotzdem richtig. Der Algorithmus sieht in etwa so aus:

    Quellcode

    1. INPUT: natürliche Zahl n
    2. OUTPUT: True, falls die Dezimaldarstellung von n die Ziffer 7 enthält, sonst False.
    3. Solange n > 0
    4. r = n Mod 10
    5. if r == 7 Return True
    6. n = n / 10
    7. Return False
    Gruß
    hal2000
    Ist diese Aussage jetzt wirklich dein Ernst?

    Die Antworten auf deinen Eröffnungspost bestehen aus Stichworten, die man finden kann, aus Links (zugegeben, auf Englisch), und aus einer tollen Erklärung von hal2000.
    WAS genau leuchtet dir nicht ein?
    Die Mod-Funktion als die Lösung?
    Die Schritte, wie die Darstellung der Zahlen zu lösen ist?

    Die Leute hier geben sich Mühe. Also bemüh dich auch: wo drückt der Schuh?
    Das Problem ist das ich bei NULL anfange und in dieser Übung wirklich nur Newbie Ausgaben abgeben kann...

    Mein Code bis jetzt lautet wie folgt:

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. For i As Integer = 1 To 100
    4. Console.WriteLine(i)
    5. If i = 7 Then
    6. Console.WriteLine("Pieeeeep")
    7. End If
    8. 'If i / 7 Then
    9. ' Console.WriteLine("Pieeeeep")
    10. 'End If
    11. Next
    12. Console.ReadLine()
    13. End Sub
    14. End Module
    nun, wir sind davon ausgegangen, dass du eine "Function TesteNummer(n as integer) As Boolean" schreiben kannst, in der jede einzelne Nummer getestet wird.
    Gibt diese Methode False zurück, musste "Piep" ausgeben.

    Im weiteren beschäftigen wir uns nur mit dem inhaltlichen dieser Methode, nämlich was für die Tests (es sind ja 2) verwendet werden müsste.
    Und da ist YaPh1l Einlassung mein klarer Favorit.

    Du kannst schonmal die Methoden-Rümpfe hinschreiben und posten, danach kannst du dich mit Mod und String.Concat herumärgern ;)
    Schreibe doch mal als Zeile 9 deines Beispiels:

    VB.NET-Quellcode

    1. Console.Writeline (i mod 7)


    Dann bekommst du was, was du mit IF abfragen kannst.

    Edit: mein Fehler - "q" durch "i" ersetzt. Wenn schon C&P, dann sollte es auch passen ;(

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

    Marc schrieb:

    Ich komme grad total nicht klar und verzweifel grad tierisch...

    Du sollst ja auch nicht irgendwelche Code-FRAGMENTE ohne überlegen sinnlos per C&P einfügen.
    Stattdessen würde es sich anbieten, mal mit ein paar Grundlagen zu starten. zB dass man Variablen vor ihrer Verwendung erstmal deklarieren und ggf mit einem sinnvollen Wert vorbelegen muss.
    Ich will auch nicht C&P machen, will mir das schon ansehen und in die Birne hämmern. Aber ich brauche ein paar Vorlagen mit denen ich arbeiten kann. Mit
    "INPUT: natürliche Zahl n
    OUTPUT: True, falls die Dezimaldarstellung von n die Ziffer 7 enthält, sonst False.

    Solange n > 0..."
    kann ich nicht wirklich viel anfangen :)

    Marc schrieb:

    kann ich nicht wirklich viel anfangen

    Da du lt. deinen bisherigen Posts schon mit PHP gearbeitet hast, sollten die gewissen grundlegende Konzepte aber nicht fremd sein, oder?

    Und der Fehler "Variable xy wurde nicht deklariert" ist irgendwie ebenso trivial wie selbsterklärend ...

    Marc schrieb:

    Ich komme grad total nicht klar und verzweifel grad tierisch...

    Das hängt auch mit der Logik von Forum-Information zusammen.
    Wenn du von verschiedenen Leuts antworten bekommst, beinhaltet üblicherweise jede eine eigene Strategie zur Problemlösung. Und da fällste natürlich auffn Bauch, wennde die Strategien verschiedener Antworter vermischst.
    Also nimm dir einen nach dem anneren vor, und probier dessen Strategie durch, ohne die Posts der anneren zu beachten (es sei denn, sie beziehen sich explizit auf die Strategie dessen, den du grad am Wickel hast).
    Meine Strategie etwa war, dass du einen Programm-Rahmen hinschreibst, bei dem das Testen der Nummern in eine eigene Test-Funktion isoliert ist (wenn also ich dran bin, dann auch meine Strategie nochmal nachlesen - nicht nur aufgrund meines letzten Postes drauflos-proggen).
    Und dann weiter sehen.
    Das mit dem q habich übrigens auch nicht verstanden.

    Mit den rethorischen Ohrfeigen (oder was man dafür hält) muß man auch iwie zurechtkommen. Natürlich geht es den Antwortern auf die Nerven, wenn sie den Eindruck haben, der Frager stellt sich unangemessen dumm an. Da hat auch jeder Antworter seine eigene Meßlatte, wanns ihm zuviel wird, und er sich zu pampen genötigt fühlt.
    Und mal sind die Pampereien gerechtfertigt, aber kommt auch vor, dasse dem Frager ein bischen Unrecht tun.
    So, nun habe ich etwas gebastelt und den nächsten Fehler. Ich habe es jetzt mal so gemacht:

    VB.NET-Quellcode

    1. If n > 0 Then
    2. r = n Mod 10
    3. ElseIf r == 7 Return True
    4. n = n / 10
    5. Return False
    6. End If


    Fehler bei == ist bei dem zweiten =: Expression expected.
    Fehler bei Return False: 'Return' statement in a Sub or a Set cannot return a value. (False darf da nicht stehen... ) Also False weg, dann gehts.

    Mein ganzer Code sieht also bis jetzt so aus:

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim n As Integer 'n als natürliche Zahl
    4. Dim r As Integer 'r als Teiler ??
    5. For i As Integer = 1 To 100
    6. Console.WriteLine(i)
    7. If i = 7 Then
    8. Console.WriteLine("Pieeeeep")
    9. End If
    10. Next
    11. If n > 0 Then
    12. r = n Mod 10
    13. ElseIf r == 7 Return True
    14. n = n / 10
    15. Return
    16. End If
    17. Console.ReadLine()
    18. End Sub
    19. End Module
    VB unterscheidet nicht zwischen dem Gleichheitsoperator und dem Zuweisungsoperator

    i = 7 -> setze i auf 7
    if i = 7 -> WENN i 7 ist ...

    Alternativ kann man CompareTo verwenden

    if i.CompareTo(7) = 0 (dann IST i gleich 7)

    BTW, irgendwie passt das alles eher in GRUNDLAGEN ...
    if i = 7 dann schreibe piep ist ja ok, denke ich.
    Wie kriege ich das jetzt hin das ich sage wenn i 7 enthält (z.B. bei 27, 57 oder 70...) dann schreibe auch piep?
    Und wie mache ich das jetzt genau mit dem Mod das alle Zahlen die durch 7 teilbar sind auch piep ausgibt?
    Tut mir Leid, wenn das jetzt Thread-highjacking ist, aber passt zum Thema.
    Ich habe auch noch nie die Mod-Funktion verstanden.
    Laut MSDN: Divides two numbers and returns only the remainder.

    Für mich bedeutet das:
    1 / 2 = 0,5
    1 Mod 2 = 5 'was aber nicht stimmt, dies ergibt 1

    oder

    100 / 30 = 3,0303030303...
    100 Mod 30 = 03030303... 'was aber nicht stimmt, dies ergibt 1

    Mein Verständnis von Mod ist somit offensichtlich falsch :(
    Für ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln!