Document

Werbung
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
Herunterladen