RosettaCodeData/Task/Loops-Wrong-ranges/ALGOL-W/loops-wrong-ranges.alg
2023-07-01 13:44:08 -04:00

41 lines
1.9 KiB
Text

begin
% sets the first n elements of s to the sequences of values specified by start, stop and increment %
% s( 0 ) is set to the number of elements of s that have been set, in case the sequence ends before n %
procedure sequence ( integer array s ( * )
; integer value n, start, stop, increment
) ;
begin
integer sPos;
for j := 0 until n do s( j ) := 0;
sPos := 1;
for j := start step increment until stop do begin
if sPos > n then goto done;
s( sPos ) := j;
s( 0 ) := s( 0 ) + 1;
sPos := sPos + 1;
end for_j ;
done:
end sequence ;
% tests the sequence procedure %
procedure testSequence( integer value start, stop, increment
; string(48) value legend
) ;
begin
integer array s ( 0 :: 10 );
sequence( s, 10, start, stop, increment );
s_w := 0; % set output formating %
i_w := 4;
write( legend, ": " );
for i := 1 until s( 0 ) do writeon( s( i ) )
end testSequence ;
% task trest cases %
testSequence( -2, 2, 1, "Normal" );
testSequence( -2, 2, 0, "Zero increment" );
testSequence( -2, 2, -1, "Increments away from stop value" );
testSequence( -2, 2, 10, "First increment is beyond stop value" );
testSequence( 2, -2, 1, "Start more than stop: positive increment" );
testSequence( 2, 2, 1, "Start equal stop: positive increment" );
testSequence( 2, 2, -1, "Start equal stop: negative increment" );
testSequence( 2, 2, 0, "Start equal stop: zero increment" );
testSequence( 0, 0, 0, "Start equal stop equal zero: zero increment" )
end.