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

  • Thread starter Thread starter SlurrerOfSpeech
  • Start date Start date
  • Tags Tags
    Algorithm Final
Click For Summary

Discussion Overview

The discussion revolves around a method for formatting console output in a class, specifically focusing on the implementation of a table-like structure. Participants are addressing issues related to the alignment and padding of strings within the table cells.

Discussion Character

  • Technical explanation
  • Debate/contested

Main Points Raised

  • One participant describes the method for printing a table and highlights a flaw related to the "fence post" issue in the output.
  • Another participant points out that the width of the substring for the last row may be less than the expected width (w1), which could cause alignment problems.
  • A different participant shares a past experience of creating a fixed-width string filled with spaces to manage alignment and suggests inserting substrings into it before printing.
  • One participant suggests that the first column string needs additional padding to ensure its length is a multiple of w1, which may help with alignment.

Areas of Agreement / Disagreement

Participants express differing views on how to resolve the alignment issue, with no consensus reached on the best approach to take.

Contextual Notes

There are unresolved considerations regarding the specific requirements for padding and alignment, as well as the implications of varying string lengths in the output formatting.

SlurrerOfSpeech
Messages
141
Reaction score
11
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:
        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:
                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:
        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.
 

Attachments

  • upload_2015-11-24_7-19-39.png
    upload_2015-11-24_7-19-39.png
    1.2 KB · Views: 450
Technology news on Phys.org
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.
 
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.
 
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.
 

Similar threads

  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K
Replies
2
Views
3K
  • · Replies 17 ·
Replies
17
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
Replies
5
Views
2K