Exercise 4-2
Write a program to calculate the squares of int values up to 100. The program should write two columns: The first lists the value; the second contains the square of that value. Use setw to manage the output so that the values line up in columns.
Solution
To keep the code as simple as possible, for the sake of solving this particular problem, I will have some kind of hard-code values in the codes. Of course, the code can be made more intelligent later on and remove the need of hard-coding!
The setw(n) function returns a value of type streamsize that, when written on an output stream s, has the effect of calling s.width(n).
After doing some experiments in Code::Block I learn that, if (say) the integer width is smaller than n, the outputstream will simply align the numbers to the right, and pad the left side with leading empty spaces. Likewise for strings.
We are asked to output two columns.
Column 1 contains a list of integers defined by this symmetric range [0,100] – i.e. between 0 and 100 inclusively. We therefore require n = 3 for this, so we can fit in the max integer 100.
Column 2 contains a list of integers defined by this symmetric range [0, 10000] – i.e. between 0 and 10000 inclusively. We therefore require n = 6 for this, so we can fit in the max integer 10000 (which takes up a width of 5), plus 1 leading empty space to separate this column from column 1.
The program will look like this:
#include <iostream> #include <iomanip> using std::cout; using std::endl; using std::setw; int main() { for (int i = 0; i != 101; ++i) { cout << setw(3) << i << setw(6) << (i * i) << endl; } }
Result
0 0 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100 11 121 12 144 13 169 14 196 15 225 16 256 17 289 18 324 19 361 20 400 21 441 22 484 23 529 24 576 25 625 26 676 27 729 28 784 29 841 30 900 31 961 32 1024 33 1089 34 1156 35 1225 36 1296 37 1369 38 1444 39 1521 40 1600 41 1681 42 1764 43 1849 44 1936 45 2025 46 2116 47 2209 48 2304 49 2401 50 2500 51 2601 52 2704 53 2809 54 2916 55 3025 56 3136 57 3249 58 3364 59 3481 60 3600 61 3721 62 3844 63 3969 64 4096 65 4225 66 4356 67 4489 68 4624 69 4761 70 4900 71 5041 72 5184 73 5329 74 5476 75 5625 76 5776 77 5929 78 6084 79 6241 80 6400 81 6561 82 6724 83 6889 84 7056 85 7225 86 7396 87 7569 88 7744 89 7921 90 8100 91 8281 92 8464 93 8649 94 8836 95 9025 96 9216 97 9409 98 9604 99 9801 100 10000
I used vector and typedef just to improve my skills. This is what I got:
int main()
{
vector sq;
typedef vector<int>::size_type vc_sz;
vc_sz size = 100;
for (vc_sz i = 0; i != size; i++)
{
sq.push_back(i+1);
cout << setw(3) << sq[i] << setw(10) << sq[i] * sq[i] << endl;
}
return 0;
}