Hallo Besucher, der Thread wurde 2,1k mal aufgerufen und enthält 17 Antworten

letzter Beitrag von Mike am

CPC Auswertetool

  • Hallo,


    Habe wieder dem besten 8Bit Basic gefröhnt und ein kleines Auswertetool für den CPC geschrieben. Warum? Weil es geht. :-) Spaß geht manchmal vor Sinn.


    Wer einen Blick drauf werfen mag schaue bitte hier:


    http://www.cpcwiki.eu/forum/ap…4-and-6128/msg145687/#new


    Ich bin übrigens noch dabei herauszufinden, bubble sort auf zwei Tabellenspalten anzuwenden, die sich aufeinander beziehen. Hat jemand einen Tipp oder Erfahrung damit, die zweite Spalte zur Sortierspalte richtig zuzuordnen?

  • Falls ich die Sortierproblematik richtig verstanden habe:
    Ich weiss nicht, ob du das auch in der CPC Programmierung verwenden kannst, ich verwende folgenden Trick in Excel:
    Wenn ich in Tabellen mehrere Spalten als Keyspalten habe und muss sie eindeutig sortieren, generiere ich einen künstlichen, zusammengesetzten Key z.B. "Spalte1-Spalte2" als String in einer dritte Spalte und kann dann einspaltig sortieren bzw. als Suchkey verwenden.


    Aber vielleicht ist das zu speicherkritisch bei einem 8-Bit System, soviel Platz zu "verschwenden".

  • Würde es nicht reichen, wenn Bubblesort in der Sortierspalte Positionen ändert, diese Positionsänderung gleichzeitig auf allen anderen Spalten durchzuführen, sodass alle Spalten dieselben Positionswechsel mitmachen?

    Ja, wenn es nur eine 1:1 Spaltenzuordnung ist und keine 1:n.

  • Ja, wenn es nur eine 1:1 Spaltenzuordnung ist und keine 1:n.

    Ja, aber dann ist es eh keine Aufgabe mehr für ein Tabellenblatt, sondern eher für eine DB... Oder der CPC kann Pivot-Tabellen, was aber auch nur eine Krücke ist.... Da ist dann wirklich das einfachste, beide Keys in einer extra Spalte zu verwalten, wie von Dir vorgeschlagen.

  • Oder den Bubblesort einfach 2 Mal durchlaufen lassen. Einmal mit dem 2. zu sortierenden Schlüssel und einmal mit dem 1. zu sortierenden Schlüssel.


    (Man kann das natürlich auch ein einer Abfrage miteinander verbinden)

  • Nur mal zum Verständnis:


    Die Frage ist, inwieweit mehrere Sortierkriterien berücksichtigt werden können, oder?
    Z.B. Bei 2 Spalten, Datum und Betrag: Sortiere erst nach Datum und innerhalb gleicher Datumsbereiche nach Betrag.
    Korrekt, oder war die Frage anders gemeint?

  • Habe wieder dem besten 8Bit Basic gefröhnt und ein kleines Auswertetool für den CPC geschrieben.

    Oh, es gibt einen Port von BBC Basic für den CPC?

    Der verwendete Bubble Sort ist von MacBacon

    Na, dafür hätte ich jetzt aber gerne eine Quelle - ich kann mich nicht erinnern, öffentlich einen Bubblesort verbrochen zu haben. :D

  • Der Bubblesort war nicht von MacBacon, sondern ich glaube, von Mike!


    Ich habe mir nicht mehr dazu geschrieben von wem der Code-Schnipsel war den ich mir weggespeichert hatte, aber ich weiß eigentlich, wie Mike kurzen Code schreibt, der viel tut. Ich glaube, das ist seine Handschrift. MacBacon hatte ich nur im Kopf, weil im V2 Basic Sortierthread seine Aussagen zum Thema Sortieren bei mir hängen geblieben sind.


    10 n=10:dimx(n):fort=1ton:x(t)=rnd(1):next
    11 :
    12 p=0:fort=1ton-1:ifx(t)>x(t+1)thenx=x(t):x(t)=x(t+1):x(t+1)=x:p=-1
    13 next:ifpthen12
    14 :
    15 fort=1ton:printx(t):next


    Das oben müsste Mike sein.


    @ RealWanderer


    ZeroZero hat es ziemlich gut erfasst. Nehmen wir eine Higscore-Liste mit Namen und Punkten, die man einerseits nach Namen, andererseits nach Punkten sortieren will. Dann muss die jeweils andere Spalte sich richtig mitordnen. Ich brauche Keys dafür, wenn ich Bubble Sort einsetze, denn die Bubbles bewegen sich ständig, so dass es bei der Referenzspalte zu Überschreibvorgängen kommt, wenn ich die einfach jedes Mal mitkopiere wenn die eine Bubble eine andere gerade ein Stück übersteigt. Ich muss eine Array Dimension alleine sortieren und DANACH anhand der Keys die zweite Spalte ordnen. Da passt SQL besser als Basic, da haben meine Vorschreiber recht.


    Ich setz mich wie gesagt dran und melde mich wieder hier, wenn ich etwas habe das läuft.

  • Was hab' ich da nur verbrochen? :cursing:


    Das ist halt das gemeine am Bubble-Sort: den kriegt man in der obigen Version auch noch früh morgens um 3 Uhr niedergeschrieben, selbst wenn man einen im Tee hat.


    Ich plädiere jedoch dafür, daß Du dich wenigstens mal an den Insertion-Sort gewöhnst: der ist nicht viel größer und bei dem gleichen Problemfall immer besser (d.h. etwa doppelt so schnell) als Bubble-Sort.


    Mach's nicht zu kompliziert: es reicht einfach, die anderen Spalten genauso mit durchzutauschen, wie es mit der zu sortierenden Spalte gemacht wird (natürlich ohne daß mit diesen Spalten verglichen wird). Ein zusätzliches Index-Array ist *nicht* nötig.

  • So, es funktioniert. Isertion Sort und die zweite Spalte mitgeschleift wie Mike es empfohlen hat. Ich baue das ins Auswertetool ein. Es soll nach jeder Spaöte sortiert werden können und wenn man die Tabellen im sortierten Zustand abspeichert, werden auch die Grafiken entsprechend sortiert angezeigt. Man kann also sortiefrte und nicht sortierte Tabellen speichern, je nachdem was man anzeigen will. Dann muss noch Summe, Min, Max und Durchschnitt dazu und dann denke ich könnte man es sogar benutzen für irgend eine Hobby Geschichte.


  • Die Scores und Namen würde ich jeweils in einem eigenen Array aufbewahren und die Scores nur bei der Ausgabe ggfs. formatieren (also Einer untereinander, etc.) Die jetzt vorhandenen Umwandlungsoperation mitten im Sort sind zumindest etwas, hmm, unelegant. Du willst eigentlich das:

    Code
    1. 100 for i=2 to 7:hi=hi(i):n$=n$(i)
    2. 110 for j=i-1 to 1 step -1
    3. 115 if hi(j)>hi then hi(j+1)=hi(j):n$(j+1)=n$(j):next
    4. 120 hi(j+1)=hi:n$(j+1)=n$:next i

    Außerdem fügt STR$() vor der Zahl ein Leerzeichen ein, wo vorher keins war (sofern positiv). Du kriegst also bei "a=val(w$(i,1))" und "w$(j+1,1)=str$(a)" in w$(j+1,1) nicht das wieder zurück was vorher in w$(i,1) stand.

  • @ Mike


    Den STR$-Effekt sieht man, wenn man das Listing ausführt. Die 50 ist um ein Leerzeichen eingerückt und ich wusste nicht warum.
    Stand heute 23:38 Uhr ist das "umständliche" Listing benutzbar. Davor hatte ich Flüchtigkeitsfehler drin beim Drucken des Arrays, was zum Programmabbruch geführt hat.


    Ich schreibe das nochmal neu.

  • Mein CPC-Quellcode ist ziemlich umfangreich und ich habe das Auswertetool direkt im CPC geschrieben, weil ich den Editor so mag.
    Search and Replace kennt der Editor aber nicht, daher schrecke ich davor zurück, das ganze Programm umzuschreiben um die Tabellen zu trennen. Ich wende nun nach dem Sortieren eine noch unelegantere Hässlichkeit an, die das Ganze künstlich langsamer macht, aber kosmetisch korrigierend wirkt.


    121 for i=1 to 7
    122 if left$(w$(i,1),1)=" " then w$(i,1)=mid$(w$(i,1),2,len(w$(i,1))-1)
    123 next i


    Fürs nächste Mal weiß ich, dass ich getrennte Arrays unterschiedlicher Typen nehmen werde. Ich habe das mit str$ nicht gewusst, jetzt verhagelt es mir die Optik und damit meine Tabelle sauber aussieht muss ich nun eine künstliche Verlangsamung in Kauf nehmen.


    Edit:
    Ich kann im CPC den Quellcode als ASCII speichern und dann mit einem Tool aus dem Disketten-Image herausholen. Ja, ich schau dann wie ich's mach..

  • Wenn Du die Highscores in HI(X) drinhast, probier das mal als Beispiel aus:


    PRINT RIGHT$("{4 SPACE}"+STR$(HI(X)),4)


    Da ist es auch egal, ob das STR$() noch ein zusätzliches Leerzeichen fabriziert. Du bekommst einfach die Zeichenkette von rechts her so, daß Einer unter Einern stehen, etc. - für maximal 4-stellige Zahlen.


    In der Zeichenkette schreibst Du der Einfachheit halber einfach soviele Leerzeichen rein, wie die Zahlen nachher im Format haben sollen, hier also 4. Brauchst Du eine andere Größe, änderst Du einfach die 4 und die Leerzeichen genauso mit.