Größter Wert eines Arrays
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Größter Wert eines Arrays
Wie finde ich den größten Wert in einem Array?
aarray:={1,6,8,19,8,20,6}
Es können Werte doppelt vor kommen. max() wäre ein Ansatz, das ließ sich aber noch nicht richtig verbinden.
aarray:={1,6,8,19,8,20,6}
Es können Werte doppelt vor kommen. max() wäre ein Ansatz, das ließ sich aber noch nicht richtig verbinden.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16502
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Stevie,
vielleicht so?
Viele Grüße,
Martin
vielleicht so?
Code: Alles auswählen
nMax := -890
aarray:={1,6,8,19,8,20,6}
aEval( aarray, {|x| iif( x > nMax, nMax := x, ) } )
? nMax
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Hab ne einfachere Methode gefunden.Martin Altmann hat geschrieben:Hallo Stevie,
vielleicht so?Viele Grüße,Code: Alles auswählen
nMax := -890 aarray:={1,6,8,19,8,20,6} aEval( aarray, {|x| iif( x > nMax, nMax := x, ) } ) ? nMax
Martin
aachs ist das Zahlenarray.
czeit:=max(0,aachs[1])
for i:=2 to lastrec()
czeit:=max(czeit,aachs)
next
- Martin Altmann
- Foren-Administrator
- Beiträge: 16502
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Stevie,
ist nicht einfacher, sondern das gleiche
Viele Grüße,
Martin
ist nicht einfacher, sondern das gleiche
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
benötigt aber weniger Code.Martin Altmann hat geschrieben:Hallo Stevie,
ist nicht einfacher, sondern das gleiche
Viele Grüße,
Martin
In den Datenbrowser hab ich nämlich noch ein Gehe zu eingebaut und damit der User weiß, in welchem Rahmen er eintragen darf, berechne ich damit die Maximalgröße und gebe sie in () neben dem Editfeld aus.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16502
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hm,
bei Dir sind es vier Zeilen und bei mir 2 (wenn ich die Ausgabe des Ergebnisses und die Initialisierung des Arrays weglasse, die es bei Deinem Beispiel auch nicht gab)...
Viele Grüße,
Martin
bei Dir sind es vier Zeilen und bei mir 2 (wenn ich die Ausgabe des Ergebnisses und die Initialisierung des Arrays weglasse, die es bei Deinem Beispiel auch nicht gab)...
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
okay ein paar Zeichen weniger,allerdings schlechter zu verstehen, jedenfalls für michMartin Altmann hat geschrieben:Hm,
bei Dir sind es vier Zeilen und bei mir 2 (wenn ich die Ausgabe des Ergebnisses und die Initialisierung des Arrays weglasse, die es bei Deinem Beispiel auch nicht gab)...
Viele Grüße,
Martin
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9345
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 100 Mal
- Danksagung erhalten: 359 Mal
- Kontaktdaten:
Martins Variante geht auch (nach erfolgter Arrayinitialisierung) mit einer Zeile:
Code: Alles auswählen
aEval( aarray, {|x| iif( nMax = nil .or. x > nMax, nMax := x, ) } )
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo,
also wenn das Array nicht nur die 6 Elemente hat, ist der Code
mit FOR NEXT deutlich langsamer als mit AEVAL() - gleiches gilt für do while und DBEVAL().
Allerdings sind beide Methoden zu langsam um große Arrays abzuarbeiten. Hier gilt sortieren, dann steht der größte Wert im letzten bzw. ersten Feld. ASORT() ist dermaßen schnell, dass auch tausende von Arrayelementen keine Rolle spielen.
also wenn das Array nicht nur die 6 Elemente hat, ist der Code
mit FOR NEXT deutlich langsamer als mit AEVAL() - gleiches gilt für do while und DBEVAL().
Allerdings sind beide Methoden zu langsam um große Arrays abzuarbeiten. Hier gilt sortieren, dann steht der größte Wert im letzten bzw. ersten Feld. ASORT() ist dermaßen schnell, dass auch tausende von Arrayelementen keine Rolle spielen.
Gruß
Hubert
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16502
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Stevie,
Das aEval() macht nichts anderes, als Deine FOR...NEXT-Schleife:
Martin
nun - das sieht nur auf den ersten Blick so aus, glaube mir!stevie hat geschrieben:...,allerdings schlechter zu verstehen, jedenfalls für mich
Das aEval() macht nichts anderes, als Deine FOR...NEXT-Schleife:
- Der erste Parameter bei dem aEval ist das Array, das abgearbeitet werden soll.
- Der zweite Parameter ist der Codeblock, der auf jedes einzelne Element Deines Arrays angewandt wird:
- Er enthält maximal zwei Parameter: Der erste ist das entsprechende Element des Arrays (in meinem Beispiel als x bezeichnet - dies entspricht in Deinem Beispiel dem aachs) und der zweite (den ich nicht genutzt habe) wäre der Zähler (auf dem wievielten Arrayelement man sich gerade befindet - also in Deinem Besipiel das i)
- Als nächstes kommen innerhalb des Codeblocks die Anweisungen für jedes einzelne Element des Arrays - dort könnten auch mehrere Anweisungen stehen, die dann durch "," getrennt werden. In meinem Beispiel gibt es nur die IIF()-Funktion
- Er enthält maximal zwei Parameter: Der erste ist das entsprechende Element des Arrays (in meinem Beispiel als x bezeichnet - dies entspricht in Deinem Beispiel dem aachs) und der zweite (den ich nicht genutzt habe) wäre der Zähler (auf dem wievielten Arrayelement man sich gerade befindet - also in Deinem Besipiel das i)
- Die weiteren Parameter findest Du in der Hilfe erklärt - sie wurden hier nicht genutzt. Man kann noch mit angeben, ab dem wievielten Element des Arrays erst mit der Abarbeitung begonnen werden soll, wieviele Elemente von da an abgearbeitet werden sollen und ob das entsprechende Element im Array selber auch geändert werden darf.
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Ich kann schon verstehen, warum einem eine 'schöne altmodische' FOR NEXT Schleife besser gefällt - oder übersichtlicher erscheint.
Geht mir manchmal auch so. Aber wenn man die unterschiedlichen Laufzeiten in einem größeren Programm sieht, kann es keine Frage mehr geben. Man muss dann einfach die komplexen Befehle oder Funktionen nutzen - offensichtlich sind die intern stark optimiert.
Geht mir manchmal auch so. Aber wenn man die unterschiedlichen Laufzeiten in einem größeren Programm sieht, kann es keine Frage mehr geben. Man muss dann einfach die komplexen Befehle oder Funktionen nutzen - offensichtlich sind die intern stark optimiert.
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
aEval
Da wir gerade beim aEval waren..
::aMess:={}
aEval(::aSens,{|x| iif(x==1,aAdd(::aMess,x),.F.)})
Dieses aEval müsste mir eigentlich alle Werte aus ::aSens rausholen, die 1 sind und alle 1en in ::aMess schreiben. Alles zusammen läuft in einer Schleife in einer Methode. Wenn ich das kompilierte Programm starte,kommt die fiese Meldung:"Zugriff auf Membervariable verweigert" (::amess). Deklariert ist sie ordnungsgemäß als protected. Was stimmt da schon wieder nicht?
::aMess:={}
aEval(::aSens,{|x| iif(x==1,aAdd(::aMess,x),.F.)})
Dieses aEval müsste mir eigentlich alle Werte aus ::aSens rausholen, die 1 sind und alle 1en in ::aMess schreiben. Alles zusammen läuft in einer Schleife in einer Methode. Wenn ich das kompilierte Programm starte,kommt die fiese Meldung:"Zugriff auf Membervariable verweigert" (::amess). Deklariert ist sie ordnungsgemäß als protected. Was stimmt da schon wieder nicht?
Re: aEval
Genau deshalb funktioniert es nicht. Durch die Ausführung des Codeblocks erfolgt der Zugriff auf ::aMess nicht mehr aus der Klasse selbst ( da ja Array, und der Codeblock an die Funktion aEval übergeben werden und dann innerhalb dieser Funktion auf ::aMess zugegriffen wird).stevie hat geschrieben:"Zugriff auf Membervariable verweigert" (::amess). Deklariert ist sie ordnungsgemäß als protected.
Das ist dann quasi in etwas so, als würdest du außerhalb deiner Klasse auf ::aMess zugreifen wollen. Das klappt ja auch nicht.
Du könntest eine neue Membervarialbe ::_aMess anlegen (protected oder hidden).
Für ::aMess machst du Assign und Accessmethoden:
EXPORTED:
ACCESS ASSIGN METHOD aMess
(Siehe ACCESS | ASSIGN in der xbase-Doku)
METHOD NameDeinerKlasse:aMess( aM )
// entsprechend vorher Prüfung, ob Daten auch korrekt sind
// ob es ein Array ist, nicht NIL, oder wie auch immer
::_aMess := aM
RETURN ::_aMess
Dadurch kannst du auf ::aMess ganz einfach zurgreifen. Gekapselt ist das ganze dennoch, da alles über die Methode geht, in der du steuern kannst, welche Daten gespeichert werden können.
Mit der Variante müsstest du nur neuen Code hinzufügen aber nichts am bestehenden ändern.
Vllt. geht das ja auch noch eleganter, aber so sollte es funktionieren
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: aEval
Die Variable zu exportieren ist dann doch einfacher,auch wenn niemand anders sie braucht.Robert hat geschrieben:Genau deshalb funktioniert es nicht. Durch die Ausführung des Codeblocks erfolgt der Zugriff auf ::aMess nicht mehr aus der Klasse selbst ( da ja Array, und der Codeblock an die Funktion aEval übergeben werden und dann innerhalb dieser Funktion auf ::aMess zugegriffen wird).stevie hat geschrieben:"Zugriff auf Membervariable verweigert" (::amess). Deklariert ist sie ordnungsgemäß als protected.
Das ist dann quasi in etwas so, als würdest du außerhalb deiner Klasse auf ::aMess zugreifen wollen. Das klappt ja auch nicht.
Du könntest eine neue Membervarialbe ::_aMess anlegen (protected oder hidden).
Für ::aMess machst du Assign und Accessmethoden:
EXPORTED:
ACCESS ASSIGN METHOD aMess
(Siehe ACCESS | ASSIGN in der xbase-Doku)
METHOD NameDeinerKlasse:aMess( aM )
// entsprechend vorher Prüfung, ob Daten auch korrekt sind
// ob es ein Array ist, nicht NIL, oder wie auch immer
::_aMess := aM
RETURN ::_aMess
Dadurch kannst du auf ::aMess ganz einfach zurgreifen. Gekapselt ist das ganze dennoch, da alles über die Methode geht, in der du steuern kannst, welche Daten gespeichert werden können.
Mit der Variante müsstest du nur neuen Code hinzufügen aber nichts am bestehenden ändern.
Vllt. geht das ja auch noch eleganter, aber so sollte es funktionieren