Die letzten 9 Beiträge |
InformaTiger |
Danke
Na, gut dann muss ich halt noch ein wenig üben
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.
|
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.
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.
Danke schon im Voraus.
Lg
InformaTiger
InformaTiger hat dieses Bild (verkleinerte Version) angehängt:
|
|
|