Erste Schritte Bin ich "zu dumm" oder nicht geeignet zum Programmieren?

Hallo liebe Community,

ich bin neu in der Programmierszene. Ich habe zum jetztigen Semester mit meinem Bachelorstudium in "Angewandter Informatik" angefangen und bin gerade recht unzufrieden mit mir selbst. Und daher hätte ich so ein bis zwei Fragen die mir auf dem Herzen liegen und ihr, als langjährige Programmierer, eventuell mit eurer Erfahrung beantworten könnt... zugleich möchte ich mich für den Wall of Text entschuldigen, der jetzt folgt.

Das Studium selbst macht mir ungeheuer Spaß. Ich bin hochmotiviert, lerne 4-6h täglich nach der Uni (insbesondere für Mathe und technische Fächer) und übe das Programmieren mit Java regelmäßig. Jegliche Übungen und Hausaufgaben, die wir in Programmierung 1 bekommen, erledige ich immer (und diese sind auch immer korrekt am Ende).

Was mir aber Sorgen bereitet ist die Zeit, die ich brauche um die Hausaufgaben zu erledigen. Hier eine Beispielaufgabe, die ich gelöst habe:

"Schreiben Sie eine Klasse Schoko, die die Zahlen a, b und n von der Konsole einliest. Wir haben a kleine Schokoriegel (1 kg) und b große Schokoriegel (5 kg). Wir wollen insgesamt n kg Schokolade essen. Wie viele kleine Schokoriegel muss man essen, um genau n kg zu essen, wenn man zuerst so viele große wie möglich ist? Gebt die Anzahl der kleinen Riegel aus. Ist dies nicht möglich, soll −1 ausgegeben werden. Beispiel: a = 7, b = 1, n = 12 ergibt 7 – zuerst einen großen, dann 7 kleine. Wäre in diesem Falle n = 13, wäre die Ausgabe -1 (zu wenig Schokolade insgesamt). Wäre im Beispiel b = 2, so wäre die Ausgabe 2 – erst zwei große, dann zwei kleine. Was auch nicht funktioniert, ist a = 2, b = 100 und n = 13, weil man zu wenig kleine Riegel hat, obwohl die Gesamtmenge mehr als ausreicht."

Diese Hausaufgabe bekamen wir vor 3 Wochen auf. An dieser Aufgabe habe ich ca. 6-8h gesessen. Warum? Ich habe keine Ahnung... anscheinend habe ich das logische denken total ausgestellt. Der Dozent sagte, dass solch Aufgaben in der Prüfung dran kämen (und das seien noch die einfachen). Da wir nur 1 1/2h für die Prüfung Zeit haben, mache ich mir natürlich Gedanken....

Und daher meine Frage: Ist das normal, dass man zu Beginn für eigentlich "einfache Aufgaben" so eine Ewigkeit braucht oder sollte ich mir Sorgen machen? Natürlich weiss ich, dass kein Meister vom Himmel gefallen ist und sich so eine Programmiersprache nicht in 1-2 Wochen meistern lässt, aber es geht hier ja um "einfaches logisches Denken"...

Da die Aufgabe ja bereits 3 Wochen her ist, kam inzwischen schon wieder einiges an Stoff hinzu. Inzwischen bereiten mir verschachtelte Schleifen große Probleme - ich verstehe es einfach nicht. Bei einzelnen Schleifen ist mir die FUnktion klar - auch der Unterschied zwischen "While" und "For" Schleife. Aber sobald sie ineinander verschachtelt sind, macht für mich alles keinen Sinn mehr. Als Beispiel hierfür:

Eine weitere Hausaufgabe: "Schreiben Sie eine Klasse Wuerfel, die alle Möglichkeiten für das Würfeln mit drei Würfeln ausgibt, indem die Ergebnisse der drei Würfel wie folgt geschrieben werden: (1,1,1), (1,1,2), …, (1,2,1), (1,2,2), … (6,6,6), also insgesamt 216 Zeilen. Die Würfel sind insofern unterscheidbar"

Meine Lösung war, wieder nach ca. 4h:

public class Wuerfel {

public static void main(String[] args) {

for (int a = 1; a < 7; a= a + 1)
{

for (int b = 1; b < 7; b= b + 1 )
{

for (int c = 1; c < 7; c = c + 1)
{
System.out.println("(" + a + "," + b + "," + c + ")");

}
}
}
}

}


Im Endeffekt habe ich es aber nur durch probieren herausbekommen. Denn Sinn dahinter, habe ich bis jetzt noch nicht verstanden. Ich habe mich belesen und habe versucht, irgendwo Erklärungen zu finden, wie verschachtelte Schleifen funktionieren, aber bis jetzt noch nichts verständliches gefunden. Das einzige, was ich weiss, ist dass sie von "innen beginnen"´.

Also zu meiner zweiten Frage: Kann mir jemand verschachtelte Schleifen erklären oder gute, verständliche Literatur empfehlen?

Vielen Dank im voraus und entschuldigt nochmal die Wall of Text.

Liebe Grüße
 
Also allein der Fakt, dass dir das Studium und die Programmierung Spaß macht, spricht eigentlich für sich und ist Grund genug weiterzumachen. Es ist völlig normal, gerade am Anfang, nicht innerhalb von 5 Minuten die Lösung vor sich zu haben. Jeder lernt anders, jeder lernt anders schnell. Wichtig ist dran bleiben und üben, üben, üben.
Wichtig ist auch, sich mit anderen über seine/andere Lösungen zu unterhalten. Vor - und Nachteile zu besprechen. Verstehen warum man es so machen / nicht machen kann. Kritik ist in dem Fall wichtig und hilft schneller Gedankengänge zu verinnerlichen.
Auch ja - auch ausprobieren gehört tw. dazu :)

Zu der Schleifenthematik:
Eine Schleife dient erstmal dazu eine oder mehrere Anweisungen mehrmals auszuführen. Wenn man sich also die Zahlen von 1 bis 5 ausgeben lassen wollen würde, könnte man das mit einer Schleife machen.
Java:
for(int i = 1; i <= 5; i++) {
    System.out.println(i);
}
Jetzt möchte man gerne zu jeder Zahl von 1 bis 5 die Zahlen von 1 bis 5 daneben stehen haben. Man muss also für jede Zahl die Zahlen von 1 bis 5 ausgeben lassen. Man kann die Schleifen also Schachteln.
Java:
for(int i = 1; i <= 5; i++) { // äußere Schleife
    for(int j =1; j <= 5; j++) { // innere Schleife
          System.out.println("(" + i + "," + j + ")");
     }
}
Die äußere Schleife würde das erste mal "durchlaufen" und i wäre 1. Jetzt würde für i=1 die innere Schleife anfangen j hochzuzählen und nach jedem Durchlauf i,j ausgeben. Ist j=5 bricht die innere Schleife ab und der zweite Durchlauf der äußeren Schleife fängt an mit i = 2. Hier passiert wieder das selbe wie für i=1.... Brauchst du also in einer sich wiederholenden Anweisung eine Anweisung die sich wiederholen soll, musst/kannst du Schleifen verschachteln.

Bei deinem Würfelbeispiel: Wie gibt man "stupide" alle Möglichkeiten von 3 Würfel aus? Nun ja. Ich nehme mir den 1. Würfel, drehe ihn auf die erste Zahle und lege ihn beiseite. Dann nehm ich mir den 2. Würfel, drehe ihn auf die 1. Zahl und lege ihn beiseite. Jetzt nehm ich mir den 3. Würfel und drehe ihn auf jede Zahl von 1-6 und kriege so die ersten Kombinationen.
Code:
1 1 1 
1 1 2
1 1 3
1 1 4
1 1 5
1 1 6
Jetzt hat der 3. Würfel keine Zahlen mehr. Ich gehe also 1 Schritt zurück - nehme mir den zweiten Würfel - und drehe diesen auf die nächste Zahl (2). Jetzt nehm ich mir wieder den 3. Würfel und drehe ihn auf jede erdenkliche Zahl (1-6).
Code:
1 2 1
1 2 2
1 2 3
1 2 4
1 2 5
1 2 6
... usw. usf. Und genau so ist auch die Reihenfolge der Schleifen.
 
Robat hat schon eine gute Antwort gegeben.

Es ist schwer, mit so wenig Details etwas genaues zu sagen. Aber für mich würde sich das jetzt etwas danach anhören, dass Du vielleicht Probleme hast, so eine Problematik inkl. Lösung zu visualisieren. Das läuft also etwas auf den Punkt abstraktes Denken hinaus. Das kann man aber durchaus üben. Und wenn Du Spaß daran hast, dann üb das noch viel mehr.

Bezüglich Visualisierung hilft Dir evtl. noch folgendes:

Bei so einer Aufgabe ist der Ablauf immer der Gleiche:
a) Abstrahieren von der Aufgabe: Was sind die relevanten Informationen? Was ist das logische Problem dahinter?
b) Visualisierung
c) Eigener Lösungsablauf anhand der Visualisierung
d) Jetzt schreiben wir erst den Code.

Also die Aufgabe mit der Schokolade:
a) Hier ist die Aufgabe schon schön reduziert. Man kann von Schokolade noch weg gehen, aber egal.
b) Auf einem leeren Zettel male ich dann die Informationen auf ... Also Stapel kleine Schokoladen und Stapel große Schokoladen
c) Jetzt überlege ich mir, wie ich so eine Lösung erreichen würde. Ich habe da also die Stapel mit Schokoladen und soll jetzt eine bestimmte Menge bekommen ... mit Vorgabe: So viele große Schokoladen wie möglich.
- du teilst da Zielgewicht durch das Gewicht der Großen Schokoladen. Das Minimum des Ergebnisses und der Anzahl der großen Schokoladen ist dann die Anzahl der verwendeten großen Schokoladen.
- Das restliche Gewicht wird mit kleinen Schokoladen aufgefüllt.
Wenn du auf eine andere Lösung kommst (Von mir aus mit Schleife: Du packst so lange große Schokoladen auf eine Waage bis das Zielgewicht überschritten wird und dann legst du eine Schoko zurück u.s.w.), dann ist das evtl. auch ok...
Auf was für eine Lösung du kommst, ist erst mal egal. Wichtig ist, dass Du die Lösung in Gedanken durchspielen kannst und bestätigst: Ja, so sollte es gehen.
d) Jetzt kannst Du das umsetzen und Code schreiben.

Bei den Würfeln ist es ähnlich. Hier kann man da auch visualisieren: Du hast drei Würfel und sollst alle möglichen Kombinationen einmal hinlegen. Wie machst du das? Nimm Dir da in Gedanken doch die Würfel und fang damit an:
Du legst alle auf 1. Dann drehst du den rechten auf 2. Dann auf 3 .... bis 6. Die ersten 6 Kombinationen. sieht doch gut aus.
Jetzt drehst du den mittleren auf 2. Und dann gehst Du beim rechten Würfel wieder von 1 bis 6 alle Kombinationen durch ...
Das klappt gut - also schaust Du, was da läuft .... jeder Würfel läuft von 1 bis 6. Der rechte Würfel läuft so durch. Der mittlere macht bei jedem Schritt eine volle Schleife des rechten Würfels. Also sind die Schleifen verschachtelt.
 
Was vielleicht helfen kann, schau dir mal https://de.wikipedia.org/wiki/Programmablaufplan Flussdiagrame an und versuch vielleicht die Logik zuerst mal so als Flussdiagram in natürlicher Sprache hinzuschreiben. Also dich einfach mal von Schleifen und Co in Java zu lösen und möglichst strukturiert Schritt für Schritt aufzuschreiben was zu tun ist. Und dann die Schritte in Java zu übersetzen. Also quasi das was JustNobody auch geschrieben hat.

Ansonsten, um nachvzuvollziehen was ein Programm tut (wie z.B. die verschachtelten Schleifen) kannst du so ein einfaches Programm auch mal schrittweise im Debugger durchlaufen lassen und schauen in welcher Reihenfolge die Zeilen durchlaufen werden wie sich die Werte der Variablen ändern.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben