(* ** PROGRAM TITLE: Alpha Numeric Numbers Conversions ** ** WRITTEN BY: Raymond E. Penley ** DATE WRITTEN: 5 July 1980 ** ** SUMMARY: ** ** VAL = Single character to integer value. ** RDR = Alphanumeric to real number. ** STR = Integer to alphanumeric. ** ** Donated to PASCAL/Z USERS GROUP, July 1980 ** *) const default = 80; { Default length } type Dstring = STRING default; str0 = STRING 0; str255 = STRING 255; var zx :real; { the real numbers go here } done: boolean; number : integer; { the integer number in here } answer : Dstring; { String buffer } function length(x: str255): integer; external; procedure setlength(var x: str0; y: integer); external; (*------------------------------------------*) Function VAL(ch: char): integer; { Returns the integer value of the single char passed } const z = 48; { ORD('0') } begin VAL := ORD(ch) - z end; (*------------------------------------------*) Function RDR(var f: Dstring ): real; { read real numbers in free format. author: Niklaus Wirth book: Pascal User Manual & Report pg 122-123 ENTER WITH: f = a string containing ONLY the alphanumeric number to be converted to a real number. RETURNS: A real number. Any error returns RDR := 0.0 *} label 9;{ error exit } const t48 = 281474976710656.0 ; limit = 56294995342131.0 ; lim1 = 322; { maximum exponent } lim2 = -292; { minimum exponent } space = ' '; emsg1 = '**digit expected'; emsg2 = '**number too large'; type posint = 0..323; var ch : char; y : real; posn, a,i,e : integer; fatal, s,ss : boolean; { signs } procedure Getc(var ch: char); begin posn := posn + 1; ch := f[posn]; end; function TEN(e: posint): real; { = 10**e, 0 lim1 then begin writeln(emsg2); {HALT} fatal := true; goto 9; end; { 0 < a < 2**49 } If a >= t48 then y := ((a+1) DIV 2) * 2.0 Else y := a; If s then y := -y; If e < 0 then RDR := y/TEN(-e) Else If e<>0 then RDR := y*TEN(e) Else RDR := y; 9: If fatal then RDR := 0.0; End{of RDR}; (*------------------------------------------*) Procedure STR( var S: Dstring; tval: integer ); { ENTER WITH: tval = INTEGER to be converted to an alphanumeric string. RETURNS: An alphanumeric equal of tval in S. } const size = 15; { number of digits in the number } var cix : char; digits : packed array[1..10] of char; i, { length of number } d,t,j: integer; begin digits := '0123456789'; t := ABS(tval); setlength(S,0); { null string } i := 0; repeat { generate digits } i := i + 1; d := t MOD 10; append(S,digits[d+1]); t := t DIV 10 until (t=0) OR (i>=size); If (tval<0) AND (i