
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
Hallo Christian, in diesem Fall liefert der Mittelwert kein brauchbares Ergebnis. Besser ist ein sogenanntes Medianfilter. Man sammelt zum Beispiel 5 Meßwerte in einem Array/Feld, sortiert es nach Größe und nimmt dann den mittleren Wert als Ergebnis. Dadurch werden Störungen herausgefiltert. Der "Ausrutscher" wandert durch die Sortierung an den Anfang oder an das Ende des Feldes. Hier mal ein Demoprogramm zum Sortieren für die Open-Maxi. Es sollte auch auf der Open-Macro laufen. Für die kleinen OM-Controller Open-Micro, Open-Mini und Open-Midi muß im Sourcecode an jeder Stelle, an der WORD steht, BYTE verwendet werden. Es wird der sogenannte "Bubble Sort"-Algorithmus verwendet. Dieser Algorithmus ist nicht sehr schnell. Wenn das Feld bereits vorsortiert ist, bietet es sich an, den sogenannten "Insertion Sort" zu verwenden. Siehe Link unten. Ich werde dieses Demoprogramm zum Bubblesort in den nächsten Tagen noch einmal offiziell hier in unserem Forum veröffentlichen. Hier eine Vorabversion: ' =========================================================================== ' Demoprogramm: Die ANZAHL Elemente eines WORD-Feldes sortieren ' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 04. Februar 2022 ' =========================================================================== ' Dieses Programm nutzt den BubbleSort-Algorithmus von der folgenden Webside: ' https://homepages.bluffton.edu/~nesterd/apps/SortingDemo.html ' Dieses Beispielprogramm demonstriert Zeiger, Felder und Arrays auf der OM. ' An dieser Stelle möchte ich mich bei Dirk von "das |_ Team" und bei Norbert ' für ihre Unterstützung bedanken. In Memoriam Norbert Klein. ' --- Definitionen ---------------------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi DIM bitarray BYTE 'ein Bitarray DIM debug BIT[1] OF bitarray 'ist HIGH, wenn Debugging aktiv DEFINE ANZAHL 8 'Anzahl der Elemente des Feldes DIM a,b,c,i,j BYTE 'temporäre Bytevariablen DIM a0,a1,a2,a3,a4,a5,a6,a7 WORD 'WORD-Feld mit ANZAHL Elementen DIM h WORD 'Hilfsvariable DIM ^s WORD 'Zeiger auf ein Word im USER-RAM DIM ^d WORD 'Zeiger auf ein Word im USER-RAM ' --- Hauptprogramm --------------------------------------------------------- PrintSpc=ON 'Bei PRINT dezimale Zahlen mit führendem Leerzeichen ausgeben End2Host=ON 'Bei Programmende (siehe END) gleich in den Host-Modus wechseln ' Titel: PRINT "Sortieren" PRINT "=========" ' Initialisierungen: RANDOMIZE 64 'Zufallsgenerator initialisieren (z.B. RANDOMIZE TIMER) debug=ON 'OFF 'Sortierschritte anzeigen ' Das Hauptprogramm: s=^a0 'WORD-Feld mit Zufallswerten laden FOR a=1 TO ANZAHL @s=RAND ADD s,1 NEXT a ?:?"Feldinhalt vor dem Sortieren:"; ?a0;a1;a2;a3;a4;a5;a6;a7 IF debug THEN ? BubbleSort 'Sortierung durchführen ?:?"Feldinhalt nach dem Sortieren:"; s=^a0 FOR a=1 TO ANZAHL ?@s; ADD s,1 NEXT a ? ?:?"Programmende." END 'Zurück in den Hostmodus. Neustart mit RETURN-Taste. ' --- Subroutinen und Funktionen -------------------------------------------- ' Das Feld a0,a1,a2,... sortieren. Es hat ANZAHL Elemente. PROCEDURE BubbleSort 'COMPILE ' BubbleSort(size) { ' for (i=size-1; i > 0; i--) ' { ' for (j=0; j < i; j++) ' { ' if (a[j] > a[j+1]) ' swap a[j] and a[j+1]; ' } ' } ' } ' /* DONE */ i=ANZAHL-1 WHILE i>0 s=^a0 'Zeiger mit USER-RAM-Adressen laden d=^a0+1 j=0 WHILE j<i IF @s > @d THEN IF debug THEN ?"Vertausche Element";j;" und";j+1;", also";@s;" und";@d;"." END IF h=@s 'Zwei Elemente des Feldes tauschen @s=@d @d=h END IF ADD s,1 'Zeiger inkrementieren ADD d,1 ADD j,1 WEND SUB i,1 WEND RETURN END PROCEDURE ' --- Programmende --------------------------------------------------------- Viel Spaß und Erfolg mit den OM-Mikrocontrollern! Dietmar Passender Link: Sorting Demonstrations Meine Homepage: http://ccintern.dharlos.de |
| Antwort schreiben |