Matrix for Schleife

Hallo zusammen,

ich hänge seit heute morgen an einem Problem das ich irgendwie nicht gelöst bekomme. Hier folgender Quellcode…

[CSHARP]
class Program
{
static void Main(string[] args)
{
object[][] kunde = new object[3][];

        kunde[0] = new object[] {"KundeA", 10, 50, 40 };
        kunde[1] = new object[] {"KundeB", 40, 30, 70 };
        kunde[2] = new object[] {"KundeC", 60, 75, 50 };

        distanzBerechnung(kunde);
        Console.ReadLine();

    }

    static void distanzBerechnung(object[][] kunde)
    {
        for (int a = 0; a < kunde.Length; a++)
        {
            Console.WriteLine(kunde[a][0]);

            for (int b = 0; b < kunde.Length; b++)
            {
                Console.WriteLine(kunde**[0]);
                for (int p = 0; p < kunde.Length; p++)
                {
                    Console.WriteLine(kunde**[p]);

                    for (int w = 0; w < kunde.Length; w++)
                    {
                        Console.WriteLine(kunde**[w]);
                        //object formel = 0;
                        //formel = p + w;
                        //Console.WriteLine(formel);
                    }
                }
            }
        }
    }
}

}
[/CSHARP]

Das Programm soll mir an Ende eine Matrix ausgeben die folgender Maßen aussehen soll:
KundeA; KundeA; 1ErgebnisFormel; 2ErgebnisFormel; 3ErgebnisFormel
KundeA; KundeB; 1ErgebnisFormel; 2ErgebnisFormel; 3ErgebnisFormel
KundeA; KundeC; 1ErgebnisFormel; 2ErgebnisFormel; 3ErgebnisFormel
KundeB; KundeA; 1ErgebnisFormel; 2ErgebnisFormel; 3ErgebnisFormel
KundeB; KundeB; 1ErgebnisFormel; 2ErgebnisFormel; 3ErgebnisFormel
KundeB; KundeC; 1ErgebnisFormel; 2ErgebnisFormel; 3ErgebnisFormel
… und so weiter!!!

Die Formel hat aktuell noch keinen Sinn. Ich habe auf jeden fall einen Fehler im Schleifen-Aufbau, da im moment zu viele Werte errechnet werden. Jedoch kann ich einfach nicht erkennen wo der Fehler liegt.

Vielleicht seht ihr den Fehler und könnte mir einen Tipp geben was ich falsch mache.

Danke und Viele Grüße

wenn du auch in Java aktiv bist und siehst wie hier keine 10 Postings im halben Jahr vorkommen,
könntest du es doch auch erstmal in Java machen :wink:
anderseits, dann füllt sich ja diese Area nie :wink:

das Problem ist so allgemein und einfach, da kann man sicher auch sprachübergreifend antworten,
was hast du vor?
die Ausgabe klingt nach einer Kombination aller Elemente untereinander, für n Einträge n x n, hier 3 x 3 = 9 Kombinationen,
dafür reichen ZWEI verschachtelte Schleifen

in Zeile 25 bist du soweit, 9x kommst du da vorbei, hast kunde[a] und kunde** und kannst diese jetzt kombinieren,

was willst du an dieser Stelle machen?
[CSHARP]
Console.WriteLine("Formel 1: "+(kunde[a][0]kunde*[0]));
[/csharp]
wäre eine Kombination, vielleicht noch zwei weitere,
vielleicht eine Schleife über die Länge der zweiten Dimension,

[CSHARP]
Console.WriteLine("bin bei a= „+a+“, b= "+b);
for (int p = 1; p < kunde[0].Length; p++) {
Console.WriteLine("Formel „+p+“: "+(kunde[a][p]kunde*[p]));
}
[/csharp]
aber das sollte es dann langsam sein,

wenn noch unklar, dann musst nun erstmal in Worte fassen,
was bei Kombination von zwei bestimmten Einträgen konkret alles passieren

Hab das jetzt nurmal im Kopf versucht zu verfolgen, aber kommen nicht sogar eher zu wenige raus? So wie ich den Code lese, schreibt er dir jedes mal eine neue Zeile, etwa so:

KundeA
KundeB
...

Deswegen solltest du vllt mehr gebrauch von der Methode Console.write(string) machen.

Und wie komme ich drauf dass es zu wenige sein dürften? Durch diese Zeilen:
[csharp]for (int p = 0; p < kunde.Length; p++)
{
Console.WriteLine(kunde**[p]);
for (int w = 0; w < kunde.Length; w++)
[/csharp]

Hier willst du vermutlich eher die länge der 2ten Dimension deines Arrays, also müsste es vermutlich so aussehen
[csharp]for (int p = 0; p < kunde**.Length; p++) …
[/csharp]

Ansonsten wäre mal ein Ausschnitt des Ist-Zustandes sicherlich interessant

ja ihr habt Recht ich habe jetzt die Schleifen angepasst.
Mein Problem ist aber immer noch die ich die Werte korrekte miteinander verrechne, sodass das hier raus kommt

KundeA; KundeA; 1ErgebnisFormel; 2ErgebnisFormel; 3ErgebnisFormel
KundeA; KundeB; 1ErgebnisFormel; 2ErgebnisFormel; 3ErgebnisFormel
KundeA; KundeC; 1ErgebnisFormel; 2ErgebnisFormel; 3ErgebnisFormel
KundeB; KundeA; 1ErgebnisFormel; 2ErgebnisFormel; 3ErgebnisFormel
KundeB; KundeB; 1ErgebnisFormel; 2ErgebnisFormel; 3ErgebnisFormel
KundeB; KundeC; 1ErgebnisFormel; 2ErgebnisFormel; 3ErgebnisFormel
… und so weiter!!!

Denn so sollen die Daten später in die DB geschrieben werden.

Mal ein Beispiel zur Verrechnung…

kunde[0] = new object[] {“KundeA”, 10, 50, 40 };
kunde[1] = new object[] {“KundeB”, 40, 30, 70 };
kunde[2] = new object[] {“KundeC”, 60, 75, 50 };

Verrechnung:
KundeA; KundeA -> 10+10; 50+50; 40+40
KundeA; KundeB -> 10+40; 50+30; 40+70
KundeA; KundeC -> 10+60; 50+75; 50+50
KundeB; KundeA -> 40+10; 30+50; 70+40
KundeB; KundeB -> 40+40; 30+30; 70+70

Die Aussage sollte dann auch so erfolgen

also für Beispiel

KundeA; KundeC -> 10+60; 50+75; 50+50

Sollte in der Console:

KundeA; KundeC; 70; 125; 100

erscheinen damit ich die Werte später sauber in die DB schreiben kann…

Ich hoffe ich habe mich verständlich ausgedrückt ^^

wohl eher 40+50 am Ende wenn A da 40 stehen hat, lieber zweimal drüber schauen

das ist dann die Schleife die ich schon gepostet habe, außer mit + statt *,
und dann noch die Arbeit, alles in eine Zeile zu bekommen statt mehrere Zeilen auszugeben,
String mit + zusammenfügen usw., das sollte machbar sein

Hab mir das nochmal angeschaut, du hast tatsächlich mehr werte als gewollt. Das liegt daran, weil du zum Schluss eine Schleife zuviel hast. Durch die 4te Schleife, würdest du alle Werte aus dem einen Array mit allen Werten aus dem anderen Array verrechnen. Das willst du ja aber garnicht.

Dann weiter: du musst für deine Formatierung in der zweiten Schleife den Zeilenumbruch setzen, d.h. auch erst dort solltest du KundeX;KundeY ausgeben (logischerweise bevor du den Zeilenumbruch ausgibst).

Wenn du diese Tipps umsetzt sollte es klappen — so tut es das zumindest in meinem Java-Progrämmchen.

Ja du hast Recht! Deine Lösung klappt! Sorry :smiley: allerdings hat sich ein weiters Problem ergeben. Die IDE sagt das ich das array vom typ object nicht mit einem + Operator verrechnen kann? aber ich muss ja beim Array object verwenden damit ich string Werte und int bzw double Werte in einem array verwenden kann um damit die Zuordnung von Kunden zu den Werte hinzubekommen…

Dann musst du die Werte in ints oder doubles casten. Dann sollte auch das funktionieren.

Ich frag mich gerade wie das bei Mehrdimensionalen Arrays geht?

Kunde [a][p] = Convert.Todouble();
geht nicht

[quote=dibbi1234]Mein Problem ist aber immer noch die ich die Werte korrekte miteinander verrechne[/quote]Als Java-Entwickler mag ich mich da irren, aber man munkelt C# sei eine objektorientierte Sprache. Also warum erzeugst Du keine Klasse Kunde mit entsprechenden Feldern, in der Du die Berechnung und die Ausgabe (einer Zeile) kapselst?

bye
TT

's bringt dir nichts, wenn du irgendwas konvertierst und dem array neu zuweist. Das Array ist vom Typ object und deswegen wird erstmal davon ausgegangen, dass alles was man da raus holt auch vom typ object ist. Da ein Integer (in c# vermutlich auch) vom typ object ist, kannst du es darin ablegen. Wenn du es dann aber wieder rausholst/ausliest, geht C# erstmal davon aus, dass es sich um ein object handelt. Um damit rechnen zu können musst du es in dem Fall halt erstmal auf ein int casten (also was es eigentlich auch ist).

[QUOTE=dibbi1234]Ich frag mich gerade wie das bei Mehrdimensionalen Arrays geht?

Kunde [a][p] = Convert.Todouble();
geht nicht[/QUOTE]

geht nicht gibts nicht, oder gibt es keine Fehlermeldungen in dieser Sprache?
kunde klein z schreiben?
Convert.Todouble() klingt auch nach falscher Groß- und Kleinschreibung und fehlenden Argument

etwas mehr Mühe in Details bitte,
sollte das gar nicht alles mit breiten Antworten würdigen, aber viel zu schreiben gibts im Forum ja nicht :wink:

Okay =) also ich habe gerade folgendes getestet!

kunde[a][p] = Convert.ToInt32(); -> Keine Überladung für die ToInt32-Methode nimmt 0 Argumente an.

dann habe ich folgendes gemacht

kunde[a][p] = Convert.ToInt32(object);
kunde[a][p] = Convert.ToInt32(object[][] kunde);

Geht auch nicht! Ich bin auch nicht so tief in der Materie, das ich jetzt irgendwie eine Idee hätte wie das gehen soll…

kunde[a][p] = Convert.ToInt32(hoppsala);
geht auch nicht, was ist denn überhaupt dein Ziel?

was erwartest du als Ergebnis deiner drei Versuche, was soll nachher anders sein als vorher?

und du musst doch die grundlegensten den Grund aufbauenden Grundlagen beachten:
die Methode verlangt einen String als Parameter, ‘nix’ ist kein String, ‘object’ ist kein String, ‘object[][] kunde’ ist kein String
(‘hoppsala’ auch nicht, falls nicht entsprechend vorher definiert)

Die Werte innerhalb des Arrays sind in im Format “Object” das habe ich ja so gewählt damit die Kunden unmittelbar mit den Werten in einer Liste im array auftauchen und man somit die Werte den Kunden zuordnen kann.

Bei unserer Formel müssen ja zwei Werte miteinander verrechnet werden. Das scheint aber mit einem Object nicht zu gehen, deshalb müssen die Werte innerhalb des Arrays irgendwie in eine Format (double oder int) damit sie sich mit einander verrechnen lassen. Jetzt ist halt die Frage wie schaffe ich es die Wert in eine solche Format zu bringen. Es gibt Casting oder Convertierung womit so etwas ja eigentlich möglich sein sollte. Aber ich habe bisher keinen Ansatz gefunden wie ich das umsetzten kann.

der Typ des Arrays ist Object, daran ist nicht zu rütteln,
wie Tomate_Salat schon schrieb würden dazu neue Befehle nichts wesentlich ändern,

kunde[0] = new object[] {“KundeA”, 10, 50, 40 };
scheint völlig ausreichend zur Befüllung des Arrays, da gibt es anscheinend keinen Fehler

das Array ist so gut, versuche nicht mehr darin irgendwas zu speichern, es sei denn mit besserer Erklärung,
wichtig ist herausfinden, was in den im Moment drin ist,

in Java würde man ein Element herausholen, evtl. in einer Object-Variablen speichern, und casten oder erst mit instanceof prüfen,
ein String wird jedenfalls nicht im Array drin sein, die Convert-Methoden dürften wegfallen,

in Java wären Integer-Objekte im Array:

int wert = ((Integer) kunde[x][y]).intValue();
// mit int nun + rechnen usw.

wenn es in C# nichts vergleichbares gibt dann weiß ich auch nicht weiter, vielleicht kann man ja direkt (int) casten oder was auch immer,
eine Fehlermeldung verrät vielleicht, welchen tatsächlichen Typ die Objekte haben

Okay ich habe mir gerade einen etwas anderen Ansatz ausgedacht. Vielleicht könnt ihr mir sagen ob diese je nachdem sinnvoll ist.
Ich würde in der Datenbank den Kunden eindeutige Nummern zuweisen und dann ein Array laden (also die Daten aus der DB in das Array) das nur die Nummer des Kunden + Seiner Werte beinhaltet und dann noch ein zusätzliches Array das nur Kunden + Deren Nummer hat.
Dann könnte man doch im weiteren Programmverlauf die Nummern den Kunden zuweisen und eine Ausgabe bauen die dann anstatt der Nummer Kundennamen ausgibt!

Ist das vielleicht die bessere Lösung?

Ich verstehe zwar gerade nicht so ganz was du machen willst aber … nein.

  1. Du hast ein Problem mit Datentypen zu arbeiten - das Problem wird 100% irgendwann in ähnlicher Form wieder auftauchen. Lerne jetzt wie man damit umgeht und du kannst es später. Getreu dem Motto aufgeschoben ist nicht aufgehoben.
  2. Arrays sind hier imho generell falsch am Platz, so wie Timothy_Truckle schon geschrieben hat: Objekte sind besser. Das wäre also der nächste Schritt: mach aus dem 2D-Array ein Array, welches Kundenobjekte beinhaltet. (nur so: wenn du die Kundenklasse richtig baust, musst du in diesem Fall auch nichts mehr casten). Ein weitere Vorteil von Objekten: man weiß was die Werte zu bedeuten haben. Keiner von uns könnte dir sagen, wofür die Zahlen stehen.
  3. Danach kannst du dran denken, die Kunden-Objekte mit Werten aus einer DB zu füllen + Kundenobjekte in einer DB zu speichern.

[QUOTE=SlaterB]
in Java wären Integer-Objekte im Array:

int wert = ((Integer) kunde[x][y]).intValue();
// mit int nun + rechnen usw.

wenn es in C# nichts vergleichbares gibt dann weiß ich auch nicht weiter, vielleicht kann man ja direkt (int) casten oder was auch immer,
eine Fehlermeldung verrät vielleicht, welchen tatsächlichen Typ die Objekte haben[/QUOTE]

In C#

[CSHARP]
int wert = Convert.ToInt32(kunde[x][y]);
[/CSHARP]

Convert.To**** gibt es in alle möglichen Farben und Kombinationen.

Int32 ist in diesem Fall die entsprechende Klasse für int. (Int64 ist dann die Klasse für long)