Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

größten 3 zahlen ermitteln

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
sorry



Anmeldungsdatum: 07.11.2004
Beiträge: 3

BeitragVerfasst am: 07.11.2004, 14:14    Titel: größten 3 zahlen ermitteln Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
REZK



Anmeldungsdatum: 28.10.2004
Beiträge: 109
Wohnort: Stuttgart

BeitragVerfasst am: 07.11.2004, 15:12    Titel: Antworten mit Zitat

-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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 07.11.2004, 16:59    Titel: Vielleicht so Antworten mit Zitat

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! happy

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!


Zuletzt bearbeitet von Sebastian am 07.11.2004, 20:42, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
sorry



Anmeldungsdatum: 07.11.2004
Beiträge: 3

BeitragVerfasst am: 07.11.2004, 19:31    Titel: jo Antworten mit Zitat

hallo,

erstmal vielen dank.
zerbrech mir schon den ganzen tag den kopf.
werds gleich mal ausprobieren.

gruß
martin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 07.11.2004, 20:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
sorry



Anmeldungsdatum: 07.11.2004
Beiträge: 3

BeitragVerfasst am: 07.11.2004, 22:07    Titel: hui Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz