I am self studying C++ from [Robert Lafore's OOP in C++](http://www.amazon.com/Object-Oriented-Programming-C-4th-Edition/dp/0672323087). I am solving the first exercise questions of chapter-3 loop and decisions. I've written three different codes using different approaches. I want to get feedback over my codes like a teacher is supposed to give feedback to his student. I want to get feedback over each code individually and then want to know which solution is overall better or more efficient.

The exercise is:

>Assume that you want to generate a table of multiples of any given number. Write a program that allows the user to enter the number and then generates the table, formatting it
into 10 columns and 20 lines. Interaction with the program should look like this (only the
first three lines are shown):

        Enter a number: 7
        7     14     21     28     35     42     49     56     63     70
       77     84     91     98    105    112    119    126    133    140
      147    154    161    168    175    182    189    196    203    210


**Using a `for` loop inside `while` loop:** 
I've written solution for user-defined number of columns and rows. The most obvious solution was to keep track of current position in the table. The number at a particular position should `original_num * pos`. And after every maxcol<sup>th</sup> position print a newline.

    #include<iostream>
    #include<iomanip>    // For setw()
    #include<conio.h>    // For getch()
    using namespace std;
    int main()
    {
    	int number;
    	cout << "Enter the number whose table you want: ";
    	cin >> number;
    	int maxrows; int maxcols;
    	cout << "\nEnter the number of rows you want: "; cin >> maxrows;
    	cout << "\nEnter the number of columns : "; 
    	cin >> maxcols;
    	int pos=1; //starting position
    	
    	while( pos<=maxrows*maxcols )
    	{
    		for(int col=1; col<=maxcols; col++, pos++)
    		{
    			cout<< setw(6) << pos*number << "  ";
    		}
    		cout<<"\n";
    	}
    	getch();
    }  
     
The inner `for` loop finishes after maxcol number of repeatitions. The outer while loop puts a newline and repeats again.

**Using a single `for` loop with an `if` statement inside:** Another idea was to force myself to use only one loop because, in principle, the second loop should be redundant as we need to increment only `pos` to find the value at that position. There must be some way to tell the computer to print a newline after every maxcol number of executions -- this is acheived by the `if` statement. 

    #include<iostream>
    #include<iomanip>
    #include<conio.h>
    using namespace std;
    int main()
    {
    	int number;
    	cout << "Enter the number whose table you want: ";
    	cin >> number;
    	int maxrows; int maxcols;
    	cout << "\nEnter the number of rows you want: "; cin >> maxrows;
    	cout << "\nEnter the number of columns : "; cin >> maxcols;
    	int row; int col; //Current row and current col
    	
    	for(int pos=1; pos<=(maxrows*maxcols); pos++)
    	{
    		cout << setw(6) <<number*pos << "  ";
    		if((pos%maxcols)==0)
    		{
    		  cout << "\n";	
    		}
    		
    	}
    	getch();	
    }



The problem is the `if` statement doesn't get executed most of the times. For 10 maxcols `if` gets executed only 10% times. It mostly wastes cpu time. In the previous version every statement does some important function every single time it is executed. 

**Keep track of current row and column:** The idea was to locate the current position by knowing the current row and column of that position. It is quite similar to the first solution but there is an important advantage that I'll mention after the code.

    #include<iostream>
    #include<iomanip>
    #include<conio.h>
    using namespace std;
    int main()
    {
    	int number;
    	cout << "Enter the number whose table you want: ";
    	cin >> number;
    	int maxrows; int maxcols;
    	cout << "\nEnter the number of rows you want: "; cin >> maxrows;
    	cout << "\n Enter the number of columns : "; cin >> maxcols;
    	
    	for(int row=0; row<=(maxrows-1); row++)
    	{
    		for(int col=1; col<=maxcols; col++)
    		{
    			cout << setw(6) << number*(col + row*maxcols); // (col + row*maxcols) represent the current position
    		}
    		cout << "\n";
    	}
    	getch();
    }

Variable `row` is not the current row but number of rows above the current row. `row*maxcols` is the position of first number of current row. `col` is simply the current column. The beauty of this approach is that the way current position is determined allows us to print the multiplication table in vertically increasing manner too. As per the exercise the numbers 7, 14, 21 ... are printed horizontally -- what if I wanted to print them vertically and jump to next column after a particular number of rows? The way console window is designed we can't print above the current printed line -- we can't go on printing 7, newline , 14, newline..., then jump to next column and print at the initial top row. Here is the solution:

    #include<iostream>
    #include<iomanip>    // For setw()
    #include<conio.h>    // For getch()
    using namespace std;
    int main()
    {
    	int number;
    	cout << "Enter the number whose table you want: ";
    	cin >> number;
    	int maxrows; int maxcols;
    	cout << "\nEnter the number of rows you want: "; cin >> maxrows;
    	cout << "\n Enter the number of columns : "; 
    	cin >> maxcols;
    	
    	
    	
    	for(int row=1; row<=maxrows; row++ )
    	{		
    		cout << "\n";
    		for(int col=0; col<maxcols; col++)
    		{
    			cout << setw(6)<< number*(row + maxrows*col) << "  ";
    		}	
    		
    		
    	}
    	getch();	
    }

`row` is the current row now and `col` is the number of columns to the left of current position. `(row + maxrows*col)` represent the current position.

-----------------------------------


**Question:**
 - Please study every code individually and tell if the idea used could be implemented better. Could the number of variables used deceased further? Could the algorithm be improved further? Could the code be more efficient/optimised further?  

 - In the second version I removed one loop and instead used an `if` statement? Which is better? Use two loops or one loop plus an if statement?  

 - Overall which version is more professional/good/efficient? Which one would be faster at run time?  

 - I am new to programming and this is the first which I've started reading seriously. Is the way I am solving exercises ok for a starter? I'm not asking for opinion based answer. Just a suggestion. This last point should be considered as a kinda P.S. Please don't close the question rather skip this P.S.

Thank you.