(*$B- Aufgabe 2.30 *) PROGRAM quadratwurzel; CONST n=300; TYPE zahl =ARRAY[0..n] OF integer; VAR a,hilf,rest,wurzel,zweia,zero : zahl; ziffer,zifftot,wvorkomma,avorkomma, imin,k,j,i,l : integer; tf:text; stri:string[10]; PROCEDURE lieszahl(VAR a:zahl; VAR anzstellen,avorkomma:integer); VAR c:char; ziffer:boolean; BEGIN avorkomma:=0; anzstellen:=0; writeln('Radikand ? Nach letzter Ziffer CTRL-Z'); REPEAT read(c); ziffer:= ('0'<=c) AND (c<='9'); IF ziffer THEN BEGIN anzstellen:=anzstellen+1; a[anzstellen]:=ord(c)-ord('0') ; END; IF c='.' THEN avorkomma:=anzstellen; UNTIL eof; IF avorkomma=0 THEN avorkomma:=anzstellen END; PROCEDURE teil(a,b:zahl;VAR z:integer); VAR f,g: real; BEGIN f:=0; g:=0; i:=imin; WHILE (g<10) AND (i0 THEN z := round(f/g) ELSE z:=9; END; PROCEDURE sub(a,b:zahl; VAR c:zahl); VAR i:integer; BEGIN FOR i:=k DOWNTO imin DO BEGIN c[i]:=a[i]-b[i]; IF c[i]<0 THEN BEGIN c[i]:=c[i]+10; a[i-1]:=a[i-1]-1; END END END; PROCEDURE uebertrag(VAR c:zahl); VAR i: integer; BEGIN FOR i:=k DOWNTO imin DO WHILE c[i]>=10 DO BEGIN c[i]:=c[i]-10; c[i-1]:=c[i-1]+1; END END; PROCEDURE mult(a:zahl; b:integer; VAR c:zahl); VAR i:integer; BEGIN FOR i:=k DOWNTO imin DO c[i]:=a[i]*b; uebertrag(c) END; FUNCTION kleiner(a,b:zahl):boolean; VAR i:integer; ungl: boolean; BEGIN i:=imin; REPEAT i:=i+1; ungl:=a[i]<>b[i]; UNTIL ungl OR (i=k); kleiner := a[i]=10 do begin hilf[i] := hilf[i]-10; hilf[i-1] := hilf[i-1] +1 end; writeln(tf); writeln(tf); writeln(tf,'Wurzel**2 ='); for i := 1 to l+1 do write(tf,hilf[i]) END; BEGIN writeln('wohin mit dem Output?'); readln(stri); assign(tf,stri); rewrite(tf); FOR i:= 0 TO n DO zero[i]:=0; rest:=zero; wurzel:=zero; hilf:=zero; a:=zero; lieszahl(a,zifftot,avorkomma); k:=(avorkomma+1) MOD 2; wvorkomma:= avorkomma DIV 2 + 1-k; l:=0; WHILE k<2*zifftot DO BEGIN IF k<=zifftot THEN BEGIN rest[k+1]:= a[k]; rest[k+2]:=a[k+1] END; k:=k+2; imin:=k-l-3; IF imin<0 THEN imin:=0; zweia:=zero; FOR j:=1 TO l DO zweia[k-l-1+j]:=wurzel[j]*2; teil(rest,zweia,ziffer); zweia[k]:=ziffer; mult(zweia,ziffer,hilf); WHILE kleiner(rest,hilf) DO BEGIN ziffer:=ziffer-1; zweia[k]:=ziffer; mult(zweia,ziffer,hilf); END; sub(rest,hilf,rest); l:=l+1; wurzel[l]:=ziffer; writeln(tf);writeln(tf,'Rest, Wurzel'); FOR i:=k-l-1 TO k DO write(tf,rest[i]); writeln(tf); printwurzel; END; writeln(tf); writeln(tf,'Gegebene Zahl'); FOR i:= 1 TO zifftot DO BEGIN write(tf,a[i]); IF i=avorkomma THEN write(tf,'.'); END; writeln(tf);writeln(tf); writeln(tf,'Wurzel'); printwurzel; kontrolle; writeln(tf); close(tf) END.