Welche Bedeutung haben folgende Zeilen im Quellcode (Informatik)?
Hallo Leute,
seit Kurzem interessiere ich mich fürs Programmieren. Ich befinde mich noch am Anfang und habe immer wieder ein paar Verständnisprobleme, die ich mir bisher nicht selbst erklären konnte. Es würde mich sehr freuen, wenn ihr mir für folgenden Quellcode ein paar Zeilen erklären könntet.
1 public class Main{
2 public static void main(String[] args){
3 int[] a = {11,7,8,3,15,13,9,19,18,10,4};
4 int merker = a[0]; // damit hat merker den Wert 11
5 int i=1;
6 int n = a.length; // Laenge der Folge a
7 while (i < n){
8 if (a[i]<merker)
9 merker = a[i];
10 i=i+1;
11 }
12 System.out.println(merker);
13 }
14 }
Kann mir jemand die Bedingung der While-Schleife erklären? "i" soll kleiner als die n sein. Leider erschließt sich der Sinn hinter dieser Bedingung nicht.
Und kann mir jemand sagen wofür "a[i]" in Zeile 8 steht und welche Bedeutung die Zeile 10 hat.
Sorry für die Anfängerfrage, aber ich würde es echt gerne verstehen.
Liebe Grüße
3 Antworten
Laenge der Folge a
nicht "Folge", sondern "Array".
Das Array enthält mehr als einen Wert. Und um auf die einzelnen Werte zugreifen zu könnnen, spricht man den Index davon an.
Der Index beginnt bei 0 für den ersten Wert.
damit hat merker den Wert 11
damit hat die Variable "merker" den Wert zugewiesen bekommen, der im Array "a" an Index 0 steht.
Laenge der Folge a
genauer -> Länge des Arrays "a", was gleichbedeutend mit der Anzahl der darin enthaltenen Werte (und somit auch der enthaltenen Indizes) ist.
Leider erschließt sich der Sinn hinter dieser Bedingung nicht.
Der weitere Code innerhalb der While-Wend-Schleife soll nur dann ausgeführt werden, wenn i kleiner ist als die Anzahl der in a enthaltenen Werte ist.
Und kann mir jemand sagen wofür "a[i]" in Zeile 8 steht
i stellt den Index dar, dessen zugehörigen Wert man in dem Array a abrufen möchte.
und welche Bedeutung die Zeile 10 hat.
i wird um den Wert 1 erhöht, damit im nächsten Durchlauf auf den nächsten Index in dem Array a zugegriffen werden kann. Und genau hier dürfte dann auffallen, warum die Bedingung der While-Wend-Schleife prüft, ob i kleiner als n ist. Ist i größer, würdest du auf einen nicht existierenden Index in dem Array zugreifen und bekommst dafür einen Laufzeitfehler.
Vielen Dank für deine Erklärung, das hilft mir weiter. Was mich noch verwirrt ist, wenn ich "int i = 2" im Code eingebe, müsste die Prüfung doch eigentlich beim 2. Element (der 7) starten, das ist aber nicht der Fall. Habe ich da einen Denkfehler?
a[i] ist der Inhalt des Arrays "a" an der Stelle "i".
Die Zeile: int[] a = {11,7,8,3,15,13,9,19,18,10,4};
erzeugt das Array "a". Das ist wie eine Tabelle mit nur einer Spalte (oder einer Zeile wie auch immer man das betrachten möchte). und a[i] ist der i-te Eintrag, von 0 beginnend gezählt.
a[0] wäre hier 11, a[1] wäre 7 und a[2] 8 und so weiter.
a.length ist die Anzahl der Elemente in a, also 11 wenn ich mich nicht verzählt habe.
a[a.length - 1] wäre also 4, weil von 0 beginnend gezählt
-----
n wird auf a.length gesetzt.
while (i < n) bedeutet also "solange i kleiner ist, als das Array a lang ist.
Gleichzeitig wird mit i = i + 1 Der Wert von i um 1 erhöht.
Also im ersten Schritt ist i 1, dann 2, dann 3 und am Ende n.
Das wird beides gemacht, um in der Schleife mit a[i] Jeden Eintrag des Arrays auszulesen (außer den an an Stelle 0, denn den Wert hat man sich in Merker gespeichert.
-----
Insgesamt sucht der Code im Array a nach dem kleinsten Wert und gibt diesen aus.
-----
Schau dir am besten Tutorials auf Youtube an, das ist besser als zu versuchen einfach Code Snippets zu verstehen. Oder nutze w3schools.
Im Zweifel ein "langsameres" Tutorial suchen
Wenn du int i = 2 machst, ist der erste Vergleich der in der Zeile 8 passiert, der von a[2], (also der 8, denn es wird von 0 beginnend gezählt, siehe meine Antwort) mit marker, welcher zuvor auf a[0] (der 11) gesetzt wurde.
Also ist der erste Vergleich von
if (a[i]<merker) in Wahrheit
if (8 < 11)
Danke dir. Klingt logisch und verstehe ich auch, funktioniert nur leider nicht. Wenn ich in der Zahlenfolge an erste Stelle eine 1setze und dann int i = 2 mache, wird mir als Ergebnis trotzdem 1 angegeben obwohl er die eigentlich überspringen müsste. Hast du dafür eine Erklärung?
Ok ich habe das Problem selbst gelöst, a[0] speichert ja das erste Element und die beiden Zahlen danach werden übersprungen 😀
Also eigentlich sollte nur a[1] übersprungen werden
a[0], also die 1, wird betrachtet wegen Zeile 4 (marker = a[0])
Und a[2] und Folgende werden wegen Zeilen 8/9 betrachtet
---
Du könntest versuchen den Code mal auf dem Papier durchzugehen, also für jede Variable aufschreiben was der aktuelle Wert ist und dann mitschreiben wenn sich etwas verändert.
Dann sieht man am besten wie sich der Code verhält
n wird Zeile 6 auf die Anzahl der Elemente in a (11) gesetzt. i auf 1 in Zeile 5. Solange i kleiner ist als n, wird die Schleife ausgeführt. Da 1 < 11 ist, wird das ausgeführt. Jetzt wird geschaut, ob a[i] kleiner ist als der "merker" und wenn ja, der merker auf den Wert von a[i] gesetzt. a[i] bedeutet dabei das i-te Element von a, wobei die Zählung bei 0 beginnt. Oben hast du ja schon a[0], wo die 11 im merker gespeichert wird. Da i 1 ist, wird jetzt das 2. Element von a, die 7, mit merker verglichen und da diese kleiner ist als der merker, in dem merker gespeichert.
In Zeile 10 wird dann zu i eins addiert (1+1=2) und das Ergebnis wieder in i gespeichert. Dann geht es wieder mit der while-Bedingung oben weiter, es wird verglichen, ob i (jetzt 2) kleiner als 11 ist, etc... bis nach etlichen Durchläufen dann i 11 ist und die Bedingung nicht mehr erfüllt ist. Dann kommt die Zeile nach der Schleife und der merker wird ausgegeben. In dem merker steht dann die kleinste der Zahlen aus a drin.
Vielen Dank für deine Erklärung, das hilft mir weiter. Was mich noch verwirrt ist, wenn ich "int i = 2" im Code eingebe, müsste die Prüfung doch eigentlich beim 2. Element (der 7) starten, das ist aber nicht der Fall. Habe ich da einen Denkfehler?
Die Zählung beginnt bei 0. Bei i=2 beginnt der daher bei der 8, dem 3. Element.
Vielen Dank für deine Erklärung, das hilft mir weiter. Was mich noch verwirrt ist, wenn ich "int i = 2" im Code eingebe, müsste die Prüfung doch eigentlich beim 2. Element (der 7) starten, das ist aber nicht der Fall. Habe ich da einen Denkfehler?