Programmieren I¶
Herzlich willkommen zur Programmieren I Veranstaltung! Wir werden unter Verwendung der Programmiersprache Java die wesentlichen Konzepte lernen, die für das Verständnis modernen Programmierens notwendig sind. Es sind keinerlei Vorkenntnisse erforderlich. Hier einige Tipps, damit Sie die Veranstaltung erfolgreich durchführen und Sie dabei auch Spaß haben:
- In diesem Skript sind bereits alle Inhalte des gesamten Semesters verfügbar. Der Grund dafür ist der, dass Sie sich das jeweilige Thema vorab selbständig erarbeiten können, indem Sie sich den jeweiligen Abschnitt bereits vor der jeweiligen Vorlesung anschauen. Ich empfehle Ihnen diese Vorgehensweise - sie hat sich bewährt!
- Lösen Sie alle Übungsaufgaben selbständig! Es ist kein Problem, wenn Sie für das Bewältigen der Übungen etwas länger benötigen. Sollten Sie es gar nicht alleine schaffen, ist das auch kein Problem. Wichtig ist dann, dass Sie sich die Lösung anschauen und es erneut selbständig versuchen. Hören Sie nicht auf, bis Sie es geschafft haben! Sie müssen irgendwann in der Lage sein, alle Übungsaufgaben selbständig zu lösen.
- Sie können die Hausaufgaben zu zweit lösen. Achten Sie aber darauf, dass Sie Ihre gemeinsame Lösung vollständig verstanden haben und dass Sie sie danach auch alleine erstellen können. Sie können beim Lösen der Hausaufgaben beliebig kreativ sein! Die Aufgabenstellung gibt Ihnen Anhaltspunkte für eine eventuelle Lösung. Sie können es aber auch ganz anders machen!
- Die Klausurvorbereitung beginnt mit Beginn der Veranstaltung! Es ist nicht möglich, die Klausur am Ende des Semesters zu bestehen, wenn Sie nicht das ganze Semester über intensiv programmieren. Die Übungsaufgaben sind "kleine" Aufgaben, um das in der Vorlesung vermittelte Wissen direkt anzuwenden. Für die Lösung der Hausaufgaben ist bereits ein gewisses Abstraktionsniveau erforderlich, um zu erkennen, dass das in der Vorlesung vermittelte Wissen dafür ausreichend ist.
- Programmieren lernt man nur durch Programmieren! Sie müssen es tun. Das Lesen von Büchern oder das "Anschauen" von Code genügt nicht. Eine Sprache lernt man auch nur durch Sprechen. Sie müssen programmieren, programmieren, programmieren... (siehe auch hier)
- Lassen Sie sich durch Fehler nicht verunsichern, sondern analysieren Sie Ihre Fehler! Bis zur Klausur sollten Sie alle Fehler einmal gemacht haben. Wenn Sie sich überlegen, warum das jeweils ein Fehler war, dann werden Sie diesen Fehler nicht wiederholen und haben durch die Reflektion eine Menge gelernt. Fehler zu machen (und darüber zu reflektieren) gehört zu den besten Lernmethoden des Programmierens.
- Haben Sie Spaß! Je mehr Sie das Programmieren lernen, je mehr Spaß werden Sie haben. Sollte es Ihnen zwischendurch keinen Spaß mehr machen, geben Sie mir sofort Bescheid!
Viel Erfolg! Und viel Spaß!
Organisatorisches¶
Der Plan zur Durchführung der Veranstaltung ist derzeit wie folgt:
- Themen werden ausführlich in der Vorlesung vorgestellt und in diesem Skript beschrieben.
- Es ist geplant, die neuen Themen stets vorab in diesem Skript hier zu veröffentlichen. Sie können sich also bereits vorab mit dem jeweiligen neuen Thema beschäftigen.
- Zusammen mit dem Skript (das neue Thema) werden sowohl die dazugehörige Übung als auch die dazugehörige Aufgabe hochgeladen.
- Die beiden Übungen am Freitag sind jeweils gleich (d.h. dort werden die gleichen Übungsaufgaben gelöst). Die Übungen behandeln den Stoff, der am Montag und Mittwoch in der gleichen Woche besprochen wird. Das bedeutet: das neue Thema wird am Montag und Mittwoch in den Vorlesungen vermittelt und am folgenden Freitag in der Übung angewendet.
- Sie können frei wählen, welche der beiden Übungen Sie besuchen. Sie können auch beliebig wöchentlich wechseln.
- Es wird ein Tutorium angeboten (Termin wird noch bekanntgegeben).
- Sollten Sie Wünsche haben, diesen Plan zu ändern, kommen Sie gerne auf mich zu.
Zur erfolgreichen Durchführung der Veranstaltung müssen Sie die Aufgaben (Hausaufgaben) lösen und zu den jeweiligen Fristen auf Moodle hochladen. Wenn Sie alle Aufgaben fristgerecht hochgeladen haben, dürfen Sie an der Klausur teilnehmen. Es werden insgesamt wahrscheinlich 8 Aufgaben sein, die Sie selbständig lösen und mindestens 6 davon hochladen müssen. Sie können die Aufgaben auch zu zweit lösen. Laden Sie dann aber bitte beide jeweils die Lösung hoch. Am Ende des Semesters schreiben wir eine Klausur (am Rechner). Diese Klausur wird bewertet und entspricht der Note für "Programmieren 1".
Unter Aufgaben sind die Aufgaben beschrieben, die Sie in jeder Woche ausführen sollen. Damit Sie dies erfolgreich erledigen können, ist jeweils angegeben, welche Themen Sie dafür durcharbeiten müssen. Das Durcharbeiten der jeweiligen Themen entspricht meistens jeweils einem Wochenthema. Diese wird also selbständig durchgeführt.
Daneben gibt es jede Woche (zu jedem Thema) Übungen, die wir in den Übungszeiten besprechen. Diese dienen der Anwendung und der Festigung der erlangten Kenntnisse. Die Übungen sind kleine Aufgaben, an denen Sie das neue Wissen anwenden sollen. Die Übungen dienen der Befähigung, die (größeren) Aufgaben lösen zu können.
Für die Kommunikation untereinander verwenden wir Slack (Channel #b11_prog1_ws2024_25
). Dort können Sie alle inhaltlichen und organisatorischen Fragen stellen. Ich fände es gut, wenn eine Art internes Diskussionsforum entsteht. Es ist sehr gewünscht, dort Fragen zu stellen und noch mehr gewünscht, dass Sie sich diese gegenseitig beantworten. Damit wäre allen geholfen und wir können besser erkennen, wo noch Nachhol- bzw. Erläuterungsbedarf bei den meisten besteht. Bei Bedarf beantworten die Lehrenden die Fragen natürlich.
Das Tutorium bei Noa Sauter findet immer mittwochs um 15:45 Uhr in C 624 statt.
Planung¶
Nachfolgend der vorläufige Wochenplan (wird eventuell angepasst).
Woche | Themen (Vorlesung) | Übung | Aufgabe | Abgabe Aufgabe bis | |
---|---|---|---|---|---|
1. | 07.-11.10.2024 | Organisatorisches, Algorithmen und Erstes Programm | Übung 0 | - | - |
2. | 14.-18.10.2024 | Variablen und Datentypen | Übung 1 | - | - |
3. | 21.-25.10.2024 | Operatoren und Ausdrücke | Übung 2 | - | - |
4. | 28.-01.11.2024 | Methoden und Methodenstack | Übung 2a | - | - |
5. | 04.-08.11.2024 | Selektion (if) und Iteration (for) | Übung 3 | Aufgabe 1 | 22.11.2024 |
6. | 11.-15.11.2024 | Iteration (while) und Methodenstack | Übung 4 | Aufgabe 2 | 29.11.2024 |
7. | 18.-22.11.2024 | Klassen und Objekte | Übung 5 | Aufgabe 3 | 06.12.2024 |
8. | 25.-29.11.2024 | Konstruktoren, this, eigene Datentypen, Rückgabe von Objekten | Übung 6 | Aufgabe 4 | 13.12.2024 |
9. | 02.-06.12.2024 | Vererbung, Object und Polymorphie | Übung 7 | Aufgabe 5 | 20.12.2024 |
10. | 09.-13.12.2024 | Arrays | Übung 8 | Aufgabe 6 | 03.01.2025 |
11. | 16.-20.12.2024 | Algorithmen über Arrays | Übung 9 | Aufgabe 7 | 10.01.2025 |
12. | 06.-10.01.2025 | Sortieren von Arrays | Übung 10 | Aufgabe 8 | 17.01.2025 |
13. | 13.-17.01.2025 | Suchen in Arrays | Übung 11 | Probeklausuren | - |
14. | 20.-24.01.2025 | JavaDoc | Übung 12 | Probeklausuren | - |
15. | 27.-31.01.2025 | Wiederholung, Klausurvorbereitung | Probeklausuren | - | |
16. | 07.02.2025 09.30-11.30 Uhr | Klausur 1.PZ | - | - | |
16. | 28.03.2025 09.30-11.30 Uhr | Klausur 2.PZ | - | - |
Code aus der Vorlesung¶
Vorlesung Datentypen und Variablen
package vorlesungen.vorl1016;
public class Datentypen
{
public static void main(String[] args)
{
// hier hinter koennen Sie schreiben, was Sie moechten
// Zeilenkommentar
/*
Blockkommentar ueber mehrere Zeilen
alles
noch
Kommentar
*/
System.out.println("test test test");
System.out.println("test test test");
int ganzeZahl = 0;
boolean wahrheitswert = true;
double gleitkommaZahl = 1.0;
char zeichen = 'a';
String zeichenkette = "Das ist eine Zeichenkette";
System.out.println(zeichenkette);
ganzeZahl = 5;
System.out.println(ganzeZahl);
ganzeZahl = 9;
System.out.println(ganzeZahl);
wahrheitswert = true;
gleitkommaZahl = 5.5;
gleitkommaZahl = 17.56;
double number = 1;
System.out.println(number);
//int numberInt = 1.0;
//System.out.println(numberInt);
System.out.println(ganzeZahl);
ganzeZahl = ganzeZahl + 1;
System.out.println(ganzeZahl);
byte test = 127;
test = (byte) (test + 1);
System.out.println(test);
}
}
Vorlesung Ausdrücke
package vorlesungen.vorl1021;
public class Ausdruecke
{
public static void main(String[] args)
{
System.out.println();
System.out.println("------ arithmetische Operatoren ------");
System.out.println();
System.out.println(3 + 4);
System.out.println(3.0 - -4);
System.out.println(3 * 4);
System.out.println(3.0 * -4);
System.out.println(-4);
System.out.println(+4);
System.out.println(-4.0);
System.out.println(+4.0);
System.out.println(9 / 3);
System.out.println(9.0 / 3.0);
System.out.println(5 / 3); // int-Division 1
System.out.println(5.0 / 3); // double-Division 1.66
System.out.println(5 / 3.0); // double-Division 1.66
System.out.println(5.0 / 3.0); // double-Division 1.66
System.out.println(5 % 3); // Rest 2
System.out.println(5 + 3 * 4); // 17
int x = 3 + 4 * 5 + 6 - 7; // 22
x = 3 + 4 * (5 + 6) - 7; // 40
System.out.println(x);
x = x + 1;
System.out.println(x);
x++; // x = x + 1;
System.out.println(x);
++x;
System.out.println(x); // x = x + 1;
x+=1;
System.out.println(x); // x = x + 1;
x*=3; // x = x * 3;
x/=3; // x = x / 3;
x-=3; // x = x - 3;
x%=3; // x = x % 3;
System.out.println();
System.out.println("------ Vergleichsoperatoren ------");
System.out.println();
int y = 7;
int z = 8;
int w = 8;
System.out.println(y < z); // true
System.out.println(y > z); // false
System.out.println(y == z); // false
System.out.println(z == w); // true
System.out.println(y <= z); // true
System.out.println(y >= z); // false
System.out.println(y % 2 == 1 ); // wenn true, dann y ungerade (false: gerade)
System.out.println(y % 2 == 0 ); // wenn true, dann y gerade (false: ungerade)
System.out.println();
System.out.println("------ Zeichenkettenverbindungsoperator ------");
System.out.println();
String s1 = "Hello " + "FIW!";
String s2 = " noch mehr dazu ";
String s3 = s1 + s2;
System.out.println(s1);
System.out.println(s3+s1);
int a = 3;
System.out.println(a);
System.out.println("a = " + a); // "a = " + "3"
System.out.println(a + " = a"); // "3" + " = a"
}
}
Vorlesung Ausdrücke - Teil 2
package vorlesungen.vorl1023;
public class Ausdruecke2
{
public static void main(String[] args)
{
int nr1 = 13;
int nr2 = 4;
int sum = nr1 + nr2;
System.out.println(nr1 + " + " + nr2 + " = " + sum);
System.out.println(nr1 + " + " + nr2 + " = " + (nr1 + nr2));
System.out.println();
System.out.println("--------- Logische Ausdruecke ----------");
System.out.println();
boolean a = false;
boolean b = true;
System.out.println(a + " && " + b + " = " + (a && b));
System.out.println(a + " || " + b + " = " + (a || b));
System.out.println("!a = " + !a);
int year = 2024;
boolean isLeapYear = ((year % 400) == 0) ||
((year % 4) == 0 && !((year % 100) == 0));
System.out.println("war " + year + " Schaltjahr ? " + isLeapYear);
int x = 3;
int y = 4;
int z = 5;
boolean xSmallerYSmallerZ = (x < y) && (y < z);
int noten = 1 + 2 + 3 + 1 + 3 + 4 + 1 + 1 + 2 + 1;
double schnitt = noten / 10.0;
System.out.println("Durchschnitt ist " + schnitt);
int test1 = 1;
double test2 = test1;
System.out.println(test2);
test2 = 1.7;
test1 = (int) test2;
System.out.println(test1);
System.out.println(test2);
}
}
Vorlesung Methoden
package vorlesungen.vorl1028;
public class Methoden
{
public static void add(int summand1, int summand2)
{
int summe = summand1 + summand2;
System.out.println(summand1 + " + " + summand2 + " = " + summe);
}
public static int computeSum(int summand1, int summand2)
{
int summe = summand1 + summand2;
return summe;
}
public static void main(String[] args)
{
add(4,5);
add(5,4);
add(7,9);
add(-7,19);
add(3,3);
int nr1 = 12;
int nr2 = 13;
int ergebnis = computeSum(nr1, nr2);
System.out.println(nr1 + " + " + nr2 + " = " + ergebnis);
ergebnis = computeSum(31,2);
}
}
Vorlesung Methodenstack und Selektion
package vorlesungen.vorl1030;
public class Methoden2
{
public static double multiply(double nr1, double nr2)
{
return nr1 * nr2;
}
public static double multiply(double nr1, double nr2, double nr3)
{
return nr1 * nr2 * nr3;
}
public static double multiply(int nr1, int nr2, int nr3)
{
return nr1 * nr2 * nr3;
}
public static void printProduct(double nr1, double nr2)
{
double product = multiply(nr1, nr2);
System.out.println(nr1 + " * " + nr2 + " = " + product);
}
public static void main(String[] args)
{
double nr1 = 3.5;
double nr2 = 4.5;
printProduct(nr1, nr2);
System.out.println(multiply(3.5, 4.5, 5.5));
System.out.println(multiply(3, 4 , 5));
double product = multiply(3.5, 4.5);
System.out.println(product);
int a = 2;
int b = 4;
System.out.println("a = " + a + ", b = " + b);
if( a > b )
{
// wenn a > b true
System.out.println("a > b -> true");
a = a - b;
}
else
{
// wenn a > b false
System.out.println("a > b -> false");
b = b - a;
}
System.out.println("a = " + a + ", b = " + b);
int n = 5;
System.out.println("n = " + n);
if( n % 2 == 0 )
{
System.out.println("n gerade ");
n = n / 2;
}
else
{
System.out.println("n ungerade ");
n = n * 3 + 1;
}
System.out.println("n = " + n);
int x = 1;
int y = 2;
int z = 3;
if( z > y )
{
// z > y true
if( y > x )
{
// y > x true ( && z > y true)
System.out.println("z > y > x");
}
else
{
// z > y && !y>x
if( y == x)
{
System.out.println("z > y == x");
}
else
{
// z > y && x > y
}
}
}
else
{
// z > y false
}
}
}
Vorlesung Iteration - for-Schleife
package vorlesungen.vorl1104;
public class Iteration1
{
public static void main(String[] args)
{
for(int i = 0; i < 0; i++)
{
System.out.println("in der Schleife : i = " + i);
}
System.out.println("fertig");
System.out.println();
System.out.println("------ printSum ----------");
System.out.println();
printSum1ToN(10);
/*
for(int i = 1; i < 50; i++)
{
System.out.print(" i = " + i + " : ");
printSum1ToN(i);
}
*/
}
public static void printSum1ToN(int n)
{
int sum = 0;
for(int summand = 1; summand <= n ; summand++)
{
System.out.print(summand);
if(summand < n)
{
System.out.print(" + ");
}
sum = sum + summand;
}
System.out.println(" = " + sum);
}
}
Vorlesung Iteration - verschachtelte for-Schleife
package vorlesungen.vorl1106;
public class Iteration2
{
public static void main(String[] args)
{
for(int number = -5; number < 17; number++)
{
System.out.println(number + "! = " + factorial(number));
}
printRectangle(6, 4);
printRectangle(16, 10);
}
public static int factorial(int n)
{
if(n < 1)
{
return 0;
}
else
{
int product = 1;
for(int factor = n; factor > 1 ; factor--)
{
product = product * factor;
}
return product;
}
}
public static void printRectangle(int width, int height)
{
// kein row
for(int row = 1; row <= height; row++)
{
// kein stars
// probieren Sie in der folgenden Bedingung anstelle von width mal row
// for(int stars = 1; stars <= width; stars++)
// for(int stars = width; stars > 0; stars--)
// for(int stars = width; stars >= 1; stars--)
for(int stars = 0; stars < width; stars++)
{
System.out.print(" [" + stars + ", " + row + "] ");
// System.out.print("* ");
}
// kein stars
System.out.println();
}
// kein row
System.out.println();
}
}
Vorlesung Iteration - while-Schleife
package vorlesungen.vorl1111;
public class Iteration3
{
public static void main(String[] args)
{
printTriangleLeft(7);
//printNStarsInOneRow(10);
//printNStarsInOneRow(1);
printCollatz(7);
printGGT(-148, 144);
}
public static void printNStarsInOneRow(int nrOfStars)
{
for(int stars = 1; stars <= nrOfStars; stars++)
{
System.out.print("* ");
}
System.out.println();
}
public static void printNCharsInOneRow(int n, char c)
{
for(int stars = 1; stars <= n; stars++)
{
System.out.print(c + " ");
}
}
public static void printTriangleLeft(int height)
{
for(int row = 1; row <= height; row++)
{
printNCharsInOneRow(height-row, ' ');
printNCharsInOneRow(row, '*');
System.out.println();
}
}
public static void printCollatz(int anfang)
{
int n = anfang;
while( n > 1 )
{
System.out.print(n + " ");
if(n % 2 == 0)
{
n = n/2;
}
else
{
n = 3 * n + 1;
}
}
System.out.println(n + " ende für anfang = " + anfang);
}
public static void printGGT(int nr1, int nr2)
{
int a = nr1;
int b = nr2;
if(a < 0)
{
a = -a; // wenn a negativ, dann |a|
}
if(b < 0)
{
b = -b; // wenn b negativ, dann |b|
}
if(a == 0)
{
a = b; // wenn a gleich 0, dann b ist ggT
}
if(b == 0)
{
b = a; // wenn b gleich 0, dann a ist ggT
}
while(a != b)
{
System.out.println("a = " + a + ", b = " + b);
if(a > b)
{
a = a - b;
}
else
{
b = b - a;
}
}
System.out.println("ggT von " + nr1 + " und " + nr2 + " ist " + a);
}
}
Klasse und Objekte - Adresse
package vorlesungen.vorl1113;
public class Adresse
{
// Objektvariablen
private String strasse;
private int nummer;
private int plz;
private String wohnort;
// Konstruktor
public Adresse(String str, int nr, int postleitzahl, String ort)
{
strasse = str;
nummer = nr;
plz = postleitzahl;
wohnort = ort;
}
// Objektmethode
public String getAdresse()
{
return strasse + " " + nummer + " in " + plz + " " + wohnort;
}
public void strasseUmbenennen(String neuerStrassenname)
{
strasse = neuerStrassenname;
}
}
package vorlesungen.vorl1113;
public class Programmklasse
{
public static void main(String[] args)
{
Adresse adresse1 = new Adresse("Wilhelminenhofstrasse", 75, 12459, "Berlin"); // ein Objekt erzeugt
Adresse adresse2 = new Adresse("Treskowallee", 8, 10435, "Berlin"); // noch ein Objekt erzeugt
/*
adresse1.strasse = "Wilhelminenhofstrasse"; // geht nicht wegen private
adresse1.nummer = 75;
adresse1.plz = 12459;
adresse1.wohnort = "Berlin";
*/
System.out.println(adresse1.getAdresse());
adresse1.strasseUmbenennen("Neue Strasse");
System.out.println(adresse1.getAdresse());
/*
adresse2.strasse = "Treskowallee";
adresse2.nummer = 8;
adresse2.plz = 10435;
adresse2.wohnort = "Berlin";
*/
System.out.println(adresse2.getAdresse());
}
}
Klasse und Objekte - Point
package vorlesungen.vorl1118;
public class Point
{
// Objektvariablen
private int x;
private int y;
// Konstruktor
public Point(int px, int py)
{
x = px;
y = py;
}
// Objektmethoden
// Getter
public int getX()
{
return x;
}
public int getY()
{
return y;
}
public void print()
{
System.out.println("[ x=" + x + ", y=" + y + " ]");
}
public void translate(int deltaX, int deltaY)
{
x = x + deltaX;
y = y + deltaY;
}
public boolean isLeft(Point otherPoint)
{
return x < otherPoint.x;
}
}
package vorlesungen.vorl1118;
public class Programmklasse
{
public static void main(String[] args)
{
Point p1 = new Point(-1, 3);
Point p2 = new Point(2, 2);
// p1.x = 5; // Fehler wegen private
System.out.println("p1.x = " + p1.getX());
System.out.println("p1.y = " + p1.getY());
System.out.println("p2.x = " + p2.getX());
System.out.println("p2.y = " + p2.getY());
p1.print();
p2.print();
System.out.println("----------- p3 ---------------");
Point p3 = new Point(1, 5);
p3.print();
p3.translate(-1, -3);
p3.print();
System.out.println("----------- p1 ---------------");
p1.print();
p2.print();
System.out.println("p1 links von p2 ? " + p1.isLeft(p2));
p2.print();
Point p4 = p3;
p4.print();
p3.print();
p3.translate(1, -1);
p4.print();
}
}
Klasse und Objekte - Circle
package vorlesungen.vorl1120;
public class Circle
{
// Obejektvariable
private double radius;
// Konstruktor (parametrisiert)
public Circle(double radius)
{
this.radius = radius;
}
// Konstruktor (parameterlos)
public Circle()
{
this.radius = 1.0;
}
public double getDiameter()
{
return 2.0 * this.radius;
}
public double getRadius()
{
return this.radius;
}
public double getPerimeter()
{
return Math.PI * this.getDiameter();
}
public double getArea()
{
return Math.PI * Math.pow(this.radius, 2);
}
public void print()
{
System.out.println("Radius " + this.radius);
System.out.println("Durchmesser " + this.getDiameter());
System.out.println("Umfang " + this.getPerimeter());
System.out.println("Flaecheninhalt " + this.getArea());
System.out.println();
}
public boolean isBigger(Circle c)
{
return this.radius > c.radius;
}
}
package vorlesungen.vorl1120;
public class Programmklasse
{
public static void main(String[] args)
{
Circle c1 = new Circle(3.0);
Circle c2 = new Circle(4.0);
Circle c3 = new Circle();
System.out.println("c1 Radius : " + c1.getRadius() + " Durchmesser : " + c1.getDiameter());
System.out.println("c2 Radius : " + c2.getRadius() + " Durchmesser : " + c2.getDiameter());
c1.print();
c2.print();
c3.print();
System.out.println("c3 groesser als c1 ? " + c3.isBigger(c1));
Circle c4 = c3; // 2 Referenzen auf dasselbe Objekte
Circle c5 = new Circle();
c5.print();
Circle c6; // Referenz ist null
}
}