Ich habe hier ein - für mich großes - Problem. _
Ich schriebe ein Programm zur Berechnung linearer Gleichungssysteme nach Gauß und möchte gerne _
Programm in kleineren Programmen teilen, damit alles übersichtlicher und einfach schöner wird _
(außerdem will ich ja was dazu lernen!!) _
'Ich möchte, dass mein "Hauptprogramm" hier "Schritt_3" genannt, die kleineren Prozeduren _
"tauschen " und "einsen" selbstständig einliest und diese korrekt ausführt. Aber es klappt nicht. _
Ich kenne mich mit solchen Situationen nicht aus. In den Bücher, die ich habe , konnte ich bis jetzt _
keine passende Lösung gefunden.
'In der Prozedur "Schritt_3" soll ein Datenfeld eingelesen werden:
'________________________________________________
Public Sub Schritt_3()
Dim A#()
Dim i%, j%, l%
Dim n%
n=3 'Eigentlich wird n durch Dialogabfrage übergeben, aber hier nehmen
'wir mal an, dass n=3 ist.
'Matrix A der Größe n*n und der Vektor b werden eingelesen, insgesamt
'ergibt es sich ein n*(n+1) großes Feld
ReDim A(n, n + 1)
For i = 1 To n
For j = 1 To n + 1
A(i, j) = Cells(15 + i, 1 + j)
'Debug.Print A(i, j)
Next j
Next i
'hier soll die Vertauschung vorgenommen werden
For l = 1 To n
If A(l, l) = 0 Then
tauschen
End If
'nach dem es keine Nullen Auf der Diagonalen der n*n Matrix mehr gibt, sollen alle Zeilen _
A(l,
.) durch ihr Diagonaleintrag A(l,l) geteilt werden. Dies soll die Prozedur einsen _
bernehmen.
einsen Aufruf der Prozedur
'Ausgabe für Kontrolle
For l = 1 To n
For j = 1 To n + 1
Cells(15 + l, 10 + j) = A(l, j)
Next j
Next l
End Sub
'___________________________________________________________________
'Nach dem die einträge eingelesen sind, muss überprüft werden, ob sich auf der Diagonalen, dass _
sind die A(l,l)-Einträge für die l-te Zeile, Nullen befindet. _
Wenn dass der Fall ist, sollen dann die betroffenen Zeilen vertauscht werden. _
Eigentlich soll es so sein, dass die l-te Zeile ihren Platzt mit der Zeile l+1 tauscht, _
und die letzte Zeile, wenn sie getauscht werden soll, auf den ersten Platz kommt und _
nicht auf die Stelle l+1, die es ja gar nicht gibt und damit es nicht aus dem gültigen Berecht fällt. _
Ich weiß bis jetzt noch nicht wie ich dass machen soll, und habe es so gemacht:
'Hat die Zeile l an der Stelle A(l,l) eine Null stehen, dann soll sie ihr Platz verlassen, und zwar auf die _
Stelle n-l+1. Diese Methode IST ABER FEHLERHAFT!!!
'Wie die Vertauschung im Allgemeinen aussieht, ist eigentlich egal, nur es soll für alle Zeilen möglich sein _
einen anderen Platzt zu bekommen, ohne dass sich da was überschneidet. _
Meine Methode schafft das nicht. D.h. für n=3 sieht es dann so aus: _
1=>3, 3=>1 und 2 wird überhaupt nicht vertauscht. Bis ich dieses Problem gelöst habe, versuche _
ich solche 3x3 Matrizen zu bearbeiten, bei denen die 2-te Zeile nicht vertauscht werden soll. _
Ist natürlich ziemlich blöd, aber im Moment habe ich keine andere Lösung. _
Wenn jemand ein Vorschlag hat, bitte meldet euch!!!
'_________________________________________________________________________
Public Sub tauschen()
Dim S#(), A#()
Dim i%, j%, l%, n%
n=3
ReDim A(n, n + 1)
ReDim S(n, n + 1)
'Hier werden die Zeilen, wenn es nötig, vertauscht
For l = 1 To n
If A(l, l) = 0 Then
For j = 1 To n + 1
S(l, j) = A(l, j)
A(l, j) = A(n - l + 1, j) Hier wird findet die Vertauschung statt
A(n - l + 1, j) = S(l, j)
Next j
End If
Next l
End Sub
_________________________________________________________________________
Public Sub einsen()
Dim A#()
Dim i%, j%, l%, n%
n=3
ReDim A(n, n + 1)
For l = k To n
For j = 1 To n + 1
A(l, j) = CLng(A(l, j)) / A(l,l) 'Hier bekomme ich immer die Meldung "Laufzeitfehler _
_
6, Überlauf",
'Debug.Print A(l, l) 'wieß aber nicht, warum
Next j
Next l
End Sub
'Ich weiss, dass man dies hier alles in einer Prozedur machen kann, aber ich will es lernen!!!
Bitte meldet euch, sagt mir was ich hier falsch mache.
Liebe Grüße
Julia