Min - und Max - Funktion

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Min - und Max - Funktion

Beitrag von Mok »

Kaeru Gaman hat geschrieben:@Kevin:
check deinen code noch mal, da ist mindestens ein Tippfehler drin.
Also bei mir funzt der Code
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Min - und Max - Funktion

Beitrag von Kaeru Gaman »

schau genau

... laufen tut er bei mir auch ...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: Min - und Max - Funktion

Beitrag von Kevin »

... ich finde denn fehler nicht
meinst du vielleicht das einrücken ?

Code: Alles auswählen

Macro Min(var, min)
  If var < min
    var = min
  EndIf
EndMacro

Macro Max(var, max)
  If var > max
    var = max
  EndIf
EndMacro


Dim Test(1)
Test(1) = -90

bla = 4021


Debug "Test(1)= " + Str(Test(1))
Debug "min= 0"
Min(Test(1), 0)
Debug "Test(1)= " + Str(Test(1))

Debug ""

Debug "bla= " + Str(bla)
Debug "max= 4000"
Max(bla, 4000)
Debug "bla= " + Str(bla)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Min - und Max - Funktion

Beitrag von Kaeru Gaman »

meinst du vielleicht das einrücken ?
also bitte, ich werde doch irgendwelche Einrück-Schwächen nicht als "Fehler" bezeichnen...
... ich finde denn fehler nicht
Tjaaaa...
dann teste doch mal die Ergebnisse
schau dir einfach an, was dein zweiter Code wirklich ausgibt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Min - und Max - Funktion

Beitrag von Kaeru Gaman »

okay.... ich bin drauf gekommen wo das Problem liegt.

es handelt sich um ein Mißverständnis.

eine Min() oder Max() Funktion dient nicht dazu, einen Wert auf bestimmte Grenzen zu beschränken.
das ist das was dein Code tut.

sie dienen dazu, den kleinsten bzw. größten Wert einer Reihe von Werten zu ermitteln.
davon tut deine Funktion das genaue Gegenteil.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: Min - und Max - Funktion

Beitrag von Kevin »

oh das habe ich wohl falsch verstanden ...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Min - und Max - Funktion

Beitrag von Kaeru Gaman »

das ist ja nicht schlimm....

für eine Min/Max Ermittlung wäre ja auch eine Funktion die einen der Werte verändert nicht so dolle gewesen.

aber für eine Min/Max Festlegung, wie du das aufgefasst hattest, ist das Macro das den Wert tatsächlich verändert genau richtig. :allright:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: Min - und Max - Funktion

Beitrag von Pelagio »

Hallo,

wie vorab schon angesprochen wurde kann man mit Hilfe von LinkedList und Array eine entsprechende Funktion schreiben, wobei ich persönlich LinkedList vorziehen würde. Aber auch mit Hilfe eines Strings ist dies machbar und gerade wenn man die Zahlen zusammen in ein StringGadget eingibt, braucht man die Daten nicht zusätzlich in eine Liste oder Array kopieren.

Code: Alles auswählen

Zahlenwerte.s = "25;35;28;36"

Procedure.l Min(Value.s, Separator.s = ";")
   Protected n.l, Zahl.l = Val(StringField(Value, 1, Separator))
   
   For n=2 To CountString(Value, Separator)
      If (Zahl>Val(StringField(Value, n, Separator)))
         Zahl = Val(StringField(Value, n, Separator))
      EndIf
   Next n
   ProcedureReturn Zahl
EndProcedure

Procedure.l Max(Value.s, Separator.s = ";")
   Protected n.l, Zahl.l = Val(StringField(Value, 1, Separator))
   
   For n=2 To CountString(Value, Separator)
      If (Zahl<Val(StringField(Value, n, Separator)))
         Zahl = Val(StringField(Value, n, Separator))
      EndIf
   Next n
   ProcedureReturn Zahl
EndProcedure

Debug Min(Zahlenwerte)
Debug Max(Zahlenwerte)
Für Fließkommazahlen muss der Code natürlich entsprechend angepasst werden.
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Min - und Max - Funktion

Beitrag von Kiffi »

hier eine LinkedList-Variante:

Code: Alles auswählen

NewList Values()

AddElement(Values()) : Values() = 25
AddElement(Values()) : Values() = 35
AddElement(Values()) : Values() = 28
AddElement(Values()) : Values() = 36
AddElement(Values()) : Values() = 15

SortList(Values(), #PB_Sort_Ascending)

FirstElement(Values()) : Debug Values() ; <- Min
LastElement(Values())  : Debug Values() ; <- Max
Grüße ... Kiffi
a²+b²=mc²
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: Min - und Max - Funktion

Beitrag von NicTheQuick »

Die Version mit der LinkedList ist ja keine so gute Idee, was die Laufzeit angeht. Die ist hier immerhin O(n*log(n)), owbohl das auch in O(n) möglich wäre.
Antworten