Stem-and-leaf plot: Difference between revisions

Content added Content deleted
(→‎{{header|ALGOL 68}}: tweak anf bugfix)
(→‎{{header|ALGOL 68}}: replace as to not depend on some random guy's utility library. if the code is needed for the solution, it should be explicitly in it. This solution avoids sorting altogether.)
Line 224: Line 224:
=={{header|ALGOL 68}}==
=={{header|ALGOL 68}}==
{{works with|ALGOL 68G|Any - tested with release 2.8.3.win32}}
{{works with|ALGOL 68G|Any - tested with release 2.8.3.win32}}
{{libheader|ALGOL 68-rows}}
<syntaxhighlight lang="algol68">
<syntaxhighlight lang="algol68">
BEGIN # produce a stem and leaf plot of some numbers, leaf = last digit, #
PROC stem and leaf plot = ([]INT data)VOID:
BEGIN
# stem = leading digits #
# get lower and higher stem value #
PR read "rows.incl.a68" PR # include row (array) utilities #
INT min stem := data[LWB data] % 10,
[]INT data = ( 12, 127, 28, 42, 39, 113, 42, 18, 44, 118, 44
max stem := data[LWB data] % 10;
, 37, 113, 124, 37, 48, 127, 36, 29, 31, 125, 139
FOR i FROM LWB data + 1 TO UPB data DO
, 131, 115, 105, 132, 104, 123, 35, 113, 122, 42, 117
INT stem := data[i] % 10;
, 119, 58, 109, 23, 105, 63, 27, 44, 105, 99, 41
IF min stem > stem THEN min stem := stem FI;
, 128, 121, 116, 125, 32, 61, 37, 127, 29, 113, 121
IF max stem < stem THEN max stem := stem FI
, 58, 114, 126, 53, 114, 96, 25, 109, 7, 31, 141
OD;
, 46, 13, 27, 43, 117, 116, 27, 7, 68, 40, 31
# this array will store the amount of leaves per stem: #
, 115, 124, 42, 128, 52, 71, 118, 117, 38, 27, 106
[min stem : max stem, 0:9]INT stems;
, 33, 117, 116, 111, 40, 119, 47, 105, 57, 122, 109
FOR i FROM LWB stems TO UPB stems DO
, 124, 115, 43, 120, 43, 27, 27, 18, 28, 48, 125
, 107, 114, 34, 133, 45, 120, 30, 127, 31, 116, 146
stems[i,] := []INT((0,0,0,0,0,0,0,0,0,0))[@0]
);
OD;
# fill the array #
# generates a stem-and-leaf plot of d, the stems and leaves are derived #
FOR i FROM LWB data TO UPB data DO
# from the elements by stem and leaf. the plot starts at first stem. #
stems[data[i] % 10, data[i] %* 10] +:= 1
# the data is assumed to be sorted into stem then leaf order #
OD;
PROC stem and leaf plot = ( []INT d, INT first stem, PROC(INT)INT stem, leaf )VOID:
# print the histogram #
IF UPB d < LWB d THEN
FOR i FROM LWB stems TO UPB stems DO
print( ( "No data", newline ) )
ELSE
print((whole(i, -4), "| "));
FOR j FROM 0 TO 9 DO
# there is some data to plot #
INT curr stem := stem( d[ LWB d ] );
print(REPR (j + ABS "0") * stems[i,j])
OD;
IF first stem < curr stem THEN
print(newline)
curr stem := first stem
FI;
OD
END;
curr stem -:= 1;
BOOL first := TRUE;
FOR i FROM LWB d TO UPB d DO
INT this stem = stem( d[ i ] );
IF first OR curr stem /= this stem THEN
curr stem +:= 1;
WHILE IF NOT first THEN
print( ( newline ) )
ELSE
first := FALSE
FI;
print( ( whole( curr stem, -4 ), "|" ) );
curr stem < this stem
DO
curr stem +:= 1
OD
FI;
print( ( " ", whole( leaf( d[ i ] ), 0 ) ) )
OD
FI # stem and leaf plot # ;


[]INT data = (12, 127, 28, 42, 39, 113, 42, 18, 44, 118, 44,
# sort the data #
37, 113, 124, 37, 48, 127, 36, 29, 31, 125,
[ LWB data : UPB data ]INT sorted data := data;
139, 131, 115, 105, 132, 104, 123, 35, 113,
QUICKSORT sorted data FROMELEMENT LWB sorted data TOELEMENT UPB sorted data;
# plot the data: stem = element / 10, leaf = element MOD 10 #
122, 42, 117, 119, 58, 109, 23, 105, 63, 27,
stem and leaf plot( sorted data, 0, ( INT n )INT: n OVER 10, ( INT n )INT: n MOD 10 )
44, 105, 99, 41, 128, 121, 116, 125, 32, 61,
37, 127, 29, 113, 121, 58, 114, 126, 53, 114,
96, 25, 109, 7, 31, 141, 46, 13, 27, 43, 117,
116, 27, 7, 68, 40, 31, 115, 124, 42, 128, 52,
71, 118, 117, 38, 27, 106, 33, 117, 116, 111,
40, 119, 47, 105, 57, 122, 109, 124, 115, 43,
120, 43, 27, 27, 18, 28, 48, 125, 107, 114, 34,
133, 45, 120, 30, 127, 31, 116, 146);


stem and leaf plot(data)
END
</syntaxhighlight>
</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
0| 7 7
0| 77
1| 2 3 8 8
1| 2388
2| 3 5 7 7 7 7 7 7 8 8 9 9
2| 357777778899
3| 011112345677789
3| 0 1 1 1 1 2 3 4 5 6 7 7 7 8 9
4| 001222233344456788
4| 0 0 1 2 2 2 2 3 3 3 4 4 4 5 6 7 8 8
5| 2 3 7 8 8
5| 23788
6| 1 3 8
6| 138
7| 1
7| 1
8|
8|
9| 6 9
9| 69
10| 4 5 5 5 5 6 7 9 9 9
10| 4555567999
11| 13333444555666677778899
11| 1 3 3 3 3 4 4 4 5 5 5 6 6 6 6 7 7 7 7 8 8 9 9
12| 00112234445556777788
12| 0 0 1 1 2 2 3 4 4 4 5 5 5 6 7 7 7 7 8 8
13| 1 2 3 9
13| 1239
14| 1 6
14| 16
</pre>
</pre>