Number to word converter (1 to 99 inclusive) Program

It takes a numerical input in range [1, 99] and outputs its word equivalent.

Concerns


Procedural approach
General code style


Code

#include &lt;iostream&gt;

void print1to20(int num)
    {
           switch(num)
           {
           case 1: std::cout &lt;&lt; "one"; break;
           case 2: std::cout &lt;&lt; "two"; break;
           case 3: std::cout &lt;&lt; "three"; break;
           case 4: std::cout &lt;&lt; "four"; break;
           case 5: std::cout &lt;&lt; "five"; break;
           case 6: std::cout &lt;&lt; "six"; break;
           case 7: std::cout &lt;&lt; "seven"; break;
           case 8: std::cout &lt;&lt; "eight"; break;
           case 9: std::cout &lt;&lt; "nine"; break;
           case 10: std::cout &lt;&lt; "ten"; break;
           case 11: std::cout &lt;&lt; "eleven"; break;
           case 12: std::cout &lt;&lt; "twelve"; break;
           case 13: std::cout &lt;&lt; "thirteen"; break;
           case 14: std::cout &lt;&lt; "fourteen"; break;
           case 15: std::cout &lt;&lt; "fifteen"; break;
           case 16: std::cout &lt;&lt; "sixteen"; break;
           case 17: std::cout &lt;&lt; "seventeen"; break;
           case 18: std::cout &lt;&lt; "eighteen"; break;
           case 19: std::cout &lt;&lt; "nineteen"; break;
           case 20: std::cout &lt;&lt; "twenty"; break;
           default: std::cout &lt;&lt; "1 to 20 switch error";
           }
    }

void printTens(int num)
    {
           switch(num)
           {
           case 20: std::cout &lt;&lt; "twenty"; break;
           case 30: std::cout &lt;&lt; "thirty"; break;
           case 40: std::cout &lt;&lt; "fourty"; break;
           case 50: std::cout &lt;&lt; "fifty"; break;
           case 60: std::cout &lt;&lt; "sixty"; break;
           case 70: std::cout &lt;&lt; "seventy"; break;
           case 80: std::cout &lt;&lt; "eighty"; break;
           case 90: std::cout &lt;&lt; "ninety"; break;
           default: std::cout &lt;&lt; "tens switch error";
           }
    }

int main()
{
    int num;
    do
    {
    std::cout &lt;&lt; "Insert a number 1-99: ";
    std::cin &gt;&gt; num;
    } while(num &lt; 1 || num &gt; 99);

    int num_a, num_b; // num = (a)(b);
    num_a = num - num%10; 
    num_b = num%10;

    std::cout &lt;&lt; "Your number is ";

    if(num &lt;= 20)
        print1to20(num);
    else
    {
        printTens(num_a);
        std::cout &lt;&lt; ' ';
        print1to20(num_b);
    }

    return 0;
}
The code is broken. If a number is greater than 20 and ends with 0, print1to20(num_b) will not do what it should. 
Don't mix the logic with the output. I'd change the return type of your functions to std::string. It'll make the code more testable and reusable.
Don't just print something to std::cout in a case of an error. Throw an exception instead. 
Declare each variable as late as possible:

int num_a, num_b; // num = (a)(b);
num_a = num - num%10; 
num_b = num%10;


should be

int num_a = ...;
int num_b = ...;

Use more descriptive names. I have no clue what num_a mean. What is a? Something like first_digit and second_digit would be better (well the first one is not exactly a digit, so you can come with even better names).
There's no need to return 0 from the main function explicitly (sure, you can if you want to). 
Write proper automated tests for your code to reduce the number of bugs (your bug is very likely to get caught by tests). In fact, you can check all possible valid inputs. There're only 100 of them.
There's nothing wrong in having stand-alone functions. There's no entity here, so I don't see the point of modeling this problem in terms of objects. A function from an int to its string representation is just a function.