Aufgabe Enumeration und Klasse

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Pasta.

    Aufgabe Enumeration und Klasse

    Kann mir jemand hierbei helfen ich weiß nicht was ich falsch mache
    Die Zeit ewird falsch angezeigt und wennich versuch eine Eingabe zu realisieren stürtz mir das Programm ab

    VB.NET-Quellcode

    1. Imports System.Console
    2. Enum Zeiteinheit As Short
    3. Stunde = 1
    4. Minute = 60
    5. Sekunde = 3600
    6. End Enum
    7. Class Zeit
    8. Private m_std As Short = 0
    9. Private m_min As Short = 0
    10. Private m_sek As Short = 0
    11. Public Sub New(ByVal Stunde As Short, ByVal Minute As Short, ByVal Sekunde As Short)
    12. m_std = Stunde
    13. m_min = Minute
    14. m_sek = Sekunde
    15. End Sub
    16. Sub Anzeigen()
    17. WriteLine("Zeit: {0}:{1}:{2}", m_std, m_min, m_sek)
    18. End Sub
    19. Private Function zuSekunden() As Integer
    20. zuSekunden = CInt(m_std * 3600) + (m_min * 60) + (m_sek)
    21. End Function
    22. Sub Addieren(ByVal Anzahl As Short, ByVal Einheit As Zeiteinheit)
    23. Select Case Einheit
    24. Case Zeiteinheit.Sekunde
    25. m_sek += Anzahl
    26. Case Zeiteinheit.Minute
    27. m_min += Anzahl
    28. Case Zeiteinheit.Stunde
    29. m_std += Anzahl
    30. End Select
    31. End Sub
    32. Private Sub zuZeit(ByVal Sekunde As Integer)
    33. m_sek = Sekunde Mod 60
    34. m_min = (Sekunde \ 60) Mod 60
    35. m_std = Sekunde \ 60 * 60
    36. End Sub
    37. Property Zeit(ByVal stunde As Integer, ByVal minute As Integer, ByVal sekunde As Integer) As Integer
    38. Get
    39. stunde = m_std
    40. minute = m_min
    41. sekunde = m_sek
    42. End Get
    43. Set(ByVal value As Integer)
    44. m_std = value
    45. m_min = value
    46. m_sek = value
    47. End Set
    48. End Property
    49. End Class
    50. Module Module1
    51. Sub Main()
    52. Dim z As New Zeit(10, 24, 36)
    53. z.Anzeigen()
    54. z.Addieren(50, Zeiteinheit.Minute)
    55. z.Anzeigen()
    56. z.Addieren(155, Zeiteinheit.Sekunde)
    57. z.Anzeigen()
    58. ReadLine()
    59. End Sub
    60. End Module


    *Topic verschoben, VB-Tag eingefügt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    1) Ist nicht VBScript, sondern VB.Net
    2) Bitte zur Code-Formatierung VB-Tags verwenden.

    2) Für Zeitberechnung und -anzeige verwendet man vernünftigerweise DateTime und Timespan.

    Oder ist das eine Hausaufgabe, bei der dieser manuelle Weg vorgegeben ist?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Mahlzeit,

    1. Bitte VB-Tags verwenden um Code hier im Forum zu posten
    2. Mach mal bitte Option Strict On rein / Stichwort: implizite Konvertierung von "Integer" in "Short"
    3. Überleg mal das so zu machen, wie petaod schon geschrieben hat
    Für Zeitberechnung und -anzeige verwendet man vernünftigerweise DateTime und Timespan.


    Hab mal auf die Schnelle alles was Integer ist gegen Short ausgetauscht, jetzt macht die Console was.
    Zeit: 10:24:36
    Zeit: 10:74:36
    Zeit: 10:74:191

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Console
    3. Enum Zeiteinheit As Short
    4. Stunde = 1
    5. Minute = 60
    6. Sekunde = 3600
    7. End Enum
    8. Class Zeit
    9. Private m_std As Short
    10. Private m_min As Short
    11. Private m_sek As Short
    12. Public Sub New(ByVal Stunde As Short, ByVal Minute As Short, ByVal Sekunde As Short)
    13. m_std = Stunde
    14. m_min = Minute
    15. m_sek = Sekunde
    16. End Sub
    17. Sub Anzeigen()
    18. WriteLine("Zeit: {0}:{1}:{2}", m_std, m_min, m_sek)
    19. End Sub
    20. Private Function zuSekunden() As Integer
    21. zuSekunden = CInt(m_std * 3600) + (m_min * 60) + (m_sek)
    22. End Function
    23. Sub Addieren(ByVal Anzahl As Short, ByVal Einheit As Zeiteinheit)
    24. Select Case Einheit
    25. Case Zeiteinheit.Sekunde
    26. m_sek += Anzahl
    27. Case Zeiteinheit.Minute
    28. m_min += Anzahl
    29. Case Zeiteinheit.Stunde
    30. m_std += Anzahl
    31. End Select
    32. End Sub
    33. Private Sub zuZeit(ByVal Sekunde As Short)
    34. m_sek = Sekunde
    35. m_min = CShort(Sekunde \ 60)
    36. m_std = CShort(Sekunde \ 60 * 60)
    37. End Sub
    38. Property Zeit(ByVal stunde As Short, ByVal minute As Short, ByVal sekunde As Short) As Short
    39. Get
    40. stunde = m_std
    41. minute = m_min
    42. sekunde = m_sek
    43. End Get
    44. Set(ByVal value As Short)
    45. m_std = value
    46. m_min = value
    47. m_sek = value
    48. End Set
    49. End Property
    50. End Class
    51. Module Module1
    52. Sub Main()
    53. Dim z As New Zeit(10, 24, 36)
    54. z.Anzeigen()
    55. z.Addieren(50, Zeiteinheit.Minute)
    56. z.Anzeigen()
    57. z.Addieren(155, Zeiteinheit.Sekunde)
    58. z.Anzeigen()
    59. ReadLine()
    60. End Sub
    61. End Module

    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „mrMo“ ()

    Dieses Forum ist aber kein Hausaufgaben-Service !
    Du klatscht hier einfach code hin, ohne Fehlermeldung, ohne konkrete Frage, ohne ordentliche Formatierung (obwohl du da schon mal drum gebeten wurdest!) und erwartest, daß andere dir den korrigieren ! :thumbdown:




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

    Ob Hausaufgabe oder nicht, ist ja nicht entscheidend. Diese soll dir ja VB näher bringen. Und dafür ist aus meiner Sicht dieses Forum da...

    Was ist den die konkrete Aufgabenstellung? Dann können wir dir bestimmt besser helfen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Das weiß ich auch darum geht es mir auch nicht meine Hausaufgaben von anderen machen zulassen,

    ich möchte meine Aufgabe selbst lösen steck eben fest und hatte gehofft jemand kann mich in die richtige Richtung anstoßen

    Und nun zu Dir Pasta : Ich bin selbst seit 25 Jahren in Cad Foren unterwegs und auch Moderator.
    Meiner Ansicht nach haben, solche Klugscheißer die auf andere herab sehen und meinen sie hätte die Weisheit mit Löffeln gefressen, in Foren nichts zu suchen.
    Wenn wir in den CAD Foren so unfreundlich zu den hilfesuchenden wären, die etwas lernen wollen dann gäbe es diese Foren schon lange nicht mehr.
    So jetz genug Frust abgelassen!

    Apollo schrieb:


    ich möchte meine Aufgabe selbst lösen steck eben fest und hatte gehofft jemand kann mich in die richtige Richtung anstoßen


    ​Sehr löblich. Also, was ist den jetzt die konkrete Aufgabenstellung?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ok das mit den Vb-Tag wußte ich nicht das das so wichtig .
    Werde es das nächste mal beherzigen , aber da kommt sch on die nächst whrrscheinlich blöde Frage wie stelle ich das hier an mit den VB-Tag

    Und hier sind Ihre Aufgaben:
    a) Erstellen Sie eine Enumeration Zeiteinheit mit den Membern Stunde, Minute, Sekunde.
    Deklarieren Sie mit dem (kleinsten) passenden Datentyp.
    Geben Sie den Membern in passender Reihenfolge die Werte 1, 60, 3600, so, dass Sie die hinterlegten Zahlenwerte später zum Rechnen verwenden können.
    b) Definieren Sie eine Klasse Zeit. Sie enthält die privaten Member m_std, m_min, m_sek, die Sie als Short deklarieren.
    c) Schreiben Sie einen Konstruktor, mit dem Sie Objekte der Klasse Zeit mitsamt Zeitangabe erstellen können. Sie übergeben die Werte für Stunde, Minute und Sekunden.
    Der Aufruf ist in der oben abgedruckten Main() enthalten.
    d) Definieren Sie eine Methode Anzeigen. Bei Aufruf wird die Zeit angezeigt, wie oben abgebildet.
    e) Die Klasse enthält die Methode Addieren():Sub Addieren(ByVal Anzahl As Short, ByVal Einheit AsZeiteinheit)
    End SubSie geben einen beliebigen Wert als Anzahl ein, und als zweites Argument, ob es sich um Stunden, Minuten oder Sekunden handelt.
    Zur Verwendung der Prozedur finden Sie im abgedruckten Programm E_1 zwei Aufrufbeispiele in den Zeilen 47 und 49. Im ersten Beispiel werden 50 Minuten addiert, im zweiten 155 Sekunden.
    Zu Ihrer Unterstützung möchte ich noch die folgenden Hinweise hinzufügen:Die Methode Addieren wandelt für interne Berechnung die in den Feldern m_std, m_min, m_sec gespeicherte Zeit in Sekunden um.
    Definieren Sie zu diesem Zweck eine Funktion zuSekunden(), die als Rückgabewert (Integer) die Anzahl der Sekunden erhält, die der im Objekt gespeicherten Zeit entspricht.
    Nun werden die übergebenen Argumente Anzahl und Einheit verwendet und hinzuaddiert.Mittels der Sub-Prozedur zuZeit ( Sekunden as Integer) wird das Ergebnis wieder in den Datenmembern gespeichert.
    Ok, das erklärt warum du über diesen Weg mit Zeiten rechnest...

    Schreib bei dir im VisualStudio im Code gaaaaanz oben (Zeile 1) Option Strict On hin.
    Dann wird dein VS anfangen zu jammern, bitte die markierten Fehler beheben (Gibt ne Fehlerliste, die einfach durcharbeiten).

    Das dir die "falsche" Zeit angezeigt wird z.B.
    Zeit: 10:24:36
    Zeit: 10:74:36
    Zeit: 10:74:191

    Liegt evtl. daran, das deine Stunden, Minuten und Sekunden kein "Ende" haben. Bei Short ergibt z.B. 30 (Min.) + 50 (Min.) eben 80 und nicht 1 Stunde, 20 Minuten. Aber hier gibt dir der Aufgabensteller ja sogar einen Tipp:

    Zu Ihrer Unterstützung möchte ich noch die folgenden Hinweise hinzufügen: Die Methode Addieren wandelt für interne Berechnung die in den Feldern m_std, m_min, m_sec gespeicherte Zeit in Sekunden um.


    Glaube, das hast du hier nicht drin, oder?

    VB.NET-Quellcode

    1. Sub Addieren(ByVal Anzahl As Short, ByVal Einheit As Zeiteinheit)
    2. Select Case Einheit
    3. Case Zeiteinheit.Sekunde
    4. m_sek += Anzahl
    5. Case Zeiteinheit.Minute
    6. m_min += Anzahl
    7. Case Zeiteinheit.Stunde
    8. m_std += Anzahl
    9. End Select
    10. End Sub
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Im Editor auf den je nach gewünschter Sprache entsprechenden Button drücken (rechts). :rolleyes:
    Alle möglichen: [Forum] Welche BBCodes (Tags) gibt es hier im Forum zum Einfärben von Quellcodes (Syntax-Highlighting)?

    Du hast immer noch keine konkrete Frage gestellt ! :rolleyes:
    [Forum] Grundlagen der Forennutzung und warum der Hilfreich-Button kein Stacheldraht ist

    Es gibt hier einen guten Artikel zum Thema debuggen (Ich finde den grade nicht, kann den bitte wer posten), denn solltest du lesen.
    Dann kannst du die Fehler selber nachvollziehen und lernst was dabei.
    ... obwohl ... es sieht sieht nicht so aus, als ob das in deinem Interesse liegt. ?(
    Hilfsmittel sind Bücher, der Debugger, dieses Forum und der eigene Verstand. Hast du dir denn mal das was wir oben geschrieben haben angeschaut?

    Apollo schrieb:

    Die Zeit wird falsch angezeigt und wenn ich versuch eine Eingabe zu realisieren stürzt mir das Programm ab


    Komm schon Pasta, drück mal ein Auge zu, das könnte man doch fast schon als Frage werten ;)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Habe den Artikel gefunden.
    Debuggen, Fehler finden und beseitigen

    edit:

    "Hilfsmittel sind Bücher, der Debugger, dieses Forum und der eigene Verstand."
    Besser so:
    Eigener Verstand, Debugger & Intellisence (IDE beherrschen), Bücher, Google & Co -> Foren, Tutorials, et cetera lesen, ..., in einem Forum fragen, gehe zum Anfang. :D

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

    Ja, scheint wohl ne Standardaufgabe zu sein. Hab grad in google gesucht. Ältester zu dieser Aufgabe gefundener Thread ist von 2007, leider ohne Lösung.

    Hier ein Thread hier im Forum, vielleicht hilf der ein wenig weiter, scheint aber auch ungelöst sein.
    Enumeration und Klasse(Hausaufgabe)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ohne es getestet zu haben:

    VB.NET-Quellcode

    1. Sub Addieren(ByVal Anzahl As Short, ByVal Einheit As Zeiteinheit)
    2. zuZeit(Anzahl * Einheit)
    3. End Sub

    Einheit ist doch bereits der Multiplikator für die Sekunden und zuZeit berechnet aus den Sekunden die Zeit-Properties.
    Was nicht funktionieren wird, ist der Tageswechsel.
    Dazu müsste in zuZeit für die Stunden noch ein Mod 24 eingefügt werden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    VB.NET-Quellcode

    1. Private Sub zuZeit(ByVal Sekunde As Short)
    2. m_sek = Sekunde
    3. m_min = CShort(Sekunde \ 60)
    4. m_std = CShort(Sekunde \ 60 * 60)
    5. End Sub


    Wenn du hier > 60 übergibst dann ist m_sek > 60, was eher unüblich auf normalen Uhren ist :D.

    VB.NET-Quellcode

    1. Property Zeit(ByVal stunde As Short, ByVal minute As Short, ByVal sekunde As Short) As Short
    2. Set(ByVal value As Short)
    3. m_std = value
    4. m_min = value
    5. m_sek = value
    6. End Set
    7. End Property


    Der Setter ist eher schlecht gestaltet - hier wird einfach alles auf value gesetzt. Generell verwendest du die Property überhaupt nicht :O .

    So hätte ich es gelöst:

    VB.NET-Quellcode

    1. Private Function zuSekunden() As Integer
    2. Return CInt(m_std * 3600) + (m_min * 60) + (m_sek)
    3. End Function
    4. Sub Addieren(ByVal Anzahl As Short, ByVal Einheit As Zeiteinheit)
    5. Select Case Einheit
    6. Case Zeiteinheit.Sekunde
    7. m_sek += Anzahl
    8. Case Zeiteinheit.Minute
    9. m_min += Anzahl
    10. Case Zeiteinheit.Stunde
    11. m_std += Anzahl
    12. End Select
    13. zuZeit(zuSekunden())
    14. End Sub
    15. Private Sub zuZeit(ByVal Sekunde As Integer)
    16. m_std = CShort(Math.Floor(Sekunde / 3600))
    17. Sekunde = CShort(Sekunde - m_std * 3600)
    18. m_std = CShort(m_std Mod 24)
    19. m_min = CShort(Math.Floor(Sekunde / 60))
    20. Sekunde = CShort(Sekunde - m_min * 60)
    21. m_sek = CShort(Sekunde)
    22. End Sub

    Auf die Weise verwendest du sogar mal die zuSekunde Methode :)

    8-) faxe1008 8-)