"Top 3" aus Array ermitteln...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
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

Beitrag von NicTheQuick »

Hi Hermann!

Ich hab deinen Code mal fast komplett geändert.

Schau mal, ob du damit zurecht kommst und du es genauso einfach findest
wie ich.

Code: Alles auswählen

; in der Variablen "zaehlertaxi" steht die Anzahl der Datensätze aus denen die Top 3 ermittelt werden soll
; in dem Arry "taxi_haltestelle(n)" jeweils ein Name der Haltestelle, dieser NAme kommt z.T. mehrfach vor

zaehlertaxi = 9
Dim taxi_haltestelle.s(zaehlertaxi)

taxi_haltestelle(0) = "Friedrichstraße" ;3
taxi_haltestelle(1) = "Hubertusweg"     ;4
taxi_haltestelle(2) = "Obere Allee"     ;2
taxi_haltestelle(3) = "Hubertusweg"
taxi_haltestelle(4) = "Sauerlandgasse"
taxi_haltestelle(5) = "Friedrichstraße"
taxi_haltestelle(6) = "Obere Allee"
taxi_haltestelle(7) = "Hubertusweg"
taxi_haltestelle(8) = "Friedrichstraße"
taxi_haltestelle(9) = "Hubertusweg"

;Struktur für Haltestellemname und Häufigkeit
Structure Haltestelle
  Name.s
  Anzahl.l
EndStructure

;Liste mit allen verschiedenen Haltestellen
NewList liste.Haltestelle()

For i = 0 To zaehlertaxi
  
  ja = 1
  ForEach liste()
    If liste()\Name = taxi_haltestelle(i) ;Wenn Haltestelle schon in liste() ist, erhöhe die Anzahl
      liste()\Anzahl + 1
      ja = 0
      Break
    EndIf
  Next
  
  If ja ;Wenn Haltestellen nicht gefunden wurd, dann erstelle sie
    AddElement(liste())
    liste()\Name = taxi_haltestelle(i)
    liste()\Anzahl = 1
  EndIf
Next

;Sortiere die Liste (liste()) absteigend (1) nach der Häufigkeit (OffsetOf(Haltestelle\Anzahl))
SortStructuredList(liste(), 1, OffsetOf(Haltestelle\Anzahl), #PB_Sort_Long)
  
Debug "Es gibt " + Str(CountList(liste())) + " verschiedene Haltestellen."

;Ordne die Top 3 den passenden Variablen zu
Define top1s.s, top2s.s, top3s.s
If FirstElement(liste()) ;Pass auf, dass die Liste nicht leer ist...
  top1s = liste()\Name
  top1  = liste()\Anzahl
EndIf
If NextElement(liste())  ;...und auch das nächste...
  top2s = liste()\Name
  top2  = liste()\Anzahl
EndIf
If NextElement(liste())  ;...und übernächste Element existiert.
  top3s = liste()\Name
  top3  = liste()\Anzahl
EndIf

;Gib die Top 3 aus
MessageRequester("test", top1s + "    " + Str(top1))
MessageRequester("test", top2s + "    " + Str(top2))
MessageRequester("test", top3s + "    " + Str(top3)) 
Hermann
Beiträge: 31
Registriert: 09.09.2004 23:01
Wohnort: Willich

Beitrag von Hermann »

Hi Nic.......

..... erstmal "Danke"......... ich werde mal schauen ob ich durchblicke.......

Wenn nicht...... ich kann ja zum Glück schreiben....... lach......

Auf jeden Fall werde ich dadurch wieder etwas lernen.....
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

nutze Smileys und Absätze- und schweige nicht so schüchtern mit den Punkten vor dich
(Bitte... die Punkte sind anstrengend zu lesen, und du brauchst dich hier nicht vor dich hin Schämen...)
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Habe nicht alles gelesen... Aber warum macht ihr das nicht mit SortArray() bzw. SortStructuredArray() und geht dann davon aus, dass je nach Sortierrichtung die drei ersten oder letzen Elemente die "Top 3" sind?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

... ist nicht so schön wie NTQ's Lösung, aber für einen Anfänger bestimmt leichter zu durchschauen:

Code: Alles auswählen

; PB4

zaehlertaxi = 10
Dim taxi_haltestelle.s(zaehlertaxi)
Dim topname.s(zaehlertaxi)

taxi_haltestelle(0) = "Friedrichstraße" ;3
taxi_haltestelle(1) = "Hubertusweg"     ;4
taxi_haltestelle(2) = "Obere Allee"     ;2
taxi_haltestelle(3) = "Hubertusweg"
taxi_haltestelle(4) = "Sauerlandgasse"
taxi_haltestelle(5) = "Friedrichstraße"
taxi_haltestelle(6) = "Obere Allee"
taxi_haltestelle(7) = "Hubertusweg"
taxi_haltestelle(8) = "Friedrichstraße"
taxi_haltestelle(9) = "Hubertusweg" 
SortArray(taxi_haltestelle(), 1)

counter=1
i=0
Repeat
  While taxi_haltestelle(i)=taxi_haltestelle(i+1)
    counter+1
    If i<zaehlertaxi
      i+1
    Else
      Break
    EndIf
  Wend
  If counter > 1
    j+1
    topname(j)=Str(counter) + " x " + taxi_haltestelle(i-1)
    counter=1
  EndIf
  i+1
Until i=zaehlertaxi

For i=1 To j
  Debug topname(i)
Next
__________________________________________
Weniger glauben - mehr wissen!
------------------------------------------------------
Proud beneficial owner of SpiderBasic, PureBasic 3.x, 4.x, 5.x and PureVisionXP
Hermann
Beiträge: 31
Registriert: 09.09.2004 23:01
Wohnort: Willich

Beitrag von Hermann »

Hi Nic......

..... ich bekomme bei deinem Code immer die Fehlermeldung

`top` is not a valid operater

Bezieht sich auf die Zeile :

Define top1s.s, top2s.s, top3s.s
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
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

Beitrag von NicTheQuick »

@Hermann:
Hast du nicht PB 4.0?

Dann ersetz die Zeile durch

Code: Alles auswählen

DefType.s top1s, top2s, top3s
Hermann
Beiträge: 31
Registriert: 09.09.2004 23:01
Wohnort: Willich

Beitrag von Hermann »

Hi Nic.......

.... nein, ich bin noch auf 3.94..... hatte die 4 installiert aber durch meine mangelnde Programmierkunst hatte ich zu viele Fehler ........ wenn ich mal etwas mehr Zeit habe werde ich wohl mal umstellen und dann weiter sehen.....

Erstmal danke........ es hat super geklappt und ich komme endlich weiter.......

Bis dann...
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Hallo.................. Hermann,

bitte.......... nicht....................... so..................... viele..............
Punkte............. in..............Deinen................. Beiträgen.......................
verwenden!...................

Danke..................... Kiffi..................
a²+b²=mc²
Hermann
Beiträge: 31
Registriert: 09.09.2004 23:01
Wohnort: Willich

Beitrag von Hermann »

Hallo Kiffi

lieber 30 Punkte mit Verstand, als 10 Worte sinnlos Aber ich werde versuchen mich in Zukunft zu bremsen ( obwohl will ich das ? )

Hermann , diesmal ganz ohne Punkt :D
Antworten