Anfängerfrage - Minimum in Array



  • Hallo,

    ich will 100 Felder eines Arrays mit Zufallswerten zwischen 0 und 500 erzeugen und dann das Mittel, den größten Wert und den kleinsten Wert ausgeben.
    Bis auf den kleinsten Wert klappt auch alles, ich komme aber nicht drauf, warum der kleinste Wert nicht richtig ausgegeben wird:

    int main()                                  
    {
        int i;
        int n = 100;
        int a[n];
        double summe = 0;
        int minimum = a[0];
        int maximum = a[0];
    
        for ( i = 0; i < n; i++ ) {
            a[n] = (rand() % 501);
            if ( i % 10 == 0 ) cout << endl;
            cout << setfill('0') << setw(3) << a[n] << " ";                                                            
            if ( a[n] < minimum ) minimum = a[n];
            if ( a[n] > maximum ) maximum = a[n];
            summe = summe + a[n];
        }
    
        cout << "\n" "\n";
        cout << "Arithmetisches Mittel aller Feldelemente: " << summe / 100 << "\n";
        cout << "Kleinster Wert der Feldelemente: " << minimum << "\n";
        cout << "Gr\x94 \b\xE1 \bter Wert der Feldelemente: " << maximum << "\n";
    
        return 0;  
    }
    


  • Was soll das tun?

    int minimum = a[0];
    int maximum = a[0];
    

    Warum startet die Schleife mit 1?

    Warum ist n nicht const?

    Sollte nach main() nicht irgendwo eine { kommen?

    Warum enthält das array double, minimum und maximum sind aber int?



  • Dein array hat 101 Felder.



  • Als erstes:
    std::vector

    Für die Berechnungen:
    std::min_element
    std::max_element
    std::accumulate in Verbindung mit std::vector::size()



  • int minimum = a[0];
    int maximum = a[0];

    Hier sollten Anfangswerte für das Minimum und Maximum gesetzt werden, die dann jeweils mit dem nächsten erzeugten Wert verglichen werden:

    if ( a[n] < minimum ) minimum = a[n];
    if ( a[n] > maximum ) maximum = a[n];

    Beim Maximum klappt das, aber das Minimum wird falsch ausgegeben ( 1 statt 3):

    007 406 105 487 113 052 490 057 498 388
    050 439 080 421 131 253 129 309 208 028
    341 260 339 411 194 425 029 226 283 100
    299 036 006 150 269 366 202 259 169 199
    393 219 384 473 386 262 473 014 317 180
    290 157 187 128 068 381 299 344 106 328
    444 405 365 450 302 380 061 003 385 230
    450 024 195 333 497 081 341 215 342 158
    142 378 315 329 005 129 456 305 473 061
    132 417 212 243 112 013 370 174 264 254

    Arithmetisches Mittel aller Feldelemente: 250.48
    Kleinster Wert der Feldelemente: 1
    Größter Wert der Feldelemente: 498



  • Mugglschoaß schrieb:

    int minimum = a[0];
    int maximum = a[0];

    Hier sollten Anfangswerte für das Minimum und Maximum gesetzt werden, die dann jeweils mit dem nächsten erzeugten Wert verglichen werden:

    Und welchen Wert haben minimum und maximum dann?



  • Mugglschoaß schrieb:

    Hier sollten Anfangswerte für das Minimum und Maximum gesetzt werden, die dann jeweils mit dem nächsten erzeugten Wert verglichen werden

    Die Idee ist ja gut, aber das solltest du erst machen, nachdem du das Array befüllt hast. Sonst steht wer weiß was in a[0].



  • Danke, hab jetzt zwei Schleifen gebaut, die erste befüllt die Felder, die zweite kümmert sich um min und max, wobei min = a[0] und max = a[0] erst vor der zweiten Schleif initialisiert werden --> klappt 🙂



  • int n = 100;
    int a[n];
    

    naja ...



  • Anfängerfehler 😃 Muss natürlich n=99 heißen und die Schleife bis <=n laufen.



  • Mugglschoaß schrieb:

    Anfängerfehler 😃 Muss natürlich n=99 heißen.

    Nein, muss es nicht.

    Edit:
    Auch nach deinem Edit ist das falsch, da du beim definieren vom Array die Anzahl der Element angibst.

    Aber du bist hier bei C++ und da gibt es (wie schon gesagt) std::vector



  • Ich dachte, wenn ich a[100] schreibe, erzeugt das a[0]...a[100}, also 101 Felder statt 100, deswegen a[99] und Schleife soll 100 mal durchlaufen, sprich i=0 bis i<=99.

    std::vector kenne ich "offiziell" noch nicht, deswegen will ich die Aufgabe ohne lösen.



  • Nein.

    Bei der Definition wird die Anzahl der Element angegeben.
    Da der Index immer bei 0 anfängt, hat das letzte Element einen Index, der Eins niedriger als die Anzahl ist.

    Darum läuft die Schleife auch von 0 bis < Anzahl, damit dort Anzahl steht.



  • OK, danke.



  • Es ist natürlich auch sehr sinnvoll, immer den Ausgangspost zu verändern. Da passen die Antworten so schön ...



  • Mugglschoaß schrieb:

    Anfängerfehler 😃 Muss natürlich n=99 heißen und die Schleife bis <=n laufen.

    ich meinte eher die variable Größe des Arrays in

    int n = 100;
    int a[n];
    

    Obwohl es Compiler gibt, die das akzeptieren, kann man damit gewaltig auf die Nase fallen, wenn die Array-Größe in die Nähe der Stackgröße kommt. In meinem System wäre das, wenn n in die Nähe von 2048*1024 kommt (8 MB = 2048*1024 ints). Sollte man sich vielleicht besser gar nicht erst angewöhnen.

    PS. Dieses Unterforum heißt "alle ISO-Standards" ...



  • Auch wenn du

    int a[100];
    

    schreibst, wird das Array auf dem Stack angelegt (sofern es nicht global oder static ist und das System einen Stack hat)



  • gegen int a[100] ist ja auch wenig einzuwenden


Anmelden zum Antworten