2-dimeonsionales Array - maximale Spaltensumme



  • SeppJ schrieb:

    Deswegen winken wir doch seit drei Seiten mit dem Zaunpfahl! 🙂

    ... aber aus Beton 😉



  • SeppJ schrieb:

    iN3verM1nd schrieb:

    Soll heißen dass mein Programm mit negativen Worten nicht funktioniert würde?

    Ja! Deswegen winken wir doch seit drei Seiten mit dem Zaunpfahl! 🙂

    Wer kam den auf die Überlegung, was denn passieren würde, wenn die Zahlen negativ wären?
    Ich nicht 😉
    Kann geschlossen werden, danke 🙂



  • iN3verM1nd schrieb:

    Wer kam den auf die Überlegung, was denn passieren würde, wenn die Zahlen negativ wären?

    Hast doch selber double als Typ im Array angegeben. Da spricht nix dagegen, daß negative Zahlen drin sind, oder?

    Ok, dein Code ist schon echt gut. Für eine Abgabe beim Prof fertig. Trotzdem hat er diese kleine Lücke. Kannste den Code auch noch als freiwillige Zusatzaufgabe so weit verbessern, daß er klappt, wenn alle Zeilensummen negativ sind? Also die größte der negativen Summen finden?

    summe1 und summe2 sehen so total ähnlich aus.

    Sind sie aber nicht. Eine Summe initialisiert man mit 0. Das ist logisch.

    Einen Maximalwert inistialisiert man mit dem kleinstmöglichen Wert. Oder wenn der nicht verfügbar ist, mit dem ersten Messwert.



  • volkard schrieb:

    iN3verM1nd schrieb:

    Wer kam den auf die Überlegung, was denn passieren würde, wenn die Zahlen negativ wären?

    Hast doch selber double als Typ im Array angegeben. Da spricht nix dagegen, daß negative Zahlen drin sind, oder?

    Ok, dein Code ist schon echt gut. Für eine Abgabe beim Prof fertig. Trotzdem hat er diese kleine Lücke. Kannste den Code auch noch als freiwillige Zusatzaufgabe so weit verbessern, daß er klappt, wenn alle Zeilensummen negativ sind? Also die größte der negativen Summen finden?
    **
    summe1 und summe2 sehen so total ähnlich aus.
    **
    Sind sie aber nicht. Eine Summe initialisiert man mit 0. Das ist logisch.

    Einen Maximalwert inistialisiert man mit dem kleinstmöglichen Wert. Oder wenn der nicht verfügbar ist, mit dem ersten Messwert.

    Danke für deine Denkanstöße 🙂
    Ich habe das Programm nun so geschrieben, dass man zum Programmstart auswählen kann, ob das Feld entweder
    -nur mit positiven Zahlen
    -nur mit negativen Zahlen
    -oder abwechselnd mit positiven und negativen Zahlen
    befüllt wird.
    Alles klappt perfekt.
    Leider habe ich "Einen Maximalwert inistialisiert man mit dem kleinstmöglichen Wert" überlesen, daher habe ich einige Zeit gebraucht, bis ich meinen Fehler finden konnte:

    if(*maxNeg*-1 > spaltenSummeNeg*-1)
                {
                    *maxNeg = spaltenSummeNeg;
                    *indexNeg = i;
                }
    

    Wenn *maxNeg mit 0 initialisiert wird, kann meine Bedingung nie wahr sein.

    Daher:

    #inlcude <float.h>
    [...]
    double spaltenSummeNeg = -DBL_MAX;
    [...]
    
    void maxSpaltenSumme(double feld[][MAX], size_t z, size_t s, double *maxPos, double *maxNeg, int *indexPos, int *indexNeg)
    {
        int i,j;
        double spaltenSummePos = 0;
        double spaltenSummeNeg = 0;
    
        for(i = 0; i < s; i++)
        {
            spaltenSummePos = 0;
            spaltenSummeNeg = 0;
                for(j = 0; j < z; j++)
                {
                    if(feld[j][i] < 0) //dann negative Zahl
                        {
                            spaltenSummeNeg += feld[j][i];
                        }
                        else //dann positive Zahl
                        {
                            spaltenSummePos += feld[j][i];
                        }
                }
                if(*maxPos < spaltenSummePos)
                {
                    *maxPos = spaltenSummePos;
                    *indexPos = i;
                }
                if(*maxNeg*-1 > spaltenSummeNeg*-1)
                {
                    *maxNeg = spaltenSummeNeg;
                    *indexNeg = i;
                }
      }
    }
    }
    

    Danke, ich habe wieder etwas gelernt 😉



  • Nee, lass die Unterscheidung zwischen pos und neg.
    Nicht nötig.



  • Der Trick ist, max auf den Wert von der ersten Zeile zu setzen.
    Dein Beispiel vom 19:09:39 17.01.2013

    ....
            }
            if(spaltenSumme > *max || i == 0)  // nur hier ist die änderung nötig 
            {
                *max = spaltenSumme;
                *index = i;
            }
    

    Kleine Änderung, große Wirkung.



  • DirkB schrieb:

    Der Trick ist, max auf den Wert von der ersten Zeile zu setzen.
    Dein Beispiel vom 19:09:39 17.01.2013

    ....
            }
            if(spaltenSumme > *max || i == 0)  // nur hier ist die änderung nötig 
            {
                *max = spaltenSumme;
                *index = i;
            }
    

    Kleine Änderung, große Wirkung.

    Warum einfach, wenn es kompliziert auch funktioniert? 😉
    Danke 😃

    Darf ich fragen wie alt du bist, bzw. wie lange du schon Erfahrung im Programmieren hast?



  • Sagen wir mal so, mein erster Computer war ein C64. Und da war ich auch kein Kind mehr. 😃

    Die anderen hätten das aber auch nicht groß anders gelöst.
    (Die Aufgabe schon, aber nicht diese kleine Anpassung)
    Z.B.:

    volkard schrieb:

    Einen Maximalwert inistialisiert man mit dem kleinstmöglichen Wert. Oder wenn der nicht verfügbar ist, mit dem ersten Messwert.

    Das mit dem ersten Messwert hat halt den Vorteil, dass du dir da über den Wertebereich keine Gedanken machen brauchst.
    Und es funktioniert für max und min.



  • DirkB schrieb:

    Das mit dem ersten Messwert hat halt den Vorteil, dass du dir da über den Wertebereich keine Gedanken machen brauchst.
    Und es funktioniert für max und min.

    Aber erzeugt mehr Compilat für nix und wieder nix.



  • volkard schrieb:

    DirkB schrieb:

    Das mit dem ersten Messwert hat halt den Vorteil, dass du dir da über den Wertebereich keine Gedanken machen brauchst.
    Und es funktioniert für max und min.

    Aber erzeugt mehr Compilat für nix und wieder nix.

    Ich glaube nicht, dass das hier eine Rolle spielt, zumal mein gesamtes Programm nur ca. 350 Zeilen lange ist.

    DirkB schrieb:

    Sagen wir mal so, mein erster Computer war ein C64. Und da war ich auch kein Kind mehr. 😃

    Die anderen hätten das aber auch nicht groß anders gelöst.
    (Die Aufgabe schon, aber nicht diese kleine Anpassung)
    Z.B.:

    volkard schrieb:

    Einen Maximalwert inistialisiert man mit dem kleinstmöglichen Wert. Oder wenn der nicht verfügbar ist, mit dem ersten Messwert.

    Das mit dem ersten Messwert hat halt den Vorteil, dass du dir da über den Wertebereich keine Gedanken machen brauchst.
    Und es funktioniert für max und min.

    Alles klar 🙂



  • iN3verM1nd schrieb:

    volkard schrieb:

    DirkB schrieb:

    Das mit dem ersten Messwert hat halt den Vorteil, dass du dir da über den Wertebereich keine Gedanken machen brauchst.
    Und es funktioniert für max und min.

    Aber erzeugt mehr Compilat für nix und wieder nix.

    Ich glaube nicht, dass das hier eine Rolle spielt, zumal mein gesamtes Programm nur ca. 350 Zeilen lange ist.

    Schon klar.
    Das ging nur an DirkB.
    Wenn der ein Maximum sucht, und std::max_element nicht angemessen ist, klickert er den passenden Code in 30 Sekunden rein und fertig. Man sammelt mit der Zeit Tricks. Es entsteht sozusagen eine Werkzeugkiste voller Tricks. Bald kann man 90% aller anstehenden Probleme lösen, indem man in der Werkzeugkiste einen Trick hervorholt oder ganz selten mal zwei Tricks kombiniert und einen neuen draus macht. Bald 99%. Und dann wird es Zeit, sich schwierigeren Aufgaben zu widmen.

    DirkB sollte als alter C64-Hase noch ein Gefühl für Rechnerlast haben. Gar nicht anders vorstellbar. Er wird diesen einen Trick umstellen, falls er den konkreten MaxWert speichert, was er wohl auch tut, wenn std::max_element nicht angebracht ist.



  • Alles klar.
    Danke für eure Hilfe 🙂


Anmelden zum Antworten