Schaltjahrberechnung (function, Array)

  • VB.NET

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

    Schaltjahrberechnung (function, Array)

    Hallo,

    ich steh schon wieder vor einem Problem.

    folgende Thematik

    Schreiben Sie eine Funktion istSchaltjahr(), die den Rückgabewert true zurückgibt, falls die
    ihr übergebene positive ganze Jahreszahl ein Schaltjahr ist. Im anderen Fall – auch wenn die
    Zahl negativ ist – wird false zurückgegeben.
    Hier die Definition für Schaltjahre:
    ein Jahr ist ein Schaltjahr wenn die Jahreszahl durch 4 oder 400 teilbar ist.
    Ist die Jahreszahl nur durch 100, nicht durch 400 teilbar, so liegt kein Schaltjahr vor.
    Testen Sie Ihre Funktion innerhalb einer angemessenen main-Methode. Diese ermöglicht die
    Eingabe von bis zu 5 Zahlen, die danach auf ihre Schaltjahr-Eigenschaft geprüft werden.
    Jede eingegebene Zahl und das Prüfergebnis werden dann ausgegeben:
    mein VB Ansatz

    VB.NET-Quellcode

    1. Imports System.Console
    2. Module Module1
    3. Dim MyArray() As Integer = {0, 1, 2, 3, 4}
    4. Dim Jahreszahl As Integer
    5. Sub Main()
    6. For i = 1 To MyArray.Length - 1
    7. Write("Bitten geben Sie die " & i & " Jahreeszahl ein")
    8. MyArray(i) = ReadLine()
    9. Next
    10. End Sub
    11. End Module


    jetzt kommt mein eigentliches Problem:

    ich soll das Jahr nun auf Schaljahr oder nicht in Form einer Funktion prüfen.
    also mein Ansatz

    VB.NET-Quellcode

    1. Function IsSchaljahr (ByVal MyArray(i) As Integer) As Boolean


    Leider meckert er bei dem MyArray(i)
    kann ich eine Funtion mit einem Array definieren? oder brauch ich immer eine eindeutige Zahl?


    Bitte um Hilfe.

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

    hallo danke für die antworten.

    das Problem ist. ich soll das ganze mit einem Array lösen.
    jede Zal als Integer einlesen und dann auszuwerten ist einfacher - das ist mir schon klar. . .

    aber es sollen ja 4 zahlen eingegeben und diese dann auf Schaltjahr ja oder nein überprüft werden.

    @picoflop mit deiner lösung für die funktion - da müsste ja dann Jahr einen festen Wert haben.
    also müsste ich dann Jahr1 = MyArray(0) zb. zuweisen oder ?
    und die funktion müsste ich dann für alle 4 Jahreszahlen wiederholen ...

    geht das nicht das ich mit einer Schleife arbeite er soll so oft die Funktion durchführen wie Jahreszahlen (also Arrays) zur Verfügung stehen?
    Hi.

    Zunächst: Achte auf die Typisierung. Stelle grundsätzlich Option Strict auf On.

    Das schwierigste daran ist, dass "bis zu" 5 Zahlen eingegeben werden sollen. Du musst dir also zuerst Gedanken um die Eingabeform machen. Du musst den Benutzer erst nach einer Jahreszahl fragen und danach, ob er eine weitere Zahl eingeben möchte. Diese Eingabeform erfordert ein variables Array, also eine Collection. Den Rest hat picoflop bereits erledigt.

    Die Eingabe könnte ich mir so vorstellen:

    VB.NET-Quellcode

    1. Dim zahlen As New ArrayList
    2. Dim count As Int32 = 0
    3. Dim antwort As String
    4. Do Until count = 5
    5. 'Benutzer zur Eingabe auffordern
    6. Try
    7. zahlen.Add(Int32.Parse(ReadLine()))
    8. Catch ex As FormatException
    9. 'ungültige Zahl, Continue Do
    10. End Try
    11. 'Benutzer nach weiterer Zahl fragen
    12. antwort = ReadLine()
    13. ' - Wenn "j" (Ja): count um 1 erhöhen
    14. ' - Wenn "n" (Nein): Exit Do
    15. Loop
    16. For Each z As Int32 In zahlen
    17. 'Ausgabe: z ist ein Schaltjahr: Rückgabewert von istSchaltjahr (siehe picoflops Post)
    18. Next z


    Diesmal kein Copy&Paste-Code ^^ - Das Gerüst sollte aber ausreichen.
    Gruß
    hal2000
    hallo diesen lösungansatz find ich ja mal super. Leider hab ich mich mit varibalen Arrays noch nicht beschäftigt. und das wir auch noch nicht vorausgesetzt. ich darf die Aufgabe mit einem festen Array von 5 Zahlen lösen.
    Das Gerüst das mein Array 5 Eingaben aufnimmt und dann in 5 verschiedenen Arrays - also MyArray (0) ... MyArray(5) speicht hab ich bereits.

    Leider scheitert es aber an der Funktion die 5 mal jeweils das nächste Array ausliest und dann auf die Schaltjahrfunktion überprüft.

    ein möglicher Ansatz . ..

    VB.NET-Quellcode

    1. Imports System.Console
    2. Module Module1
    3. Sub Main()
    4. Dim MyArray() As Integer = {0, 1, 2, 3, 4, 5}
    5. For i = 1 To MyArray.Length - 1
    6. WriteLine("Bitte geben Sie eine Jahreszahl ein")
    7. MyArray(i) = ReadLine()


    das funktioniert ja aber dann kommt die funktion ...

    VB.NET-Quellcode

    1. Function IsSchaltjahr(ByVal MyArray() As Integer) As Boolean
    2. For Each item In MyArray
    3. If MyArray(0) Mod 400 = 0 Or MyArray(0) Mod 100 Then IsSchaltjahr = True 'Phantasiebedingung bezieht sich nicht auf SChaltjahr
    4. Return True
    5. Next
    6. End Function


    wie muss ich mit der funktion ansetzen das er immer das um ein größeres Array ausliest ? und dann für dieses Array auch den richtigen Rückgabe wert liefert.
    Hi.

    Verwende einfach mein Codegerüst - das Array mit fester Größe ist in deinem Fall ungeeignet, da das Programm vorher nicht weiß, wie viele Zahlen der Benutzer eingeben wird. Wenn er einfach 6 statt maximal 5 Zahlen eingibt, weil es ihm Spaß macht, stürzt dein Programm ab, weil das Array zu klein ist. Ersetze die Kommentare in meinem Code durch ein wenig Eigenarbeit und du bist fertig.
    Gruß
    hal2000

    VB.NET-Quellcode

    1. Imports System.Console
    2. Module Module1
    3. Sub Main()
    4. Dim zahlen As New ArrayList
    5. Dim count As Int32 = 0
    6. Dim antwort As String
    7. Do Until count = 5
    8. WriteLine("Bitte geben Sie eine Jahreszahl ein") 'Benutzer zur Eingabe auffordern
    9. Try
    10. zahlen.Add(Int32.Parse(ReadLine()))
    11. Catch ex As FormatException
    12. If Not IsNumeric(zahlen) Then WriteLine("Bitte geben Sie eine gültige Jahreszahl ein")
    13. WriteLine()
    14. End Try
    15. WriteLine("Möchten Sie eine weitere Jahreszahl hinzufügen - ja oder nein?") 'Benutzer nach weiterer Zahl fragen
    16. WriteLine("Die Eingabe nein beginnt mit der Auswertung")
    17. antwort = ReadLine()
    18. WriteLine()
    19. Select Case antwort
    20. Case "ja"
    21. count += 1
    22. Case "nein"
    23. Exit Do
    24. Case Else
    25. WriteLine("Bitten antworten Sie mit ja oder nein")
    26. End Select
    27. ' - Wenn "j" (Ja): count um 1 erhöhen
    28. ' - Wenn "n" (Nein): Exit Do
    29. Loop
    30. For Each z As Int32 In zahlen
    31. istSchaltjahr(z)
    32. If istSchaltjahr(z) = True Then WriteLine("Das Jahr " & z & " ist ein Schaltjahr")
    33. If istSchaltjahr(z) = False Then WriteLine("Das Jahr " & z & " ist kein Schaltjahr")
    34. 'Ausgabe: z ist ein Schaltjahr: Rückgabewert von istSchaltjahr (siehe picoflops Post)
    35. ReadLine()
    36. Next z
    37. End Sub
    38. Private Function istSchaltjahr(ByVal z As Integer) As Boolean
    39. If z Mod 4 = 0 Or z Mod 400 = 0 Then istSchaltjahr = True
    40. If z Mod 100 = 0 And z Mod 400 <> 0 Then istSchaltjahr = False
    41. End Function
    42. End Module


    Bitte um Korrektur. .. und Anmerkungen . ..
    Hi!
    Hab mal ohne VB drübergesehen.
    Wenn du in Zeile 12 - angenommen - 5 mal eine ungültige Zahl eingibst, und nach der Fehlermeldung anschließend "...weitere Jahreszahl..." JA eingibst, hättest du ab Zeile 35 nicht viel zum Rechnen.

    Die Antwort könntest du in Zeile 20, statt mit ReadLine mit ReadKey abfragen. Damit wird nur ein Zeichen abgefragt, und du könntest anschließend einfach mit "Select Case antwort.toLower" nach den Buchstaben "j" oder "n" abfragen. Damit ersparst du die vollständige Eingabe von "ja" oder "nein".

    Die in Zeile 44 bis 47 deklarierte Funktion...
    Du rufst sie 3x hintereinander auf. In der Zeile 36 rufst du diese Funktion zum ersten Mal auf, überweist den Rückgabewert allerdings nirgendwohin. Ergebnis ist, die Zeile hat Null Auswirkung.

    Der Funktionsname 'istSchaltjahr' sagt ja schon aus, dass, wenn Z ein Schaltjahr ist, dann der Wert True übergeben wird. (das ... = TRUE kann entfallen)
    Weiters ist es nicht empfehlenswert diese Funktion zweimal abzufragen. Für die Zeilen 37 und 38 reicht folgendes Konstrukt:

    VB.NET-Quellcode

    1. If istSchaltjahr(z) then
    2. WriteLine("Das Jahr " & z & " ist ein Schaltjahr")
    3. Else
    4. WriteLine("Das Jahr " & z & " ist kein Schaltjahr")
    5. EndIf

    Das sieht zwar etwas länger aus, ist aber lesbar. (Es geht auch noch kürzer, darunter leidet aber die Übersichtlichkeit)

    Zeile 40: Statt mit ReadLine auf "Enter" zu warten, könntest du mit ReadKey einfach ein Zeichen abfragen, so mache ich es immer.

    Allgemein. Mir gefällt der Stil mit Zeilenabständen, und Kommentaren. (Auch wenn er ganz offensichtlich nur kopiert ist, Siehe Kommentar Zeile 39... Das würde ich so nicht abliefern. )
    hallo,

    danke fürs drüberschauen. .. .

    jo ist kopiert. siehe weiter oben das Gerüst hat mich Hal geliefert auch bereits mit den Kommentaren. ich habe nur noch versucht ein läiuffähiges Programm zu machen. Also vom Sinn und Zweck was das Programm tun muss funktioniert es. Jetza muss ich nur noch schönheitsfehler wie du mir ja freundlicherweiße bereits ein Paar genannt hast. ausmerzen.

    setz mich gleich mal dran.

    Danke fürs drüberschauen.


    Hab mal ohne VB drübergesehen.
    Wenn du in Zeile 12 - angenommen - 5 mal eine ungültige Zahl eingibst, und nach der Fehlermeldung anschließend "...weitere Jahreszahl..." JA eingibst, hättest du ab Zeile 35 nicht viel zum Rechnen.
    OK, danke um das Problem zu lösen muss ich ja nur do Until count auf 100 oder sowas setzen oder ?

    Die Antwort könntest du in Zeile 20, statt mit ReadLine mit ReadKey abfragen. Damit wird nur ein Zeichen abgefragt, und du könntest anschließend einfach mit "Select Case antwort.toLower" nach den Buchstaben "j" oder "n" abfragen. Damit ersparst du die vollständige Eingabe von "ja" oder "nein".
    wenn ich Selcect Case "j" and "n" schreibe dann wird doch auch nur ein Zeichen abgefragt.
    Aber ich werde versuchen diees Read Key einzbauen - bis jetzt kannte ich nur immer readLine.

    Die in Zeile 44 bis 47 deklarierte Funktion...
    Du rufst sie 3x hintereinander auf. In der Zeile 36 rufst du diese Funktion zum ersten Mal auf, überweist den Rückgabewert allerdings nirgendwohin. Ergebnis ist, die Zeile hat Null Auswirkung.
    Könntest du mir das bitte erklären. Der Wert False oder True wird ja zurückgegeben sonst würde das Schaltjahr nicht berechnet werden können.
    oder fehlt dir in der function das Schlüsselwort Return(z) ?

    Der Funktionsname 'istSchaltjahr' sagt ja schon aus, dass, wenn Z ein Schaltjahr ist, dann der Wert True übergeben wird. (das ... = TRUE kann entfallen)
    Weiters ist es nicht empfehlenswert diese Funktion zweimal abzufragen. Für die Zeilen 37 und 38 reicht folgendes Konstrukt:


    Danke hab ich geändert.
    Das sieht zwar etwas länger aus, ist aber lesbar. (Es geht auch noch kürzer, darunter leidet aber die Übersichtlichkeit)

    Zeile 40: Statt mit ReadLine auf "Enter" zu warten, könntest du mit ReadKey einfach ein Zeichen abfragen, so mache ich es immer.

    Allgemein. Mir gefällt der Stil mit Zeilenabständen, und Kommentaren.

    (Auch wenn er ganz offensichtlich nur kopiert ist, Siehe Kommentar Zeile 39... Das würde ich so nicht abliefern. )

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

    Die in Zeile 44 bis 47 deklarierte Funktion...
    Du rufst sie 3x hintereinander auf. In der Zeile 36 rufst du diese Funktion zum ersten Mal auf, überweist den Rückgabewert allerdings nirgendwohin. Ergebnis ist, die Zeile hat Null Auswirkung.
    Könntest du mir das bitte erklären. Der Wert False oder True wird ja zurückgegeben sonst würde das Schaltjahr nicht berechnet werden können.
    oder fehlt dir in der function das Schlüsselwort Return(z) ?

    Zeile 36

    VB.NET-Quellcode

    1. istSchaltjahr(z)

    Du rufst hier die Funktion auf, sie wird auch (korrekt) abgearbeitet, aber der Rückgabewert geht verloren, weil er nirgends zugewiesen wird. (z.B. Ergebnis = istSchaltjahr(z) )


    Wenn du in Zeile 12 - angenommen - 5 mal eine ungültige Zahl eingibst, und nach der Fehlermeldung anschließend "...weitere Jahreszahl..." JA eingibst, hättest du ab Zeile 35 nicht viel zum Rechnen.
    OK, danke um das Problem zu lösen muss ich ja nur do Until count auf 100 oder sowas setzen oder ?

    möglicher Pseudocode:

    Quellcode

    1. do 5x
    2. schleife
    3. eingabe=console.readline()
    4. wenn die fehlermeldung von einem vorherigen durchlauf noch da ist... dann weg damit
    5. wenn zahl ist gültig
    6. in deinem Feld dazuspeichern
    7. exit schleife
    8. sonst
    9. fehlermeldung...
    10. end schleife
    11. bei abbruchbedingung verlasse Schleife vorzeitig (wenn keine weiteren Zahlen erwünscht sind...)
    12. loop
    Der Code in Post #13 ist bereits in Ordnung, so wie er ist. Um das Problem mit den 5 ungültigen Zahlen zu lösen fehlt einfach ein 'Continue Do' in der (noch leeren) Zeile 16. Dann wird auch nicht gefragt, ob eine neue Zahl eingegeben werden soll - das hatte der Benutzer ja schonmal mit ja beantwortet und hat sich vielleicht nur vertippt.
    Gruß
    hal2000