Motivation | Wozu überhaupt Programmieren lernen? |
1. Lektion | Das erste Programm "Hallo Welt" |
2. Lektion | Variablen und Wertzuweisung |
3. Lektion | if ... then ... else I. Teil |
4. Lektion |
Schleife: for .. to .. do
..Begin .. End Summen und Produkte |
5. Lektion |
repeat und while-Schleifen Wertetafeln |
... |
zusammenfassende
Aufgaben weitere Aufgaben |
6. Lektion | Pascalfunktionen (Einstieg) |
7. Lektion |
if .. then .. else II.Teil div und mod Primzahlen und Primfaktoren |
8. Lektion |
Case .. of .. End zusammenfassende Aufgaben |
9. Lektion |
Algorithmen Der euklidische Algorithmus |
10. Lektion | Rekursive Funktionen I. Teil: Erste Beispiele |
11. Lektion | Prozeduren |
12. Lektion |
Iterationen zusammenfassende Aufgaben |
13. Lektion | Rekursion II. Teil: Basiswissen |
14. Lektion |
Arrays und Ordnungsalgorithmen zusammenfassende Aufgaben Die 15. Lektion wird für Lektion 16 u.s.w. nicht vorausgesetzt. |
15. Lektion | Das Gauß-Verfahren zur Lösung eines LGS |
16. Lektion | Recordtypen |
17. Lektion | Ein zweites Fenster erzeugen |
18. Lektion |
Objektorientierte
Programmierung: Unterschied zwischen Prozedur und Methode |
19. und 20. Lektion für Ergänzungen noch freigehalten | |
21. Lektion | Eigenschaften, Methoden und Ereignisse am Beispiel Öffnen und Speichern von Dateien |
22. Lektion | Klassen und Instanzen |
23. Lektion | Klassen selbst definieren |
24. Lektion | Nachkomme von TForm selbst schreiben |
Anhang 1 | hoch(x,n) = xn für x,n: real |
Anhang 2 | Genauigkeit bei der Gleitkommarechnung |
Anhang 3 | Ein Programmmanager. (Deine eigene Startleiste) |
Anhang 4 | Lektion in Graphik |
Anhang 5 | Lektion in Bildbearbeitung |
Anhang 6 | Bewegung aufs Bild: Verwendung der Timerkomponente |
Anhang 7 | Wettrennen: Images werden zur Laufzeit erzeugt und mit Bild geladen |
Anhang 8 | Wie Delphi definieren wir selbst eine Form als Klasse. |
Anhang 9 | Rekursion III. Teil: Ein mathematischer Parser |
Anhang 10 | Umwandlung von Dezimalzahlen in Dualzahlen |
Anhang 11 | Kryptologie |
Anhang 12 | Vermischtes (Die FAQ) |
1. Eingabe und Ausgabe | 2. Variablentyp | 3. Wertzuweisung | 4. Wiederhlung |
5. Verzweigung | 6. Funktion | 7. Przedur | 8. Algrithmus |
9. Iteration | 10. Rekursion | 11. Array (Vektor) | 12. Record (Datenblatt) |
13. Genauigkeit bei Real | 14. Klasse Instanz | 15. Eigenschaft Methode | 16. etwas OOP |
17. Daten speichern | 18. Verzeichnisse lesen | 19. Graphik | 20. Bildbearbeitung |
Das sind für Anfänger viele verwirrende Elemente.
Sie gibt es aber in jeder guten Programmiersprache. Um damit
umgehen zu können, muss man lernen, sich vorzustellen,
was im Computer passiert, wenn der Programmcode
ausgeführt wird.
Das ist ein langwieriger Lernprozess. Als Anfänger muss
man daher viel üben. Diese Lektionen werden Dir dabei
helfen. Die ersten Lektionen sind dabei die wichtigsten.
Delphi zwingt wie die Vorgängersprache Pascal zum logischen und strukturiertem Aufbau eines Programms. Die Deklaration aller verwendeten Variablen ermöglicht einen Überblick über ihren Gültigkeitsbereich.
Mit diesem Grundwissen kann sich dann der fortgeschrittene
Programmierer anwendungsorientierten Projekten widmen.
Einfache und komplexe Beispiele findest du hier in der
Delphi-Ecke.
Zum Beispiel: memo1.Font.Name := 'Courier New'; //Im Objektinspektor memo1.Font.Size := 12; //Im Objektinspektor
Starte in Delphi eine Neue Anwendung (Menu Datei|Neu). Klicke in der Komponentenleiste auf einen Button und setze ihn aufs Formular und klicke im Objektinspektor auf das Ereignis OnClick. Delphi schreibt folgenden Quellcode: procedure TForm1.Button1Click(Sender: TObject); begin end; Merke: Was Delphi schreibt, darf nicht geändert oder gelöscht werden! Du darfst nur vor begin die Variablen deklarieren (siehe Programme in Lektion 1) und zwischen begin und end Deine Anweisungen. Ergänze nun die Prozedur folgendermaßen: procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('Hallo Welt'); //Einzige Anweisung end;Hinweis:
Speichere mit Menü Datei|Projekt speichern
unter... in einem Eigenen Ordner HalloWelt ab.
Delphi speichert zu jedem Projekt mehrere Dateien ab, nämlich .RES (Ressourcendatei) .DPR (Projektdatei) .DFM (graphische Formulardatei) werden alle von Delphi verwaltet und .PAS (Unit Quelltext, nur in diesem schreibt der Programmierer)
Jetzt Programm starten:
Der Compiler erzeugt Unit-Object-Zwischencode .DCU und die eigentliche ausführbare Datei .EXE (nur die erhält der Kunde).
Hinweis:
Niklaus Wirth, geboren 1934 Winterthur, Schweiz |
Das von Borland/Inprise entwickelte Delphi ist eine objektorientierte Nachfolgesprache von Pascal, einer von dem Zürcher Professor Niklaus Wirth entwickelte klar konzipierte und streng strukturierte Programmiersprache, benannt nach dem französischen Philosophen und Mathematiker Blaise Pascal (1623-1662), der um 1640 (vor seiner mystischen Erleuchtung) eine mechanische Rechenmaschine entwickelt hatte. Die von ihm inspirierte objektorientierte Nachfolgesprache Oberon setzte sich leider nicht durch, obwohl sie gegenüber Delphi oder auch Java den außerordentlichen Vorteil hat, kurz und bündiges Programmieren zu verlangen. Siehe "Pascal and its Successors"(25.09.2002) von Niklaus Wirth. (Zitat: Are we therefore condemned to eternally produce an ever growing mountain of software of ever growing complexity, software that nobody fully understands, although everybody is well aware of its defects and deficiencies?") |
Im folgenden ist häufig von Pascal die Rede. Damit ist Quelltext von Delphi gemeint, der reines bewährten Pascal ohne OOP darstellt.
procedure TForm1.Button1Click(Sender: TObject); begin label1.Caption := 'Hallo Welt'; label1.Show; button1.hide; button2.show; button2.left := button1.left; end;Klicke Schließen an und wähle im Objektinspektor das Ereignis OnClick. Und ergänze den Quelltext folgendermaßen:
procedure TForm1.Button2Click(Sender: TObject); begin close end;close bezieht sich hier auf form1, da hier Button2Click eine Methode von Tform1 ist.
Übung: Welche Werte stehen in den folgenden Programmen in den für die Variablen reservierten Speicherbereichen? Schreibe dies Zeile für Zeile auf! Aufgabe 2.1: Protokolliere die Variablenbelegung! a) Füge nach jedem Befehl ein: showmessage('a=' + a); (Ersetzte gegebenenfalls passend a durch b und c!) procedure TForm1.Button1Click(Sender: TObject); var a, b, c:string; begin a := 'Hallo'; b := 'Welt'; c := a + ' ' + b; end; Hinweis: Jeder Befehl wird mit einem Semikolon abgeschlossen!
b) Füge nach jedem Befehl ein! showmessage('a=' + IntToStr(a) + ' b=' + IntToStr(b) + ' c=' + IntToStr(c)); procedure TForm1.Button1Click(Sender: TObject); var a, b, c: Integer; begin a := 5; b := 7; c := 9; a := b; b := c; c := a; a := a + 1; b := b-1; c := c-1; end; c) Füge nach jedem Befehl ein! showmessage('a=' + floatToStr(a) + ' b=' + floatToStr(b)); Ersetzte gegebenenfalls passend a und b durch c und d! procedure TForm1.Button1Click(Sender: TObject); var a,b,c,d:real; begin a: = 1 + 3/10; b := - 3/10; a: = a + 1/10; b := b - 1/10; c: = a + b; d := 1 - c; end; d) Füge nach jedem Befehl ein: showmessage(...) procedure TForm1.Button1Click(Sender: TObject); var a,b,c:integer; begin a := -7; b := 11; c := 13; a := a + 6; b := b-12; c := c-11; a := a + b; b := b + c; c := a + b; a := a + b + c; b := a + b + c; c := a + b + c; end. e) Was berechnet folgendes Programm? (Schreibe keine Zahl sondern einen Rechenausdruck!) procedure TForm1.Button1Click(Sender: TObject); var s:real; begin s := 0; s := s + 1; s := s - 1/3; s := s + 1/5; s := s - 1/7; s := s + 1/9; s := s - 1/11; //weiter siehe Aufg. 4.2 end; Lösung
Wir können Bedingungen mit if.. then .. in unser Programm einbauen: Ein Befehl wird nur ausgeführt, wenn eine Bedingung erfüllt ist.
Beispiel 3.1: Eine Zufallszahl wird mit Worten ausgegeben: procedure TForm1.Button1Click(Sender: TObject); var k:integer; begin k := random(2) + 1; // k = 1 oder k = 2 if k = 1 then showmessage('Eins'); if k = 2 then showmessage('Zwei'); end;Bemerkung:
procedure TForm1.Button1Click(Sender: TObject); var k:integer; begin k := random(2) + 1; if k = 1 then showmessage('Eins') else showmessage('Zwei'); end;
a)Beachte ... procedure TForm1.Button1Click(Sender: TObject); var a,b:integer; begin a := spinedit1.Value; b := spinedit2.Value; if a 〈 b then showmessage('Erste Zahl kleiner als 2. Zahl'); if 2*a 〈 b then showmessage('Erste Zahl kleiner als die Hälfte der 2. Zahl'); end; b)1 procedure TForm1.Button1Click(Sender: TObject); var a,b:integer; begin a := spinedit1.Value; b := spinedit2.Value; if 2*a 〈 b then showmessage('Erste Zahl kleiner als die Hälfte der 2. Zahl') else if a 〈 b then showmessage('Erste Zahl kleiner als 2. Zahl'); end; Lösung Beispiel 3.4: Kopfrechenübung: Zwei Zufallszahlen x,y mit 0 〈= x,y 〈= 10 sollen durcheinander dividiert werden. procedure TForm1.Button1Click(Sender: TObject); var x,y:integer; begin randomize; x := random(11); //liefert Zufallszahl aus {0,1,...,10} y := random(11); showmessage('Schätze ' + intToStr(x) + '/' + intToStr(y) + '!'); if y = 0 then showmessage('Durch 0 darf nicht dividiert werden!') else showmessage(intToStr(x) + '/' + intToStr(y) + ' = ' + floatToStr(x/y)); end;
Für jede Funktion f ist die Tangentenfunktion g mit
g(x) = f(0) + f'(0)·x eine Näherung des Schaubildes in Q(0|f(0)).
(Der "Fehler 1. Ordnung" ist "nahe bei x=0" klein.)
Noch besser wird f durch eine Parabel angenähert, wenn man noch
die Krümmung durch die 2. Ableitung berücksichtigt:
1 2
h(x) = f(0) + f'(0)·x + -·f''(0)·x (Siehe Schaubild!)
2
(Der "Fehler 2. Ordnung" ist "nahe x=0" kleiner).
Allgemein bestimmt man die ganzrationale Funktion g
n
2 n
mit g (x) = a + a x + a x + ... a x als Näherungsfunktion so, dass
n 0 1 2 n
(n) (n)
g(0) = f(0), g'(0) = f'(0) , g''(0) = f''(0) ... g (0) = f (0).
Man erhält dann die "Taylorreihe" als Näherungsfunktion
(n)
f'(0) f''(0) 2 f'''(0) 3 f (0) n
g (x) = f(0) + —————·x + —————·x + ——————·x + ... + ———————·x
n 1! 2! 3! n!
Zum Beispiel für f(x) = sin(x) die "Taylorreihe"
1 3 1 5 1 7
x - ——·x + ——·x - ——·x + ... mit n! = 1·2·3· ... ·n
3! 5! 7!
Wie man π
mit einer Summe oder Reihe berechnet: siehe Leibniz/Wallis/Euler
etc.
|
Um den Befehl showmessage('Hallo Welt'); 4 mal ausführen zu lassen, kann man folgende Schleife verwenden: procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i := 1 to 4 do showmessage(IntToStr(i) + ' Hallo Welt'); end; Die folgende Prozedur ohne for .. to do macht genau dasselbe. procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin i := 1; showmessage(IntToStr(i) + ' Hallo Welt'); i := 2; showmessage(IntToStr(i) + ' Hallo Welt'); i := 3; showmessage(IntToStr(i) + ' Hallo Welt'); i := 4; showmessage(IntToStr(i) + ' Hallo Welt'); end; Will man in einer Schleife mehrere Befehle ausführen lassen, schreibt man diese zwischen Begin und End. procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i := 1 to 10 do Begin showmessage(IntToStr(i) + ' Hallo Welt'); showmessage('Dieses war der ' + IntToStr(i) + '. Streich'); showmessage('Doch der nächste folgt zugleich'); End; showmessage('Jetzt ist Schluss'); end; Hinweis: In Delphi darf man groß- und kleinschreiben, wie man will. Hier wird deshalb zur besseren Lesbarkeit das erste, das zweite u.s.w. ineinandergeschachtelte begin mit zugehörigem end folgendermaßen geschrieben. Merke! Auf jeden Fall mit Einrückungen schreiben. begin ... Begin ... BEgin ... BEGin ... beGin ... ... enD; END; ENd; End; end; Anektdote (Typisch deutsch): Die Polizei, die die Bankräuber, die die Sparkasse in Weiler, die neben dem Rathaus, das vom berühmten Architekten, der auch das Rathaus in Oberdorf, das kürzlich abbrannte, gebaut wurde, steht, überfielen, verfolgte, hatte Erfolg.
Screen.Width ist die Breite des Bildschirms Screen.Height ist die Höhe des BildschirmsUnsese Form hat verschiedene Eigenschaften:
Zum Beispiel: form1.Width (Breite) form1.Height (Höhe) form1.Top (Obere Rand im Vergleich zum Bildschirm) form1.left (Linker Rand im Vergleich zum Bildschirm)Komplizierter ist die Eigenschaft
form1.canvas canvas (engl.) = LeinwandDas ist die Zeichenfläche von Form1.
form1.Canvas.Rectangle(100,100,200,200)zeichnet ein Rechteck: links oben (100|100) rechts unten (200|200)
form1.Canvas.Ellipse(100,100,200,200)zeichnet eine Ellipse, die das Rechteck oben an allen Seiten berührt
mit form1.Canvas.Pen.Width := 5; form1.Canvas.Pen.Color := clblue; //cl = Colorwird die Dicke und Farbe unseres Schreibstiftes bestimmt.
form1.Canvas.brush.Color := clRed;Eine Linie von A(100|100) nach B(200|200) wird folgendermaßen gezeichnet: form1.canvas.moveto(100,100); form1.Canvas.LineTo(200,200);
//Button1 und button2 auf ein panel mit panel1.align := bottom; procedure TForm1.Button1Click(Sender: TObject); //Vorbereitung begin top := 0; left := 0; //form1.width := screen.Width; Kürzer nur ... width := screen.Width; //width bezieht sich hier auf den Typ TForm1 height := screen.height; //panel1.Align := albottom; im Objektinspector canvas.Pen.Width := 0; canvas.Brush.Color := clwhite; canvas.Rectangle(0,0,width,height); end; procedure TForm1.Button2Click(Sender: TObject); var x, yi: integer; //yi = y_integer yr, v: real; //yr = y_real begin canvas.Pen.Width := 5; canvas.Pen.Color := clred; canvas.Brush.Color := clyellow; v := height/(width*width); for x := 0 to width do Begin yr := v*x*x; yi := round(yr); canvas.Ellipse(x,yi,x + 10,yi + 10); //nur Integer erlaubt End; end;
I) Summen können mit folgenden zwei Zeilen gebildet werden: s := 0; //Anfangswert: das neutrale Element bez. " + " for i := .. to .. do s := s + .. Beispiel 4.1 s = 1 + 4 + 9 + 16 + .. + 10*10 procedure TForm1.Button1Click(Sender: TObject); var s,i:integer; begin s := 0; //Anfangswert for i := 1 to 10 do s := s + i*i; //Hier wird "aufaddiert" showmessage('s=' + intToStr(s)); //385 end; Hinweis: Ein schwerer Programmierfehler wäre es, den Anfangswert s := 0 nicht zu setzten. Für s ist zwar eine Speicherstelle reserviert. Diese ist jedoch noch nicht initialisiert. Der Compiler gibt deshalb eine Warnung aus. Diese Warnungen zu beachten, hat sich bestens bewährt. Die for .. to .. do-Schleife ersetzt die in der folgenden Prozedur beschriebenen 20 Befehle: procedure TForm1.Button1Click(Sender: TObject); var s,i:integer; begin s := 0; i := 1; s := s + i*i; //1 i := 2; s := s + i*i; //1 + 4 i := 3; s := s + i*i; //5 + 9 i := 4; s := s + i*i; //14 + 16 i := 5; s := s + i*i; //30 + 25 i := 6; s := s + i*i; //55 + 36 i := 7; s := s + i*i; //91 + 49 i := 8; s := s + i*i; //140 + 64 i := 9; s := s + i*i; //204 + 81 i := 10; s := s + i*i;//285 + 100 showmessage('s=' + intToStr(s)); //385 end; II) Produkte können mit folgenden zwei Zeilen gebildet werden: p := 1; //Anfangswert: das neutrale Element bez. "*" for i := .. to .. do p := p * .. Beispiel 4.2 p := 6! = 1*2*3* .. *6 procedure TForm1.Button1Click(Sender: TObject); var p,i:integer; begin p := 1; for i := 1 to 6 do p := p*i; showmessage('p=' + intToStr(p)); end; Ohne Schleife müsste man folgendes schreiben. (Als Kommentar ist die Wertebelegung protokolliert. Das ist stets eine gute Übung beim Programm studieren). procedure TForm1.Button1Click(Sender: TObject); var p,i:integer; begin p := 1; i := 1; p := p*i; //p=1 i := 2; p := p*i; //p=1*2 i := 3; p := p*i; //p=2*3 i := 4; p := p*i; //p=6*4 i := 5; p := p*i; //p=24*5 i := 6; p := p*i; //p=120*6 showmessage('p=' + intToStr(p)); //p=720 end; Aufgabe 4.1: Schreibe ein Programm, das berechnet: a) s = 1 + 1/2 + 1/3 + 1/4 + ... + 1/9999 b) s = 1000 + 1001 + .. + 1998 + 1999 c) p = 2^32 = 2*2*2* .. *2 Lösung Verallgemeinerung: Nach Eingabe eines Wertes in ein Editfeld soll eine Summe bzw. ein Produkt berechnet werden. (OOP: Die Editkomponente kannst du von der Komponententabelle als edit1 auf die Form platzieren) Lösung mit n als integer: n := stringToInt(edit1.text); for i := 1 to n do .. Beispiel 4.3 xn: x hoch n Man benötigt edit1 für n und edit2 für x. procedure TForm1.Button1Click(Sender: TObject); var i,n:integer; p,x:real; begin n := strToInt(edit1.text); x := strToFloat(edit2.text); p := 1; for i := 1 to n do p := p*x; showmessage(floatToStr(x) + '^' + intToStr(n) + '=' + floatToStr(p)); end; Aufgabe 4.2: Was berechnet folgendes Programm bei Eingabe von a) n=5 (Keine Zahl sondern Rechenausdruck!) b) n=10 c) allgemein procedure TForm1.Button1Click(Sender: TObject); var i,n,plusminus:integer; s,p:real; begin n := strtoInt(edit1.text); plusminus := 1; s := 1; for i := 1 to n do Begin plusminus := - plusminus; s := s + plusminus/(2*i + 1); End; showmessage(floatToStr(s)); p := 4*s; showmessage(floatToStr(p)); end; Lösung
for .. to .. do .. |
for .. to .. do Begin .. End |
repeat .. until .. |
while .. do .. |
while .. do Begin .. End |
Beispiel 5.1: Wertetafel für y = 1/3x^3 - 3x von -5 bis 5 Man benotigt außer dem Button noch eine Memokomponente. procedure TForm1.Button1Click(Sender: TObject); var x :integer; y :real; begin memo1.Lines.clear; for x := -5 to 5 do Begin y := 1/3*x*x*x - 3*x; memo1.lines.Add(IntToStr(x) + ' ' + FloatToStr(y)); End; end;
Aufgabe 5.1: Schreibe ein Programm das die Wertetafel für eine Funktion ausgibt. Die Grenzen soll der Benutzer eingeben können. Lösung Aufgabe 5.2: Was berechnet folgendes Programm procedure TForm1.Button1Click(Sender: TObject); var x :integer; y :real; begin memo1.Lines.clear; for x := -36 to 36 do Begin y := sin(10*x*Pi/180); //sin berechnet den Sinus im Bogenmaß //Beachte: x im Bogenmaß ist x*Pi/180 im Gradmaß memo1.lines.Add(IntToStr(x) + '0 ' + FloatToStr(y)); End; end; Lösung Beispiel 5.2: Wertetafel von x1 bis x2 mit Schrittweite s mit repeat .. until ..: procedure TForm1.Button1Click(Sender: TObject); var x, x1, x2, s, y:real; begin x1 := -2; //Alternative: Einlesen von editx1 x2 := 2; //Alternative: Einlesen von editx2 s := 1/10; //Alternative: Einlesen von edits x := x1; //Anfangswert repeat y := 1/3*x*x*x - 3*x; memo1.lines.Add(FloatToStr(x) + ' ' + FloatToStr(y)); x := x + s; until x > x2; //Programmierfehler wäre .. until x = x2 bzw. //until x = x2 + s, da real nur angenähert rechnet! //siehe auch Gleitkommarechnung end;Hier wird x laufend um s = 0.1 erhöht, bis es schließlich x2 = 2 übertrifft. Solange der Ausdruck nach until nicht den Wert true hat, wird der Teil zwischen repeat und until wiederholt. Erst wenn, x = 2.1 ist also 〈x2 den Wert false hat, gibt es keine Wiederholung mehr.
Beispiel 5.3: Wertetafel von x1 bis x2 mit Schrittweite s mit while .. do Begin .. End; procedure TForm1.Button1Click(Sender: TObject); var x, x1, x2, s, y:real; begin x1 := -2; //Alternative: Einlesen von editx1 x2 := 2; //Alternative: Einlesen von editx2 s := 1/10; //Alternative: Einlesen von editx2 x := x1; //Anfangswert memo1.Lines.clear; while x 〈= x2 do Begin y := 1/3*x*x*x - 3*x; memo1.lines.Add(FloatToStr(x) + ' ' + FloatToStr(y)); x := x + s; End; end;Solange die Bedingung x 〈 x2 nach while den Wert true hat, wird der Befehl nach while ... wiederholt. Da nach while eine Befehlsguppe von drei Befehlen steht, muss diese Gruppe zwischen Begin und End.
repeat das shape bewegt sich ohne Unterlass until false; //Die Bedingung nach until wird nie wahr.Mit einem zweiten Button kann jedoch die Bewegung gestoppt werden. Die Variable "stop" wird auf true gesetzt. Sobald dies der Fall ist wird die Endlosschleife "repeat ... until false" mit exit verlassen. Dass die Botschaft auch ankommt, wird durch "application.ProcessMessages" bewirkt. (Das veranlasst Windows alle Botschaften, die es erhalten hat, erst einmal abzuarbeiten. Zum Beispiel auch, das Shape weiter rechts zu zeichnen.).
var Form1: TForm1; //... schreibt Delphi. Darunter schreibst Du die // globalen Variablen "stop" und "geschwindigkeit" stop: boolean; geschwindigkeit: integer; implementation //... schreibt Delphi {$R *.DFM} // ... schreibt Delphi procedure TForm1.Button1Click(Sender: TObject); begin DoubleBuffered := true; stop := false; geschwindigkeit := 1; repeat if stop then exit; shape1.Left := shape1.Left + geschwindigkeit; if shape1.Left 〉 form1.Width - shape1.Width - 20 then shape1.Left := 0; application.ProcessMessages; until false; end; procedure TForm1.Button2Click(Sender: TObject); begin stop := true; end; procedure TForm1.Button3Click(Sender: TObject); begin geschwindigkeit := geschwindigkeit + 1; end;
Aufgabe 5.3: Schreibe die Prozeduren so um, dass Anfangs- und Endwert sowie die Schrittweite eingelesen werden können.Lösung
Aufgabe 5.4: Was berechnet folgendes Programm ? Denke Dir nach jedem Befehl "showmessage(...)" und schreibe ein Verlaufsprotokoll. a) procedure TForm1.Button1Click(Sender: TObject); var a,b,c,d,x,y: integer; begin a := 2; b := -10; c := 0; a := a + 4; b := b + 4 ; c := c + 4; a := b + c; b := a + c; c := a + b; x := 7; x := x*x; x := x*x; //Darstellung als Potenz mit kleinster Basis erwünscht! y := x; x := x*x; x := x*x; y := x*y; end; b) procedure TForm1.Button1Click(Sender: TObject); var a,b,c,d,w,x:real; begin a := 6; b := -5; c := -25; d := b*b - 4*a*c; w := sqrt(d); //sqrt=Quadratwurzel x := (-b - w )/(2*a); end; c) procedure TForm1.Button1Click(Sender: TObject); var k,a: integer; x: real; begin x := 0; for k := 1 to 6 do Begin a := k*k; x := x + 1/a; //Rechenausdruck genügt End; end; d) procedure TForm1.Button1Click(Sender: TObject); var k,a: integer; x: real; begin x := 0; k := 1; repeat a := k*k; x := x + 1/a; //Rechenausdruck genügt k := k + 2; until k > 6; end; e) procedure TForm1.Button1Click(Sender: TObject); var k,a,b: integer; x: real; begin x := 1; k := 1; while k 〈 6 do Begin a := 2*k; b := 2*k + 1; x := x * a/b; //Rechenausdruck genügt k := k + 1; End; end; Lösung Aufgabe 5.5: Schreibe jeweils ein Programm! a) Die Wertetafel für y = x^2 - 2x soll für die Werte x = -2; -1,9; ... 1,6; 1,7 1,8; 1,9 und 2 in ein Memofeld geschrieben werden. (i) Mit einer for -Schleife. (ii) Mit einer while -Schleife. (iii) Mit einer repeat-Schleife. b) In ein Editfeld soll die natürliche Zahl n eingegeben werden können. Anschließend soll die Summe s = 1 + 1/4 + 1/9 + 1/16 + ... + 1/(n*n) berechnet werden und in eine zweites Editfeld geschrieben werden. c) In zwei Editfeldern sollen die natürlichen Zahlen a und b eingegeben werden (a 〈 b) Anschließend soll das Produkt p = a*(a + 1)*(a + 2) ... *(b-1)*b berechnet werden. Lösung Aufgabe 5.6: Schreibe ein Programm, welches das kleinste n ausgibt, für das s = 1 + 1/2 + 1/3 + 1/4 + ... + 1/n > 20 ist. LösungAufgabe 5.7: Ein Selbständiger hat ein Vermögen von 1,674 Mio. EUR. Er rechnet mit einem Verbrauch von 48 000 EUR jährlich, jedes Jahr 5% mehr. Wir nehmen an, dass das Restvermögen auch zu 5 % verzinst wird. Wie lange kann er unter diesen Voraussetzungen von seinem Vermögen zehren?
Mathematische Lösung: Anfangsvermögen K0 = 1674000 Anfangsauszahlung a0 = 48000; Vermögen nach 1 Jahr K1 = (K0 - a0)*1.05 Auszahlung nach 1 Jahr a1 = a0*1.05 Vermögen nach 2 Jahren K2 = (K1 - a1)*1.05 ... Auszahlung nach n Jahren an = an-1*1.05 Vermögen nach n Jahren KN = (Kn-1 - an-1)*1.05 Lösung