2-dimeonsionales Array - maximale Spaltensumme



  • Hallo!
    Verzweifle gerade an einem einfachen Beispiel in C.

    > Aufgabenstellung:

    In einer Funktion maxSpaltenSumme()ist die größte Spaltensumme (Summer aller Zahlen in einer Spalte) sowie deren Index zu ermitteln. Beide Werte sind als Referenzparameter zurückzuliefern.

    void maxSpaltenSumme(double feld[][MAX], size_t n, double *max, int *index)
    {
        double summe = 0;
        double summe2 = 0;
        int i,j;
    
        for(i = 0; i < n; i++)
        {
            summe = 0;
            for(j=0; j < n; j++)
            {
                summe += feld[i][j];
    
                    if(summe > summe2)
                    {
                        summe2 = summe;
                    }
            }
    
        }
        *index = i;
        *max = summe2;
    }
    

    Als Ausgabe bekomme ich immer, dass die Spaltensumme 0 ist. Der Spaltenindex ist auch immer falsch.

    Könnt ihr mir helfen? 😉



  • sorry für Doppelpost...
    Habe vergessen zu erwähnen dass das Feld in einer anderen Funktion erfolgreich initialisiert bzw. ausgegeben wurde!


  • Mod

    Mehr Kontext! Ein vollständiges Beispielprogramm, Beschreibung, was passieren soll und was stattdessen passiert.

    Die Funktion die du gezeigt hast sollte zumindest die Summe korrekt liefern (wobei die meisten Leute das wohl eher die Zeilensumme nennen würden, aber das ist Definitionssache, was die Zeile und was die Spalte sein soll), der Index ist natürlich der Index der letzten Zeile/Spalte, da du dir nirgendwo merkst, welcher Index zu der Spalte mit der größten Summe gehört.

    Drei Tipps:
    1. Den Fehler mit der falschen Zeile/Spalte kannst du beheben, indem du dir beim Fund eines neuen Maximums die aktuelle Zeile/Spalte merkst.
    2. Du musst nicht nach jeder Addition prüfen, ob ein neues Maximum erreicht wurde. Wie wäre es, erst einmal die ganze Zeile/Spalte zusammen zu zählen?
    3. Mach dir mal Gedanken, was wohl bei negativen Zahlen passiert.



  • Hallo!
    Danke für die schnelle Antwort! 🙂

    Hier ein Auszug aus der Angabe meiner Hausübung:

    Gegeben ist ein zweidimensionales Feld der Groesse n*n (2<=n<=6). Es ist ein Programm zu erstellen, das:

     In einer Funktion eingabe() n einliest (Plausibilitatskontrolle!) und die einzelnen Feldelemente mit double Zufallszahlen zwischen 30.00 und 299.99 beschreibt. n ist dabei als Ruckgabewert zuruckzuliefern. funktioniert

    In einer Funktion ausgabe() ist das Feld optisch korrekt (n Werte pro Zeile, 2 Nachkommastellen, Werte spaltenweise untereinander) am Bildschirm auszugeben.-funktioniert ebenfalls

    In einer Funktion maxSpaltenSumme()ist die größte Spaltensumme (Summer aller Zahlen in einer Spalte) sowie deren Index zu ermitteln. Beide Werte sind als Referenzparameter zurückzuliefern. - hier liegt das Problem

    Dabei sind noch 2 andere Funktionen, aber das spielt hier keine Rolle.

    In der Funktion menu() ist abzufragen, welche der drei Funktionen (in diesem Fall maxSpaltenSumme()) aufgerufen werden soll.

    Ich habe den Code etwas gekürzt.
    Das Feld wurde erfolgreich mit den Zufallszahlen erzeugt, die Ausgabe funktioniert auch richtig.

    In der 1. Spalte (index 0) sind die Elemente von feld[0][i] aufgelistet
    In der 2. Spalte (index 1) sind die Elemente von feld[0][i] aufgelistet
    Also sind in einer Zeile die Elemente von feld[0 bis (n-1)][0] aufgelistet.

    Ich hoffe du verstehst was ich meine.

    Es spielt ebenfalls keine Rolle, ob die Zahlen positiv oder negativ sind(Zufallszahlen von 30.00 - 299.99)

    void menu(double feld[][MAX], size_t n)
    {
        int spaltenIndex=0, e = 0;
        double max=0;
    
            printf("\n\n\n\n>>>Menu<<<\n\nEingabe:\n");
            printf("Berechne max. Spalten-Summe: 1\n");
    
            printf("eingabe: ");
            scanf("%d",&e);
            fflush(stdin);
            printf("\n\n");
    	switch(e)
    	{
    	case 1: printf(">>>Berechne max Spalten-Summe<<<<\n");
    
    	maxSpaltenSumme(feld,n,&max,&spaltenIndex);
    
    	printf("\nDie groesste Spaltensumme: %.2f\n",max);
    	printf("Der Index: %d\n",spaltenIndex);
    	ausgabe(feld,n);
     }
    void maxSpaltenSumme(double feld[][MAX], size_t n, double *max, int *index)
    {
        double summe = 0;
        double summe2 = 0;
        int i,j;
        for(i = 0; i < n; i++)
        {
            summe = 0;
            for(j=0; j < n; j++)
            {
                summe += feld[i][j];
                    if(summe > summe2)
                    {
                        summe2 = summe;
                    }
            }
        }
        *index = i;
        *max = summe2;
    }
    

  • Mod

    iN3verM1nd schrieb:

    Also sind in einer Zeile die Elemente von feld[0 bis (n-1)][0] aufgelistet.

    Fein, dann passt deine Definition von Zeilen und Spalten. Was funktioniert nun nicht? Hast du die bereits genannten Fehler beseitigt? In deinem neuen Quellcode sind sie noch drin.

    Es spielt ebenfalls keine Rolle, ob die Zahlen positiv oder negativ sind(Zufallszahlen von 30.00 - 299.99)

    Diese Anforderung steht für alle Zeiten in Stein gemeißelt, wird sich niemals ändern und die Funktion wird auch niemals von jemand anderem (der dem Namen der Funktion nach ein korrektes Verhalten auch für negative Zahlen erwarten könnte, schließlich heißt sie nicht maxSpaltenSummeAberNurFuerPositiveZahlen) benutzt werden?
    Falls ja: Du hast aber ein unglaubliches Vertrauen in die Zukunft und deine Mitmenschen.



  • SeppJ schrieb:

    iN3verM1nd schrieb:

    Also sind in einer Zeile die Elemente von feld[0 bis (n-1)][0] aufgelistet.

    Fein, dann passt deine Definition von Zeilen und Spalten.

    Ich habe meinen "Fehler" gefunden. Das Problem war, dass in der Ausgabe alle Elemente von feld[0][0] bis feld[0][n-1] nebeneinander waren - Somit habe ich die Spaltensumme der Felder richtig berechnet.

    Da aber die Summe der Spalten in der Ausgabe gefragt war, wurde die "richtige" größte Spaltensumme des Feldes der Ausgabe demnach zur Zeilensumme...

    Es spielt ebenfalls keine Rolle, ob die Zahlen positiv oder negativ sind(Zufallszahlen von 30.00 - 299.99)

    Diese Anforderung steht für alle Zeiten in Stein gemeißelt, wird sich niemals ändern und die Funktion wird auch niemals von jemand anderem (der dem Namen der Funktion nach ein korrektes Verhalten auch für negative Zahlen erwarten könnte, schließlich heißt sie nicht maxSpaltenSummeAberNurFuerPositiveZahlen) benutzt werden?
    Falls ja: Du hast aber ein unglaubliches Vertrauen in die Zukunft und deine Mitmenschen.

    Es spielt wirklich keine Rolle, da es sich hier um ein Hausübungs-Beispiel von unserem Lehrer handelt und der nur die Spaltensumme sehen will 😉

    Aber danke dir für deine Hilfe 🙂


  • Mod

    Magst du dir nicht wenigstens mal Gedanken darüber machen, wie man es so umsetzen könnte, dass das Programm bei negativen Zahlen keinen Unsinn macht? Man braucht auch bei Hausaufgaben schließlich nicht immer nur die Minimalforderung abliefern. Soger gerade bei Hausaufgaben kannst du doch rumprobieren! Später, wenn du mal wirklich das Minimum/Maximum von beliebigen Mengen suchen musst, dann weißt du schon gleich, was gute und schlechte Ideen sind.



  • SeppJ schrieb:

    Magst du dir nicht wenigstens mal Gedanken darüber machen, wie man es so umsetzen könnte, dass das Programm bei negativen Zahlen keinen Unsinn macht? Man braucht auch bei Hausaufgaben schließlich nicht immer nur die Minimalforderung abliefern. Soger gerade bei Hausaufgaben kannst du doch rumprobieren! Später, wenn du mal wirklich das Minimum/Maximum von beliebigen Mengen suchen musst, dann weißt du schon gleich, was gute und schlechte Ideen sind.

    Wenn eine negative Zahl zu einer positiven addiert wird, dann wird subtrahiert.
    (5)+(-3) = 5-3 = 2

    Meinst du etwa damit, dass ich negative Zahlen statt addieren subtrahieren soll?
    (5)-(-3) = 5+3 = 8



  • ...



  • Was passiert wenn die Summe kleiner Null wird weil negative Zahlen in der Spalte vorkommen.



  • DirkB schrieb:

    Was passiert wenn die Summe kleiner Null wird weil negative Zahlen in der Spalte vorkommen.

    Dann ist es doch trotzdem die "Summe".
    Eben die "Summe" aus den negativen und positiven Zahlen.



  • Was ist das Maximum von -12, -15, -3 ?

    Und schau mal was der Startwert in deiner Funktion ist.



  • DirkB schrieb:

    Was ist das Maximum von -12, -15, -3 ?

    Und schau mal was der Startwert in deiner Funktion ist.

    Okay, ich verstehe was du meinst.
    Dann muss ich

    1. entweder diese Zahlen ignorieren (nicht aufsummieren)
    2. oder diese Zahlen mit (-1) multiplizieren

    Stimmts? 🙂



  • ...



  • Swordfish schrieb:

    Njet. Spiel doch deinen Code mit negativen Zahlen mit Bleistift und Zettel durch ...

    if(spaltenSumme > *max)
    

    Ah, das ist das Problem...



  • Oder ändere den Code mal testweise um, das nur negative Werte vorkommen und lass dir das Maximum ausgeben.

    Was ist denn nun das Maximum von den Zahlen?



  • DirkB schrieb:

    Oder ändere den Code mal testweise um, das nur negative Werte vorkommen und lass dir das Maximum ausgeben.

    Was ist denn nun das Maximum von den Zahlen?

    Habs schon verstanden - 0 😉



  • iN3verM1nd schrieb:

    if(spaltenSumme > *max)
    

    Ah, das ist das Problem...

    Nein.

    Das Problem ist dein Anfangswert für das Maximum summe2 = 0;



  • DirkB schrieb:

    Was passiert wenn die Summe kleiner Null wird weil negative Zahlen in der Spalte vorkommen.

    Das ist der "falsche", alte Code.

    void maxSpaltenSumme(double feld[][MAX], size_t z, size_t s, double *max, int *index)
    {
        int i,j;
        double spaltenSumme = 0;
        for(i = 0; i < s; i++)
        {
            for(j = 0; j < z; j++)
            {
                spaltenSumme += feld[j][i];
            }
            if(spaltenSumme > *max)
            {
                *max = spaltenSumme;
                *index = i;
            }
            spaltenSumme = 0;
      }
    }
    


  • Ok, damit verlagerst du das Problem nach draußen.
    Mit Welchem Wert für max gehst du denn in die Funktion?


Anmelden zum Antworten