Fachschaft Mathematik und Informatik Vorkurs Praktische Informatik I und Programmierpraktikum I Freitag, 1. September 2017 Wirtschaftsinformatik Wirtschaftsmathematik Lehramt Mathematik Lehramt Informatik Vorstellungsrunde • Sven Rosenzweig – Master Wifo, 4. Fachsemester – Fachschaftsmitglied – [email protected] • Daniel Flachs – Master Wifo, 5. Fachsemester – Fachschaftsmitglied – [email protected] • Und ihr? – Studiengang? – Woher? – Programmiererfahrung? Informatik in der Schule? 2 Ziel dieser Veranstaltung • Grober und schneller Überblick über die Vorlesungen Praktische Informatik I und Programmierpraktikum I • Fokus: Programmiersprache Java • Keine Panik: Alle Inhalte werden ausführlich in den Vorlesungen behandelt! Fragen Traut euch, jederzeit Fragen zu stellen. Die Erfahrung zeigt, dass die meisten eurer Kommilitonen auch nicht mehr wissen als ihr. 3 Überblick 1. 2. 3. 4. 5. Einführung Imperative Sprachkonstrukte von Java Objektorientierung Weitere Bereiche der praktischen Informatik Allgemeine Hinweise 4 1. Einführung 5 Wozu Computer? • Computer sind Hilfsmittel, die Aufgaben für Menschen lösen. – Schnell und effizient, besonders bei wiederkehrenden Aufgaben oder großen Datenmengen, … – … aber nicht eigenständig intelligent. • Programmiersprache: für den Menschen verständliche Sprache, mit der Computer Anweisungen gegeben werden. • Computer „verstehen“ nur 1 und 0 Programme werden mithilfe eines Compilers in Maschinencode übersetzt. 6 Warum programmieren können? • Um eine Aufgabe, die wir erledigen müssen, zu automatisieren. – z.B. um Datensätze einer Umfrage zu verarbeiten. • Um Software zu produzieren, die von anderen benutzt wird und ihnen einen Mehrwert bringt. • Um die Arbeit anderer Programmierer nachvollziehen und mit ihnen zusammenarbeiten zu können. Kompetenz von (Wirtschafts-) Informatikern! 7 Software? Programme? Algorithmen? (1) • Ein Programm ist eine gespeicherte Abfolge von Anweisungen, die von einem Computer ausgeführt werden können. • Einem Programm liegt ein Algorithmus zugrunde: eine eindeutige, unmissverständliche Anleitung, um eine bestimmte, klar definierte Aufgabe zu erfüllen. • Pseudo-Beispiele für Algorithmen aus dem täglichen Leben: – IKEA-Anleitung – Rezept aus dem Kochbuch – … 8 Software? Programme? Algorithmen? (2) • Beispiele für Algorithmen in der Informatik: – Gauß-Algorithmus (Schulmathematik) – Quicksort (Sortieralgorithmus) – … • Entwurfsparadigma: Divide and Conquer (Teile und herrsche) • Pseudocode ermöglicht es, einen Algorithmus formal und standardisiert aufzuschreiben, ohne von den Eigenarten einer speziellen Programmiersprache abhängig zu sein. 9 2. Imperative Sprachkonstrukte der Sprache Java 10 Elemente von Java (informal) In Anlehnung an natürliche Sprachen und deren Zweck: • Worte/Vokabular: Variablen, Operatoren und Schlüsselwörter • Satzstruktur: korrekte „Sätze“, definiert durch die Java-Syntax • „Handlung“: logisch sinnvolle Aneinanderreihung korrekter Sätze 11 Sätze: Anweisungen int x; x = 2; x = x + 5; System.out.println(x); Datentyp Variable Operator Literal Variablen-Deklaration Wertzuweisung Wertzuweisung mit Ausdruck Ausgabe • Eine Anweisung endet immer mit einem Semikolon. 12 Variablen • Variablen „speichern“ Dinge (Daten) unter einem Namen ab, zum Beispiel Zahlen oder Zeichenketten. Sie verweisen auf den Bereich im Arbeitsspeicher, in dem die Daten liegen. • Deklaration einer Variablen: Welcher Typ von Daten? Datentyp int x; Variablenname • Initialisierung einer Variablen: Belegung mit einem Wert. x = 2; • Kann auch gleichzeitig erfolgen: int x = 2; 13 Variablen – Datentypen Primitive Datentypen • Ganzzahlen (Integer): int • Fließkommazahlen: float und double • Buchstaben (Character): char • Zeichenketten: String (nicht wirklich primitiv) • Wahrheitswert (wahr/falsch): boolean Komplexe Datentypen • Kommen später… 14 Variablen – Namen Variablen müssen benannt werden. Regeln: Ein Variablenname… • besteht aus Buchstaben, Zahlen und Unterstrichen. • beginnt mit einem Buchstaben (oder einem Unterstrich…). • ist beliebig lang. • ist case-sensitive (Groß-/Kleinschreibung relevant). Beispiel: zahl, Zahl und ZAHL bezeichnen unterschiedliche Variablen. 15 Schlüsselwörter von Java Reservierte Schlüsselwörter haben eine bestimmte Bedeutung und dürfen nicht als Name für Variablen und Methoden verwendet werden: abstract, assert, boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, enum, extends, final, finally, float, for, goto, if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while 16 Ablauf eines Java-Programms • Ein Programm ist eine sequenzielle Abfolge von Anweisungen, die in einer vorgegebenen Reihenfolge ausgeführt werden. • Manche Anweisungen werden nur ausgeführt, wenn eine Bedingung erfüllt ist. if/else • Manche Anweisungen werden wiederholt. Schleifen • Manche Anweisungen werden an verschiedenen Stellen des Programms benötigt und können wiederverwendet werden. Methoden 17 Sequenzieller Programmablauf int x = 2 print(x) x = x + 2 print(x) int y = 2*x + 1 print(y) int x = 2; System.out.println(x); x = x + 2; System.out.println(x); int y = 2 * x + 1; System.out.println(y); 2 4 9 • System.out.println() gibt eine Zeichenfolge auf der Konsole aus. 18 Bedingte Anweisungen: if int x = 5; int x = 5 if (x < 10) { x < 10? Nein x > 20? Nein print("Fertig") System.out.println("Klein"); Ja } print("Klein") if (x > 20) { System.out.println("Groß"); Ja } print("Groß") System.out.println("Fertig"); Klein Fertig 19 Bedingte Anweisungen: if/else int x = 5; Klein Fertig if (x < 10) { System.out.println("Klein"); } else { System.out.println("Groß"); } int x = 5 System.out.println("Fertig"); Ja x < 10? Nein print ("Groß") print ("Klein") print("Fertig") 20 Schleifen: while int x = 5; int x = 5 while (x > 0) { System.out.println(x); x = x – 1; Nein x > 0? Ja print(x) } System.out.println("Fertig"); x = x - 1 5 4 3 Laufvariable der Schleife print("Fertig") 2 1 Fertig 21 Operatoren (1) • Mithilfe von Operatoren können Daten verändert und Berechnungen durchgeführt werden. • Arithmetische Operatoren – – – – Addition: + Subtraktion: Multiplikation: * Division: / • Zuweisungsoperator für Wertzuweisungen an Variablen: = 22 Operatoren (2) • Vergleichsoperatoren dienen dem Vergleich zweier Werte, z.B. in if-Anweisungen oder Schleifen. – – – – – Gleichheit: == Ungleichheit: != Kleiner: < Größer: > Kleiner-/größer-gleich: <=, >= • Logische Junktoren – Logisches Nicht: ! – Logisches Und: && – Logisches Oder: || 23 Operatoren | Übungsaufgabe Welchen Wert haben die Variablen nach Ende des Programms? int a; int b; int c; a b c a b = = = = = 0; a + 2 * a – a * Lösung: a = -7 b = -14 c = 2 1; b; 7; c; 24 Arrays • Ein Array (dt. auch Feld) speichert eine Menge von Daten gleichen Datentyps hintereinander und adressiert sie über einen Index. • Der Index beginnt bei 0! • Die Anzahl der Elemente, die ein Array aufnehmen kann, (seine Größe) wird einmal festgelegt und kann danach nicht mehr verändert werden. 25 Arrays: Syntax Beispiel: Repräsentiere einen Vektor in Java: 1 𝑎Ԧ ≔ 5 3 int[] vektor; //Deklaration: Array des Typs ’int’ vektor = new int[3]; //Initialisierung: Leeres Array mit 3 Elementen vektor[0] = 1; //Belege Array mit Werten vektor[1] = 5; vektor[2] = 3; 26 Arrays: Beispiel Zahlenliste (1) Beispiel: Liste von Ganzzahlen: 13, 9, 1, 5, 7, 21, 49, 3, 12, 42 int[] liste; //Deklaration: Array des Typs ’int’ liste = new int[10]; //Initialisierung liste[9] liste[1] liste[2] liste[5] liste[8] liste[0] liste[3] liste[6] liste[7] liste[4] = = = = = = = = = = 42; //Belege Array mit Werten 9; 1; 21; 0 1 2 3 4 5 6 12; 13 9 1 5 7 21 49 13; 5; 49; 3; 7; 7 3 8 9 12 42 27 Arrays: Beispiel Zahlenliste (2) Beispiel: Liste von Ganzzahlen: 13, 9, 1, 5, 7, 21, 49, 3, 12, 42 // Alle Zahlen mit einer Schleife ausgeben. 13 9 int index = 0; 1 5 while (index < 10) { System.out.println(liste[index]); index = index + 1; } 7 21 49 3 3 12 42 28 Methoden (1) • Methoden sind quasi Unterprogramme, die Daten entgegennehmen, sie mittels eines Algorithmus modifizieren und ein Ergebnis zurückliefern. • Vgl. mathematische Funktion. • Sind Konzept der objektorienterten Programmierung, gehören daher immer zu einer Klasse (siehe später). • Eingabedaten: Parameter • Ergebnis: Rückgabewert 29 Methoden (2) Beispiel: Deklaration einer Methode zum Addieren zweier Zahlen Rückgabetyp Methodenname Parameterliste int addiere(int a, int b) { int ergebnis = a + b; return ergebnis; } Rückgabe-Anweisung und -Wert Aufruf: int x = addiere(3, 5); 30 Methoden (3) • Der Rückgabetyp kann ein beliebiger primitiver oder komplexer Datentyp sein. • Außerdem gibt es Methoden, die keine Werte zurückgeben. – Spezifiziere Rückgabetyp als void – System.out.println() ist eine solche Methode. Sie gibt Zeichenfolgen auf der Konsole aus, liefert aber keinen Wert zurück. 31 Methoden: Die main-Methode Jedes Java-Programm hat eine spezielle Methode: main() • Sie wird immer als erstes beim Start des Programms aufgerufen. • In ihr platziert man den Code, den man ausführen will, wenn das Programm gestartet wird. • Von dort aus kann man dann andere Methoden aufrufen. public static void main (String[] args) { System.out.println("Hallo Welt!"); } 32 Methoden | Übungsaufgabe Schreibe eine Methode, die eine Zahl als int-Wert entgegennimmt und den Betrag der Zahl zurückgibt. Mögliche Lösung: int betrag (int zahl) { int betr = 0; if (zahl >= 0) { betr = zahl; } else { betr = -1 * zahl; } return betr; } 33 3. Objektorientierung 34 Objektorientierte Programmierung • Idee der objektorientierten Programmierung (OOP): Objekte und Konzepte der realen Welt werden in Software nachgebildet • Klassen bilden Eigenschaften und Verhaltensweisen realer Dinge in Software ab und dienen dabei als „Bauplan“. – Beispiele: Klasse der Menschen, Klasse der Studierenden, Klasse der Autos, Klasse der Bücher… „Typen von Dingen“ – Klassen besitzen Attribute (Eigenschaften) und Methoden (Aktionen). • Objekte sind konkrete Ausprägungen einer Klasse. – Beispiele: Paul und Anna sind Objekte der Klasse der Menschen. „Einführung in die Informatik“ ist ein Objekt der Klasse der Bücher… 35 Wozu Objektorientierung? • Ermöglicht es, leichter Dinge der realen Welt abzubilden. • Programme werden flexibel und erweiterbar gehalten. • Ermöglicht leichtere Wiederverwendung von Code. • Vererbung • uvm. 36 OOP in Java • In Java stellen Klassen abstrakte Datentypen dar. Objekte werden in Variablen gespeichert. • Beispiel im Folgenden: Klasse „Studierender“ – Welche Eigenschaften hat eine Studentin/ein Student? – Welche Methoden benötigt ein Objekt der Klasse „Studierender“? 37 OOP in Java: Beispiel (1) class Studierender { // Attribute -> Eigenschaften String vorname; String nachname; String studienfach; int fachsemester; int matrNr; double ecumKontostand; Hier wird der „Bauplan“ festgelegt. } 38 OOP in Java: Beispiel (2) class Studierender { // ... // Methoden (Aktionen) void aendereStudienfach(String neuesFach) { studienfach = neuesFach; fachsemester = 1; // Fachsemester zurücksetzen } void naechstesSemester() { fachsemester = fachsemester + 1; } // ... } 39 OOP in Java: Beispiel (3) public static void main (String[] args) { Studierender hans = new Studierender(); // Erstellen eines Objekts vom Typ “Studierender” hans.nachname = "Mueller"; hans.vorname = "Hans"; hans.studienfach = "B. Sc. Wirtschaftsinformatik"; hans.fachsemester = 1; // Hans stellt fest, dass Lehramt viel cooler ist. hans.aendereStudienfach("B. Ed. Informatik"); } 40 4. Weitere Bereiche der praktischen Informatik 41 Was ist Softwareentwicklung? Softwareentwicklung ist viel mehr als „nur“ Code schreiben: • • • • Aufbau von Software planen: UML Programme flexibel und erweiterbar halten: Modularität Fehler in Software finden: Korrektheit, Verifikation und Tests Performance der Software analysieren: Komplexität Auch diese Aspekte sind Inhalte von PI1 und PP1. 42 Unified Modeling Language (UML) • Aufbau von Software grafisch modellieren und darstellen. • Verschiedene Diagramme für verschiedene Anwendungsfälle. • Häufig eingesetzt: UML-Klassendiagramm – Stellt die Software-Klassen, deren Attribute, Methoden und Beziehungen untereinander dar. – Beispiel: Klassenname Studierender vorname : String nachname : String studienfach : String fachsemester : int matrNr : int Attribute der Klasse aendereFach() : void naechstesSemester() : void Methoden der Klasse 43 Modularität • Programme flexibler und übersichtlicher gestalten… • … indem man sie in einzelne, möglichst abgeschlossene Teile zerlegt (vgl. „Divide and Conquer“). • Kapselung z.B. durch Klassen, Methoden • Beispiel: zerlege Methode „kochen“ in – Zutaten vorbereiten – Zubereiten – Servieren 44 Korrektheit, Verifikation, Tests • Grundregel: Jedes (komplexere) Programm enthält Fehler! • Ein korrektes Programm erfüllt die Spezifikationen, d.h. „es tut, was es soll“. • Zwei Möglichkeiten zum Suchen von Fehlern – Verifikation: mathematischer Beweis der Fehlerfreiheit eines Programms – Testen: Fehlerüberprüfung z.B. anhand von Test-Eingabedaten (keine beweisbare Fehlerfreiheit!) 45 Komplexität: Laufzeit und Speicher • Zum Lösen einer Aufgabe gibt es oftmals mehrere verschiedene Algorithmen. • Qualitätsmerkmale eines Algorithmus – Wie schnell arbeitet der Algorithmus? Zeitkomplexität – Wie viel Speicher verbraucht er? Speicherkomplexität • Zeit- und Speicherkomplexität werden in Abhängigkeit der Menge der Eingabedaten angegeben. • Diese Themen sind unter anderem Inhalt der Vorlesung „Algorithmen und Datenstrukturen“ (3. Fachsemester). 46 5. Allgemeine Hinweise 47 Wie lerne ich programmieren? • Programmieren ist eine praktische Tätigkeit, die man nur durch Übung und selbst Ausprobieren lernt! • Hat man einmal gelernt, wie man programmiert, dann ist die konkrete Programmiersprache später zweitrangig. • In PI1 und PP1 gibt es wöchentliche Übungsblätter, die eigenständig bearbeitet und abgegeben werden müssen. • Auch wenn am Anfang vieles leicht und langsam zu sein scheint: Am Ball bleiben, sonst verpasst ihr vielleicht den Anschluss! 48 Programmierstil (1) Negativbeispiel aus der Programmiersprache C 49 Programmierstil (2) Konventionen, die man einhalten sollte, um den Code lesen und auch in Zukunft noch verstehen zu können: • Code einrücken. • Code ausführlich kommentieren. • Konventionen für Groß- und Kleinschreibung – – – – Klassennamen: erster Buchstabe groß Methoden- und Variablennamen: klein Konstanten: komplett in Großbuchstaben CamelCase verwenden, Bsp.: ageOfCurrentPerson • In der Regel englische Namen und Kommentare. 50 Programmierstil (3) • Gleich von Anfang an richtig angewöhnen! • Manche Tutoren in PI1/PP1 ziehen Punkte für das Nichteinhalten der Code-Konventionen ab! 51 Literatur • Folien aus Vorlesung, Übung und Tutorium werden euch i.d.R. zur Verfügung gestellt. • Bücher (z.B. aus der Lehrbuchsammlung der UB oder online) – „Java ist auch eine Insel“ (Galileo, Online-Openbook) – Head First Java (O‘Reilly, Online-Openbook) • Sonstige Internetquellen – „Geheimtipp“ Wikipedia – StackOverflow (stackoverflow.com) – Diverse Online-Kurse und -Tutorials Sich selbst Bücher zu kaufen ist normalerweise nicht notwendig, da alle obigen Ressourcen frei verfügbar sind. 52 Veranstaltungskonzept PI1/PP1 • In beiden Veranstaltungen gibt es jeweils Vorlesungen, große Übungen und Tutorien. • Der komplette Lehrstoff wird dort vermittelt. • Außer dem Verstehen, Lernen, Wiederholen und Üben des dort Gelernten müsst ihr normalerweise nichts nebenher machen (solange ihr den Lehrstoff versteht). • Praktische Informatik I: Prof. Dr. Frederik Armknecht • Programmierpraktikum I: Dr. Ursula Rost 53 Zeit für eure Fragen Source: http://en.hdyo.org/assets/ask-question-1-ff9bc6fa5eaa0d7667ae7a5a4c61330c.jpg 54 Fachschaft Mathematik und Informatik Das war‘s! Vielen Dank für eure Aufmerksamkeit und viel Erfolg bei PI1 und PP1! Wirtschaftsinformatik Wirtschaftsmathematik Lehramt Mathematik Lehramt Informatik