首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >温度转换程序

温度转换程序
EN

Code Review用户
提问于 2012-04-18 19:51:53
回答 3查看 2.4K关注 0票数 1

我在访问多个函数中的变量时遇到了困难。例如,我需要在许多其他函数中使用用户输入,但是我的当前代码无法访问它。我确信我需要更改函数的参数,以便通过引用传递这些函数的值,但是我在这样做时遇到了困难。

下面是我的代码现在的样子:

代码语言:javascript
复制
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;

double fahrtocels();
double celstofahr();
double celstokelv();
double kelvtocels();


int main()
{
    do { int userinput=0;

    cout << " 1) Fahr to Cels" << endl;
    cout << " 2) Cels to Fahr" << endl;
    cout << " 3) Cels to Kelv" << endl;
    cout << " 4) Kelv to Cels" << endl;
cin >> userinput;
if(userinput=1)
fahrtocels();
if(userinput=2)
celstofahr();
if(userinput=3)
celstokelv();
if(userinput=4)
kelvtocels(); } while(userinput=0);

}

double fahrtocels()
{
    int input;
    int tempinput;
    double finaloutput;
    cout <<" Please Enter the Temp in Fahrenheit"<<endl;
    cin >> input;
userinput= 1;
    tempinput = input - 32;

finaloutput = tempinput/1.8;

    cout<<input<< " degrees fahrenheit is equivalent to  " << finaloutput<< "  celsius"<< endl;
    userinput = 0;
}

double celstofahr()
{
    int inputcels;
    int tempinputcels;
    double finaloutputcels;
    cout <<" Please Enter the Temp in Celsius"<<endl;
    cin >> inputcels;

    tempinputcels = inputcels * 1.8;

finaloutputcels = tempinputcels + 32;

    cout<<inputcels<< " degrees celsius is equivalent to  " << finaloutputcels<< "  fahrenheit"<< endl;
}

double celstokelv()
{
    int inputcelskelv;
    double finaloutputcelskelv;
    cout <<" Please Enter the Temp in Celsius for Kelvin Conversion"<<endl;
    cin >> inputcelskelv;

finaloutputcelskelv = inputcelskelv + 273.15;

    cout<<inputcelskelv<< " degrees celsius is equivalent to  " << finaloutputcelskelv<< " kelvin"<< endl;
}

double kelvtocels()
{
    int inputkelvcels;
    double finaloutputkelvcels;

    cout <<" Please Enter the Temp in Kelvin for Celsius conversion"<<endl;
    cin >> inputkelvcels;

finaloutputkelvcels = inputkelvcels - 273.15;

    cout<<inputkelvcels<< " degrees kelvin is equivalent to  " << finaloutputkelvcels<< " celsius"<< endl;
}
EN

回答 3

Code Review用户

发布于 2012-04-19 04:18:07

首先,代码在技术上是不讨论主题的,因为它有一个非常明显的错误(在main中):

代码语言:javascript
复制
} while(userinput=0);

这几乎可以肯定是userinput==0。实际上,它是一个赋值,它产生0,它被视为false,因此循环只执行一次,而不管用户的输入如何。

虽然我同意@Konrad所提倡的基本方法,将转换所需的数据表组合在一起,但我认为实现它的方式略有不同。我不会使用std::pair。我将显式地定义一个结构,以便这些值具有有意义的名称:

代码语言:javascript
复制
struct conversion {
    double offset;
    double coefficient;
};

那么,您的转换将类似于:

代码语言:javascript
复制
double convert(conversion_type conversion, double input) { 
   conversion c = conversions[conversion];
   return (input+c.offset)*c.coefficient;
}

至少在我看来,...which似乎更易读懂。如果您确实希望为每个转换维护单独的函数,我仍然会将其分解为一个函数进行输入。另一个执行转换本身,第三个用于显示结果。我仍然使用指向函数的指针的矢量(或数组),使用用户输入的数字来索引它(当然,在确保它在范围内之后),我仍然将它作为表驱动器。

票数 3
EN

Code Review用户

发布于 2012-04-18 20:52:26

您的问题与智能指针完全无关。

这里的关键词是关注点的分离。您有一个函数(嗯,其中有几个),它尝试做所有事情:创建提示符、控制用户输入、转换值和输出结果。

这很糟糕。你应该严格地把这些问题分开。

程序的核心是一个带有原型的转换函数。

代码语言:javascript
复制
double convert(double input);

当然,对于每个单元到单元的转换,您有几个- one(这可以通过首先转换为公共单元来实现不同的操作,但是现在我们将省略这一点)。

然后需要输入和输出例程,如下所示:

代码语言:javascript
复制
double read_number(std::string const& unit) {
    std::cout << "Please enter the temperature in " << unit << std::flush;
    double value;
    std::cin >> value;
    return value;
}

代码语言:javascript
复制
void print_result(std::string const& from_unit, std::string const& to_unit, double from, double to) {
    std::cout << from << " " << from_unit << " is equivalent to "
              << to << " " << to_unit << "\n";
}

然后转换为简单的一行程序,例如:

代码语言:javascript
复制
double celsius_to_kelvin(double value) {
    return value + 273.15;
}

(此外,请注意,虽然是“摄氏度”,但它只是“开尔文”,而不是“开尔文度”。)

您甚至可以对所有转换使用相同的函数,只需存储缩放因子和偏移量。例如:

代码语言:javascript
复制
typedef std::pair<double, double> coefficients_t;

std::vector<coefficients_t> conversions = {
    { 273.15, 1 }, // °C => K
    { -32, 0.5556 }, // °F => °C
    …
};

enum conversion_type {
    CtoK,
    FtoC,
    …
};

double convert(conversion_type conversion, double input) {
    coefficients_t coef = conversions[conversion];
    return (input + coeffs.first) * coeffs.second;
}

(这个语法需要C++11,C++03更详细。)

票数 2
EN

Code Review用户

发布于 2012-04-19 12:40:08

代码语言:javascript
复制
if(userinput==1)
...
if(userinput=2)
...

考虑在这种情况下使用switchelse if结构

代码语言:javascript
复制
if     (userinput==1)
...
else if(userinput==2)
...

也要考虑玩这个把戏

代码语言:javascript
复制
double(*)(void) fp[] = {fahrtocels, celstofahr, celstokelv, kelvtocels}
fp[userinput]() // calling function depends on the input number
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/10993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档