unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons, Math; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Label5: TLabel; Memo1: TMemo; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; ScrollBar1: TScrollBar; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Label1Click(Sender: TObject); procedure ScrollBar1Change(Sender: TObject); function Heron(flaeche: real; max_n: integer; epsilon: real):real; procedure Ausgabe(n: integer; x: real; y: real); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation { TForm1 } procedure TForm1.Button2Click(Sender: TObject); begin Form1.Close; end; procedure TForm1.Label1Click(Sender: TObject); begin end; procedure TForm1.ScrollBar1Change(Sender: TObject); begin Edit2.Text:= IntToStr(Scrollbar1.Position); end; procedure TForm1.Button1Click(Sender: TObject); var x,y,fehler:real; zahl,n,max_n:integer; begin zahl:= StrToInt(Edit1.Text); if (zahl < 1) then begin ShowMessage ('Wert muss eine positive ganze Zahl sein!'); Edit1.Text:=''; ActiveControl := Edit1; end else begin fehler:=1; n:= ScrollBar1.Position; Edit2.Text:= IntToStr(n); fehler := power(10,-n); max_n := StrToInt(Edit5.Text); // Vorbereitung der Ausgabe Memo1.Append('Bestimmung der Quadratwurzel aus ' + IntToStr(zahl) +':'); Memo1.Append('n | x | y | x - y '); Memo1.Append('------------------------------------------------------'); x:=Heron(zahl,max_n,fehler); // Nachbereitung der Ausgabe Memo1.Append('______________________________________________________'); Memo1.Append(' '); end end; function TForm1.Heron(flaeche: real; max_n: integer; epsilon: real):real; var n: integer; // Schritte, ganze Zahl x: real; // erste Seitenlänge, reelle Zahl y: real; // zweite Seitenlänge, reelle Zahl begin x := 1; // erste Seite startet bei 1 y := flaeche/x; // Berechnung der zweiten Seitenlänge n := 0; // Anzahl der Schritte noch null repeat // Wiederhole so lange... x := (x+y)/2; y := flaeche/x; n := n+1; // Ausgabe Ausgabe(n,x,y); until ((abs(x-y) < epsilon) or (n >= max_n)); // bis genau genug berechnet. Heron := x; // Übergabe des berechneten Werts an Hauptprogramm. end; procedure TForm1.Ausgabe(n: integer; x: real; y: real); begin Edit3.Text:= IntToStr(n); // Schrittnummer Edit4.Text:= FloatToStrF(x,ffFixed,ScrollBar1.Position,12); Memo1.Append(IntToStr(n) + ' | ' + FloatToStrF(x,ffFixed,ScrollBar1.Position,12) + ' | ' + FloatToStrF(y,ffFixed,ScrollBar1.Position,12) + ' | ' + FloatToStrF(x-y,ffFixed,ScrollBar1.Position,12)); end; initialization {$I unit1.lrs} end.