Was macht man, wenn Zahlenfolgen zu komplex werden, um sie mit Schleifen zu erzeugen?

  • Allgemein

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Was macht man, wenn Zahlenfolgen zu komplex werden, um sie mit Schleifen zu erzeugen?

    Hallo,

    es gibt ja z.B. einfache Schleifenkonstruktionen, wie z.B. welche, die jedes Element eines 2D-Arrays durchgehen

    VB.NET-Quellcode

    1. Dim MyArray(9,4) As String
    2. For i As Integer = 0 to 9
    3. For j As Integer = 0 to 4
    4. MyArray(i,j) ...
    5. Next
    6. Next


    Dann gibt es auch z.B. noch welche, wo jedes Element mit jedem in einem 1D-Array verglichen werden kann

    VB.NET-Quellcode

    1. Dim MyArray(5) As String
    2. For i As Integer = 0 to 5
    3. For j As Integer = i+1 to 5
    4. If MyArray(i) = MyArray(j) Then ...
    5. Next
    6. Next


    Was macht man aber bei wirklich komplexen Schleifenkonstruktionen?
    Zum Beispiel habe ich ein Array

    VB.NET-Quellcode

    1. Dim MyArray As Integer(,) = {(0,0,1,2}, {1,2,1,1}, {0,0,0,0}, {1,2,1,2}}


    und ich möchte nun (0,0) mit (0,1); (0,0) mit (1,0); (0,0) mit (1,1); (0,0) mit (2,0); ... ; (0,1) mit (1,0); (0,1) mit (1,1); (0,1) mit (2,0) usw. vergleichen. Das wären max. 4 ineinander verschachtelte Schleifen und de innerste Schleife müsst 0,0,0,1, dann 0,0,1,0, dann 0,0,2,0, ..., dann 0,1,1,0 usw. hervorbringen, was, wie ich finde, schon eine schwierige Zahlenfolge ist, die auch folglich mit Schleifen nur mühsam zu realisieren ist.
    Was macht man also, wenn die Schleifenkonstruktion zu kompliziert wird, um eine bestimmte Zahlenfolge zu erstellen?

    Mir fällt da nur ein, die Zahlenfolge in ein Array einzugeben und von diesem dann jedes Element nacheinander abzurufen.

    Kennt ihr noch weitere Methoden? Gibt es Methoden, wie man Schleifen analysieren kann, etc?

    Danke,

    Thilo
    Wie kommst du von dem

    Thilo87 schrieb:

    Zum Beispiel habe ich ein Array

    VB.NET-Quellcode

    1. Dim MyArray As Integer(,) = {{0,0,1,2}, {1,2,1,1}, {0,0,0,0}, {1,2,1,2}}

    und ich möchte nun (0,0) mit (0,1); (0,0) mit (1,0); (0,0) mit (1,1); (0,0) mit (2,0); ... ; (0,1) mit (1,0); (0,1) mit (1,1); (0,1) mit (2,0) usw. vergleichen.

    zu dem

    Thilo87 schrieb:

    und de innerste Schleife müsst 0,0,0,1, dann 0,0,1,0, dann 0,0,2,0, ..., dann 0,1,1,0 usw. hervorbringen

    ? Für mich sieht es nach einem Zickzackmuster aus.

    Thilo87 schrieb:

    Mir fällt da nur ein, die Zahlenfolge in ein Array einzugeben und von diesem dann jedes Element nacheinander abzurufen.

    Und was verstehst du an dieser Stelle unter "Zahlenfolge"?
    Achso, da hat sich ein kleiner Fehler eingeschlichen. Es sollte

    "und de innerste Schleife müsst 0,0,0,1, dann 0,0,1,0, dann 1,1,0,0, dann 0,0,2,0, ..., dann 0,1,1,0 usw. hervorbringen" heißen.

    Ich wollte ja z.B. Array(0,0) mit Array(0,1) vergleichen (im ersten Schritt). Da muss ich ja irgendwas mit

    VB.NET-Quellcode

    1. If Array(0,0) = Array(0,1) Then ...
    2. ' bzw.
    3. If Array(i,j) = Array(k,l) Then ...


    in der innersten Schleife sein.

    Aber das war ja auch nur ein Beispiel. Man könnte auch in der innersten Schleife eine Zahlenfolge wie (0,1), (0,3), (1,3), (1,0) haben wollen oder (2,3), (5,7), (11,13), (17,19), (23,29), (31,37) (die Primzahlen ^^). Letzteres wäre wohl eine so komplexe Zahlenfolge, dass nichts anderes mehr möglich ist, als es in ein Array zu speichern und nacheinander abzurufen.
    Verstehe ich recht, dass du jeden Punkt mit jedem anneren abgleichen willst?
    Das wären max. 4 ineinander verschachtelte Schleifen
    Ja und - wäre das besonders schlimm?

    Edit: Hmm - scheint eine abstrakte Frage ohne konkretes Problem zu sein.
    Hat ich finde keinen Sinn, sich mit zu beschäftigen. Nur soviel: Ja, beim Permutieren muss man sich oft listenreiche Lösungen einfallen lassen, und: meist ist es möglich.
    Ach so, ich dachte, da stehen schon die Werte drin (aus deinem Array), übrigens, es soll dann nicht 1,1,0,0 heißen, sondern 0,0,1,1 (du vergleichst doch (0,0) der Reihe nach mit seinen Nachbarn).

    Gerade die letzte Variante könnte man doch über die Primzahlen super realisieren. ;)

    Ich stelle mir die Frage, in welchem Fall würde man es brauchen?
    Wann soll man ein Array nach einem Muster ohne innere Struktur durchsuchen wollen? Ich denke mir, es wird immer irgendeinen Grund für die Suche geben, eine Struktur dahinter, und anhand dieser Struktur erstellt man die Schleifendurchlaufmuster.
    Die Primzahlen kann man nicht optimal herausfinden, das ist bis heute ein ungelöstes Problem der Mathematik. Man kann sie nur berechnen, indem man alle Zahlen von 1 bis n durchläuft und eine Primfaktorzerlegung auf sie anwendet. Dies ist aber natürlich extrem rechenaufwändig, da die Zahlen sehr schnell sehr groß werden.
    @Artentus
    Ich habe angenommen, dass man schon bei der Programmierung weiß, dass man Primzahlen verwenden will. Dafür kann man sie vorher schon zur Verfügung stellen (in einem Array), bevor man anfängt das Array zu durchlaufen.
    Und man muss die Zahlen ja nicht durch alle Zeilen zu teilen versuchen sondern durch die jeweils vorher ermittelnden Primzahlen, das beschleunigt die Suche. Abgesehen davon, dass man sie gar nicht im Programm jedes Mal rechnen muss, sondern in einer Textdatei oder als Const-Array im Code ablegen kann.

    Mir ging es darum: man hat einen Grund, wieso man auf diese Weise ein Array durchsuchen will, und genau diesen Grund kann man in den Schleifen abbilden.
    @ErfinderDesRades
    Edit: Hmm - scheint eine abstrakte Frage ohne konkretes Problem zu sein.
    Ja, das ist richtig ^^ Es ist eben so, dass ich mit komplexen Schleifenkonstruktionen oft nicht klarkomme. Ich sitze dann davor, schreibe eine Schleife nach der anderen und am Ende stimmt die Zahlenfolge trotzdem nicht. Ich finde das bei mehrdimensionalen Arrays sehr schwierig. Das letzte Problem, woran ich verzweifelt bin, war dieses, dass ich ein 2D-Array gefüllt mit den Feldern eines Sudokus hatte und eine Funktion schreiben wollte, die zurückgibt, ob das Sudoku richtig ausgefüllt ist. Es ist ja leicht, die waagerechten und senkrechten Felder darauf zu überprüfen, ob sie jede Zahl nur einmal enthalten. Aber bei den Blöcken bin ich echt verzweifelt, sie alle in einer Schleifenkonstruktion zu überprüfen. Vielleicht kann man es sich vereinfachen, indem man alle Zahlen in einem Block in einer Liste zwischenspeichert und diese Liste dann darauf überprüft, ob ein Element darin doppelt vorkommt, dann wäre der Block nicht korrekt ausgeführt. Aber das ist sicher nicht so performant, wie wenn man die Blöcke direkt in einer Schleife überprüfen würde.

    Aber stelle dir doch mal ein 3D-Sudoku oder soetwas vor. Die Schleifenkonstruktion würde etliche ineinander verschachtelte Schleifen enthalten. Da würde ich vollends zusammenbrechen ^^


    Ich hatte ja auch schon diesen Thread hier geschrieben: [VB.NET] 2-dimensionales Array diagonal durchlaufen
    Das fand ich auch schon sehr schwer und es hat so einige Anläufe von anderen Usern gegeben, bis es endlich richtig war (danke dir ^^).

    Es muss doch einen allgemeinen Ansatz geben, wie man Schleifenkonstruktionen für bestimmte Zwecke erstellen kann. Eine Reihenfolge, in der man die Schleifen konstruiert und worauf man achten muss... Hoffe ich ;)

    @Artentus:
    Die Primzahlen kann man nicht optimal herausfinden, das ist bis heute
    ein ungelöstes Problem der Mathematik. Man kann sie nur berechnen, indem
    man alle Zahlen von 1 bis n durchläuft und eine Primfaktorzerlegung auf
    sie anwendet. Dies ist aber natürlich extrem rechenaufwändig, da die
    Zahlen sehr schnell sehr groß werden.
    Ja eben, deswegen gibt es auch keine einfache Schleifenkonstruktion, die diese Folge erzeugt, woraus man auch folgern kann, dass es nicht für jede Zahlenfolge eine Schleifenkonstruktion geben kann, manchmal ist es also schlicht nicht möglich.
    Zu dem Sudoku: da braucht man überhaupt keine komplizierten Schleifenkonstrukte, nur ein bisschen Mathematik. Schau mal her, hier ist ein Sudoku-Code von mir:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Sudoku
    2. Protected data As SudokuData
    3. Protected isSolving As Boolean
    4. ''' <summary>
    5. ''' Erstellt ein neues Sudoku.
    6. ''' </summary>
    7. ''' <remarks></remarks>
    8. Public Sub New()
    9. 'initialisieren
    10. data = New SudokuData
    11. isSolving = False
    12. End Sub
    13. ''' <summary>
    14. ''' Gibt das diesem Sudoku zu Grunde liegende SudokuData-Objekt zurück.
    15. ''' </summary>
    16. ''' <returns></returns>
    17. ''' <remarks></remarks>
    18. Public Function GetData() As SudokuData
    19. 'wenn möglich Rückgabe
    20. If Not isSolving Then Return data
    21. 'ansonsten Fehler
    22. Throw New InvalidOperationException("Während des Lösevorgangs kann nicht auf das SudokuData-Objekt zugegriffen werden.")
    23. End Function
    24. ''' <summary>
    25. ''' Löst das Sudoku, wenn möglich.
    26. ''' </summary>
    27. ''' <returns>Gibt einen Wahrheitswert zurück, der aussagt, ob das Sudoku gelöst werden konnte.</returns>
    28. ''' <remarks></remarks>
    29. Public Function Solve() As Boolean
    30. 'Status setzen
    31. isSolving = True
    32. 'lösen
    33. Dim retVal = SolveInner()
    34. 'Status zurücksetzen
    35. isSolving = False
    36. 'Ergebnis zurückgeben
    37. Return retVal
    38. End Function
    39. Protected Function SolveInner() As Boolean
    40. 'Anzahl leerer Felder speichern
    41. Dim emptyFields = data.EmptyFields
    42. 'wiederholen bis alle Felder gesetzt sind
    43. Do While emptyFields > 0
    44. 'lösen
    45. For y = 0 To 8
    46. For x = 0 To 8
    47. SolveField(x, y)
    48. Next
    49. Next
    50. 'leere Felder aktualisieren
    51. Dim oldEmpty = emptyFields
    52. emptyFields = data.EmptyFields
    53. 'keine Felder in dieser Iteration gesetzt -> Sudoku nicht lösbar
    54. If oldEmpty = emptyFields Then Return False
    55. Loop
    56. 'Erfolg
    57. Return True
    58. End Function
    59. Protected Function SolveField(x As Integer, y As Integer) As Boolean
    60. 'ist das Feld schon gelöst?
    61. If data(x, y) > 0 Then Return True
    62. 'List für beschränkende Werte erstellen
    63. Dim vals As New List(Of Integer)
    64. vals.AddRange(GetRegionValues(x, y))
    65. vals.AddRange(GetColumnValues(x))
    66. vals.AddRange(GetRowValues(y))
    67. 'übrige Werte berechnen
    68. Dim remaining = GetRemainingValues(vals)
    69. 'wenn möglich lösen
    70. If remaining.Count = 1 Then
    71. data(x, y) = remaining.First
    72. Return True 'gelöst
    73. End If
    74. 'nicht gelöst
    75. Return False
    76. End Function
    77. Protected Function GetRemainingValues(l As IEnumerable(Of Integer)) As IEnumerable(Of Integer)
    78. 'Liste erstellen
    79. Dim allVals() = {1, 2, 3, 4, 5, 6, 7, 8, 9} 'alle Werte
    80. Return allVals.Except(l) 'vorhandene Werte aussortieren
    81. End Function
    82. Protected Function GetRegionValues(x As Integer, y As Integer) As IEnumerable(Of Integer)
    83. 'Index der Region ermitteln
    84. Dim rIndex = data.GetRegionOfField(x, y)
    85. 'alle Felder der Region auflisten
    86. Dim vals() = data.GetRegion(rIndex)
    87. 'alle vorhandenen Werte zurückgeben
    88. Return From val In vals Where val <> 0
    89. End Function
    90. Protected Function GetColumnValues(x As Integer) As IEnumerable(Of Integer)
    91. 'alle Felder der Spalte auflisten
    92. Dim vals() = data.GetColumn(x)
    93. 'alle vorhandenen Werte zurückgeben
    94. Return From val In vals Where val <> 0
    95. End Function
    96. Protected Function GetRowValues(y As Integer) As IEnumerable(Of Integer)
    97. 'alle Felder der Zeile auflisten
    98. Dim vals() = data.GetRow(y)
    99. 'alle vorhandenen Werte zurückgeben
    100. Return From val In vals Where val <> 0
    101. End Function
    102. End Class
    103. Public Class SudokuData
    104. Protected fields(,) As Integer 'Spielfeld
    105. ''' <summary>
    106. ''' Die Felder in diesem Sudoku.
    107. ''' </summary>
    108. ''' <param name="x">Die X-Koordinate des Feldes.</param>
    109. ''' <param name="y">Die Y-Koordinate des Feldes.</param>
    110. ''' <value></value>
    111. ''' <returns></returns>
    112. ''' <remarks></remarks>
    113. Default Public Property Field(x As Integer, y As Integer) As Integer
    114. Get
    115. Return fields(x, y)
    116. End Get
    117. Set(value As Integer)
    118. If value < 0 OrElse value > 9 Then Throw New ArgumentException("Ein Feld kann nur mit den Zahlen 0 bis 9 befüllt werden.")
    119. fields(x, y) = value
    120. End Set
    121. End Property
    122. ''' <summary>
    123. ''' Gibt die Anzahl freier Felder in diesem Sudoku an.
    124. ''' </summary>
    125. ''' <value></value>
    126. ''' <returns></returns>
    127. ''' <remarks></remarks>
    128. Public ReadOnly Property EmptyFields As Integer
    129. Get
    130. Return fields.Cast(Of Integer).Count(Function(item) item = 0)
    131. End Get
    132. End Property
    133. ''' <summary>
    134. ''' Konstruktor. Nur innerhalb des Projekts verfügbar.
    135. ''' </summary>
    136. ''' <remarks></remarks>
    137. Protected Friend Sub New()
    138. 'Spielfeld erstellen
    139. fields = New Integer(8, 8) {}
    140. End Sub
    141. ''' <summary>
    142. ''' Setzt alle Felder auf 0.
    143. ''' </summary>
    144. ''' <remarks></remarks>
    145. Public Sub Clear()
    146. 'alle Felder durchlaufen
    147. For x = 0 To 8
    148. For y = 0 To 8
    149. 'auf 0 setzen
    150. fields(x, y) = 0
    151. Next
    152. Next
    153. End Sub
    154. ''' <summary>
    155. ''' Gibt alle Felder mit der selben X-Koordinate als Array zurück.
    156. ''' </summary>
    157. ''' <param name="columnIndex">Die gemeinsame X-Koordinate aller Felder.</param>
    158. ''' <returns></returns>
    159. ''' <remarks></remarks>
    160. Public Function GetColumn(columnIndex As Integer) As Integer()
    161. 'Fehler vermeiden
    162. If columnIndex >= 9 Then Throw New ArgumentException("Der Index muss kleiner 9 sein.", "columnIndex", New IndexOutOfRangeException)
    163. 'Array initialisieren
    164. Dim vals(8) As Integer
    165. 'Array füllen
    166. For y = 0 To 8
    167. vals(y) = fields(columnIndex, y)
    168. Next
    169. 'Rückgabe
    170. Return vals
    171. End Function
    172. ''' <summary>
    173. ''' Gibt alle Felder mit der selben Y-Koordinate als Array zurück.
    174. ''' </summary>
    175. ''' <param name="rowIndex">Die gemeinsame Y-Koordinate aller Felder.</param>
    176. ''' <returns></returns>
    177. ''' <remarks></remarks>
    178. Public Function GetRow(rowIndex As Integer) As Integer()
    179. 'Fehler vermeiden
    180. If rowIndex >= 9 Then Throw New ArgumentException("Der Index muss kleiner 9 sein.", "rowIndex", New IndexOutOfRangeException)
    181. 'Array initialisieren
    182. Dim vals(8) As Integer
    183. 'Array füllen
    184. For x = 0 To 8
    185. vals(x) = fields(x, rowIndex)
    186. Next
    187. 'Rückgabe
    188. Return vals
    189. End Function
    190. ''' <summary>
    191. ''' Gibt alle Felder innerhalb einer Region zurück.
    192. ''' </summary>
    193. ''' <param name="regionIndex">Der Index der Region.</param>
    194. ''' <returns></returns>
    195. ''' <remarks></remarks>
    196. Public Function GetRegion(regionIndex As Integer) As Integer()
    197. 'Array initialisieren
    198. Dim vals(8) As Integer
    199. 'Startpunkt berechnen
    200. Dim rX, rY As Integer
    201. GetRegionPos(regionIndex, rX, rY)
    202. 'Array füllen
    203. For y = 0 To 2
    204. For x = 0 To 2
    205. Dim i = x + y * 3 'Index im Array berechnen
    206. vals(i) = fields(rX + x, rY + y) 'Wert zuweisen
    207. Next
    208. Next
    209. 'Rückgabe
    210. Return vals
    211. End Function
    212. ''' <summary>
    213. ''' Berechnet den Index der Region, in der sich ein Feld befindet.
    214. ''' </summary>
    215. ''' <param name="x">Die X-Koordinate des Feldes.</param>
    216. ''' <param name="y">Die Y-Koordinate des Feldes.</param>
    217. ''' <returns></returns>
    218. ''' <remarks></remarks>
    219. Public Function GetRegionOfField(x As Integer, y As Integer) As Integer
    220. 'Fehler vermeiden
    221. If x >= 9 Then Throw New ArgumentException("Der Index muss kleiner 9 sein.", "x", New IndexOutOfRangeException)
    222. If y >= 9 Then Throw New ArgumentException("Der Index muss kleiner 9 sein.", "y", New IndexOutOfRangeException)
    223. 'Koordinaten der Region berechnen
    224. Dim rX, rY As Integer
    225. rX = x \ 3
    226. rY = y \ 3
    227. 'Index berechnen und zurückgeben
    228. Dim i = rX + rY * 3
    229. Return i
    230. End Function
    231. ''' <summary>
    232. ''' Bestimmt die Position eines Feldes in Abhängigkeit seiner Region.
    233. ''' </summary>
    234. ''' <param name="regionIndex">Der Index der Region.</param>
    235. ''' <param name="fieldIndex">Der Index des Feldes innerhalb der Region.</param>
    236. ''' <param name="x">Rückgabewert. Die X-Koordinate des Feldes.</param>
    237. ''' <param name="y">Rückgabewert. Die Y-Koordinate des Feldes.</param>
    238. ''' <remarks></remarks>
    239. Protected Sub GetPosInRegion(regionIndex As Integer, fieldIndex As Integer, ByRef x As Integer, ByRef y As Integer)
    240. 'falscher Index
    241. If fieldIndex >= 9 OrElse fieldIndex < 0 Then Throw New ArgumentException("Der Index des Feldes muss kleiner 9 sein.", "fieldIndex")
    242. 'Position der Region berechnen
    243. Dim rX, rY As Integer
    244. GetRegionPos(regionIndex, rX, rY)
    245. 'Koordinate des Feldes berechnen
    246. Dim fX = fieldIndex Mod 3
    247. Dim fY = fieldIndex \ 3
    248. fX += rX 'relative X-Position zur Region
    249. fY += rY 'relative Y-Position zur Region
    250. 'Rückgabe
    251. x = fX
    252. y = fY
    253. End Sub
    254. ''' <summary>
    255. ''' Bestimmt die Position der linken oberen Ecke einer Region im Sudoku.
    256. ''' </summary>
    257. ''' <param name="regionIndex">Der Index der Region.</param>
    258. ''' <param name="x">Rückgabewert. Die X-Koordinate der Region.</param>
    259. ''' <param name="y">Rückgabewert. Die Y-Koordinate der Region.</param>
    260. ''' <remarks></remarks>
    261. Protected Sub GetRegionPos(regionIndex As Integer, ByRef x As Integer, ByRef y As Integer)
    262. 'falscher Index
    263. If regionIndex >= 9 OrElse regionIndex < 0 Then Throw New ArgumentException("Der Index der Region muss kleiner 9 sein.", "regionIndex")
    264. 'linke obere Ecke der Region berechnen
    265. Dim rX = regionIndex Mod 3
    266. Dim rY = regionIndex \ 3
    267. rX *= 3 'mit breite multiplizieren
    268. rY *= 3 'mit höhe multiplizieren
    269. 'Rückgabe
    270. x = rX
    271. y = rY
    272. End Sub
    273. End Class

    Thilo87 schrieb:

    Das fand ich auch schon sehr schwer

    Dafür fand ich es sehr interessant. :D Ich habe danach noch gegoogelt (weil ich wissen wollte, wie die anderen es gemacht haben) und fand eine Menge Lösungen (die auf dem Konzept vom EDR basierten). Man muss das Rad nicht immer neu erfinden, es gibt schon viele fertige Lösungen, wenn man gerade keine Lust hat sich den Kopf über das aktuelle Problem zu zermattern. ;)

    Thilo87 schrieb:

    Es muss doch einen allgemeinen Ansatz geben, wie man Schleifenkonstruktionen für bestimmte Zwecke erstellen kann. Eine Reihenfolge, in der man die Schleifen konstruiert und worauf man achten muss...

    Ich glaube nicht, dass es sowas gibt, denn die Muster sind doch alle total unterschiedlich und man muss schauen, wo die Schleife jeweils anfängt, wo sie aufhört, wie die Länge der jeweiligen Schleife bestimmt wird, welche Abhängigkeiten die Anfänge und Enden der anderen Schleifen untereinander haben usw. Das ist immer problembezogen und lässt sich m.M.n. nicht pauschalisieren.

    Artentus schrieb:

    Die Primzahlen kann man nicht optimal herausfinden, das ist bis heute ein ungelöstes Problem der Mathematik. Man kann sie nur berechnen, indem man alle Zahlen von 1 bis n durchläuft und eine Primfaktorzerlegung auf sie anwendet. Dies ist aber natürlich extrem rechenaufwändig, da die Zahlen sehr schnell sehr groß werden.


    Primzahlen Finden: O(n) (Erathostenes) bzw. O(n/log log n) (Atkin)
    Das ist optimal.

    Zahl faktorisieren: de.wikipedia.org/wiki/Faktorisierungsverfahren (ungleich aufwändiger)

    Wäre es schwierig, Primzahlen zu finden, so würden RSA usw. nicht funktionieren. Primzahlen finden ist einfach (bzw. Primzahlen zu multiplizieren (RSA)), von einer Zahl ihre Primfaktoren zu finden, nicht.

    Artentus schrieb:

    Die Primzahlen kann man nicht optimal herausfinden, das ist bis heute ein ungelöstes Problem der Mathematik.
    Das Sieb des Eratosthenes findet alle Primzahlen von 1 bis n.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Artentus:: Ist schon klar.
    Sneakers, die Lautlosen. Leider konnte er es uns nicht mitteilen. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Thilo87 schrieb:

    Es muss doch einen allgemeinen Ansatz geben, wie man Schleifenkonstruktionen für bestimmte Zwecke erstellen kann. Eine Reihenfolge, in der man die Schleifen konstruiert und worauf man achten muss... Hoffe ich

    nö - da gibts nix allgemeingültiges für alle denkbaren Zwecke.
    Die einzige allgemeine Konvention mit Eselsbrücke ist eine für 2d-Arrays, aber sinngemäß auch auf höhere Dimensionen übertragbar:
    "Zeile zuerst, Spalte später".
    Das kann dich davor bewahren, ein 2d-Array zeilenweise (horizontal) vollzuschreiben, und dann irrtümlich spaltenweise (vertikal) auszulesen.
    Und ich stell mir immer Schachbretter vor, oder das Koordinatensystem, also meine Laufvariablen heißen bei sowas immer y, x.
    Aber komplexe schleifen sind einfach schwierig.