Autor Beitrag
sebastian1234
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Do 06.02.14 18:56 
Hallo zusammen,

folgende Frage! Ich lese aus einem EXCEL File Daten und schreibe diese in ein Array. Dieses Array wird in der unten aufgeführt Methode weiterverarbeitet und es erhält neue Werte. Wie kann ich die neuen Werte den einzelnen Objekten (Unternehmen) wieder zuordnen?

Ausgangspunkt EXCEL File:
Unternehmen/Kennzahl1/Kennzahl2
1/10/20
2/30/40

1.Array Kunde:
1/10/20
2/30/40

Methode verarbeitet die Werte 10, 20, 30, 40! Bspw. 0,4; 0,6; 0,3; 0,1
Wie können die Werte in einem neu erstellten Array wieder den "Unternehmen" 1 und 2 zuteilt werden sodass folgendes Array entsteht...

1/0,4/0,6
2/0,3/0,1

Hier die Methode in der alles gemacht wird (wahrscheinlich nicht besonders gut von mir programmiert)

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
 
public static void Stanardisierung(double[][] kunde)
        {
            double Mittelwert = 0;
            double Standardabweichung = 0;
            double Summe = 0;
            double Anzahl = 0;
            double Test = 0;
            double Test1 = 0;
            double Array = 0;
            double Array1 = 0;

            for (int a = 0; a < kunde.Length; ++a)
            {
                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    Summe += kunde[a][i];
                    Anzahl++;
                    Test1 += (Math.Pow(kunde[a][i], 2));
                }
            }

            Mittelwert = Summe / Anzahl;
            Test = Test1 / Anzahl;
            Standardabweichung = Math.Sqrt(Test);
            Console.WriteLine("Abweichung" + Test1);
            Console.WriteLine("Mittelwert" + Mittelwert);

            for (int a = 0; a < kunde.Length; ++a)
            {
                Console.WriteLine("Unternehmen"+kunde[a][0]);
                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    Array = kunde[a][i] - Mittelwert;
                    Array1 = Array / Standardabweichung;
                    Console.WriteLine(Array1);
                    Array = 0;
                }
            }  
        }


In Array1 stehe die neu berechneten Werte!
Die Ausgabe im Terminal ist...

Unternehmen1
Wert1
Wert2
Unternehmen2
Wert1
Wert2

Diese müssten wieder in ein Array gebracht werden und zwar so wie es in die Methode reingekommen ist.

Viele Grüße!!!! und danke
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 06.02.14 19:18 
Erstell dir einen Klon des Eingangsarray

ausblenden C#-Quelltext
1:
double[,] kundeStandardabweichung = (double[,])kunde.Clone();					


und schreibe den Wert den du berechneten hast in deiner Schleife an den selben Index zurück an dem du auch die Werte aus dem Kunde Array geholt hast also vermutlich

ausblenden C#-Quelltext
1:
kundeStandardabweichung[a][i] = Array1;					



Übrigens dein Naming ist ziemlich problematisch um nicht zu sagen kaum leserlich. Ich würde dir raten dich an die Standards von c# zu halten die machen am wenigsten Probleme und sind für uns am einfachsten lesbar. Zum Beispiel den double Array zu nennen geht schon unter grob fahrlässig. Den kann man mit der Klasse Array verwechseln, wenn einer aus dem Context bemerkt das das nicht sein kann würde er erstmal vermuten das es eine Property ist etc. Schreib Variablen klein und gib ihnen Namen die auch irgendwas mit dem Context zu tun haben in dem sie verwendet werden.

Für diesen Beitrag haben gedankt: sebastian1234
sebastian1234 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Mo 17.02.14 17:00 
Hallo konnte jetzt eine Woche leider nichts machen! Beim wieder einarbeiten in den Quelltext bin ich nun auf folgendes Problem gestoßen... Ich will 3 checkboxen an der Oberfläche haben Standardisierung, distanzBerechnungCity, distanzBerechnungEukli.

Ich habe ein Problem wie ich die if Abfrage gestallten muss sodass zuerst gefragt wird ob die Werte standardisiert werden sollen ja oder nein und dann danach erst gewählt werden soll ob distanzBerechnunCity und distanzBerechnunEkli...

EDIT: Wie schaffe ich es die checkbox1 und checkbox2 Werte nicht nur in der Form1 anzuwenden sondern auch in der DistanzenBerechnen klasse???
sebastian1234 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Mo 17.02.14 18:39 
Ich will mal was genauer werden!

Im ersten if-Teil wird eine Abfrage hinsichtlich StandardisierungCheckBox gemacht. Ist diese Abfrage "gecheckt" soll zuerst die Methode Stanardisierung aufgerufen werden, welche die Daten standardisiert. Innerhalb dieser Methode möchte ich dann eine weitere if Abfrage machen die dann entweder die distanzBerechnungCity oder DistanzBerechnungEukli aufruft je nachdem wie an der Oberfläche entweder checkbox CityBlockCheckBox oder EuklidischCheckBox ausgewählt wurde. Wie kann ich die "gecheckten" Werte von CityBlockCheckBox oder EuklidischCheckBox an die Methode Stanardisierung übergeben.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
if (StandardisierungCheckBox.Checked)
            {
                double[][] kunde = dt.Rows.OfType<DataRow>().Select(x => x.ItemArray.Cast<double>().ToArray()).ToArray();
                
                if (CityBlockCheckBox.Checked)
                {
                    DistanzenBerechnen.Stanardisierung(kunde);
                    
                }
                if (EuklidischCheckBox.Checked)
                {
                    DistanzenBerechnen.Stanardisierung(kunde);
                }
            }
            else
            {
                double[][] kunde = dt.Rows.OfType<DataRow>().Select(x => x.ItemArray.Cast<double>().ToArray()).ToArray();
                if (CityBlockCheckBox.Checked)
                {
                    DistanzenBerechnen.distanzBerechnungCity(kunde);
                }
                if (EuklidischCheckBox.Checked)
                {
                    DistanzenBerechnen.distanzBerechnungEukli(kunde);
                }
            }


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
public static void Stanardisierung(double[][] kunde)
        {
            double Mittelwert = 0;
            double Standardabweichung = 0;
            double Summe = 0;
            double Anzahl = 0;
            double StandardabweichungOhneWurzel = 0;
            double SummeQuadrat = 0;
            double AufDemBruchFormelStandardisierungKunde = 0;
            double StandardisierungKunde = 0;

            for (int a = 0; a < kunde.Length; ++a)
            {
                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    Summe += kunde[a][i];
                    Anzahl++;
                    SummeQuadrat += (Math.Pow(kunde[a][i], 2));
                }
            }

            Mittelwert = Summe / Anzahl;
            StandardabweichungOhneWurzel = SummeQuadrat / Anzahl;
            Standardabweichung = Math.Sqrt(StandardabweichungOhneWurzel);
            
            Console.WriteLine("Mittelwert " + Mittelwert);
            Console.WriteLine("Standardabweichung " + Standardabweichung);
            Console.WriteLine("");

            for (int a = 0; a < kunde.Length; ++a)
            {
                Console.WriteLine("Unternehmen"+kunde[a][0]);
                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    AufDemBruchFormelStandardisierungKunde = kunde[a][i] - Mittelwert;
                    StandardisierungKunde = AufDemBruchFormelStandardisierungKunde / Standardabweichung;
                    Console.WriteLine(StandardisierungKunde);
                    AufDemBruchFormelStandardisierungKunde = 0;
                }

                // Hier würde ich vllt. die If Abfrage einbauen... 
                
            }  
        }
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 17.02.14 18:51 
Zitat:
Wie kann ich die "gecheckten" Werte von CityBlockCheckBox oder EuklidischCheckBox an die Methode Stanardisierung übergeben.


Als Parameter? Hast du ja mit dem kunde Array auch gemacht.
sebastian1234 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Mo 17.02.14 18:56 
ich habe eben versucht das in einem int und double zu speichern was allerdings nicht geklappt hat. Auch ist die Unterscheidung zwischen CityBlockCheckBox oder EuklidischCheckBox mir nicht wirklich klar... Aber ich versuche nochmal
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 17.02.14 19:00 
int, double???? Ein Checkbox liefert maximal einen Boolean.
sebastian1234 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Di 18.02.14 13:10 
Ja stimmt boolean! Gibt ja nur 2 Zustände. Trotzdem ist mir die Verarbeitung bzw. die Unterscheidung was jetzt "gecheckt" ist nicht wirklich klar...

Habe die Übergabe der Parameter jetzt so gestaltet...

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
if (StandardisierungCheckBox.Checked)
            {
                double[][] kunde = dt.Rows.OfType<DataRow>().Select(x => x.ItemArray.Cast<double>().ToArray()).ToArray();
                Boolean check;

                if (CityBlockCheckBox.Checked)
                {
                    check = CityBlockCheckBox.Checked;
                    DistanzenBerechnen.Stanardisierung(kunde, check);
                    
                }
                if (EuklidischCheckBox.Checked)
                {
                    check = EuklidischCheckBox.Checked;
                    DistanzenBerechnen.Stanardisierung(kunde, check);
                }
            }


Die Methode in der die Parameter ankommen sieht so aus...
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
public static void Stanardisierung(double[][] kunde, Boolean check)
        {
            double Mittelwert = 0;
            double Standardabweichung = 0;
            double Summe = 0;
            double Anzahl = 0;
            double StandardabweichungOhneWurzel = 0;
            double SummeQuadrat = 0;
            double AufDemBruchFormelStandardisierungKunde = 0;
            double StandardisierungKunde = 0;

            for (int a = 0; a < kunde.Length; ++a)
            {
                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    Summe += kunde[a][i];
                    Anzahl++;
                    SummeQuadrat += (Math.Pow(kunde[a][i], 2));
                }
            }

            Mittelwert = Summe / Anzahl;
            StandardabweichungOhneWurzel = SummeQuadrat / Anzahl;
            Standardabweichung = Math.Sqrt(StandardabweichungOhneWurzel);
            
            Console.WriteLine("Mittelwert " + Mittelwert);
            Console.WriteLine("Standardabweichung " + Standardabweichung);
            Console.WriteLine("");

            for (int a = 0; a < kunde.Length; ++a)
            {
                Console.WriteLine("Unternehmen"+kunde[a][0]);
                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    AufDemBruchFormelStandardisierungKunde = kunde[a][i] - Mittelwert;
                    StandardisierungKunde = AufDemBruchFormelStandardisierungKunde / Standardabweichung;
                    Console.WriteLine(StandardisierungKunde);
                    AufDemBruchFormelStandardisierungKunde = 0;
                }  
            }
            /*if (check == CityBlockCheckBox.Checked)
                 * {
                 *  ‹bergeben Array an Methode distanzBerechnungCity...
                 * }
                 *if (check == EuklidischCheckBox.Checked)
                 *{
                 *  ‹bergebe Array an Methode distanzBerechnungEukli...
                 *}*/

        }


Ich weiß halt nicht genau wie ich jetzt die Unterscheidung zwischen CityBlockCheckBox und EuklidischChechkBox hinbekommen sollen. Weil doch in dem boolean lediglich true oder false gespeichert wird...oder? Aber dann fehlt der Bezug zu CityBlockCheckBox oder EuklidischCheckBox.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 18.02.14 13:28 
Hallo,

stehst du irgendwie auf dem Schlauch heute? ;-)

Klar kannst du mit dem einen boolschen Parameter nur einen Wert abfragen. Also wirst du wohl beide boolschen Werte an die Methode übergeben müssen...
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if (StandardisierungCheckBox.Checked)
{
    double[][] kunde = dt.Rows.OfType<DataRow>().Select(x => x.ItemArray.Cast<double>().ToArray()).ToArray();

    bool checkCity = CityBlockCheckBox.Checked;
    bool checkEuklid = EuklidischCheckBox.Checked;

    DistanzenBerechnen.Standardisierung(kunde, checkCity, checkEuklid);
}

Und dann in der Methode Standardisierung (ich kaufe ein 'd') die Abfrage auf diese beiden Parameter durchführen.

Für diesen Beitrag haben gedankt: sebastian1234
sebastian1234 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Di 18.02.14 14:45 
Ja ich weiß auch nicht wahrscheinlich einfach Dummheit =)

Auf jeden Fall habe ich es jetzt hinbekommen und das Problem mit dem Array! Vielen Dank!

Nur noch eine kurze Frage bzgl. Checkboxen... Wenn ich an der Oberfläche 2 Checkboxen habe, es aber so sein soll, dass von diesen beiden immer nur eine angeklickt werden darf, wie kann ich das einstellen? Also quasi XOR!
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 18.02.14 14:54 
Dazu benutzt man dann keine CheckBox, sondern RadioButtons. Da ist dann automatisch immer nur einer pro Gruppe ausgewählt und es ist auch das UI-Element, was ein Windows-Nutzer dafür erwartet.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: sebastian1234
sebastian1234 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Di 18.02.14 15:10 
Wunderbar vielen danke klappt!!!