den größten wert eines arrays ermitteln?



  • Oder so.

    Mit den Elementen des Builders bin ich nochnet so vertraut.

    Mein Code stammt aus nem C Progie, was wir letztes Jahr in der Schule gemacht haben.

    Ich wollte halt masl was sagen *g*

    [ Dieser Beitrag wurde am 15.05.2003 um 19:48 Uhr von Thargor editiert. ]



  • Thargor schrieb:

    Muss das Array in der gleichen Form bleibenwie es ist, oder kann die reihenfolge geändert werden?

    Wenn ja sotier es doch einfach, mit der Blasenmethode.

    for(c=0 ; c<=9 ; c++)
    {
        for(b=0 ; b<=9 ; b++)
       {
        if(arr>arr[b+1])
        {
        tausch=arr[b];
        arr[b]=arr[b+1];
        arr[b+1]=tausch ;
        }
       }
    }
    

    **

    dann haste den höchsten wert im ertsen Array.

    Oder wenn die Reihenfolge nicht verändert werden darf:

    for(c=0 ; c<=9 ; c++)
    {
        for(b=0 ; b<=9 ; b++)
       {
        if(arr[b]>arr[b+1])
        {
        max=c;   // (oder max=b; sorry. Is lang her das ich das gemacht habe, musstemal testen.
        }
       }
    

    [ Dieser Beitrag wurde am 15.05.2003 um 19:35 Uhr von [b]Thargor** editiert. ]

    Kann mir jemand sagen, wieso wir hier zwei for Schleifen machen müssen, damit es funktioniert?

    Gruss



  • @ALIG Nein, der Code ist schlicht schrott!



  • // Da es keine sonderlich handsame Methode gibt die Anzahl eines Integer-
    // Arrays zu ermitteln, muss die Anzahl der Funktion mit uebergeben werden.
    // Alternativ dazu kann man auch vector benutzen. Dort gibt es eine vor-
    // definierte Methode size().
    int find_max(int *a,int c) {
        int max=0;
        for(int i=0;i<c;i++) if(a[i]>max) max=i;
        return max;
    }
    

    Hier einmal ein Beispiel mit vector :

    #include <vector.h>
    int find_max(vector<int>a) {
        int max=0;
        for(int i=0;i<a.size();i++) if(a[i]>max) max=i;
        return max;
    }
    

    Ein Beispiel-Aufruf könnte so aussehen:

    vector<int> test;   // Deklaration
    test.reserve(7);    // Speicher-Reservierung
    test.push_back(10); // F
    test.push_back(45); // u
    test.push_back(12); // e
    test.push_back(23); // l
    test.push_back(39); // l
    test.push_back(63); // e
    test.push_back(33); // n
    
    int idx_of_max=find_max(test); // Wird 5 sein, da das vorletzte Element
                                   // mit 63 den hoechsten Wert beinhaltet.
    


  • heini schrieb:

    Hier einmal ein Beispiel mit vector :

    #include <vector.h> /* ... */
    

    🙄

    ... und a per value übergeben? int zum Zählen von Speichergrößen? nene.

    0 als Initialwert für max ? nene.



  • heini schrieb:

    // Da es keine sonderlich handsame Methode gibt die Anzahl eines Integer-
    // Arrays zu ermitteln, muss die Anzahl der Funktion mit uebergeben werden.
    // Alternativ dazu kann man auch vector benutzen. Dort gibt es eine vor-
    // definierte Methode size().
    int find_max(int *a,int c) {
        int max=0;
        for(int i=0;i<c;i++) if(a[i]>max) max=i;
        return max;
    }
    

    Hast du das überhaupt getestet? Bist du sicher, dass es funktioniert, wenn du in der Schleife dem Maximalwert einen Index zuweist? (Gilt für die vector-Variante genauso.)



  • Um der Nekrophilie mal eine Rechtfertigung zu geben. Wenn jemand einen 13 Jahre alten Thread ausgräbt muss es ja ein dringendes Problem sein.

    #include <algorithm>
    
    // manuell
    int find_max( int *a, size_t c ) 
    {
       assert( a && c > 0 );
    
       int max = *a;
       for( size_t i = 1; i < c; ++i, ++a ) if( *a > max ) max = *a;
       return max;
    }
    
    // STL way
    int find_max( int *a, size_t c )
    {
       assert( a && c > 0 ); 
       return *std::max_element( a, a + c );
    }
    


  • //STL-like way:
    
    #include <cassert>
    #include <iterator>
    
    template <class InputIt, class T = typename std::iterator_traits< InputIt >::value_type >
    T max( InputIt first, InputIt last )
    {
    	assert( first != last );
    
    	T max = *first;
    
    	for( auto i = first; i != last; ++i )
    		if( *i > max )
    			max = *i;
    
    	return max;
    }
    


  • Dasd schrieb:

    Hast du das überhaupt getestet?

    Ja.

    Bist du sicher, dass es funktioniert, wenn du in der Schleife dem Maximalwert einen Index zuweist? (Gilt für die vector-Variante genauso.)

    Ja. Denn das war die Anforderung im Eingangs-Post:

    Franz schrieb:

    [...] also welches array teil dem größten wert hat



  • heini schrieb:

    Dasd schrieb:

    Bist du sicher, dass es funktioniert, wenn du in der Schleife dem Maximalwert einen Index zuweist? [...]

    Ja. [...]

    heini schrieb:

    // ...
    
        for(int i=0;i<c;i++) if(a[i]>max) max=i;
    
    // ...
    
        for(int i=0;i<a.size();i++) if(a[i]>max) max=i;
    
    // ...
    

    Darüber denkst jetzt bitte nochmal gaaaanz scharf nach.



  • Und als Gedankenstütze: http://ideone.com/UVKe17



  • Dasd schrieb:

    Und als Gedankenstütze: http://ideone.com/UVKe17

    Joa, dein Kommentar am Ende des Codes ist interessant. Du meinst das richtige, schreibst aber das falsche. -> Index ist 6 und nicht 5, da an Index 6 der Wert 63 steht.



  • inflames2k schrieb:

    Dasd schrieb:

    Und als Gedankenstütze: http://ideone.com/UVKe17

    Joa, dein Kommentar am Ende des Codes ist interessant. Du meinst das richtige, schreibst aber das falsche. -> Index ist 6 und nicht 5, da an Index 6 der Wert 63 steht.

    Ähmm... Nein? Das ist der Originalcode samt Kommentare von Heini. Das soll nur nochmal verdeutlichen, dass sein Algorithmus nicht passt. Der Wert 63 steht nämlich nicht an Index 6. 😉



  • Dasd schrieb:

    Ähmm... Nein? Das ist der Originalcode samt Kommentare von Heini. Das soll nur nochmal verdeutlichen, dass sein Algorithmus nicht passt. Der Wert 63 steht nämlich nicht an Index 6. 😉

    Woah, hast recht. - Habe das "Reserve" aus irgendeinem Grund als "push_back" gelesen.

    Hallo Heini,

    falls du deinen Fehler wirklich nicht siehst. - Du vergleichst die Werte des Vektors mit dem zuletzt gelesenen Index. - Da alle Werte > 7 sind ist der Index folglich der des letzten Elements.

    Korrekt wäre also wenn du dir den Wert des größten Elements und den Index merkst und auch auf den Wert des bisher größten Elements prüfst.



  • inflames2k schrieb:

    Korrekt wäre also wenn du dir den Wert des größten Elements und den Index merkst und auch auf den Wert des bisher größten Elements prüfst.

    dub di dub.

    max = 0;
         for(int i=0;i<c;i++) if(a[i]>a[max]) max=i;
    


  • Ist doch das gleiche nur in kürzer. 🤡



  • Swordfish schrieb:

    dub di dub.

    max = 0;
         for(int i=0;i<c;i++) if(a[i]>a[max]) max=i;
    

    Und das Problem ist auch nicht unbedingt Raketenwissenschaft.


Anmelden zum Antworten