Announcement

Collapse
No announcement yet.

Enumeration und Klassen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Enumeration und Klassen

    Ich verzweifel wieder mal. Ich hab ein ganz "simples" Programm geschrieben um Klassen und Enumerationen besser zu verstehen. Aber irgendwie ist das Ergebnis nicht das was ich will. Das Programm soll folgendes machen:

    Ich gebe am Anfang einen Zeit vor. Hier 10:24:36 Uhr. Dazu sollen dann erst 50 Minuten und im nächsten Schritt 135 Sekunden dazu gerechnet werden. Leider hab ich irgendwo noch einen Fehler und ich komm nicht weiter.



    Code:
    Imports System.Console
    Enum Zeiteinheit As Short
         Stunde = 1
         Minute = 60
         Sekunde = 3600
    End Enum
    Class Zeit
        Private m_std As Short
        Private m_min As Short
        Private m_sek As Short
        Public Sub New(ByVal m_std As Short, ByVal m_min As Short, ByVal m_sek As Short)
            m_std = Zeiteinheit.Stunde
            m_min = Zeiteinheit.Minute
            m_sek = Zeiteinheit.Sekunde
        End Sub
        Sub Anzeige()
            WriteLine("Zeit:   {0,2}:{1,2}:{2,2}", m_std, m_min, m_sek)
        End Sub
        Sub Addieren(ByVal Anzahl As Short, _
                     ByVal Einheit As Zeiteinheit)
    
        End Sub
        Private Sub zuSekunde(ByVal Sekunde As Integer)
    
        End Sub
        Private Sub zuZeit(ByVal Sekunde As Integer)
            m_sek = Sekunde Mod 60
            m_min = (Sekunde \ 60) Mod 60
            m_std = Sekunde \ 60 * 60
        End Sub
    End Class
    
    Module abc
        Sub Main()
            Dim z As New Zeit(10, 24, 36)
            z.Anzeige()
            z.Addieren(50, Zeiteinheit.Minute)
            z.Anzeige()
            z.Addieren(135, Zeiteinheit.Sekunde)
            z.Anzeige()
            ReadLine()
        End Sub
    End Module
    Ich hoffe ihr versteht was ich mein und könnt mir helfen!?

    Danke schonmal für eure Mühe
    Zuletzt editiert von Yazu; 18.08.2008, 08:45.

  • #2
    Also als erstes Mal tust du in deinem Modul die Prozedur Addieren aufrufen und übergibst Parameter. Die Prozedur ist allerdings in deiner Klasse leer.

    Zum zweiten erstellst du eine neue Instanz der Klasse Zeit und rufst den Konstruktor auf:

    Dim z As New Zeit(10, 24, 36)
    Die Übergebenen Werte werden dann aber auch gleich direkt von dir wieder überschrieben:

    m_std = Zeiteinheit.Stunde
    m_min = Zeiteinheit.Minute
    m_sek = Zeiteinheit.Sekunde
    Damit sind die Werte folgende:

    m_std = 1
    m_min = 60
    m_sek = 3600

    Und warum kommt es dann zur 0:0:0 anzeige anstelle von 1:60:3600 ?
    Ganz einfach: Du überschreibst nähmlich NICHT die von dir Global definierten Variablen der Klasse (m_std usw.) sondern die Variablen, die du in der Parameterangebe des Konstruktors angegeben hast. Und sobald du sie dann überschrieben hast, ist der Sub beendet und die Variablen verfallen.

    Das dürfte alles sein denke ich, war ziemlich schwer sich einzulesen so unformatiert!

    Mfg, Myst

    Comment


    • #3
      Wie übergeb ich den die Variablen ohne das sie verfallen am ende vom sub?
      Zuletzt editiert von Yazu; 18.08.2008, 08:46.

      Comment


      • #4
        Hiho Yazu.

        Das ist ganz simpel: Benenne einfach die Variablen bei den Parametern des Konstruktors um. Des weiteren wäre es noch ratsam die übergebenen Parameter dann auch an deine globalen Variablen zu binden

        Bsp:

        Code:
        Class Zeit
            Private m_std As Short
            Private m_min As Short
            Private m_sek As Short
            
            Public Sub New(ByVal stunden As Short, ByVal minuten As Short, ByVal sekunden As Short)
                m_std = stunden
                m_min = minuten
                m_sek = sekunden
            End Sub
        
            'Noch mehr Code..
        
        End Class

        Comment


        • #5
          Bin jetzt ein ganzes stück weiter....Hab nur noch das Problem das mir keine "richtige" uhrzeit angezeigt wird. Würde das ganze gern noch in Sekunden umrechenen lassen und sauberer addierern:

          Code:
          Imports System.Console
          Enum Zeiteinheit As Short
              Stunde = 1
              Minute = 60
              Sekunde = 3600
          End Enum
          Class Zeit
              Private m_std As Short = 0
              Private m_min As Short = 0
              Private m_sek As Short = 0
              Public Sub New(ByVal Stunde As Short, ByVal Minute As Short, ByVal Sekunde As Short)
                  m_std = Stunde
                  m_min = Minute
                  m_sek = Sekunde
              End Sub
              Sub Anzeige()
                  WriteLine("Zeit: {0,2}:{1,2}:{2,2}", m_std, m_min, m_sek)
              End Sub
              Sub Addieren(ByVal Anzahl As Short, ByVal Einheit As Zeiteinheit)
                  Select Case Einheit
                      Case Zeiteinheit.Sekunde
                          m_sek += Anzahl
                      Case Zeiteinheit.Minute
                          m_min += Anzahl
                      Case Zeiteinheit.Stunde
                          m_std += Anzahl
                  End Select
              End Sub
              Public Function zusekunden(ByVal istunde As Short, ByVal iminute As Short, ByVal isekunde As Short) As Integer
          
              End Function
              Private Sub zuZeit(ByVal Sekunde As Integer)
                  m_sek = Sekunde Mod 60
                  m_min = (Sekunde \ 60) Mod 60
                  m_std = Sekunde \ 60 * 60
              End Sub
          End Class
          
          Module abc
              Sub Main()
                  Dim z As New Zeit(10, 24, 36)
                  z.Anzeige()
                  z.Addieren(50, Zeiteinheit.Minute)
                  z.Anzeige()
                  z.Addieren(135, Zeiteinheit.Sekunde)
                  z.Anzeige()
                  ReadLine()
              End Sub
          End Module
          Zuletzt editiert von Yazu; 19.08.2008, 09:22.

          Comment


          • #6
            Gut gemacht Yazu. Sieht ja schon ganz ordentlich aus

            Hier mal ein Vorschlag für deine Prozedur Addieren:

            Code:
                Sub Addieren(ByVal Anzahl As Short, ByVal Einheit As Zeiteinheit)
                    Select Case Einheit
                        Case Zeiteinheit.Sekunde
                            m_sek += Anzahl
            
                            If m_sek >= 60 Then
                                Do Until m_sek < 60
                                    m_min = m_min + 1
                                    m_sek = m_sek - 60
                                Loop
                            End If
            
                            If m_min >= 60 Then
                                Do Until m_min < 60
                                    m_std = m_std + 1
                                    m_min = m_min - 60
                                Loop
                            End If
            
                        Case Zeiteinheit.Minute
                            m_min += Anzahl
            
                            If m_min >= 60 Then
                                Do Until m_min < 60
                                    m_std = m_std + 1
                                    m_min = m_min - 60
                                Loop
                            End If
            
                        Case Zeiteinheit.Stunde
                            m_std += Anzahl
                    End Select
                End Sub
            Bei mir war dann das gewünschte Ergebnis zu sehen.
            Achte darauf, dass die Stunden immernoch 24 überschreiten können.

            Mfg Myst

            Comment


            • #7
              Super...Danke dir...Langsam steig ich da bissle dahinter

              Comment

              Working...
              X