|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
sorry
Anmeldungsdatum: 07.11.2004 Beiträge: 3
|
Verfasst am: 07.11.2004, 15:14 Titel: größten 3 zahlen ermitteln |
|
|
hallo,
hab da nen problem das ich nicht gelöst bekomm.
ich habe 100 zahlen in der variable b(x).
nun würde ich gerne aus diesen 100 zahlen (sind jedesmal andere) die 3 größten zahlen ermitteln und z.b. in die variable gr(x) hinterlegen.
hat da jemand eine idee? |
|
Nach oben |
|
|
REZK
Anmeldungsdatum: 28.10.2004 Beiträge: 109 Wohnort: Stuttgart
|
Verfasst am: 07.11.2004, 16:12 Titel: |
|
|
-mach eine sicherung von dem array, in dem die 100 zahlen stehen (übertrage inhalt des array auf ein anders, damit du das ursprüngliche nicht verändern musst)
-gehe dieses array durch und prüfe, ob das element größer als das vorige ist, wenn ja übernehmen, sonst weitermachen
-wenn du durchbist, setze das element, das du gefunden hast auf eine zahl, die sicher kleiner als das kleinste element ist (z.b -10000)
- mache die letzen zwei schritte noch zweimal
sicher keine elegante lösung, aber sie sollte funktionieren _________________ Meine sämtlichen QB Projekte findet ihr hier |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 07.11.2004, 17:59 Titel: Vielleicht so |
|
|
Hallo.
Hab dir ein Programm geschrieben. Funktioniert auch:
Den obersten Block habe ich mal abgegrenzt, da er im eigentlichen Programm nicht nötig ist. Er füllt bloß das Array mit Zahlen, um die Funktion des Codes zu demonstrieren.
Code: | 'Zuerst mal ein paar Zahlen erzeugen...
DIM Zahl%(1 TO 100)
FOR i% = 1 TO 100
Zahl%(i%) = 50
IF i% = 50 THEN Zahl%(50) = 60
IF i% = 60 THEN Zahl%(60) = 70
NEXT i% |
Code: | 'Jetzt die drei größten Zahlen raussuchen...
TYPE GrosseZahl
Wert AS INTEGER
ArrayNr AS INTEGER
END TYPE
DIM GroessteZahl(1 TO 3) AS GrosseZahl
FOR i% = 1 TO 3
FOR j% = 1 TO 100
IF Zahl%(j%) > GroessteZahl(i%).Wert THEN
GroessteZahl(i%).Wert = Zahl%(j%)
GroessteZahl(i%).ArrayNr = j%
END IF
NEXT j%
Zahl%(GroessteZahl(i%).ArrayNr) = Zahl%(GroessteZahl(i%).ArrayNr) * (-1)
NEXT i%
'Zahlen im Array wiederherstellen:
FOR i%=1 TO 100
IF Zahl%(i%)<0 THEN Zahl%(i%)=Zahl%(i%)*(-1)
NEXT i%
'Größte Zahlen ausgeben...
FOR i% = 1 TO 3
PRINT GroessteZahl(i%).Wert
NEXT i%
SLEEP: END |
//EDIT: Jubiläum - Mein 200. Beitrag!
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Zuletzt bearbeitet von Sebastian am 07.11.2004, 21:42, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
sorry
Anmeldungsdatum: 07.11.2004 Beiträge: 3
|
Verfasst am: 07.11.2004, 20:31 Titel: jo |
|
|
hallo,
erstmal vielen dank.
zerbrech mir schon den ganzen tag den kopf.
werds gleich mal ausprobieren.
gruß
martin |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 07.11.2004, 21:37 Titel: |
|
|
Vom Grundprinzip her muss man eine absteigende Sortierung durchführen und dann die ersten drei Elemente entnehmen. Allgemein gehaltenes Beispiel:
Code: | DIM za%(1 TO 100), gr%(1 TO 3)
' za%() füllen
HoleXGroessten za%(), gr%()
SUB HoleXGroessten(za%(), gr%())
' za%() enthält die 100 Zahlen
' In gr%() müssen die drei grössten Zahlen zurückgegeben werden
DIM temp%(LBOUND(za%) TO UBOUND(za%))
' Temporäre Kopie erstellen
FOR i% = LBOUND(za%) TO UBOUND(za%)
temp%(i%) = za%(i%)
NEXT i%
' absteigend sortieren
FOR i% = LBOUND(za%) TO UBOUND(za%) - 1
FOR j% = i% + 1 TO UBOUND(za%)
IF temp%(i%) < temp%(j%) THEN
SWAP temp%(i%), temp%(j%)
END IF
NEXT j%
NEXT i%
' Übertragen
FOR i%=LBOUND(gr%) TO UBOUND(gr%)
gr%(i%) = temp%(i% - LBOUND(gr%) + LBOUND(temp%)
NEXT i%
END SUB |
Sinnvollerweise sollte man die Sortierung in einer temporären Kopie des Arrays durchführen, wie im Listing ersichtlich.
Zwecks Verbesserung der Performance ist es dann sinnvoll, den verwendeten Bubble-Sort unvollständig durchzuführen, d.h. ich sortiere nur gerade soviel, dass sich meine drei gesuchten grössten Zahlen am Anfang befinden, der Rest aber immer noch undefiniert geordnet sein darf.
Code: | ' absteigend sortieren, jedoch nur soviel, wie für die x grössten
' Zahlen bestimmen notwendig ist
FOR i% = LBOUND(za%) TO LBOUND(za%) + UBOUND(gr%) - LBOUND(gr%)
FOR j% = i% + 1 TO UBOUND(za%)
IF temp%(i%) < temp%(j%) THEN
SWAP temp%(i%), temp%(j%)
END IF
NEXT j%
NEXT i% |
Falls man noch zusätzlich den Index (Platz, wo sich die drei grössten Zahlen befinden) benötigt, ist es ratsam, statt einer temporären Kopie nur ein Indexfeld zu sortieren. Sieht dann ungefähr wie folgt aus:
Code: | DIM za%(1 TO 100), gr%(1 TO 3)
' za%() füllen
HoleXGroessten za%(), gridx%()
FOR i%=1 TO 3
PRINT "Platz 1: Index"; gridx%(i%); "mit Wert"; za%(gridx%(i%))
NEXT i%
SUB HoleXGroessten(za%(), gr%())
' za%() enthält die 100 Zahlen
' In gr%() müssen die drei grössten Zahlen zurückgegeben werden
DIM idx%(LBOUND(za%) TO UBOUND(za%))
' Index initialisieren
FOR i% = LBOUND(za%) TO UBOUND(za%)
idx%(i%) = i%
NEXT i%
' absteigend sortieren
FOR i% = LBOUND(za%) TO LBOUND(za%) + UBOUND(gr%) - LBOUND(gr%)
FOR j% = i% + 1 TO UBOUND(za%)
IF za%(idx%(i%)) < za%(idx%(j%)) THEN
SWAP idx%(i%), idx%(j%)
END IF
NEXT j%
NEXT i%
' Übertragen
FOR i%=LBOUND(gr%) TO UBOUND(gr%)
gr%(i%) = idx%(i% - LBOUND(gr%) + LBOUND(idx%)
NEXT i%
END SUB |
_________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
sorry
Anmeldungsdatum: 07.11.2004 Beiträge: 3
|
Verfasst am: 07.11.2004, 23:07 Titel: hui |
|
|
also, ich muß schon sagen, ihr legt euch ja gut ins zeug.
vielen dank erstmal. werde mich morgen drum kümmern das einzubauen.
schon scheiße wenn man seit jahren aus der materie ist...
gruß
martin |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|