Mag. iur. Dr. techn. Michael Sonntag Softwareentwicklung Allgemeines und prozedurale Konstrukte E-Mail: sonntag@fim.uni-linz.ac.at http://www.fim.uni-linz.ac.at/staff/sonntag.htm Institut für Informationsverarbeitung und Mikroprozessortechnik (FIM) Johannes Kepler Universität Linz, Österreich Michael Sonntag 2004
??? Fragen? Bitte gleich stellen!??? Michael Sonntag 2004
Grundlagen Allgemeines Michael Sonntag Prozedurale Konstrukte 3
Algorithmen Algorithmus = Verfahren zur Problemlösung Schrittweise» Einzelne Befehle oder Blöcke Präzise» Genaue Bedeutung, genaue Schreibweise (HAARGENAU!) Statisch endlich» Sie wollen irgendwann mit dem Programmieren fertig sein Dynamisch endlich» Sie wollen die Antwort noch erleben Meist in natürlicher Sprache: Noch nicht ganz präzise niedergeschrieben (auch wenn so gedacht) Befehle/Blöcke sind für Maschinen unverständlich Michael Sonntag Prozedurale Konstrukte 4
Programm (1) Programm = Realisierung eines Algorithmus in einer Programmiersprache Nun wirklich alles haargenau» Sonst gibt es eine Fehlermeldung! Befehle und Blöcke sind fest definiert: Damit muss man auskommen! Vollständigkeit: Alle modernen Programmiersprachen sind vollständig» D. h. alles was man als Algorithmus hinschreiben kann, kann man auch programmieren Auch wenn es oft zu lange (statisch oder dynamisch) dauern würde!!!» Jedes praktische Problem kann (zumindest theoretisch) damit gelöst werden, da für alles ein Algorithmus existiert Was nicht gelöst werden kann: Siehe Gödel! Michael Sonntag Prozedurale Konstrukte 5
Programm (2) Praktische Probleme bei Programmen Manche Probleme sind NP vollständig» Man kann sie programmieren, aber außer bei Trivialbeispielen endet das Universum bevor das Programm fertig ausgeführt ist» Annäherungslösungen müssen gesucht werden Manche Probleme sind schwer : Der Algorithmus ist nicht leicht zu finden» Kreativität, Nachdenken und Abschreiben (z. B. im Internet oder in Literatur nach Lösungen suchen) Manche Probleme sind aufwendig: Der Algorithmus ist da, aber er ist sehr lang und sehr kompliziert» Nachdenken und Arbeiten Michael Sonntag Prozedurale Konstrukte 6
Problem-Probleme??? Praktische Probleme bei Problemen Was ist eigentlich das Problem? Viele Auftraggeber haben nur eine ungenaue Vorstellung dessen, was sie eigentlich wollen:» Soll die Lohnabrechnung machen, aber man sollte vielleicht auch gleich noch den Lagerbestand feststellen können; und überhaupt soll auch die ganze Entwicklungsabteilung damit unterstützt werden Feststellen, was überhaupt genau gemacht werden soll, ist der erste (und oft wichtigste) Schritt! Dies wird hier nicht näher erläutert! Der nächste Schritt ist die Reduktion des Problems Praktische Probleme sind so groß, daß ein Algorithmus für alles auf einmal nicht mehr erstellt werden kann: Überforderung des Gehirns (und der Papierfläche, die man noch ansehen kann!) Michael Sonntag Prozedurale Konstrukte 7
Software Engineering =Unterteilung des Problems in so kleine Teilprobleme, daß diese komplett verstanden und dann auf einmal und einheitlich gelöst werden können Auf einmal: Von einer Person kann ein Algorithmus entwickelt werden Einheitlich: Eine Person kann das zugehörige Programm schreiben Auch wenn es mit mehreren Personen ev. schneller geht Siehe dazu Kapitel 15 (Schrittweise Verfeinerung) im Buch! Dies ist eine Methode; es gibt noch andere» Siehe dazu auch: SE Modelle, OO Design, AOE,... Michael Sonntag Prozedurale Konstrukte 8
Softwareentwicklung Wir gehen davon aus, dass das Problem genau bekannt ist und wir auch eine genaue Beschreibung davon besitzen Übungen: Fragen hierzu an den Übungsleiter/Vortragenden! Umsetzung in einen Algorithmus ist eine kreative Tätigkeit Wenig erforscht, kaum lehrbar Aufgabe der Teilnehmer mit Hinweisen des Vortragenden» Die meisten Probleme sind gar nichts so schwer» Im Grundsatz auch in der Praxis nicht! Die Details haben es meist in sich, sowie wenn später Änderungen oder Erweiterungen gewünscht werden Umsetzung des Algorithmus in ein Programm Hauptaugenmerk der LVA Wir beschäftigen uns hier mit Java Michael Sonntag Prozedurale Konstrukte 9
Einteilung der Programmiersprachen Funktionale: Alles ist ein mathematischer Ausdruck Auch das ist vollständig! Alles lässt sich damit lösen!» Für Benutzerinterfaces oä schlecht geeignet» Sehr gut für komplexe Berechnungen Beispiel: Lisp Prozedurale: Schritt für Schritt ein Befehl an den Computer Direkte 1:1 Umsetzung des Algorithmus Bei weitem die allergrößte Verbreitung Beispiel: Java Sonstige: Verschiedene Misch- oder Sonderformen Eher unbedeutend; am ehesten noch bei künstlicher Intelligenz oder in bestimmten Sondergebieten/Spezialanwendungen Beispiele: Prolog Michael Sonntag Prozedurale Konstrukte 10
Grundlagen Prozedurale Konstrukte Michael Sonntag Prozedurale Konstrukte 11
Daten, Befehle Datum = Bestimmter Wert (Plural: Daten) Beispiele: -2, Java, 3.14159, 14.3.2003, März 2003,... Computer verarbeiten Daten (=Datenverarbeitung; EDV) Befehle = Anweisungen zur Datenmanipulation Beispiele: Addieren, Multiplizieren, Ausgeben, Datei öffnen, Webseite von Server abholen,. Befehle können sehr einfach bis extrem kompliziert sein Praxis: Maschinensprache (=Hardware) = Sehr einfache Befehle Programmiersprache = Mittelschwere Befehle Bibliotheken (=fertige Programme für Teilaufgaben) = Leicht bis extrem kompliziert Michael Sonntag Prozedurale Konstrukte 12
Daten, Befehle Heute: Daten und Befehle konzeptuell streng getrennt Früher: Selbstmodifizierende Programme (=Programm sieht seine Befehle als Daten an und verändert sie) Daten = Variablen (veränderlich), oder Konstanten (invariant) Befehle (Anweisungen) = Vorgegeben von der Programmiersprache Meistens zwischen 50 und 100 gelegen» Je nach Definition, was alles ein getrennter Befehl ist Grundmuster sind jedoch noch viel weniger: Vier Stück» Zuweisung, Sequenz, Verzweigung, Schleife Dies reicht für Vollständigkeit aus! Weniger genügt jedoch nicht! Michael Sonntag Prozedurale Konstrukte 13
Variablen Behälter für Daten mit einem Namen Name ist meist frei wählbar (in bestimmten Grenzen) Besitzen eine bestimmte Form, nur diese Art von Dingen passt hinein (entspricht einem Wertebereich) Moderne Programmiersprachen: Jede Variable ist typisiert, d. h. sie besitzt einen Typ und NUR das kann hinein! Kann jederzeit beliebig verändert werden Besitzt immer einen bestimmten Wert Achtung: Bei Java kann dieser ev. nicht abgefragt werden! Realisierung: Jede Variable besitzt einen Platz im Speicher; darin steht immer irgendetwas, das entsprechend dem Typ der Variable interpretiert wird» Beispiel: 48 kann als Zahl 48 aufgefasst werden (Typ: Ganze Zahl), aber auch als Zahl 0 (Eigentlicher Typ: Zeichen, also 0 )! Michael Sonntag Prozedurale Konstrukte 14
Zuweisung Zuweisung eines neuen Wertes an eine Variable Dies kann auch eine temporäre Variable ohne Namen sein Meist: Berechnung eines Wertes. Beispiele: i=1 ( i : Name der Variablen = : Zuweisung; 1 : neuer Wert) i=1+1 (Berechnung eines neuen Wertes) c= Lehrgang (Zuweisung von Text) c=c+ akademischen Characters ( Berechnung neuen Wertes) x=y+z Zuweisungen sind nur möglich auf Dinge, die eine Speicherstelle repräsentieren (= L-Value ; left-value) Unmöglich ist daher: 1=i (1 ist ein Wert; i repräsentiert eine Speicherstelle) y+z=x (x, y, z sind Speicherstellen; y+z aber nicht, dies ist ein Wert!) Michael Sonntag Prozedurale Konstrukte 15
Sequenz Die Hintereinander-Ausführung von mehreren einzelnen Anweisungen Werden der Reihe nach ausgeführt Jede Anweisung wird komplett beendet bevor die nächste begonnen wird Keine Verzahnung (nächster Befehl beginnt, bevor der vorige komplett beendet wurde)! Reihenfolge wird durch die statische Schreibung festgelegt Was weiter oben steht, wird zuerst ausgeführt! Michael Sonntag Prozedurale Konstrukte 16
Sequenz EBNF x=3 y=4 z=x*y x=3 y=4 z=x*y Michael Sonntag Prozedurale Konstrukte 17
Sequenz Nassi-Shneiderman-Diagramm x=3 y=4 z=x*y x=3 y=4 z=x*y Michael Sonntag Prozedurale Konstrukte 18
Verzweigung Entscheidung zwischen zwei Alternativen Es wird IMMER nur EINE davon ausgeführt, NIE beide! Auch: Selektion, Auswahl Entscheidung erfolgt nach einem Ausdruck Dieser muss einen logischen Wert (Wahr oder Falsch) ergeben Michael Sonntag Prozedurale Konstrukte 19
Verzweigung EBNF Wenn x<y, dann min=x, sonst min=y. min=x min=y Es fehlt die Bedingung (x<y)! EBNF kann nicht alles ausdrücken, was wir programmieren können! Michael Sonntag Prozedurale Konstrukte 20
Verzweigung Nassi-Shneiderman-Diagramm Wenn x<y, dann min=x, sonst min=y. J x<y? N min=x min=y Michael Sonntag Prozedurale Konstrukte 21
Schleife Wiederholte Ausführung einer Anweisung Auch genannt: Iteration, Wiederholung Jede Schleife besitzt eine Bedingung die spezifiziert, wie oft sie ausgeführt wird Abbruchbedingung Dadurch unterscheiden sich die verschiedenen Arten Drei/vier grobe Hauptarten von Schleifen: Prüfung der Bedingung am Anfang vor jedem Durchlauf (=While) Prüfung der Bedingung am Ende nach jedem Durchlauf (=Repeat) Prüfung vor der ersten Ausführung; feste Anzahl (=For) Gar keine Prüfung: Endlosschleife (=Loop)» Nicht verwenden! Michael Sonntag Prozedurale Konstrukte 22
Schleifen EBNF i=1, bis i=10 erhöhe i um 1 und gibt * aus i=1 i=i+1 ausgeben * Auch hier fehlt wieder die Bedingung! Außerdem könnten wir das auch anders zeichnen: i=1 ausgeben * i=i+1 Grund: Text ist nicht genau genug! Michael Sonntag Prozedurale Konstrukte 23
Schleifen Nassi-Shneiderman-Diagramm i=1, bis i=10 erhöhe i um 1 und gibt * aus Als While-Schleife: i=1 while i<=10 i=i+1 ausgeben * AlsRepeat-Schleife: i=1 i=i+1 ausgeben * until i>10 Michael Sonntag Prozedurale Konstrukte 24
Wann welche Schleife? Die Auswahl-Frage! Wir wissen von Anfang an genau, wie oft die Schleife durchgeführt werden soll Oder nur in ganz seltenen Ausnahmefällen einmal anders FOR Schleife verwenden! Schleife muss immer mindestens ein Mal durchlaufen werden REPEAT (do-while) Schleife verwenden! Sonst oder wenn unsicher, was besser geeignet is Schleife wird ev. gar nicht durchlaufen Aussage schwer, wann genau wie oft WHILE Schleife verwenden! Michael Sonntag Prozedurale Konstrukte 25
Kombinationen Zuweisung, Sequenz, Verzweigung, Schleife Dies ist ALLES was sie hier lernen werden» Zumindest im Grundsatz Details folgen noch! Diese Elemente können beliebig kombiniert werden: Schleife in Verzweigung Verzweigung in Schleife Sequenz von Zuweisungen. Michael Sonntag Prozedurale Konstrukte 26
Kombinationen Nassi-Shneiderman-Diagramm Summe der geraden Zahlen von 1 bis 20 berechnen N Summe=0 Zähler=1 Zähler gerade? Summe= Summe+Zähler Zähler=Zähler+1 Until Zähler>20 Summe anzeigen J Michael Sonntag Prozedurale Konstrukte 27