home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol021
/
rdr.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1984-04-29
|
6KB
|
281 lines
(*
** 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<e<322 }
var i: integer;
t: real;
begin
i := 0;
t := 1.0;
repeat
If ODD(e) then
case i of
0: t := t * 1.0E1;
1: t := t * 1.0E2;
2: t := t * 1.0E4;
3: t := t * 1.0E8;
4: t := t * 1.0E16;
5: t := t * 1.0E32 { that's all! }
6,7,8:
begin
writeln('**Floating point overflow');
fatal := true;
e := 2;{ sets e to zero on next division }
end;
{*===================*
--- can not use ---
6: t := t * 1.0E64;
7: t := t * 1.0E128;
8: t := t * 1.0E256
*===================*}
end{ case };
e := e DIV 2;
i := i + 1;
until e=0;
TEN := t;
end{of TEN};
begin
fatal := false;
posn := length(f);
setlength(f,posn+1);
f[posn+1] := space;
posn := 0;
getc(ch);
{ skip leading blanks }
While ch=space do getc(ch);
If ch='-' then
begin
s := true;
getc(ch)
end
Else
begin
s := false;
If ch='+' then getc(ch)
end;
If not(ch IN ['0'..'9']) then
begin
writeln(emsg1);
{HALT} fatal := true; goto 9;
end;
a := 0;
e := 0;
repeat
If a<limit then
a := 10 * a + VAL(ch)
Else
e := e+1;
getc(ch);
until not(ch IN ['0'..'9']);
If ch='.' then
begin { read fraction }
getc(ch);
while ch IN ['0'..'9'] do
begin
If a<limit then
begin
a := 10 * a + VAL(ch);
e := e - 1
end;
getc(ch);
end{ while };
end{ read fraction };
If (ch='E') or (CH='e') then
begin { read scale factor }
getc(ch);
i := 0;
If ch='-' then
begin ss := true; getc(ch) end
Else
begin
ss := false;
If ch='+' then getc(ch)
end;
If ch IN ['0'..'9'] then
begin
i := VAL(ch);
getc(ch);
while ch IN ['0'..'9'] do
begin
If i<limit then i := 10 * i + VAL(ch);
getc(ch)
end{ while}
end{ If }
Else
begin
writeln(emsg1);
{HALT} fatal := true; goto 9;
end;
If ss
then e := e - i
Else e := e + i;
end{ read scale factor };
If e < lim2 then
begin
a := 0;
e := 0;
end
Else
If e > 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<size) then
begin { sign }
i := i + 1;
append(S,'-')
end;
j := 1;
while j<i do
begin{ reverse }
cix := S[i]; S[i] := S[j]; S[j] := cix;
i := i - 1;
j := j + 1
end{ revese }
End{of STR};
begin
done := false;
repeat
writeln;
write('Enter a number (real or integer) ?');
readln(answer);
writeln('literal number is ..... ', answer);
writeln('with a length of ..... ', length(answer):4 );
zx := RDR(answer);
writeln('the numeric equal of your literal .. ', zx);
writeln('Formatted as ! Number:10:4 ! ....... ', zx:10:4);
write('Five times ', zx, ' = ');writeln( zx * 5 );
write('The integer portion is ............... ');writeln( trunc(zx) );
writeln;
write('Enter an integer ?');
readln(number);
STR(answer, number);
writeln('The integer number is .............. ', number);
writeln('Expressed as an alphanumeric is .... ', answer);
writeln('the length of the literal is ....... ', length(answer) );
append(answer,answer);
writeln('Since we now have a string');
writeln(' we can concatenate like so ........ ', answer);
Until done;
End{ of Alpha_Numeric }.