Announcement

Collapse
No announcement yet.

Anfängerfrage: Werte aus File berechnen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #31
    ich hab mal wieder ein problem

    ich möchte nun in der schleife (siehe rot makiert) von jedem wert in der spalte z den mittelwert abziehen. jedoch stehe ich da gerade auf dem schlauch wie ich das mit dem feld machen muss. ich weiss zwar das ein feld in der art von
    Code:
    double[] feld = new double[3];
    angelegt werden muss jedoch weiss ich nicht was ich bei dem new angeben muss in meinem fall
    ein kleiner tipp wäre klasse

    Code:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Data.OleDb;
    using System.Data.Common;
    
    namespace DataCon
    {
        class Program
        {
            static void Main(string[] args)
            {
                
                string source = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\praktikum" +
                                @";Extended Properties=""text;HDR=Yes;FMT=TabDelimited\""";
    
                DataTable table = new DataTable("pts_ring");
                table.Columns.Add("x", typeof(double));
                table.Columns.Add("y", typeof(double));
                table.Columns.Add("z", typeof(double));
    
                double value2 = 0;  //  value für z - Spalte
                using (OleDbConnection conn = new OleDbConnection(source))
                {
                    OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM test.txt", conn);
                    da.Fill(table);
                }
                
                foreach (DataRow row in table.Rows)
                {
                    double value0 = (double)row["x"];   //  für 1-te Spalte
                    double value1 = (double)row["y"];   //  für 2-te Spalte
                    value2 = (double)row["z"];   //  für 3-te Spalte
                    
                }
               
                //Anzahl ermitteln
                double count = table.Rows.Count;
                Console.WriteLine("Anzahl = " + count);
                
                //Minimum
                object min = table.Compute("Min(z)", "z >= 0");
                Console.WriteLine("Minimum = " + min);
                
                //Maximum
                object max = table.Compute("Max(z)", "z >= 0");
                Console.WriteLine("Maximum = " + max);
                
                //Summe
                object sum = table.Compute("Sum(z)", "z >= 0");
                Console.WriteLine("Summe = " + sum);
                
                //Mittelwert
                object avg = table.Compute("Avg(z)", "z >= 0");
                Console.WriteLine("Mittelwert = " + avg);
    
                //Modulo, um gerade o. ungerade Anzahl von Zeilen zu ermitteln
                double mod = count % 2;
                Console.WriteLine("Modulo = " + mod);
    
                        if (mod == 1)
                        {
                            Console.WriteLine("Die Anzahl der Zeilen ist ungerade");
                        }
    
                        if (mod == 0)
                        {
                            Console.WriteLine("Die Anzahl der Zeilen ist gerade");
                        }
    
                //Object to double konvertieren
                
                for (int i = 0; i < count; i++)
                {
                    double dif = 0;
                    double[] felddif = new double[dif];
                    dif = value2 - Convert.ToDouble(avg);
                    Console.WriteLine(felddif);
                    
                }
                
                Console.WriteLine(value2);
    
                Console.WriteLine();
                Console.WriteLine("Fertig");
                Console.ReadLine();
            }
        }
    }
    und meine 2. frage ist, wie ich eine bestimmte zeile mir anzeigen lassen kann ? also z.b. zeile 50 ?
    Zuletzt editiert von braindead2000; 09.04.2008, 15:15.

    Comment


    • #32
      mag keiner antworten ? is euch die frage zu dumm ? wobei.. es gibt ja keine dummen fragen...

      das ganze suchen und nachschlagen in der SDK oder MSDN (wie auch immer die heisst) und google haben keine wirkliche lösung für mein problem gebracht und auch das rumprobieren nicht.

      ich weiss halt nicht wie ich da direkt eine zeile rausbekommen soll wie bei einem feld.

      Comment


      • #33
        Originally posted by braindead2000 View Post
        mag keiner antworten ? is euch die frage zu dumm ? wobei.. es gibt ja keine dummen fragen...
        Dieses Rummotzen geht schon gar nicht. Du bist nämlich selbst schuld: Deinen Beitrag von 12:01 Uhr hast Du wieder gelöscht. Also hatte ich nicht gesehen, dass dort um 15:15 Uhr wieder etwas eingetragen wurde.

        Originally posted by braindead2000 View Post
        ich weiss halt nicht wie ich da direkt eine zeile rausbekommen soll wie bei einem feld.
        Mit meinen Vorschlägen solltest Du das inzwischen gelernt haben.

        table.Rows enthält alle Zeilen. Die SDK-Doku sagt, dass das eine DataRowCollection ist. Ein einzelnes Element kann also mit Index angesprochen werden: table.Rows[50]; alle Zeilen erhält man nacheinander durch eine for-Schleife mit Index oder foreach-Schleife per DataRow.

        Eine einzelne DataRow bietet den Zugriff auf die einzelnen Spalten durch Spaltenname row["x"] (hatten wir das nicht schon ausführlich behandelt?) oder durch Spaltenindex row[2]. Ein einzelner Wert ist immer vom Typ object und muss deshalb konvertiert werden. Wenn man den Typ sicher kennt, geht das direkt:
        Code:
        double currentValue = (double)row[2];
        Wenn das nicht sicher ist, braucht man Sicherheitsprüfungen:
        Code:
        object currentObject = row[2];
        double currentValue;
        if (currentObject is double)
            currentValue = (double)currentObject;
        else
            currentValue = 0;
        Was das hier soll, ist mir schleierhaft: Wozu brauchst Du ein double-Array mit 3 Werten (wie in Deiner Frage angedeutet)?
        Code:
                   for (int i = 0; i < count; i++)
                    {
                        double dif = 0;
                        double[] felddif = new double[dif];
                        dif = value2 - Convert.ToDouble(avg);
                        Console.WriteLine(felddif);
                    }
        double[dif] ist eine Array-Definition mit dif Elementen. dif ist von Dir als double deklariert mit dem Inhalt 0; aber zur Array-Erzeugung wird ein int benötigt. Was soll ein Array mit 0 Elementen sein? Danach willst Du dif berechnen, aber verwendest das Ergebnis überhaupt nicht. Stattdessen willst Du das nackte Array felddif (das noch keine Zahlen bekommen hat) ausgeben. value2 dagegen hat den letzten, weiter oben zugeordneten Wert, hat aber nichts mit dieser Schleife zu tun.

        Ich habe doch schon 'mal gesagt: Überleg Dir Schritt für Schritt, was Dein Programm machen soll, was vorher gilt und was nachher gelten soll! Das, was Du hier schreibt, ist doch völlig sinnleer!

        Ganz am Rande: Du willst avg ständig als double-Wert benutzen. Dann mach' daraus doch sofort einen double-Wert:
        Code:
                    //Mittelwert
                    double avg = (double)table.Compute("Avg(z)", "z >= 0");
        Auf jeden Fall ist es lächerlich, die Konvertierung in jedem Schleifendurchlauf neu zu machen. (Ich nehme an, dass der Compiler das für Dich verbessert, aber an so etwas solltest Du schon selbst denken.) Außerdem sind die Methoden der Convert-Klasse möglichst zu vermeiden; in Deiner Situation geht die Konvertierung direkt, in anderen Fällen ist Parse, ParseExact, TryParse entschieden vorzuziehen.

        Jürgen

        Comment


        • #34
          hallo,

          ok ich hab jetzt die konvertierungen alle verbessert.
          und jetzt klappt auch das mit row über table.Rows[50]["z"] laut SDK


          so nun zum eigentlichen was darauf aufbaut.
          komme ich als erstes zu meinem median problem:

          ich möchte ja den median berechnen.
          die anzahl der zeilen hab ich ja über table.Rows.Count;. den median davon bekomm ich dann ja z.b. so in der gedachten art:

          Code:
          double mid = table.Rows.Count  / 2; 
          double median = (mid % 2 != 0) ? 
          double row[mid+1] : ((double)row[mid] + (double)row[mid-1]) / 2;
          bis dato bekomm ich nur immer die position bzw stelle, die mir ja nichts nützt. d.h. ich weiss nicht genau wie ich da mit row usw arbeiten muss um zu einem ergebnis zu kommen.
          das er mir genau den wert ausgibt der in der zeile steht die ermittelt wurde für den median. über table.Rows[mid]["z"] komme ich zu keinem ergebnis .
          ich hoffe ich habe mich verständlich ausdrücken können.


          die 2. sache ist:
          bei der standartabweichung geht es mir ähnlich. da möchte ich mir zunächst die differenz der werte vom mittelwert berechnen.
          als nächsten dann die differenzen miteinander multiplizieren und dann das aufsummieren und dann die standartabweichung in der form berechnen:

          Code:
           for (int i = 0; i < count; i++)
                      {
                          double dif = table.Rows[i]["x"] - avg;
                          double tsum = dif * dif;
                          tsum2 +=  tsum;
                          
                      }
          double stdabw = sqrt (( 1 / (table.Row.Count - 1) * tsum2)
          ist vielleicht auch arge umständlich aber besser weiss ich es momentan nicht. ansich könnte das letzte klappen wenn ich das mit dif hinbekomme. macht das so sinn oder sollte ich es anders angehen ?
          Zuletzt editiert von braindead2000; 10.04.2008, 12:43.

          Comment


          • #35
            So, ab jetzt musst Du auf meine Hilfe verzichten: Auch als ich mich vor gut 30 Jahren intensiv mit Mathematik beschäftigt hatte, habe ich um Stochastik soweit möglich einen Bogen gemacht... Deshalb nur soviel:

            Für den Median brauchst Du eine geordnete Menge. Dies ist die DataTable natürlich nicht. Du kannst stattdessen eine DataView verwenden:
            Code:
            DataView view = new DataView(table);
            view.Sort = "z";  // Sortierung nach Spalte z
            Bei der view kannst Du direkt auf die n/2-te bzw. (n+1)/2-te Zeile zugreifen. (Auch für viele andere Maßnahmen kannst Du eine DataView genauso wie eine DataTable verwenden.)

            Für die Standardabweichung könnte Dir schon die korrekte Rechtschreibung helfen: Der "Standard" hat nichts mit einer "Standarte" oder "Stand-Kunst" (= Stand-Art) zu tun. Mit dem richtigen Suchbegriff findest Du in einem Forum oder unter Wikipedia vielleicht passende Anleitungen.

            Abschließend möchte ich meine früheren Empfehlungen wiederholen:
            Zuerst selbst Schritt für Schritt überlegen, was gemacht werden soll; dann das in Programmcode umsetzen; das Ergebnis im Debugger kontrollieren.
            In der SDK-Doku findet man unter den allgemeinen Erläuterungen viele nützliche Hinweise und Beispiele. Und die OpenBooks zu C# und Visual C# sind ebenfalls sehr hilfreich.

            Jürgen

            Comment


            • #36
              hm ok, aber eine frage hab ich noch. ich hab die spalte z über den sql befehl sortieren lassen SELECT * FROM test.txt ORDER BY z ASC das geht dann nicht so ?

              ps: für meine rechtschreibung kann ich nichts, hab nunmal ne lese-rechtschreib-schwäche. das kann man nicht so einfach an und abstellen. ich bemühe mich schon (siehe die ganzen edits)

              Comment


              • #37
                Originally posted by braindead2000 View Post
                hm ok, aber eine frage hab ich noch. ich hab die spalte z über den sql befehl sortieren lassen SELECT * FROM test.txt ORDER BY z ASC das geht dann nicht so ?
                Doch, dann geht es auch mit der DataTable. (Dein letzter Code hatte davon noch nichts geschrieben.) Dann ist ja die DataTable bereits die benötigte geordnete Menge; also kannst Du auch direkt auf die benötigte Zeile table.Rows[i] mit dem richtigen Index i zugreifen.

                Originally posted by braindead2000 View Post
                ps: für meine rechtschreibung kann ich nichts, hab nunmal ne lese-rechtschreib-schwäche. das kann man nicht so einfach an und abstellen. ich bemühe mich schon (siehe die ganzen edits)
                "Standart" ist leider ein weit verbreiteter Standardfehler; deshalb (und wegen der Konsequenzen bei der Suche) wollte ich darauf hinweisen. Deine Rechtschreibung und Grammatik (fehlende Satzzeichen) sind in der Tat gewöhnungsbedürftig; aber ich habe schon "Schlimmeres" gelesen und wollte mich darüber nicht beschweren.

                Übrigens bist Du jetzt etwa soweit, dass Du eine neue Diskussion mit einem Titel wie "Median und Standardabweichung in DataTable" eröffnen kannst. Denke daran, dass Überschrift und Inhalt zusammenpassen sollen.

                Jürgen

                Comment


                • #38
                  alles klar, ich danke dir!
                  die ganze hilfestellung hat enorm viel gebracht.
                  mit dem median habe ich es nun auch hinbekommen.
                  Zuletzt editiert von braindead2000; 10.04.2008, 15:17.

                  Comment

                  Working...
                  X