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

Informatiker Board » Themengebiete » Informatik in der Schule » C# IndexOutOfRangeException Problem » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 9 Beiträge
InformaTiger

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

Lg
InformaTiger
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.
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
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
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
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(' ');
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
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?
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

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