Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Help me nail the final post to the fence of this algorithm

  1. Nov 24, 2015 #1
    I'm writing a class to format console output and the trickiest method in this class so far is the one for printing a table. I'm having it act like an HTML table in how text fits

    Code (Text):

            public static void PrintTable ( string[][] cells )
            {
                // Outputs content in cells matrix like

                // =========================================
                //  cells[0][0]   | cells[0][1]
                // -----------------------------------------
                //  cells[1][0]   | cells[1][1]
                // -----------------------------------------
                //  cells[2][0]   | cells[2][1]
                //                .
                //                .
                // -----------------------------------------
                //  cells[n-1][0] | cells[n-1][1]
                //  ========================================

                // Each cell must be able to hold at least 1 character inside
                // 1 space of padding on the left and right

                int linelen = OutputFormatter.OutputMaxLength; // copy of width (in characters) of lines being formatted
                // Calculate widths of columns 1 and 2 (excluding the single space of padding on the
                // left and right side of each):
                int w1 = Math.Min(cells.Max(c => c[0].Length), linelen - 6);
                int w2 = linelen - w1 - 5;
                OutputFormatter.PrintChars('-'); // prints a line of equals signs for the top border of the table
               
                // print out rows:
                foreach ( string[] row in cells )
                {
                    // Make the strings corresponding to the first and second column have equal
                    // length by adding whitespace to the end of the shorter one:
                    String padding = new String(' ', Math.Abs(row[0].Length - row[1].Length));
                    if ( row[0].Length > row[1].Length ) row[1] += padding;
                    else row[0] += padding;

                    // Print out content of row
                    int i = 0, j = 0, n = row[0].Length - Math.Max(w1,w2);
                    for ( ; i < n && j < n; i += w1, j += w2 )
                    {
                        Console.WriteLine(" {0} | {1} ",
                                           row[0].Substring(i,w1),
                                           row[1].Substring(j,w2));
                    }
                    Console.WriteLine(" {0} | {1} ",
                                       row[0].Substring(i,row[0].Length - i),
                                       row[1].Substring(j,row[1].Length - j));                


                    OutputFormatter.PrintChars('-'); // prints a line of dashes to separate rows
                }

            }
     

    It's almost correct except for the fence post

    Code (Text):

                    Console.WriteLine(" {0} | {1} ",
                                       row[0].Substring(i,row[0].Length - i),
                                       row[1].Substring(j,row[1].Length - j));    
     
    For example, when I test it with the string

    Code (Text):

            private static readonly string[][] _instructs = new string[][] {
                                                                             new string[] {"CompareLastTwo","Shows difference between friends lists of last two Facebook data files in repository"},
                                                                             new string[] {"AddFriendList <DataFolderPath>", "blah blah blah"}
                                                                           };
     
    here's what it ends up looking like:

    IbJKBvR.png

    Where's the flaw that is causing that? I'm trying to make this as compact, elegant, efficient and readable as possible, but it's proving difficult.
     

    Attached Files:

  2. jcsd
  3. Nov 24, 2015 #2
    The width of row[0].Substring(i,w1) is w1.
    The width of row[0].Substring(i,row[0].Length - i) can be less than w1.
     
  4. Nov 25, 2015 #3

    Svein

    User Avatar
    Science Advisor

    When I did something similar way back when, I ended up by creating a string of length 80 (the width of the console), filling it with spaces, inserting the substrings (sprintf()) and at the end inserting the "fence post" at the correct place. Then printing the complete string.
     
  5. Nov 25, 2015 #4
    Do you realize that the row(0) string needs more padding? In needs to be padded out to a length that is a multiple of w1.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Help me nail the final post to the fence of this algorithm
  1. Help with algorithm (Replies: 2)

Loading...