Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » 2 Dimensionales Array

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
18.06.2007, 23:19 Uhr
jack26



Hallo,

ich hab ein kleines Problem mit einem 2 Dimensionalem Array, und zwar will eine Matrix an eine Funktion übergeben, diese gibt als Resultat die Anzahl der Zeilen zurück für die folgende Bedingungen gelten:

- Zwischen 2 negativen Zahlen einer Zahl steht wenigstens 1 positive Zahl oder 0
- Die Summe aus den positiven Zahlen in einer Zeile ist kleiner als der Betrag der Summe der negativen Zahlen in der Zeile

Hier mal mein Code:

C++:
#include <stdio.h>
#include <math.h>

int matrixfunc(int (*matrix)[4]) {

    int i, j, k, summepos, summeneg, counter=0;

    for(i=0; i<3; i++)
        for(j=1; j<4; j++) {

            summepos=0;
            summeneg=0;

        
            
            for(k=0; k<4; k++)
                if(matrix[i][k] < 0 && matrix[i][k+2] < 0 && k<4) //Ist 1te und 3te Zahl negativ?
                    if(matrix[i][k+1] >= 0) { //Ist 2te Zahl positiv?
                        summepos += matrix[i][k+1];
                        summeneg += matrix[i][k];
                    }
            if(summepos<abs(summeneg)) //Summe der positiven Zahlen < Summe der negativen Zahlen einer Zeile?
                counter++;

            printf("pos:%i\n",summepos);
            printf("neg:%i\n",summeneg);
            printf("counter:%i\n",counter);
            
        }

        return counter;
        
}

int main(void) {
    int matrix[3][4]={{-1,1,-1,1},
            {-2,1,-1,1},    // Rückgabe müsste 2 sein
            {-1,1,-2,1}};
                        
    int ergebnis;

    ergebnis=matrixfunc(matrix);
    printf("%i",ergebnis);

}



Irgendwie funktioniert meine Funktion noch nicht gaz, wäre für jede Hilfe dankar.

Danke
Gruß
jack26
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.06.2007, 23:21 Uhr
jack26



Das ganze sollte in C, nicht in C++ realisiert werden...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.06.2007, 07:58 Uhr
Kest
saint


Hi!

Also wenn das >matrix< ja ehe schon zur Compilerzeit bekannt ist, dann kann man das einfach mit
C++:
sizeof(matrix)/sizeof(int)/4
erfahren.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 19.06.2007 um 07:58 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.06.2007, 23:04 Uhr
jack26



Aha und was möchtest du mir damit genau sagen?
Mein Problem ist ja, dass ein falscher Rückgabewert zurück gegeben wird, es müsste 2 zurückgegeben werden bei meiner übergebenen Tabelle, da es in Zeile 2 und 3 jeweil genau einmal vorkommt, dass eine positive Zahl von 2 negativen Zahlen eingeschlossen ist und die Summe der positiven Zahlen kleiner der Summe der negativen Zahlen ist.

Oder versteh ich jetz irgendwas falsch?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.06.2007, 00:39 Uhr
Blubber2063



Also mehrere Dinge:
1. entweder j oder k, die schleife über j erscheint mir ziemlich sinnlos.
2. Dein Programm enstpricht nicht deiner Anforderung(die positive Zahl könnte auch zwischen 2. und 4. Position stecken)
3. Dein Test ist großer mist, dein k kann von 0-3 gross werden, aber k in deinem Test schaust du dir das Element k+1 und k+2 an, diese existieren aber bei deiner Matrix nicht.
Und der Test k < 4 in deiner If Abfrage ist unsinn, k kann wegen der Forschleife nicht größer als 3 werden, wenn dann muss da k+2 < 4 stehen und auch dann muss es vor der If Abfrage passieren, da du sonst wieder auf nicht "existenten" Speicher zugreifst.
Dann deine Summierung der negativen und postiven Summe ist falsch, du kannst nicht von unterschiedlichen Indizes ausgehen, wenn du den selber Wert testest. Das mit dem k+1 als index halte ich auch für sehr merkwürdig.

Also schau dir noch mal genau an was dein Programm tut und was es tuen soll, bei der kleinen Matrix würde ich dir sogar mal eine Handsimulation vorschlagen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.06.2007, 08:27 Uhr
Kest
saint


Wenn das Ziel ja sowieso das Ermitteln der Zeilenanzahl ist, was bringt es dann, da irgendwas zu suchen, wenn die Zeilenanzahl schon bekannt ist? Denn genau das ist ja das Dumme: deine Matrix wird auf dem Stack angelegt, und auf den Stack kann man >immer< zugreifen (ist auch ein bekanntes Problem: buffer overflow (zwar ein bisschen was anderes, aber ...)); es funktioniert also auch z.B. matrix[8][9]. Und wenn da grad eine >gültige< Zahl liegt, dann ist ja das ganze im A... . Zwar tutste das nicht, aber in deiner Funktion ist schon die Größe der Matrix bekannt.
Im Grunde genommen hättest du einfach die Frage anders stellen sollen. Selber schuld, wenn dir die Antworten nicht gefallen.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.06.2007, 08:42 Uhr
Blubber2063



Du hast die Frage falsch gelesen Kest, er hat ja die statische Größe der Matrix in den schleifen schon drinne, aber es geht ja auch um die Auswertung des Inhalts der Zeilen, nicht um die Zeilen selbst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.06.2007, 09:38 Uhr
Kest
saint


Hast recht. Hab mich grad totgelacht, wie man ja sein kann.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 20.06.2007 um 10:02 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.06.2007, 20:31 Uhr
jack26



Ich hab mir das ganze eigentlich ein bisschen anders vorgestellt, nicht dass bloß mein Code als "misst" bezeichnet wird, sondern etwas konstruktive Kritik, aber naja egal.
Ich hab mein Problem gelöst, mit folgendem Code funktioniert mein Programm so wie ich es wollte:

C++:
#include <stdio.h>
#include <math.h>

int matrixfunc(int (*matrix)[4]) {

    int i, j, k, summepos, summeneg, counter=0;

    for(i=0; i<3; i++)
        for(j=1; j<3; j++) {

            summepos=0;
            summeneg=0;
            for(k=0; k<4; k++) {
                if(matrix[i][k] >= 0)
                    summepos+=matrix[i][k];
                else
                    summeneg+=matrix[i][k];
            }


            if(matrix[i][j-1] < 0 && matrix[i][j+1] < 0)
                if(matrix[i][j] >= 0)
                    if(summepos<abs(summeneg))
                        counter++;
        }

    return counter;
        
}

int main(void) {
    int matrix[3][4]={{1,-2,1,-1},
            {-2,1,-1,1},    
            {-1,1,-1,1}};
                        
    int ergebnis;

    ergebnis=matrixfunc(matrix);
    printf("%i",ergebnis);

}



Aber trotzdem vielen Dank für eure Bemühungen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.06.2007, 21:20 Uhr
0xdeadbeef
Gott
(Operator)


Ich würd das möglicherweise nochmal refaktorisieren, also

C++:
int knn(int *zeile, size_t zlaenge) { /* keine negativen Nachbarn, knn */
  size_t i;

  for(i = 0U; i < zlaenge - 1; ++i) {
    if(zeile[i] < 0 && zeile[i + 1] < 0) {
      return 0;
    }
  }

  return 1;
}

int zeilen_summe(int *zeile, size_t zlaenge) {
  size_t i;
  int x = 0;

  for(i = 0U; i < zlaenge; ++i) {
    x += zeile[i];
  }

  return x;
}

int matrixfunc(int *matrix, size_t dimx, size_t dimy) {
  size_t i;
  int x = 0;

  for(i = 0U; i < dimy; ++i) {
    if(knn(&matrix[i * dimx], dimx) &&
       zeilen_summe(&matrix[i * dimx], dimx) < 0) {
      ++x;
    }
  }

  return x;
}


Ist jetzt völlig ungetestet, aber die Idee sollte klar werden, denke ich. So würd ich das anpacken.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 20.06.2007 um 21:21 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: