Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Informatik in der Schule » C# IndexOutOfRangeException Problem » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen C# IndexOutOfRangeException Problem
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
InformaTiger InformaTiger ist männlich
Tripel-As


images/avatars/avatar-77.gif

Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol

C# IndexOutOfRangeException Problem Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,
ich programmiere gerade ein Programm das die Reihenfolge von Zahlen bzw. von Mathematischen Variablen verändern soll und diese in ein Array aReihenfolge schreiben soll. Nun soweit ist es gut. Gibt man jetzt eine Gleichung ein die von aZerlegeGleichung zerlegt und von der for- Schleife sortiert wird, so passiert z.b bei der Gleichung 5 y + 1 x = 16 der Fehler IndexOutOfRange. Das Array aZerlegeGleichung ist in diesem Fall 7 Felder groß. Jedoch muss der letzte Durchlauf also in diesem Fall i = 6 auch noch durchgeführt werden können. verwirrt

Danke schon im Voraus.

Lg
InformaTiger

InformaTiger hat dieses Bild (verkleinerte Version) angehängt:
Problem.png



__________________
Why do Java developers wear glasses? Because they can't C#

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von InformaTiger: 26.02.2013 18:42.

26.02.2013 18:40 InformaTiger ist offline Beiträge von InformaTiger suchen Nehmen Sie InformaTiger in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Kannst du den Code bitte mal als Text einfügen, statt als Screenshot?
Dann muss man ihn nicht erst abtippen, um ihn zu debuggen.

Und was ist das Ziel des Programms?
Willst du noch eine 2. Gleichung eingeben lassen, um dann nach den Variablen aufzulösen?

__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 27.02.2013 17:44.

27.02.2013 17:35 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
InformaTiger InformaTiger ist männlich
Tripel-As


images/avatars/avatar-77.gif

Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hier ist der Code:

code:
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:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _130226UeLineareGleichungsysteme2
{
      class Program
      {
          static void Main(string[] args)
          {
              double[] aVariablen = new double[6];
              double x;
              double y; 
              double z;
              string aGleichung;

              Console.ForegroundColor = ConsoleColor.DarkGreen;
              Console.Write("Information: ");
              Console.ForegroundColor = ConsoleColor.Gray;
              Console.WriteLine("Bitte bringen Sie ihre I.Gleichung auf folgende Form: a_1 x + b_1 y = c_1\n");
                Console.Write("Bitte geben Sie ihre Gleichung ein: ");
              aGleichung = Console.ReadLine();
              string[] aZerlegeGleichung = new string[aGleichung.Length];
              double[] aReihenfolge = new double[4];
              aZerlegeGleichung = aGleichung.Split(" ".ToCharArray());
              for (int i = 0; i < aZerlegeGleichung.Length; i++)
              {
                  try
                  {
                      if ((aZerlegeGleichung[i] == "x") || (aZerlegeGleichung[i] == "y"))
                      {
                          if (i != 0)
                          {
                              i--;
                          }
                          if (aReihenfolge[0] == 0)
                          {
                              aReihenfolge[0] = Convert.ToDouble(aZerlegeGleichung[i]);
                          }
                          else if (aReihenfolge[1] == 0)
                          {
                              aReihenfolge[1] = Convert.ToDouble(aZerlegeGleichung[i]);
                          }
                          else if (aReihenfolge[2] == 0)
                          {
                              aReihenfolge[2] = Convert.ToDouble(aZerlegeGleichung[i]);
                          }
                          i++;
                      }
                      else if ((aZerlegeGleichung[i + 1] != "x") || (aZerlegeGleichung[i + 1] != "y"))
                      {
                          if (aReihenfolge[3] == 0)  
                          {
                              aReihenfolge[3] = Convert.ToDouble(aZerlegeGleichung[i]);
                          }
                      }
                  }
                  catch (FormatException)
                  {
                      continue;
                  }
              }
                Console.ReadLine();
          }
      }
  }
 


Genau der Sinn des Programmes besteht darin Gleichungen und Gleichungssysteme auszurechnen.

Lg
InformaTiger

__________________
Why do Java developers wear glasses? Because they can't C#

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von InformaTiger: 27.02.2013 17:48.

27.02.2013 17:45 InformaTiger ist offline Beiträge von InformaTiger suchen Nehmen Sie InformaTiger in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

code:
1:
else if ((aZerlegeGleichung[i + 1] != "x") || (aZerlegeGleichung[i + 1] != "y"))

die Zeile macht keinen Sinn: die Bedingung ist immer erfüllt, da der string immer entweder nicht "x" oder nicht "y" ist.
Die IndexOutOfRange Exception kannst du mit if(i < aZerlegeGleichung.Length-1 && ...)
Das && bewirkt, dass erst der erste Ausdruck ausgewertet wird, und der zweite gar nicht mehr betrachtet wird, wenn das Ergebnis bereits feststeht (false AND xxx == false)

code:
1:
aZerlegeGleichung = aGleichung.Split(" ".ToCharArray());

geht auch mit aZerlegeGleichung = aGleichung.Split(' ');

__________________
Syntax Highlighting fürs Board (Link)
27.02.2013 18:48 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Kaum getestet, sollte aber klappen.
Fehlerbehandlung (Benutzereingabe, Gleichungssystem nicht/nicht eindeutig lösbar) gibt es keine.
code:
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:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Wie viele Gleichungen hat das System? ");
            int n = int.Parse(Console.ReadLine());
            string[] Variablennamen = new string[n];
            double[,] eingang = new double[n, n];
            double[] ausgang = new double[n];
            for (int i = 0; i < n; i++) //Gleichung einlesen
            {
                Console.Write("{0}. Gleichung: ", i + 1);
                string gleichung = Console.ReadLine();
                //rechte Seite der Gleichung abspalten
                ausgang[i] = double.Parse(gleichung.Substring(gleichung.IndexOf("=") + 1));
                gleichung = gleichung.Remove(gleichung.IndexOf("="));
                //es ist nur noch die linke Seite übrig
                //Minusvorzeichen zur Zahl ziehen, dazwischen alles mit plus
                gleichung = gleichung.Replace("-", "+-");
                if (gleichung.Substring(0, 1) == "+") gleichung = gleichung.Remove(0, 1);
                string[] summanden = gleichung.Split('+');
                foreach (string s in summanden)
                {
                    string variable = s.Substring(s.Length - 1, 1); //letztes Zeichen
                    string zahl = s.Remove(s.Length - 1);
                    if (zahl == "") zahl = "1";
                    if (zahl == "-") zahl = "-1";

                    //prüfen, ob Variable schon verwendet wurde
                    for (int j = 0; j < n; j++)
                    {
                        if (Variablennamen[j] == null) //wenn Variable bisher noch nicht aufgetaucht
                            Variablennamen[j] = variable; //anfügen
                        if (Variablennamen[j] == variable)
                        {
                            eingang[i, j] = double.Parse(zahl); //wert für Variable zuweisen
                            break;
                        }
                    }
                }
            }
            //Gleichungssystem lösen mit Gauss
            //Dreiecksmatrix erzeugen
            for (int i = 0; i < n; i++)
            {
                if (eingang[i, i] == 0)
                {
                    for(int zeile=i;zeile<n;zeile++)
                        if(eingang[i,zeile]!=0) //zeile tauschen
                        {
                            for (int k = 0; k < n; k++)
                            {
                                double tmp = eingang[k, i];
                                eingang[k, i] = eingang[k, zeile];
                                eingang[k, zeile] = tmp;
                            }
                            double tmp2 = ausgang[i];
                            ausgang[i]=ausgang[zeile];
                            ausgang[zeile]=tmp2;
                        }
                }
                if (eingang[i, i] == 0) continue;
                for (int j = i + 1; j < n; j++)
                {
                    //0er erzeugen durch Addition
                    double faktor = -eingang[j, i] / eingang[i, i];
                    for (int k = 0; k < n; k++)
                        eingang[j, k] += faktor * eingang[i, k];
                    ausgang[j] += faktor * ausgang[i];
                }
            }
            //einsetzen
            double[] erg = new double[n];
            for (int i = n - 1; i >= 0; i--)
            {
                double tmp = ausgang[i];
                for (int j = n - 1; j > i; j--)
                    tmp -= erg[j] * eingang[i, j];
                erg[i] = tmp / eingang[i, i];
            }
            //Ergebnis ausgeben:
            for (int i = 0; i < n; i++)
                Console.WriteLine("{0} = {1}", Variablennamen[i], erg[i]);
            Console.ReadKey();
        }
    }
}


Beispielablauf:
code:
1:
2:
3:
4:
5:
6:
7:
Wie viele Gleichungen hat das System? 3
1. Gleichung: b+c+a=9
2. Gleichung: c-b+a=4
3. Gleichung: -a+b+c=8
b = 2,5
c = 6
a = 0,5


__________________
Syntax Highlighting fürs Board (Link)
27.02.2013 19:36 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
InformaTiger InformaTiger ist männlich
Tripel-As


images/avatars/avatar-77.gif

Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

code:
1:
else if ((aZerlegeGleichung[i + 1] != "x") || (aZerlegeGleichung[i + 1] != "y"))


Mit dieser Zeile wollte ich eigentlich abfragen ob der string danach, also nach der überprüften stelle "x" oder "y" ist. Deshalb kommt auch die Fehlermeldung und die möchte ich eben irgendwie abfangen. Ich hab leider keine Idee wie das gehen soll. verwirrt

Zu deinem Programm: bedauerlicherweise wäre ich nicht im Stande so etwas zu programmieren.

Lg
InformaTiger

__________________
Why do Java developers wear glasses? Because they can't C#

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von InformaTiger: 28.02.2013 18:49.

28.02.2013 18:47 InformaTiger ist offline Beiträge von InformaTiger suchen Nehmen Sie InformaTiger in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hi,


Zitat:
Original von InformaTiger
code:
1:
else if ((aZerlegeGleichung[i + 1] != "x") || (aZerlegeGleichung[i + 1] != "y"))


Mit dieser Zeile wollte ich eigentlich abfragen ob der string danach, also nach der überprüften stelle "x" oder "y" ist. Deshalb kommt auch die Fehlermeldung und die möchte ich eben irgendwie abfangen. Ich hab leider keine Idee wie das gehen soll. verwirrt


Schau dir mal reguläre Ausdrücke an. Damit sollten solche Prüfungen möglich sein.


Zitat:
Original von InformaTiger
Zu deinem Programm: bedauerlicherweise wäre ich nicht im Stande so etwas zu programmieren.


Nur noch nicht... Mit ein wenig Training und Spaß an der Sache bekommst du das sicher auch hin.

VG,

Karlito
01.03.2013 11:33 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Oder du lässt es erst gar nicht zur Exception kommen, wie ich vorgestern schon vorgeschlagen habe:
code:
1:
else if (i < aZerlegeGleichung.Length- 1  && char.IsLetter(aZerlegeGleichung[i + 1], 0))

Wenn i zu groß ist, wird die zweite Bedingung nicht mehr geprüft, sondern direkt abgebrochen, da der gesamte Ausdruck nicht mehr true werden kann.
char.IsLetter prüft, ob du einen Buchstaben hast.
Da du aber strings verwendest, lasse ich in dem Codebeispiel das erste Zeichen des strings testen.

Und ich gebe Karlito recht, es wird nicht alles auf Anhieb klappen, aber mit etwas Übung geht das schon.

__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 01.03.2013 14:31.

01.03.2013 14:30 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
InformaTiger InformaTiger ist männlich
Tripel-As


images/avatars/avatar-77.gif

Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke smile
Na, gut dann muss ich halt noch ein wenig üben Augenzwinkern

Lg
InformaTiger

__________________
Why do Java developers wear glasses? Because they can't C#
01.03.2013 18:32 InformaTiger ist offline Beiträge von InformaTiger suchen Nehmen Sie InformaTiger in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Informatik in der Schule » C# IndexOutOfRangeException Problem