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:
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 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, prohgrammieren...
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!
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 Mittwoch sind jeweils gleich (d.h. dort werden die gleichen Übungsaufgaben gelöst). Die Übungen behandeln den Stoff, der am Mittwoch in der Vorwoche und am Dienstag in der gleichen Woche besprochen wird. Das bedeutet: das neue Thema wird am Mittwoch und am darauffolgenden Dienstag in der Vorlesung vermittelt und an dem Mittwoch darauf 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 12 Aufgaben sein, die Sie selbständig lösen und 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. 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.
Es wird ein Programmier-Tutorium angeboten. Dieses findet montags um 16:00 Uhr in C 639 statt - Start ist am 25.10.2021. Unsere Tutorin ist Lisanne Delfs.
Vorlesung Selektion if und Iteration for -- 2. und 3.11.2021
publicclassSelektionIteration{publicSelektionIteration(){}publicbooleanisEven(intnumber){return(number%2==0);}publicvoidprintSumFrom1ToN(intn){intsum=0;Stringterm="0";for(intsummand=1;summand<=n;summand++){term=term+" + "+summand;sum=sum+summand;System.out.println(term+" = "+sum);}}publicintcomputeSumFrom1ToN(intn){intsum=0;for(intsummand=1;summand<=n;summand++){sum+=summand;}returnsum;}publicvoidprintSomething(intheight,intwidth){for(introw=height;row>0;row--){// String output = "row = " + row + " : ";for(intcol=0;col<row;col++){// output += " col=" + col;System.out.print("*");}System.out.println();}}publicbooleanisOdd(intnumber){return!isEven(number);}publicvoidstart(){booleanresult=isEven(4);intnumber=7;inta=3;intb=2;if(isOdd(number)){System.out.println(number+" ist ungerade");}else{System.out.println(number+" ist gerade");}System.out.println(result);inti=0;for(i=0;i>10;i=i+1){System.out.println("Wert von i "+(i+1));}System.out.println("Ende der Schleife. Wert von i "+i);printSumFrom1ToN(7);printSomething(5,4);}}
Vorlesung Iteration while -- 9.11.2021
publicclassIterationWhile{publicIterationWhile(){}publicvoidprintCollatz(intstart){intnumber=start;while(number>1){System.out.print(number+" ");if(number%2==0){number=number/2;}else{number=3*number+1;}}}publicvoidprintGGT(inta,intb){intnumber1=a;intnumber2=b;while(number1!=number2){if(number1>number2){number1=number1-number2;}else{number2=number2-number1;}}System.out.println("ggT von "+a+" und "+b+" ist "+number1);}publicvoidstart(){printGGT(40,24);printCollatz(7);}}
import staticorg.junit.jupiter.api.Assertions.*;importorg.junit.jupiter.api.AfterEach;importorg.junit.jupiter.api.BeforeEach;importorg.junit.jupiter.api.Test;/** * The test class AdresseTest. * * @author (your name) * @version (a version number or a date) */publicclassAdresseTest{/** * Default constructor for test class AdresseTest */publicAdresseTest(){}/** * Sets up the test fixture. * * Called before every test case method. */@BeforeEachpublicvoidsetUp(){}@TestpublicvoidtestAdresse(){Adresseadresse1=newAdresse();adresse1.street="Wilhelminnenhofstr.";adresse1.number=75;adresse1.zipcode=12459;adresse1.city="Berlin";adresse1.printAddress();System.out.println(adresse1.getAddress());Adresseadresse2=newAdresse();adresse2.street="Treskowallee";adresse2.number=8;adresse2.zipcode=10318;adresse2.city="Berlin";adresse2.printAddress();System.out.println(adresse2.getAddress());}/** * Tears down the test fixture. * * Called after every test case method. */@AfterEachpublicvoidtearDown(){}}
Video zur Vorlesung Klassen und Objekte -- 16.11.2021Vorlesung Klassen und Objekte -- 17.11.2021
import staticorg.junit.jupiter.api.Assertions.*;importorg.junit.jupiter.api.AfterEach;importorg.junit.jupiter.api.BeforeEach;importorg.junit.jupiter.api.Test;/** * The test class AddressTest. * * @author (your name) * @version (a version number or a date) */publicclassAddressTest{/** * Default constructor for test class AddressTest */publicAddressTest(){}/** * Sets up the test fixture. * * Called before every test case method. */@BeforeEachpublicvoidsetUp(){}@TestpublicvoidtestAddress(){AddresshtwWilh=newAddress("Alte Strasse",75,1249,"Berlin");htwWilh.printAddress();AddresshtwTres=newAddress("Treskowallee",8,10318,"Berlin");htwTres.printAddress();htwTres.renameStreet("Neue Strasse");htwTres.printAddress();}/** * Tears down the test fixture. * * Called after every test case method. */@AfterEachpublicvoidtearDown(){}}
Video zur Vorlesung Klassen und Objekte -- 17.11.2021Vorlesung Point und this -- 23.11.2021
publicclassRechteckextendsViereck// Rechteck erbt von Viereck{// es werden alle Objekteigenschaften der Klasse Viereck geerbt// a, b, c, d, umfang(), toString(), print()publicRechteck(intlaenge,intbreite){super(laenge,breite,laenge,breite);// Aufruf des Konstruktors von Viereck// System.out.println("Objekt von Rechteck erzeugt");}publicintflaecheninhalt(){returnthis.a*this.b;}@OverridepublicStringtoString(){Strings=String.format("[ laenge=%d, breite=%d ], Umfang des Rechtecks : %d und Flaecheninhalt : %d %n",this.a,this.b,this.umfang(),this.flaecheninhalt());returns;}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
publicclassQuadratextendsRechteck// Quadrat erbt von Rechteck{// es werden alle Objekteigenschaften der Klasse Rechteck geerbt// a, b, c, d, umfang(), toString() (neu), print(), flaecheninhalt()publicQuadrat(intseite){super(seite,seite);// Aufruf des Konstruktors von Rechteck}@OverridepublicStringtoString(){Strings=String.format("[ seitenlaenge=%d ], Umfang des Quadrats : %d und Flaecheninhalt : %d %n",this.a,this.umfang(),this.flaecheninhalt());returns;}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
publicclassProgramclass{publicvoidmain(){Viereckv1=newViereck(10,20,30,40);v1.print();Viereckv2=newViereck(11,22,33,44);v2.print();// System.out.println("Flaecheninhalt des Vierecks : " + v2.flaecheninhalt()); // Error!Rechteckr1=newRechteck(15,25);r1.print();System.out.println("Flaecheninhalt des Rechtecks : "+r1.flaecheninhalt());Quadratq1=newQuadrat(15);q1.print();}}
packagevorlesungen.vorlesung1221;publicclassProgramclass{publicstaticvoidmain(String[]args){System.out.println("Endlich Eclipse!");System.out.println();char[]alphabet=newchar[26];alphabet[0]='A';System.out.println("Laenge des Arrays: "+alphabet.length);System.out.println("erstes Element : "+alphabet[0]);alphabet[1]=66;System.out.println("zweites Element : "+alphabet[1]);// alphabet befuellenfor(intindex=0;index<alphabet.length;index++){alphabet[index]=(char)(index+65);}// alphabet ausgebenfor(intindex=0;index<alphabet.length;index++){System.out.print(alphabet[index]+" ");}System.out.println();MyArraysma=newMyArrays();System.out.println(ma.arrayToString(alphabet));ma.printArray(alphabet);char[]ca1={'a','b','c','a','b','c'};ma.printArray(ca1);char[]ca2=newchar[0];// []ma.printArray(ca2);char[]ca3={'a'};ma.printArray(ca3);intm=10000;intn=10000;for(intx=0;x<m;x++){for(inty=0;y<n;y++){// n * m O(n^2)System.out.println(x*y);// 100.000.000 Ausgaben}}}}
packagevorlesungen.vorlesung1221;publicclassMyArrays{publicStringarrayToString(char[]carr){// [ a, b, c, d, e, f ]// bei Laenge 0: [ ]Strings="[ ";if(carr.length==0){s=s+"]";}else{for(intindex=0;index<carr.length-1;index++){s=s+carr[index]+", ";}s=s+carr[carr.length-1]+" ]";}returns;}publicStringarrayToString1(char[]carr){// [ a, b, c, d, e, f ]// bei Laenge 0: [ ]Strings="[ ";for(intindex=0;index<carr.length;index++){s=s+carr[index];if(index!=carr.length-1){s=s+", ";}}s=s+" ]";returns;}publicvoidprintArray(char[]carr){System.out.println(this.arrayToString1(carr));}}
Video zur Vorlesung Eclipse + Arrays -- 21.12.2021Vorlesung TicTacToe -- 22.12.2021
packagevorlesungen.vorlesung1222;importjava.util.Random;/** * 3x3 Feld * 2 Spielerinnen (1, 2) * auf dem Feld: 0 --> hat noch niemand gesetzt * 1 --> Spielerin 1 * 2 --> Spielerin 2 * Ziel: 3 gleiche in einer Reihe oder Spalte oder Diagonale * * @author jornfreiheit * */publicclassTicTacToe{privateint[][]field;privateintplayer;// 1 und 2 --> enum viel besserprivateintsize;publicTicTacToe(intsize){this.size=size;this.field=newint[this.size][this.size];for(introw=0;row<this.size;row++){for(intcol=0;col<this.size;col++){this.field[row][col]=0;}}this.player=1;// 1 faengt an}publicvoidprintField(){for(introw=0;row<this.size;row++){for(intcol=0;col<this.size;col++){if(this.field[row][col]==0){System.out.print("- ");}elseif(this.field[row][col]==1){System.out.print("x ");}elseif(this.field[row][col]==2){System.out.print("o ");}}// Ende der ZeileSystem.out.println();}// nach Ausgabe des FeldesSystem.out.println();}publicvoidswitchPlayer(){if(this.player==1){this.player=2;}else// this.player == 2{this.player=1;}// this.player = (this.player % 2) + 1; // geht auch}publicvoidmove(introw,intcol){if(this.movePossible(row,col)){this.field[row][col]=this.player;/* if(this.won()) { this.printWon(); } else { this.switchPlayer(); } */}}publicbooleanmovePossible(introw,intcol){booleanmovePossible=false;// row und col jeweils koorekter Index ???if(row>=0&&row<this.size&&col>=0&&col<this.size){// ist das Feld ueberhaupt leer (0) ???if(this.field[row][col]==0){movePossible=true;}}returnmovePossible;}publicbooleanwon(){booleanwon=false;// 3 nebeneinander ???for(introw=0;row<this.size&&!won;row++){if(this.field[row][0]==this.player&&this.field[row][1]==this.player&&this.field[row][2]==this.player){won=true;}}// 3 untereinander ???for(intcol=0;col<this.size&&!won;col++){if(this.field[0][col]==this.player&&this.field[1][col]==this.player&&this.field[2][col]==this.player){won=true;}}// von links oben nach rechts unten - Diagonaleif(!won&&this.field[0][0]==this.player&&this.field[1][1]==this.player&&this.field[2][2]==this.player){won=true;}// von rechts oben nach links unten - Diagonaleif(!won&&this.field[0][2]==this.player&&this.field[1][1]==this.player&&this.field[2][0]==this.player){won=true;}returnwon;}publicvoidprintWon(){if(this.player==1){System.out.println("Spielerin x hat gewonnen !!!");}else{System.out.println("Spielerin o hat gewonnen !!!");}}publicbooleanfieldFilled(){for(introw=0;row<this.size;row++){for(intcol=0;col<this.size;col++){if(this.field[row][col]==0){returnfalse;}}}returntrue;}publicbooleandraw(){returnthis.fieldFilled()&&!this.won();}publicbooleanfinished(){returnthis.draw()||this.won();}publicvoidautomaticMove(){Randomr=newRandom();introw=r.nextInt(this.size);intcol=r.nextInt(this.size);while(!this.movePossible(row,col)){row=r.nextInt(this.size);col=r.nextInt(this.size);}this.move(row,col);}publicvoidautomaticMoveAndCheck(){this.automaticMove();this.printField();if(this.finished()){if(this.won()){this.printWon();}else// draw{System.out.println("Unentschieden !!!");}}else{this.switchPlayer();}}publicvoidplayGame(){while(!this.finished()){this.automaticMoveAndCheck();}}}
Video zur Vorlesung TicTacToe -- 22.12.2021Vorlesung Arrays (getMaximum, areEqual) -- 04.01.2022
packagevorlesungen.vorlesung0104;publicclassProgramclass{publicstaticvoidmain(String[]args){// myArray wird erzeugt und befuellt --> Objektvariable in MyArrays2MyArrays2ma=newMyArrays2(10);ma.printArray();System.out.println();// arr1 wird erzeugt und befuelltint[]arr1=ma.createAndFill(20);System.out.print("arr1 : ");ma.printArray(arr1);intmax1=ma.getMaximum(arr1);System.out.println("Maximum von arr1 ist : "+max1);System.out.println();// arr2 wird erzeugt und befuelltint[]arr2=ma.createAndFill(15);System.out.print("arr2 : ");ma.printArray(arr2);intmax2=ma.getMaximum(arr2);System.out.println("Maximum von arr2 ist : "+max2);System.out.println();int[]arr3=newint[0];System.out.print("arr3 : ");ma.printArray(arr3);if(!ma.isEmpty(arr3)){intmax3=ma.getMaximum(arr3);System.out.println("Maximum von arr3 ist : "+max3);}else{System.out.println("arr3 is empty!");}System.out.println();int[]arr4={8,2,4,3};System.out.print("arr4 : ");ma.printArray(arr4);int[]arr5={8,2,4,3};System.out.print("arr5 : ");ma.printArray(arr5);System.out.println("arr4 gleich arr5 ? "+ma.areEqual(arr4,arr5));System.out.println();int[]arr6=newint[0];System.out.print("arr6 : ");ma.printArray(arr6);System.out.println("arr6 gleich arr5 ? "+ma.areEqual(arr6,arr5));System.out.println();}}
packagevorlesungen.vorlesung0104;publicclassProgramclass{publicstaticvoidmain(String[]args){// myArray wird erzeugt und befuellt --> Objektvariable in MyArrays2MyArrays2ma=newMyArrays2(10);ma.printArray();System.out.println();// arr1 wird erzeugt und befuelltint[]arr1=ma.createAndFill(20);System.out.print("arr1 : ");ma.printArray(arr1);intmax1=ma.getMaximum(arr1);System.out.println("Maximum von arr1 ist : "+max1);System.out.println();// arr2 wird erzeugt und befuelltint[]arr2=ma.createAndFill(15);System.out.print("arr2 : ");ma.printArray(arr2);intmax2=ma.getMaximum(arr2);System.out.println("Maximum von arr2 ist : "+max2);System.out.println();int[]arr3=newint[0];System.out.print("arr3 : ");ma.printArray(arr3);if(!ma.isEmpty(arr3)){intmax3=ma.getMaximum(arr3);System.out.println("Maximum von arr3 ist : "+max3);}else{System.out.println("arr3 is empty!");}System.out.println();int[]arr4={8,2,4,3};System.out.print("arr4 : ");ma.printArray(arr4);int[]arr5={8,2,4,3};System.out.print("arr5 : ");ma.printArray(arr5);System.out.println("arr4 gleich arr5 ? "+ma.areEqual(arr4,arr5));System.out.println();int[]arr6=newint[0];System.out.print("arr6 : ");ma.printArray(arr6);System.out.println("arr6 gleich arr5 ? "+ma.areEqual(arr6,arr5));System.out.println();// ab hier 5.1.2022int[]arr7=ma.copy(arr4);ma.printArray(arr7);// SortierenSystem.out.printf("%n%n-------------- Sortieren ----------%n%n");int[]arr8=ma.createAndFill(20);ma.printArray(arr8);int[]arr9=ma.bubblesort(arr8);ma.printArray(arr9);}}
packagevorlesungen.vorlesung0111;publicclassProgramclass{publicstaticvoidmain(String[]args){System.out.printf("%n%n-------------- Suchen in unsortierten Arrays -----------------------%n%n");int[]a2=m3.createAndFill(20);m3.printArray(a2);intnr=6;System.out.printf("%n%d in a2 ? : %b%n",nr,m3.containsUnsorted(a2,nr));if(m3.containsUnsorted(a2,nr)){System.out.printf("%nIndex von %d in a2 ? : %d%n",nr,m3.getIndexUnsorted(a2,nr));}else{System.out.println("Fehlercode : "+m3.getIndexUnsorted(a2,nr));}System.out.printf("%n%n-------------- Suchen in sortierten Arrays -----------------------%n%n");m3.bubblesort(a2);m3.printArray(a2);System.out.printf("%n%d in a2 ? : %b%n",nr,m3.containsSorted(a2,nr));int[]a3={10,12,15,16,23,25,29,34,38,41,43,46,49,52,55};m3.printArray(a3);System.out.printf("%n%d in a3 ? : %b%n",25,m3.binarySearch(a3,25));}}
packagevorlesungen.vorlesung0118;publicclassProgramclass{publicstaticvoidmain(String[]args){CharArrayscaObj1=newCharArrays();char[]ca1=caObj1.createAndFillCharArray();caObj1.print(ca1);if(caObj1.contains(ca1,'b')){System.out.println("b ist enthalten");}else{System.out.println("b ist nicht enthalten");}}}