Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

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

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 <
000
24.05.2007, 21:59 Uhr
jack26



Hi,

kann mir jemand sagen, wie man eine Funktion schreibt, die ein 2 Dimensionales int Array auf folgende 3 Dinge untersucht:

1. Hat das Array gleich viele Zeilen wie Spalten
2. Ist jeder einzelne Wert des Arrays nur einmal vorhanden, es darf also jede Zahl nur einmal vorkommen.
3. Die Zeilensumme, die Spaltensumme und die Summe der Diagonalen müssen gleich sein, d.h. wenn man die einzelnen Zahlen einer Zeile addiert muss das gleiche rauskommen, wie wenn man die einzelnen Zahlen der Spalten addiert, selbiges gilt auch für die Diagonalsumme.

Wenn alle Kriterien erfüllt sind wird 1 zurückgegeben, ansonten 0.

Mir geht es hier nur um die Überprüfung des Arrays, nicht wie dieses Array auszusehen hat um die Kriterien zu erfüllen.

Hat jemand ne Idee?? Soll angeblich recht schnell zu lösen sein...

Gruß
jack26
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.05.2007, 22:10 Uhr
öni



Also auch wenn wir keine Hausaufgaben Service sind -> deswegen selber Ansätze vorlegen (entweder Code oder Gedankengänge)
Trozdem mal für den Anfang die Nummer 2 kann man mit 2 For-Schleifen lösen genauso wie die Nummer 3. Wie man Funktionen schreibt dürte ja bekannt sein deshalb ist der Rückgabewert auch eigentlich einfach! Wie man die Nummer 1 anpackt habe ich keine Ahnung da ich nicht weis wie man herauslesen soll wieviele Spalten und Zeilen es hat aber ich denke man könnte es vielleicht mit einer Execption lösen (hab noch nie mit denen gearbeitet).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.05.2007, 11:53 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Nummer 1 ist in c nicht wirklich möglich ohne irgendwelche perversen verrenkungen wie Öni schon andeutet. Die Dimension muss übergeben werden oder ein Datentyp verwendet werden der die Dimension als Information enthält. Alles andere ist blödsin.


Zitat:

Hat jemand ne Idee?? Soll angeblich recht schnell zu lösen sein...



Das ist richtig
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.05.2007, 12:32 Uhr
jack26



Also, hierbei handelt es sich nicht um eine Hausaufgabe, ich hatte einen Lösungsansatz, der leider überhaupt nicht hingehauen hatte, deshalb bin ich nach einiger Zeit des grübelns hierher gekommen...

Was haltet ihr von folgendem Vorschlag, um herauszufinden ob das Array gleich viele Spalten wie Zeilen hat:


C++:
...
int y=0;
...

for(x=0; x<Z; x++) {
    if(t[0][x])
        counter++;
        
    if(t[y][1]) {
        counter--;
        y++;
    }
}
if(counter!=0)
    return 0;

...



Das die 2 und 3 mit ner doppelten for-Schleife funktionieren muss ist mir auch klar, nur wie weiter??
Zur 2 und 3 fällt mir leider nix weiteres ein, meine Lösung dafür war vieeel zu lange...

Aber Danke
Gruß
jack26
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.05.2007, 12:51 Uhr
Blubber2063



Wenn t ein C-Array ist, dann funktioniert deine Lösung nicht, denn dann prüfst du Speicher der dir nicht gehört, das kann eine Runtime Exception auslösen, nebenbei kannst du da unter Umständen endlos über nicht genullten Speicher rattern.

Deswegen gibts für sowas Klassen bzw in c Strukturen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.05.2007, 13:29 Uhr
Th



Wie Windalf schon geschrieben hat, muß man die Dimensionen (in C) einzeln der Funktion übergeben, d.h.

C++:
int check(int *array, int zeilen, int spalten)
{
  int z, s, z2, s2, sum, sum2;

  if(zeilen != spalten) // 1. check
    return 0;

  // 2. check
  for(z=0; z<zeilen; z++)
    for(s=0; s<spalten; s++)
       for(z2 = z+1; z2<zeilen; z2++)
         for(s2 = s+1; s2<spalten; s2++)
           if(array[z][s] == array[z2][s2])
             return 0; // Zahl doppelt

  // 3. check
  sum = 0;
  for(z=0; z<zeilen; z++)
   sum += array[z][0];

  // zeilen
  for(z=0; z<zeilen; z++)
  {
     sum2 = 0;
     for(s=0; s<spalten; s++)
        sum2 += array[z][s];

     if(sum != sum2)
         return 0;
  }

  // spalten
  for(s=0; s<spalten; s++)
  {
     sum2 = 0;
     for(z=0; z<zeilen; z++)
        sum2 += array[z][s];

     if(sum != sum2)
         return 0;
  }

  // diagonalen
  ...

  return 1;
}


Ich habe dies jetzt blind getippt, könnten also noch Fehler drin sein (evtl. habe ich auch C++ statt C verwendet -)
Die Diagonalen habe ich jetzt noch als Aufgabe für dich übriggelassen (ist mir zu schwer...)

Besser ist es sogar, wenn du die drei Checks in eigene Funktionen packst (auch wenn es keine Hausaufgabe ist und du es nicht abgeben mußt -)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.05.2007, 13:48 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Mal so als Anmerkung: Nicht jede Zeile eines Array muss genauso lang sein wie eine andere.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
28.05.2007, 20:28 Uhr
jack26



Erstmal vielen Dank für die ausfürhliche Antwort.

@Th, ich hab deinen Code ausprobiert, aber das funktioniert nicht ganz bei deinem 2ten Check, um zu ermitteln ob doppelte Zahlen darin vorkommen. Den Rest muss ich noch durschauen.

Aber warum Hast du nicht die eigentlich leichteste, die Diagonalsumme berechnet?
Ich würde dies so lösen:


C++:
int diagonal=0, s, z;
...
...
    for(z=0; z<10; z++)
        for(s=0; s<10; s++) {
            if(z==s)
                diagonal+=quadrat[z][s];
        }
        ...
...



Was haltet ihr davon?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
28.05.2007, 20:40 Uhr
öni



Das ist jetzt von links oben nach rechts unten, ich weiß nicht ob du das noch von rechts oben nach links unten machen willst?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
28.05.2007, 21:15 Uhr
jack26



Ach stimmt ja, die zweite Diagonale hatte ich ganz vergessen...ja die gehört natürlich auch mit dazu.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: