我在访问多个函数中的变量时遇到了困难。例如,我需要在许多其他函数中使用用户输入,但是我的当前代码无法访问它。我确信我需要更改函数的参数,以便通过引用传递这些函数的值,但是我在这样做时遇到了困难。
下面是我的代码现在的样子:
#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;
}发布于 2012-04-19 04:18:07
首先,代码在技术上是不讨论主题的,因为它有一个非常明显的错误(在main中):
} while(userinput=0);这几乎可以肯定是userinput==0。实际上,它是一个赋值,它产生0,它被视为false,因此循环只执行一次,而不管用户的输入如何。
虽然我同意@Konrad所提倡的基本方法,将转换所需的数据表组合在一起,但我认为实现它的方式略有不同。我不会使用std::pair。我将显式地定义一个结构,以便这些值具有有意义的名称:
struct conversion {
double offset;
double coefficient;
};那么,您的转换将类似于:
double convert(conversion_type conversion, double input) {
conversion c = conversions[conversion];
return (input+c.offset)*c.coefficient;
}至少在我看来,...which似乎更易读懂。如果您确实希望为每个转换维护单独的函数,我仍然会将其分解为一个函数进行输入。另一个执行转换本身,第三个用于显示结果。我仍然使用指向函数的指针的矢量(或数组),使用用户输入的数字来索引它(当然,在确保它在范围内之后),我仍然将它作为表驱动器。
发布于 2012-04-18 20:52:26
您的问题与智能指针完全无关。
这里的关键词是关注点的分离。您有一个函数(嗯,其中有几个),它尝试做所有事情:创建提示符、控制用户输入、转换值和输出结果。
这很糟糕。你应该严格地把这些问题分开。
程序的核心是一个带有原型的转换函数。
double convert(double input);当然,对于每个单元到单元的转换,您有几个- one(这可以通过首先转换为公共单元来实现不同的操作,但是现在我们将省略这一点)。
然后需要输入和输出例程,如下所示:
double read_number(std::string const& unit) {
std::cout << "Please enter the temperature in " << unit << std::flush;
double value;
std::cin >> value;
return value;
}和
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";
}然后转换为简单的一行程序,例如:
double celsius_to_kelvin(double value) {
return value + 273.15;
}(此外,请注意,虽然是“摄氏度”,但它只是“开尔文”,而不是“开尔文度”。)
您甚至可以对所有转换使用相同的函数,只需存储缩放因子和偏移量。例如:
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更详细。)
发布于 2012-04-19 12:40:08
if(userinput==1)
...
if(userinput=2)
...考虑在这种情况下使用switch或else if结构
if (userinput==1)
...
else if(userinput==2)
...也要考虑玩这个把戏
double(*)(void) fp[] = {fahrtocels, celstofahr, celstokelv, kelvtocels}
fp[userinput]() // calling function depends on the input numberhttps://codereview.stackexchange.com/questions/10993
复制相似问题