Überschneidung von Zeiträumen

Anfängerfragen zum Programmieren mit PureBasic.
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

Überschneidung von Zeiträumen

Beitrag von ThoPie »

Hallo Leute, ich brauche mal eure Hilfe

Ich habe bis jetzt diese Procedure zur Ermittlung von Überschneidungen von 2 Zeiträumen

Code: Alles auswählen

; Überprüfung auf Überschneidung von zwei Zeiträumen
; Eingangsparameter: BZR1 - Beginn des 1. Zeitraumes (JJJJ-MM-TT)
;                    EZR1 - Ende des 1. Zeitraumes (JJJJ-MM-TT), leer möglich
;                    BZR2 - Beginn des 2. Zeitraumes (JJJJ-MM-TT)
;                    EZR2 - Ende des 2. Zeitraumes (JJJJ-MM-TT), leer möglich
; Ausgangsparameter: 0 - es gibt keine Überschneidung
;                    1 - es gibt eine Überschneidung
Procedure.i HabenZeitraeumeUeberschneidung(BZR1.s,EZR1.s,BZR2.s,EZR2.s)
  If EZR1>"" And EZR2>""
    ; Zeitraum 1 in Zeitraum 2
    If (BZR1>=BZR2 And BZR1<=EZR2) Or (EZR1>=BZR2 And EZR1<=EZR2)
      ProcedureReturn 1
    EndIf
    ; Zeitraum 2 in Zeitraum 1
    If (BZR2>=BZR1 And BZR2<=EZR1) Or (EZR2>=BZR1 And EZR2<=EZR1)
      ProcedureReturn 1
    EndIf
  ElseIf EZR1="" And EZR2=""
    ; Zeitraum 1 und Zeitraum 2 haben offenes Ende
    ProcedureReturn 1
  ElseIf EZR1>"" And EZR2=""
    If BZR1>=BZR2 Or EZR1>=BZR2
      ProcedureReturn 1
    EndIf
  ElseIf EZR1="" And EZR2>""
    If BZR2>=BZR1 Or EZR2>=BZR1
      ProcedureReturn 1
    EndIf  
  EndIf
  ProcedureReturn 0
EndProcedure
Die Enden der Zeiträume können offen sein. Soweit funktioniert diese Prozedur auch. Nun muss ich die aber erweitern, so dass auch offene Beginnzeiträume zugelassen werden. Irgendwie komme ich da immer durcheinander und verstricke mich. Kann mir jemand dabei behilflich sein - vielleicht gehts ja auch viel einfacher.

Vielen Dank für eure Mühe.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Überschneidung von Zeiträumen

Beitrag von NicTheQuick »

Du musst die Zeiträume ja nur nach Startzeit sortieren und dann schauen, ob der spätere Startzeitpunkt vor dem Ende des anderen liegt. Dann überschneiden sie sich.

Code: Alles auswählen

Überschneidung     keine Überschneidung

|––––––|           |––––––|
     |––––––|                 |––––––|

···––––|           ···––––|
     |––––––|                 |––––––|

···––––|           ···––––|
     |––––···                 |––––···
Falls beide keine Startzeit haben, überschneiden sie sich immer, wenn sie kein Ende haben, ebenfalls.

Code: Alles auswählen

···––––|
···–––––––––|

|–––––––––···
     |––––···
Falls der frühere Startzeitpunk kein Ende hat, überschneiden sie sich.

Code: Alles auswählen

|–––––––––···
     |––––···

|–––––––––···
     |––––––|
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Überschneidung von Zeiträumen

Beitrag von STARGÅTE »

Sowas habe ich ja noch nie gesehen: Ein größer-gleich-Vergleich mit String?
Ist das offiziell zugelassen?
Wie sind denn da die regeln? Scheinbar wird ein Zeichen-für-Zeichen-Ascii-Vergleich durchgeführt.

Auch wenn es nicht teil der Frage ist, aber ich würde hier lieber auf TimeStamps umsteigen, mit denen kann man dann auch leichter Rechnen (subtrahieren und addieren)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Überschneidung von Zeiträumen

Beitrag von 7x7 »

Die Logik ist eigentlich recht einfach.

Code: Alles auswählen

; Voraussetzung:
;Anfangs-und Endzeiten mit Date() in numerische Werte umwandeln
;leere Anfangszeiten auf (numerisch) Null setzen
;leere Endzeiten auf den Maximalwert von Date() setzen

Teil1:
;Aus der Sicht von Zeitfenster A gegen Zeitfenster B prüfen
If BZR1<=BZR2	
	If EZR1<=BZR2
		ProcedureReturn 0
	Else
		ProcedureReturn 1
	EndIf
EndIf

If BZR1=>EZR2
	ProcedureReturn 0
Else
	ProcedureReturn 1
EndIf


Teil2:
;Aus der Sicht von Zeitfenster B gegen Zeitfenster A prüfen
If BZR2<=BZR1	
	If EZR2<=BZR1
		ProcedureReturn 0
	Else
		ProcedureReturn 1
	EndIf
EndIf

If BZR2=>EZR1
	ProcedureReturn 0
Else
	ProcedureReturn 1
EndIf

Teil2 könnte man sich sparen, wenn man Zeitfenster A und Zeitfenster B "swapt" und Teil1 nochmal aufruft

(Code ist nicht getestet und ich setze voraus, dass wenn das Ende eines Zeitfensters mit dem Beginn des anderen Zeitfensters GLEICH ist, dass das KEINE Überschneidung bedeutet!)
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Überschneidung von Zeiträumen

Beitrag von NicknameFJ »

STARGÅTE hat geschrieben:(...) Ein größer-gleich-Vergleich mit String? Ist das offiziell zugelassen?
Wie sind denn da die regeln? Scheinbar wird ein Zeichen-für-Zeichen-Ascii-Vergleich durchgeführt.
Hallo Stargate,

ist in allen mir bekannten Basic-Dialekten eine dokumentierte Art Strings zu vergleichen.

ja, zeichenweiser - Ascii Vergleich:
also: "19" > "121" wird #true ergeben


Grüße

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

Re: Überschneidung von Zeiträumen

Beitrag von ThoPie »

Danke euch allen.
Habs jetzt so gemacht.

Code: Alles auswählen

; Überprüfung auf Überschneidung von zwei Zeiträumen
; Eingangsparameter: BZR1 - Beginn des 1. Zeitraumes (JJJJ-MM-TT), leer möglich
;                    EZR1 - Ende des 1. Zeitraumes (JJJJ-MM-TT), leer möglich
;                    BZR2 - Beginn des 2. Zeitraumes (JJJJ-MM-TT), leer möglich
;                    EZR2 - Ende des 2. Zeitraumes (JJJJ-MM-TT), leer möglich
; Ausgangsparameter: 0 - es gibt keine Überschneidung
;                    1 - es gibt eine Überschneidung
Procedure.i HabenZeitraeumeUeberschneidung(BZR1.s,EZR1.s,BZR2.s,EZR2.s)
  If (BZR1="" And BZR2="") Or (EZR1="" And EZR2="")
    ProcedureReturn 1  
  EndIf
  If BZR2<BZR1
    Swap BZR1,BZR2  
    Swap EZR1,EZR2 
  EndIf
  If EZR1=""
    ProcedureReturn 1
  EndIf
  If BZR2<=EZR1
    ProcedureReturn 1  
  EndIf
  ProcedureReturn 0
EndProcedure
Falls jemand noch Anmerkungen/Verbesserungen hat, bitte melden.
Danke nochmal
Bild
Antworten