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
AI Thread Summary
The discussion revolves around the challenges of implementing a method for printing a formatted table in the console, mimicking HTML table behavior. The method, PrintTable, aims to align text within cells while maintaining proper padding and structure. Key points include the calculation of column widths based on the maximum length of cell content and the need for consistent padding to ensure that each row aligns correctly. A specific issue identified is related to the "fence post" problem, where the last printed line may not match the expected width due to varying lengths of content in the cells. The solution involves ensuring that the strings are padded to a length that is a multiple of the calculated column width. The discussion highlights the importance of compactness, elegance, efficiency, and readability in the code while addressing these formatting challenges.
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: 425
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.
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...
Back
Top