C# IndexOutOfRangeException Problem

Neue Frage »

Auf diesen Beitrag antworten »
InformaTiger C# IndexOutOfRangeException Problem

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
 
Auf diesen Beitrag antworten »
eulerscheZahl

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?
Auf diesen Beitrag antworten »
InformaTiger

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
Auf diesen Beitrag antworten »
eulerscheZahl

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(' ');
 
Auf diesen Beitrag antworten »
eulerscheZahl

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
Auf diesen Beitrag antworten »
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

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

Lg
InformaTiger
Auf diesen Beitrag antworten »
Karlito

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
Auf diesen Beitrag antworten »
eulerscheZahl

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.
Auf diesen Beitrag antworten »
InformaTiger

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

Lg
InformaTiger
 
Neue Frage »
Antworten »


Verwandte Themen