Terminberechnungsfunktion

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

schalli

Betreff: Terminberechnungsfunktion

BeitragMo, Aug 31, 2009 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Für mein Programm TERMIvention habe ich vor längerer Zeit hier von onkelz89 einen Code bekommen, den ich so anwende:
Code: [AUSKLAPPEN]
Function Betweendays(Tag,Monat,JahrN,enddate)
  momdate=Tag+"."+Monat+"."+JahrN
  While momdate<>enddate

  If Tag<28 Then
    Tag=Tag+1
  Else
    If Monat<>2 Then
      If Monat=1 Or Monat=3 Or Monat=5 Or Monat=7 Or Monat=8 Or Monat=10 Or Monat=12 Then
        If Tag<31 Then
          Tag=Tag+1
        Else
          Tag=1
          Monat=Monat+1
        EndIf
      Else
        If Tag<30 Then
          Tag=Tag+1
        Else
          Tag=1
          Monat=Monat+1
        EndIf
      EndIf
    Else
      Schaltjahr#=JahrR#/4
        If RSet(Schaltjahr#,1)<>0 Then
          If Tag<28 Then
            Tag=Tag+1
          Else
            Tag=1
            Monat=Monat+1
          EndIf
        Else
          If Tag<29 Then
            Tag=Tag+1
          Else
            Tag=1
            Monat=Monat+1
          EndIf
       EndIf
    EndIf
  EndIf
  If Monat>12 Then
    Monat=1
    JahrN=JahrN+1
    JahrR#=JahrR#+1
  EndIf

  momdate=Tag+"."+Monat+"."+JahrN
  zahl=zahl+1

  Wend
  Return zahl
End Function

Mein Problem:
Worklog-Zitat:
Die Terminfunktion rechnet immer einen Tag dazu, bis das Anfangs- und das Enddatum übereinstimmen. Jetzt sollte eigentlich das Programm eigentlich in eine Endlosschleife geraten, wenn man ihm eine Aufgabe wie von 7.11.2009 bis 6.11.2009. Das tut es aber nicht sondern gibt 29 zurück. Warum weiß ich nicht und bevor ich das nicht weiß, komme ich nicht voran.

Kann mir jemand sagen, warum das oben genannte passiert?

Xeres

Moderator

BeitragMo, Aug 31, 2009 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Sicher, dass die Datentypen überhaupt richtig sind? Ich meine, gleich in der ersten Zeile sollte das schon mal ein String sein...
Code: [AUSKLAPPEN]
momdate=Tag+"."+Monat+"."+JahrN


Edit:
Zum eigentlichen Problem: Warum Vergleichst du nicht beide Daten und lieferst -1 zurück, wenn das Enddatum vor dem Startdatum liegt?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

schalli

BeitragMo, Aug 31, 2009 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres: Weil ich dann die ganze Funktion umprogrammieren müsste, und da ist mir eine Endlosschleife, die ich nach eine Zeit stoppen kann lieber.

Xeres

Moderator

BeitragMo, Aug 31, 2009 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Endlosschleife ist dir lieber? Na wenn du meinst.
Ich würde das anderes Regeln...

BlitzBasic: [AUSKLAPPEN]
Local StartDate$="1.2.2004"
Local EndDate$="5.3.2004"

Print (Betweendays(StartDate$, EndDate$))
WaitKey
End


Function Betweendays(StartDate$,EndDate$)
Local Tag = Int(nwort(StartDate$,1))
Local Monat = Int(nwort(StartDate$,2))
Local Jahr = Int(nwort(StartDate$,3))

Local TagE = Int(nwort(EndDate$,1))
Local MonatE = Int(nwort(EndDate$,2))
Local JahrE = Int(nwort(EndDate$,3))

If ((TagE + MonatE*30 + JahrE*365) - (Tag + Monat*30 + Jahr*365)) < 0 Then Return -1

Local momdate$ = StartDate$

Local Schaltjahr#, JahrR#, zahl
While momdate$<>EndDate$

If Tag<28 Then
Tag=Tag+1
Else
If Monat<>2 Then
If Monat=1 Or Monat=3 Or Monat=5 Or Monat=7 Or Monat=8 Or Monat=10 Or Monat=12 Then
If Tag<31 Then
Tag=Tag+1
Else
Tag=1
Monat=Monat+1
EndIf
Else
If Tag<30 Then
Tag=Tag+1
Else
Tag=1
Monat=Monat+1
EndIf
EndIf
Else
Schaltjahr#=JahrR#/4
If RSet(Schaltjahr#,1)<>0 Then
If Tag<28 Then
Tag=Tag+1
Else
Tag=1
Monat=Monat+1
EndIf
Else
If Tag<29 Then
Tag=Tag+1
Else
Tag=1
Monat=Monat+1
EndIf
EndIf
EndIf
EndIf
If Monat>12 Then
Monat=1
Jahr=Jahr+1
JahrR#=JahrR#+1
EndIf

momdate$=Tag+"."+Monat+"."+Jahr
zahl=zahl+1

Wend
Return zahl
End Function

; SpionAtom:
; satz$ ist der zu untersuchende String wort gibt an, das wievielte Wort gesucht werden soll
; https://www.blitzforum.de/forum/viewtopic.php?t=18819
Function nwort$(satz$, wort, trenn$=".")
If wort < 1 Then Return ""
satz$ = satz$ + trenn$
Local pos = 1, w, x, y
While w < wort And pos > 0
While Mid$(satz$, pos, 1) = trenn$
pos = pos + 1
Wend
x = pos
y = Instr(satz$, trenn$, pos)
pos = y
w = w + 1
Wend
Return Mid$(satz$, x, y - x)
End Function
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

schalli

BeitragMo, Aug 31, 2009 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres: Bei folgender Aufgabe in deinem Code: [AUSKLAPPEN]
Local StartDate$="1.2.2004"
Local EndDate$="31.1.2004"

gerät das Programm in eine Endlosschleife, bei dieser jedoch nicht:
Code: [AUSKLAPPEN]
Local StartDate$="1.2.2004"
Local EndDate$="30.1.2004"

Hier gibt es -1 zurück, aber es ist doch -2.
Na ja, trotzdem danke für den Versuch.

EDIT: Bei einer Endlosschleife hätte ich nach vier Jahren abgebrochen, weiter im Vorraus kann man in meinem Programm keine Termine anlegen. Es geht mir nur darum, dass ich weiß, wann ich einen Termin automatisch löschen kann und da hätte meine Idee gereicht. Aber mit negativen Zahlen ist es natürlich besser.

Xeres

Moderator

BeitragMo, Aug 31, 2009 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei der Datumsüberprüfung handelt es sich nur um eine Abschätzung. Entweder erhöht man die "Wertigkeit" eines Monats auf 31 Tage...
Code: [AUSKLAPPEN]
If ((TagE + MonatE*31 + JahrE*365) - (Tag + Monat*31 + Jahr*365)) < 0 Then Return -1

oder man macht eine längere aber sichere Überprüfung mit If..else usw.
code an dieser stelle war doof und nicht funktionsfähig... Die Abschätzung ist sehr viel einfacher als viele Verschachtelte If-Blöcke...

Edit2: Okay, so viele sind es doch nicht...
Code: [AUSKLAPPEN]
   If JahrE < Jahr Then
      Return -1
   ElseIf JahrE = Jahr And MonatE < Monat Then
      Return -1
   ElseIf JahrE = Jahr And MonatE = Monat And TagE < Tag Then
      Return -1
   EndIf

Um statt dem Ergebnis -1 (EndDatum liegt vor dem Startdatum) die Anzahl von Tagen zu erhalten, musst du Start- und Enddatum vertauschen und ggf. am schluss mit -1 Multiplizieren und die Zeitliche "Richtung" an zu zeigen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group