erweiterbares Array anlegen? (war: Zufallsgenerator)



  • Hallo Leute,

    ich habe ein Prgramm geschrieben, dies läuft auch wunderbar (soweit). Das Programm soll mir aus einer txt-Datei per durch zufall Zeilen daraus in einem Memofeld anzeigen (und zwar jede Zeile nur einmal, damit diese nicht doppelt auftauchen), die Werte für min und max werden durch Werte in einer ini-Datei bestimmt.
    Mein Problem ist nun, da ich dieses mit einem Array gelöst habe, kann ich nur diese 10 Zeilen anzeigen (da ich das Array na leider nicht auf z.B. 64 erhöhen kann), doch ich möchte, dass die Anzahl der einmalig ausgegebenen Zeilen auch durch einen variablen Wert aus der ini bestimmt wird.

    Hat jemand ein Idee, am Besten wär natürlich mit Snippet 😃

    ...
    int arr[10]={0};
    ...
    bool neueZahl=false;
    for(int i=0;i<10;++i) // ziehe nacheinander 10 Zahlen
    {
        do  // wiederhole die Ziehung, bis die neue Zahl
        {   // nicht mit einer der vorigen identisch ist.
            arr[i]=RandomRange(min,max); //ziehe nur Zahlen die zwischen
                                         //min und max liegen.
            neueZahl=true; // positive Grundeinstellung
            for (int j=0;j<i;++j)
            {
                if (qarr[j]==arr[i])
                {
                    neueZahl=false;
                }
            }
        } while(!neueZahl);
    }
    

    Edit:
    Bitte aussagekräftige Überschriften wählen. Danke!



  • Ich glaube, ich sehe Dein Problem nicht... Warum kannst Du Dein Array nicht auf z.B. 64 erhöhen?



  • Gehe folgendermaßen vor:

    • Durchgehe das gesamte Textdokument und zähle die Zeilen(-umbrüche).
    • Danach erstellst du ein dynamisches Array mit dem Typ BOOL / Boolean mit genauso vielen Elementen wie es Zeilen gibt; und setzt alle Elemente auf False.
    • Bei jedem Durchgang setzt du in dem Array das Element mitz dem Index %Zufallsnummer% auf True, wenn das Feld noch False ist, sonst lässt du den Computer noch einmal "würfeln".

    Mit freundlichen Grüßen und darauf hinweisend, dass er keine Ahnung speziell von Borland & Co hat,
    Rhombicosidodecahedron



  • ^^ Na Du bist toll; wenn er keine Ahnung von Borland & Co hat, ist es nicht wirklich hilfreich irgendwas von dynamischen Arrays zu schreiben...

    @hakunamatata:
    Wenn Du mit dynamischen Arrays arbeiten willst, dann schaue mal in der Hilfe nach dynamicArray
    Du kannst auch das Array vergrößern, also statt

    int arr[10]={0};
    

    eine größere Zahl bestimmen. Das ganze ist aber dann statisch.
    Die beste Variante wäre eine Verbindung aus einem offenem Array mit Memo/IniFile Strings->Count.

    Gruss



  • Nein ich habe wirklich nicht viel Ahnung von Borland, ich habe nur ein wenig ANSI gelernt, das es dynamische Arrays gibt wusste ich nicht mal, da mir mein Dozent mal verklickert hat, dass Arrays immer statisch sind und somit eine feste Größe haben...so steht es auch in meinen Unterlagen die ich zum Borland Builder bekommen hab 🙄
    Ich werde mir mal die dynamischen Arrays angucken, danke für die Hilfe



  • Rostfrei[] schrieb:

    ^^ Na Du bist toll; wenn er keine Ahnung von Borland & Co hat, ist es nicht wirklich hilfreich irgendwas von dynamischen Arrays zu schreiben...

    Ich habe zumindest etwas ahnung von c++, saonst könnte ich nicht von ynamischen Arrays sprechen - oder?

    Ich habe bloß nur mit Windows programmiert!

    // WEnn das Array augegeben werden soll void umändern
    void nefunktion(LPCSTR file) 
    {
    // Array der augewählten Zeilen initalisieren
    // - Datei einlesen
    // - alle Zeilenumbrüche Zählen
    
    int zeilen_count = /* Anzahl */;
    int i As Integer;
    
    // weniger als 10 Zeilen (wenn nicht abgebrochen würde,
    // würde eine Entlosschleife entstehen
     if (zeilen_count <= 10) return;
    
    // Dynamisches Array mit bool initalisieren
    bool* zeile = new bool[zeilen_count];
    for(i = 0; i < zeilen_count; i++ )
    bool[i] = false;
    
    for(i = 0; i < 10; i++)
    {
       // Zufallszahl initalisieren
       int random;
    
       // Wenn die Zeile schon ausgewählt worden ist,
       // ==> Neuer Durchlauf
       do
       {
           random= RandomRange(0,zeilen_count - 1 );
       }while(zeile[random] == true);
    
       // Wert zeile[random] ist vorher false
       zeile[random] = true;
    
       //TODO:
       //Zufallszeile einlesen
       //In ein Array speichern
    }
    
    // Speicher freigeben
    delete[] zeile;
    }
    

    ~[h]Editert: logische uns Syntaxfehler[/h]~



  • Wenn man Ahnung von C++ hat sollte einem vielleicht hierzu std::vector einfallen. 🙂



  • Braunstein schrieb:

    Wenn man Ahnung von C++ hat sollte einem vielleicht hierzu std::vector einfallen. 🙂

    Ich schrieb:

    etwas

    ! Und mit templates kenn ich mich eben nicht so gut aus.



  • Um vector zu benutzen muß man sich nicht unbedingt mit templates auskennen. Hier gibt es eine Anleitung
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-143816.html


Anmelden zum Antworten