Agenda für heute, 21. April, 2005 • Interaktion mit Pascal-Programmen • Dateneingabe • Programmsteuerung • Debugging • Datentypen: real Interaktion mit dem Betriebssystem Betriebssystem begin read (x); GetDate() GetTime() if x >= 0 then write (sqrt (2)) else write (x,'?'); end. Programmieren und Problemlösen 2/15 © Institut für Computational Science, ETH Zürich An das Betriebssystem angepasster, standardisierter Code Programmierumgebung Programmbibliothek Objektcode für read-Operation Objektcode für write-Operation Objektcode für sqrt-Operation ….. Quellcode des Programms begin read (x); if x >= 0 then write (sqrt (2)) else write (x,'?'); end. Compiler Objektcode des Programms Programmieren und Problemlösen 3/15 © Institut für Computational Science, ETH Zürich • Interaktion mit Pascal-Programmen • Dateneingabe • Programmsteuerung • Debugging • Datentypen: real Eingabevalidierung Ziel: Verhindern, dass ungültige Daten verarbeitet werden. Mögliche Folgen inkorrekter Eingabedaten: • unbeabsichtigtem Programmabbruch ("Absturz") • "unendlichen" Schleifen • falschem Programmablauf • inkorrekten Resultaten Programmieren und Problemlösen 4/15 © Institut für Computational Science, ETH Zürich Umwandlung textueller Zahlen in numerische Werte • Die Standardprozedur read liest Zahlen als Textzeichen ein und wandelt diese in die interne, binäre Zahlendarstellung des Computers um. • Manchmal ist es nicht möglich, read in dieser Form zu verwenden, weil der Eingabetext nicht-numerische Zeichen enthält, z.B.: 'die Werte sind 102 und 633.54'. • Das Beispielprogramm Konvert, liest Eingabetext bis es eine Ziffer findet, liest weitere Ziffern, bis es das Ende der Zahl erreicht und konvertiert die Zahl in die binäre Darstellung. Programmieren und Problemlösen 5/15 © Institut für Computational Science, ETH Zürich • Interaktion mit Pascal-Programmen • Dateneingabe • Programmsteuerung • Debugging • Datentypen: real Programmsteuerung • Stapelprogramm wird einmal ausgeführt, keine Interaktion möglich • Interaktives Programm: Befehlszeilensteuerung Tastatureingabe führt zu bedingter Programmausführung Tastatureingabe führt zu Schleifenabbruch • Interaktives Programm: Ereignissteuerung Mausbewegung, Maustaste oder Tastatureingabe in grafischen Elementen führt zu Programmausführung oder Programmabbruch Delphi Programmieren und Problemlösen 6/15 © Institut für Computational Science, ETH Zürich Programmsteuerung mit Menüs Klammern zur Begrenzung ch:= ' '; von Kommentaren while ch <> 'q' do begin writeln(Eingabe: 1 für die Tageszeit'); writeln(' 2 für das Datum'); writeln(' q um zu beenden'); readln('ch'); case ch of '1': { hole Systemzeit und gebe sie aus } '2': (* hole Systemdatum und gebe es aus *) end end Siehe ausgegebenes Beispielprogramm Programmieren und Problemlösen 7/15 © Institut für Computational Science, ETH Zürich • Interaktion mit Pascal-Programmen • Dateneingabe • Programmsteuerung • Debugging • Datentypen: real Debugging Prävention • Strukturiertes Programmieren • Top-down Entwurf • Lesbare Programme (gutes Layout, sinnvolle Bezeichner) Es gibt keine allgemeine Regeln um Fehler in einem Programm zu finden. Jeder Bug ist einmalig Debugging verlangt Intuition, Eingebung, Erfahrung. Programmieren und Problemlösen 8/15 © Institut für Computational Science, ETH Zürich Debugging: ein paar Hinweise • Untersuche alle Anzeichen: Programmtext, Eingabedaten, Ausgabedaten, diagnostische Information des Run-time Systems. • Rufe Programm mit anderen Eingabedaten auf. • Füge zusätzliche write-Anweisungen ein um Zwischenresultate zu überprüfen. • Prüfe Programmteile vor dem verdächtigen Programmabschnitt. • Zeige Dein Programm Kolleginnen und Kollegen (ohne zu sagen, was Du vom Programm erwartest. • Wenn Du den Fehler gefunden hast, stelle sicher, dass er für alle unerwarteten Verhaltensweisen des Programms verantwortlich ist. Programmieren und Problemlösen 9/15 © Institut für Computational Science, ETH Zürich Debugging: ein Beispiel (Quelle: Tim Grams, Denkfallen und Programmierfehler) Gesucht ist die grösste Zweierpotenz, die nicht grösser als die vorgegebene Zahl z ist. program zweihoch; var z, p: integer; begin write('? z = '); readln(z); p:= 1; repeat p:= p*2 until p*2 >= z; writeln('! p = ',p) end. Was stimmt mit diesem Programm nicht? Programmieren und Problemlösen 10/15 © Institut für Computational Science, ETH Zürich Debugging: ein Beispiel Stimmt es jetzt? program zweihoch; var z, p: integer; begin write('? z = '); readln(z); if z < 1 then p:= 0 else begin p:= 1; while p <= z do p:= p*2; p:= p div 2 end; if p = 0 then writeln('keine Lösung') else writeln('! p = ',p) end. Programmieren und Problemlösen 11/15 © Institut für Computational Science, ETH Zürich • Interaktion mit Pascal-Programmen • Dateneingabe • Programmsteuerung • Debugging • Datentypen: real Der Datentyp real Teilbereich der reellen Zahlen. Der Wertebereich ist vom Prozessor abhängig. Beispiel: 5.0 x 10 -324 .. 1.7 x 10 308 (8 Byte, 15-16 signifikante Stellen) Operationen: +, –, *, /, ROUND, TRUNC Das Resultat eines Ausdrucks mit Integer-Werten kann sowohl an eine Integer-Variable als auch an eine Real-Variable zugewiesen werden. Programmieren und Problemlösen 12/15 © Institut für Computational Science, ETH Zürich Reelle Typen in Delphi 6 Typ Bereich Signifikante Stellen Grösse in Byte Real48 2.9 x 10-39 .. 1.7 x 1038 11-12 6 Single 1.5 x 10-45 .. 3.4 x 1038 7-8 4 Double 5.0 x 10-324 .. 1.7 x 10308 15-16 8 19-20 10 19-20 8 Extended 3.6 x 10-4951 .. 1.1 x 104932 Comp 2-63+1 .. 263-1 Currency 922337203685477.5808.. 922337203685477.5807 19-20 8 Der generische Typ Real ist in der aktuellen Implementation mit dem Typ Double identisch. Programmieren und Problemlösen 13/15 © Institut für Computational Science, ETH Zürich Konsequenzen der endlichen Darstellung für real Gegeben sind folgende Anweisungen: a:= 4 / 3 – 1; a:= 3 * a – 1; Welchen Wert erhält a? 3(4/3-1)-1 = 4-3-1 = 0 Angenommen, wir haben 4 Ziffern um eine relle Zahl darzustellen: 4 = 4. 0 0 0 3 = 3. 0 0 0 1 = 1. 0 0 0 das bedeutet: 4/3 = 1. 3 3 3 4/3-1 = 0. 3 3 3 Also: a = –0. 0 0 1 ≠ 0 Programmieren und Problemlösen deshalb: 3*(4/3-1) = 0. 9 9 9 3*(4/3-1)-1 = –0. 0 0 1 Lösung: 14/15 3 * 4 / 3 – 3 * 1 rechnen © Institut für Computational Science, ETH Zürich Automatische Typenkonversion In Ausdrücken können Integer- und Real-Werte gemeinsam vorkommen. Wenn für eine der Operationen +, – oder * ein Operand vom Typ Real ist, dann wird der andere Operand automatisch zu Real konvertiert bevor der Operator angewandt wird. Beispiel: (6 + 4) * (1 + 0.1) Die Faktoren in Klammern werden zuerst ausgewertet: 6 + 4 = 10 (Integer) Im zweiten Faktor ist 0.1 vom Typ Real, deshalb wird 1 zu Real konvertiert: 1 + 0.1 = 1.1 (Real) Der Multiplikationsoperator * hat einen Integer-Operanden (10) und einen Real-Operanden (1.1). Der Integer-Operand wird zu Real konvertiert: 10.0 * 1.1 = 11.0 (Real) Beachte: Das Resultat ist vom Typ "Real" obwohl es ein ganzzahliger Wert ist! Programmieren und Problemlösen 15/15 © Institut für Computational Science, ETH Zürich