Task: Stem-and-leaf plot



C#: using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        const string data =
        "12 127 28 42 39 113 42 18 44 118 44 37 113 124 37 48 127 36 29 31 " +
        "125 139 131 115 105 132 104 123 35 113 122 42 117 119 58 109 23 " +
        "105 63 27 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";

        int[] ints = data.Split(' ').Select(int.Parse).ToArray();

        StemAndLeafPlot(ints);

        Console.ReadKey();
    }

    public static void StemAndLeafPlot(int[] arr)
    {
        int stemMax = arr.Max() / 10;
        int stemMin = arr.Min() / 10;
        Array.Sort(arr);

        for (int i = stemMin; i <= stemMax; i++)
        {
            Console.Write("{0,3} | ", i);
            foreach (var t in arr)
            {
                if (t < 10 * i)
                    continue;
                if (t >= 10 * (i + 1))
                    break;
                Console.Write("{0} ", t % 10);
            }
            Console.WriteLine("");
        }
    }
}








Fortran:       SUBROUTINE COMBSORT(A,N)
       INTEGER A(*)	
       INTEGER N	
       INTEGER H,T	
       LOGICAL CURSE
        H = N - 1		
    1   H = MAX(1,H*10/13)	
        IF (H.EQ.9 .OR. H.EQ.10) H = 11	
        CURSE = .FALSE.		
        DO I = N - H,1,-1	
          IF (A(I) .GT. A(I + H)) THEN	
            T=A(I); A(I)=A(I+H); A(I+H)=T	
            CURSE = .TRUE.			
          END IF			
        END DO			
        IF (CURSE .OR. H.GT.1) GO TO 1	
      END SUBROUTINE COMBSORT	

      SUBROUTINE TOPIARY(A,N)	
       INTEGER A(*)		
       INTEGER N		
       INTEGER CLIP		
       PARAMETER (CLIP = 10)	
       INTEGER I1,I2,STEM	
        CALL COMBSORT(A,N)	
        STEM = A(1)/CLIP	
        I1 = 1			
        I2 = I1			
   10   I2 = I2 + 1			
        IF (I2 .GT. N) GO TO 11		
        IF (A(I2)/CLIP .EQ.STEM) GO TO 10	
Cast forth a STEM line, corresponding to elements I1:I2 - 1.
   11   WRITE (6,12) STEM,ABS(MOD(A(I1:I2 - 1),CLIP))	
   12   FORMAT (I4,"|",(100I1))		
        IF (I2 .GT. N) RETURN		
        I1 = I2				
Chug along to the next STEM value.
   13   STEM = STEM + 1			
        IF (A(I2)/CLIP.GT.STEM) GO TO 11
        GO TO 10			
      END SUBROUTINE TOPIARY	

      PROGRAM TEST
      INTEGER VALUES(121)	
      DATA VALUES/		
     o  12,127, 28, 42, 39,113, 42, 18, 44,118,	
     1  44, 37,113,124, 37, 48,127, 36, 29, 31,	
     2 125,139,131,115,105,132,104,123, 35,113,
     3 122, 42,117,119, 58,109, 23,105, 63, 27,
     4  44,105, 99, 41,128,121,116,125, 32, 61,
     5  37,127, 29,113,121, 58,114,126, 53,114,
     6  96, 25,109,  7, 31,141, 46, 13, 27, 43,
     7 117,116, 27,  7, 68, 40, 31,115,124, 42,
     8 128, 52, 71,118,117, 38, 27,106, 33,117,
     9 116,111, 40,119, 47,105, 57,122,109,124,
     o 115, 43,120, 43, 27, 27, 18, 28, 48,125,
     1 107,114, 34,133, 45,120, 30,127, 31,116,
     2 146/
        CALL TOPIARY(VALUES,121)
      END