1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Visual Basic – Stunde, Minute oder Sekunde soll zu Zeit addiert werden

Discussion in 'Programmieren' started by LuanMalcolm, Aug 27, 2007.

Thread Status:
Not open for further replies.
  1. Hallo!

    Als Visual Basic Neuling habe ich ein Problem damit, ein Programm zu schreiben (eine Hausaufgabe), was gewissen Vorgaben unbedingt entsprechen muss. Es soll zu einer bestehenden Zeit etwas hinzuaddiert werden. Per Auswahl Stunde, Sekunde oder Minute soll dies wie folgt geschehen:

    Module abc
    Sub Main()
    Dim z = New Zeit(10, 24, 36)
    z.Anzeigen()
    z.Addieren(50, Zeiteinheit.Minute)
    ReadLine()
    z.Anzeigen()
    z.Addieren(135, Zeiteinheit.Sekunde)
    z.Anzeigen()
    ReadLine()
    End Sub

    Allerdings habe ich ein Problem damit, dies in der Klasse Zeit entsprechend zu verankern.:confused:
    Vielleicht kann mir ja jemand einen Ratschlag geben, wie ich der Lösung etwas näher komme.:eek:

    Hinweise in der Aufgabenstellung (die mich mehr verwirren als mir helfen):
    - Eine Methode Addieren soll die bestehende Zeit in Sekunden umwandeln
    - Dazu soll die Funktion zuSekunden() dienen
    - Nun sollen die übergebenden Argumente Anzahl und Einheit verwendet und hinzuaddiert werden.
    - mittels einer Sub-Prozedur zuZeit( iSekunden as integer) wird das Ergebnis in den Datenmembern gespeichert

    Hier nun das Basisgerüst der Enum und Klasse:



    Imports System.Console
    Enum Zeiteinheit As Integer
    Stunde = 3600
    Minute = 60
    Sekunde = 1
    End Enum

    Class Zeit
    Private m_std As Short
    Private m_min As Short
    Private m_sek As Short
    Sub Anzeigen() ’Ausgabe der Zeit
    Write("Zeit: {0}:{1}:{2}", m_std, m_min, m_sek)
    End Sub

    Function zuSekunden(ByVal Sekunden As Integer)
    Sekunden = CInt((3600 * m_std) + (60 * m_min) + m_sek)
    End Function

    Sub Addieren(ByVal Anzahl As Short, ByVal Einheit As Zeiteinheit)
    Select Case Zeiteinheit
    ’-----hier bin ich mir nicht sicher. Select Case sinnvoll?
    Case "Stunden"
    Anzahl = ?
    Case "Minuten"
    Anzahl = ?
    Case "Sekunden"
    Anzahl = ?
    End Select
    End Sub

    Private Sub zuZeit(ByVal Sekunden As Integer)
    m_sek = Sekunden Mod 60
    m_min = (Sekunden \ 60) Mod 60
    m_std = Sekunden \ 60 * 60
    End Sub

    Module abc
    Sub Main()
    Dim z = New Zeit(10, 24, 36)
    z.Anzeigen()
    z.Addieren(50, Zeiteinheit.Minute)
    ReadLine()
    z.Anzeigen()
    z.Addieren(135, Zeiteinheit.Sekunde)
    z.Anzeigen()
    ReadLine()
    End Sub
    End Module

    PS: Natürlich gibt es auch andere Lösungswege wie den Folgenden, allerdings soll es nicht auf diesem Weg geschehen geschehen.

    Dim d1 As New Date(1, 1, 1, 10, 24, 36)
    Console.WriteLine(d1.ToString("hh:mm:ss"))
    d1 = d1.AddMinutes(50)
    Console.ReadLine()
    Console.WriteLine(d1.ToString("hh:mm:ss"))
    d1 = d1.AddSeconds(135)
    Console.WriteLine(d1.ToString("hh:mm:ss"))
    Console.ReadLine()
     
  2. Ich bin mit dem Syntax von VB2005 nicht vertraut, aber generell kann man sagen:

    In der Funktion 'Addieren':

    Code:
    Sub Addieren(ByVal Anzahl As Short, ByVal Einheit As Zeiteinheit) 
    Select Case Zeiteinheit 
    ’-----hier bin ich mir nicht sicher. Select Case sinnvoll?
    Case "Stunden"
    Anzahl = ?
    Case "Minuten"
    Anzahl = ?
    Case "Sekunden"
    Anzahl = ?
    End Select
    End Sub
    
    Kann man durchaus ein Select Case verwenden. Allerdings musst du die Fallunterscheidung natürlich für die Variable und nicht für den Datentyp durchführen. Zudem vergleichst du hier eine Zeichenkette mit einem Enum. Das kann schon nicht gut gehen. Anzahl ist zudem eine Variable die nur innerhalb der Funktion Addieren gültig ist. D.h. nach dem Aufruf der Funktion, kannst du auf diese Variable von außen nicht mehr zugreifen. Deshalb musst du eine Variable anlegen, die im Sichtbarkeitsbereich der Klasse liegt. Das hast du ja auch mit

    Code:
    Private m_std As Short
    Private m_min As Short
    Private m_sek As Short
    
    gemacht. Also musst du eine von den 3 Variablen verwenden. Allerdings würde ich dir raten, nur eine Variable vom Typ Int zu verwenden, in denen du nur die Sekunden speicherst. Dann kannst du in den Select Case zweigen nämlich problemlos die Werte des Enum hinzufügen. Den Rest solltest du dann eigentlich auch hinkriegen.
     
  3. Harvey82

    Harvey82 ROM

    Hallo ich bin grad in den Anfängen und hab auch ein Problem mit der gleichen Aufgabe, irgendein Fehler ist in meinem Programm, nur weiß ich nicht wo... vielleicht kann ja mal jemand drüber schauen
    :bitte:

    Imports System.Console
    Enum Zeiteinheit As Short
    Stunde = 3600
    Minute = 60
    Sekunde = 1
    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 = 1
    m_min = 1
    m_sek = 1
    End Sub
    Sub Anzeigen()
    WriteLine("Zeit: {0}:{1}:{2}", m_std, m_min, m_sek)
    End Sub
    Private Function zuSekunden() As Integer
    zuSekunden = CInt(m_std * 3600) + (m_min * 60) + (m_sek)
    End Function
    Sub Addieren(ByVal Anzahl As Short, ByVal Einheit As Zeiteinheit)
    Select Case Einheit
    Case Zeiteinheit.Stunde
    m_sek = Zeiteinheit.Stunde * Anzahl
    Case Zeiteinheit.Minute
    m_sek = Zeiteinheit.Minute * Anzahl
    Case Zeiteinheit.Sekunde
    m_sek = Zeiteinheit.Sekunde * Anzahl
    End Select
    End Sub
    Private Sub zuZeit(ByVal Sekunden As Integer)
    m_sek = Sekunden Mod 60
    m_min = (Sekunden \ 60) Mod 60
    m_std = Sekunden \ 60 * 60
    End Sub
    End Class

    Module abc
    Sub Main()
    Dim z As New Zeit(10, 24, 36)
    z.Anzeigen()
    z.Addieren(50, Zeiteinheit.Minute)
    z.Anzeigen()
    z.Addieren(135, Zeiteinheit.Sekunde)
    z.Anzeigen()
    ReadLine()
    End Sub
    End Module
     
  4. Harvey82

    Harvey82 ROM

    Schade das keiner antwortet:heul:

    Wenigstens ein kleiner Tip???:bitte::bahnhof:

    Wären dafür echt sehr dankbar!
     
Thread Status:
Not open for further replies.

Share This Page