使用class c将华氏温度转换为摄氏温度

时间:2015-10-07 17:38:24

标签: c++ class

大家好,我遇到了问题。我很新,一直试图解决它。

当我运行它时,它为华氏度到摄氏度打印0的第一部分是正确的但是一旦我输入一个数字,它就会输出我输入的数字。我知道这可能是一个简单的答案,但谢谢你的时间。

#include <iostream>

using namespace std;

class Temp
{
    public:

        Temp(); //CONSTRUCTOR: Sets private variable for Fahrenheit to 32

        void InputF(float F); //Initialize Fahrenheit temperature to F

        void Celsius(); //PRINTS the Celsius temperature corresponding to

        // the private Fahrenheit equivalent temperature

        void ChangeBy(float D); //Changes the private Fahrenheit temperature

        // by D degrees. 

        float Fahrenheit(); // returns the value of the private Fahrenheit temp

    private:

        float Fah; //Fahrenheit Temperature
};

int main() {
    float FF;

    Temp T; // Temperature Object

    T.Celsius(); 

    cout << endl; //Note that the value will be 0 since the private variable is 32. 

    cout << "Input a Fahrenheit temp: ";

    cin >> FF;

    T.InputF(FF);

    cout << T.Fahrenheit() << endl;;

    T.ChangeBy(34);

    cout << T.Fahrenheit() << endl;

    system("Pause");

    return 0;

}

Temp::Temp() {
    Fah = 32;
}

void Temp::InputF(float F) {
    Fah = F;
}

void Temp::Celsius() {
    cout << Fah;
}

void Temp::ChangeBy(float D) {
    Fah = (5.0 / 9) * (Fah - 32);
}

float Temp::Fahrenheit() {
    return Fah;
}

1 个答案:

答案 0 :(得分:1)

所以,有一个问题:

void Temp::ChangeBy(float D)
{
    Fah = (5.0/9)* (Fah - 32);    
}

此方法不会像您在类声明中所做的那样做;您的评论表明它会根据传递给它的 Fahrenheit 度数更新Fah

如果我可以建议以下更改:

  • 首先,让ChangeBy只需将输入值添加到Fah
    void Temp::ChangeBy( float D )
    {
      Fah += D;
    }
  • 其次,让Celcius方法执行转换并返回转换后的值
    float Temp::Celcius()
    {
      return (5.0/9.0) * (Fah - 32.0);
    }
    
  • 最后,在main函数中,将Temp::Celcius()的输出写入输出流:
    std::cout << T.Celcius() << std::endl;

    修改

    我冒昧地重写你的代码来表明我的意思;单个评论中没有足够的空间来真正理解这一点:

    #include <iostream>
    
    using namespace std;
    
    class Temp
    {
        public:
    
            Temp( float f = 32.0 );     // slight change here 
            void InputF(float F);
            float Celsius() const;      // note return type, addition of const
            void ChangeBy(float D);
            float Fahrenheit() const;   // note addition of const
    
        private:
    
            float Fah;
    };
    
    int main() {
        float FF;
        Temp T;
    
        cout << T.Celsius();  // Note that we output the result of Celsius in 
                              // exactly the same manner that we do for 
                              // Fahrenheit below.
        cout << endl; 
        cout << "Input a Fahrenheit temp: ";
        cin >> FF;
        T.InputF(FF);
        cout << T.Fahrenheit() << endl;    
        T.ChangeBy(34);
        cout << T.Fahrenheit() << endl;
        return 0;
    
    }
    
    /**
     * Slight change here; we're using a member initializer, rather than 
     * assigning Fah in the body of the constructor.  For a simple class
     * like this it doesn't matter, but when you start getting into derived
     * and virtual classes, using this method will make sure things get
     * initialized in the right places and in the right order.
     */
    Temp::Temp( float f ) : Fah(f) {
    }
    
    void Temp::InputF(float F) {
        Fah = F;
    }
    
    float Temp::Celsius() const {
        return (5.0f / 9.0f) * ( Fah - 32.0f ); // use f suffix for float constants
    }
    
    void Temp::ChangeBy(float D) {
        Fah += D;    // Update the value of Fah by the input value; the code you
                     // posted isn't using the value of D to update Fah, it was
                     // simply converting Fah to Celsius.  
    }
    
    float Temp::Fahrenheit() const {
        return Fah;
    }
    

    此代码使用带有g++标志的-pedantic -Wall -Werror在Linux系统上构建和运行。

    所以,我已将Celsius的返回类型从void更改为float;而不是让Celsius打印该值,它只是将值返回到main。这种方式Celsius不必担心输出写入的 (例如,如果你想写一个文件而不是cout,那么它)焦点现在要窄得多。

    我也改变了ChangeBy功能;在您上面粘贴的实现中,您实际上并不是使用输入参数D来更改Fah的值;你只是将Fah的值从华氏温度转换为Celcius。

    请注意,我还在constFahrenheit方法中添加了尾随Celsius限定符。这表明这两种方法不会尝试更新Temp内部的任何数据。以这种方式制作这种“查询”方法const是个好主意;它使您无法编写能够在不应该进行更改的地方编写代码。