Temperature Converter This is an implementation of a practice problem from cprogramming.com:  Temperature Converter Challenge

The problem:


  In this challenge, write a program that takes in three arguments, a start temperature (in Celsius), an end temperature (in Celsius) and a step size. Print out a table that goes from the start temperature to the end temperature, in steps of the step size; you do not actually need to print the final end temperature if the step size does not exactly match. You should perform input validation: do not accept start temperatures less than a lower limit (which your code should specify as a constant) or higher than an upper limit (which your code should also specify). You should not allow a step size greater than the difference in temperatures. (This exercise was based on a problem from C Programming Language). 


The code:

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;iomanip&gt;

using namespace std;

const double LowestLimit = 0;
const double HighestLimit = 50000;
const string LowerLimitMessage = "Please enter a lower limit, limit &gt;= 0: ";

struct UserInputs
{
public:
    double LowerLimit = -1;
    double UpperLimit = -1;
    double StepAmount = -1;
};

stringstream GetSingleInput(const string message)
{
    stringstream returnStream;
    string input;
    cout &lt;&lt; message;
    cin &gt;&gt; input;
    returnStream &lt;&lt; input;
    return returnStream;
}

UserInputs GetUserInputs()
{
    UserInputs parsedInputs;
    auto LowerLimitStream = GetSingleInput(LowerLimitMessage);

    while (!(LowerLimitStream &gt;&gt; parsedInputs.LowerLimit) || parsedInputs.LowerLimit &lt; LowestLimit)
    {
        cout &lt;&lt; "Invalid Lower Limit!\n";
        LowerLimitStream = GetSingleInput(LowerLimitMessage);;
    }

    stringstream UpperLimitMessage;
    UpperLimitMessage &lt;&lt; "Please enter an upper limit, limit &gt; "
        &lt;&lt; parsedInputs.LowerLimit
        &lt;&lt; ", limit &lt;= "
        &lt;&lt; HighestLimit
        &lt;&lt; ": ";

    auto UpperLimitStream = GetSingleInput(UpperLimitMessage.str());

    while (!(UpperLimitStream &gt;&gt; parsedInputs.UpperLimit)
        || parsedInputs.UpperLimit &gt; HighestLimit
        || parsedInputs.UpperLimit &lt;= parsedInputs.LowerLimit)
    {
        cout &lt;&lt; "Invalid Upper Limit!\n";
        UpperLimitStream = GetSingleInput(UpperLimitMessage.str());
    }

    stringstream stepMessage;
    stepMessage &lt;&lt; "Please enter a step amount , step &gt; "
        &lt;&lt; LowestLimit
        &lt;&lt; ", step &lt;= "
        &lt;&lt; (parsedInputs.UpperLimit - parsedInputs.LowerLimit)
        &lt;&lt; ": ";


    auto stepStream = GetSingleInput(stepMessage.str());
    while (!(stepStream &gt;&gt; parsedInputs.StepAmount)
        || parsedInputs.StepAmount &lt;= 0
        || parsedInputs.StepAmount &gt; parsedInputs.UpperLimit - parsedInputs.LowerLimit)
    {
        cout &lt;&lt; "Invalid Step Amount!\n";
        stepStream = GetSingleInput(stepMessage.str());
    }

    return parsedInputs;
}

double CelsiusToFarenheit(const double celsius)
{
    return celsius * 33.8;
}

int main()
{
    auto inputs = GetUserInputs();

    cout &lt;&lt; "Celsius" &lt;&lt; "\t\t\t" &lt;&lt; "Farenheit" &lt;&lt; "\n";
    cout &lt;&lt; "----------" &lt;&lt; "\t\t" &lt;&lt; "----------" &lt;&lt; "\n";
    cout.precision(9);
    while (inputs.LowerLimit &lt;= inputs.UpperLimit)
    {
        cout &lt;&lt; fixed &lt;&lt; inputs.LowerLimit &lt;&lt; "\t\t" &lt;&lt; CelsiusToFarenheit(inputs.LowerLimit) &lt;&lt; "\n";
        inputs.LowerLimit += inputs.StepAmount;
    }

    return 0;
}


I'm a C# developer who has been self learning C++. As a result I am likely making simple mistakes on structural design which don't feel odd in C#.

Any commentary would be appreciated, especially as to whether or not my method of checking the input is inefficient.
Your conversion from celcius is not correct, since 0°F is not 0°C. Something like \$F = \frac{9}{5} C + 32\$ should work for the conversion.