Exercise 2-2
Change the framing program (Exercise 2-0) so that it uses a different amount of space to separate the sides from the greeting than it uses to separate the top and bottom borders from the greeting.
Solution
The original framing program in Exercise 2-0 “hard-codes” the const int pad which forces both vertical and horizontal paddings to be identical. The question asks for a capability to assign the vertical padding and horizontal padding separately.
To do this I am going to adjust the original framing program taking into account of the followings:
- Ask the user to provide the vertical padding, and store it as an int variable inPadY.
- Ask the user to provide the horizontal padding, and store it as an int variable inPadX.
- Assign the int variable inPadY to a constant integer padY.
- Assign the int variable inPadX to a constant integer padX.
- Replace all the (old) pad references associating with rows with padY (e.g. the constant rows and invariant r). Because the number of rows depends on vertical padding.
- Replace all the (old) pad references associating with columns with padX (e.g. the constant cols and invariant c). Because the number of columns depends on horizontal padding.
The modified program looks like this:
#include <iostream> #include <string> // say what standard-library names we use using std::cin; using std::endl; using std::cout; using std::string; int main() { // ask for the person's name cout << "Please enter your first name: "; // read the name string name; cin >> name; // ask user to provide the vertical padding cout << "Please provide integer padY (vertical padding): "; int inPadY; cin >> inPadY; // ask user to provide the horizontal padding cout << "Please provide integer padX (horizontal padding): "; int inPadX; cin >> inPadX; // build the message that we intend to write const string greeting = "Hello, " + name + "!"; // build the constant padding parameters const int padY = inPadY; // vertical padding const int padX = inPadX; // horizontal padding // the number of rows to write const int rows = ( padY * 2 ) + 3; // the number of columns to write const string::size_type cols = greeting.size() + ( padX * 2 ) + 2; // write a blank line to separate the output from the input cout << endl; // write 'rows' rows of output // invariant: we have written r rows so far for ( int r = 0; r != rows ; ++r ) { string::size_type c = 0; // invariant: we have written c characters so far in the current row while ( c != cols) { // is it time to write the greeting? if ( ( r == padY+ 1 ) && ( c == padX + 1 ) ) { cout << greeting; c += greeting.size(); } else { // are we on the border? if ( ( r == 0 ) // top row || ( r == rows - 1 ) // or bottom row || ( c == 0 ) // or left-most column || ( c == cols - 1 ) // or right-most column ) { cout << "*"; } else { cout << " "; } ++c; } } cout << endl; } return 0; }
Result
Case 1: padY = 1; padX = 10
Please enter your first name: Johnny Please provide integer padY (vertical padding): 1 Please provide integer padX (horizontal padding): 10 ************************************ * * * Hello, Johnny! * * * ************************************
Case 2: padY = 5; pad X = 5
Please enter your first name: Johnny Please provide integer padY (vertical padding): 1 Please provide integer padX (horizontal padding): 10 ************************************ * * * Hello, Johnny! * * * ************************************
Case 3: padY = 10 padX = 1
Please enter your first name: Johnny Please provide integer padY (vertical padding): 5 Please provide integer padX (horizontal padding): 5 ************************** * * * * * * * * * * * Hello, Johnny! * * * * * * * * * * * **************************
So far, so good!