48 lines
2.3 KiB
Text
48 lines
2.3 KiB
Text
begin
|
|
% record structure that will be used to return the middle 3 digits of a number %
|
|
% if the middle three digits can't be determined, isOk will be false and message %
|
|
% will contain an error message %
|
|
% if the middle 3 digts can be determined, middle3 will contain the middle 3 %
|
|
% digits and isOk will be true %
|
|
record MiddleThreeDigits ( integer middle3; logical isOk; string(80) message );
|
|
|
|
% finds the middle3 digits of a number or describes why they can't be found %
|
|
reference(MiddleThreeDigits) procedure findMiddleThreeDigits ( integer value number ) ;
|
|
begin
|
|
integer n, digitCount, d;
|
|
|
|
n := abs( number );
|
|
% count the number of digits the number has %
|
|
digitCount := if n = 0 then 1 else 0;
|
|
d := n;
|
|
while d > 0 do begin
|
|
digitCount := digitCount + 1;
|
|
d := d div 10
|
|
end while_d_gt_0 ;
|
|
if digitCount < 3 then MiddleThreeDigits( 0, false, "Number must have at least 3 digits" )
|
|
else if not odd( digitCount ) then MiddleThreeDigits( 0, false, "Number must have an odd number of digits" )
|
|
else begin
|
|
% can find the middle three digits %
|
|
integer m3;
|
|
m3 := n;
|
|
for d := 1 until ( digitCount - 3 ) div 2 do m3 := m3 div 10;
|
|
MiddleThreeDigits( m3 rem 1000, true, "" )
|
|
end
|
|
end findMiddleThreeDigits ;
|
|
|
|
% test the findMiddleThreeDigits procedure %
|
|
for n := 123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345, 1, 2, -1, -10, 2002, -2002, 0 do begin
|
|
reference(MiddleThreeDigits) m3;
|
|
i_w := 10; s_w := 0; % set output formating %
|
|
m3 := findMiddleThreeDigits( n );
|
|
write( n, ": " );
|
|
if not isOk(m3) then writeon( message(m3) )
|
|
else begin
|
|
% as we return the middle three digits as an integer, we must manually 0 pad %
|
|
if middle3(m3) < 100 then writeon( "0" );
|
|
if middle3(m3) < 10 then writeon( "0" );
|
|
writeon( i_w := 1, middle3(m3) )
|
|
end
|
|
end for_n
|
|
|
|
end.
|