Miahjer
Miahjer

Reputation: 1

Conversion Fahrenheit to Celsius using class c

Hello everyone I'm having a problem. I'm fairly new and been stuck trying to solve it.

When I run it the first part where it prints 0 for the Fahrenheit to Celsius is correct but once I input a number it just prints the number I input. I know it probably a simple answer but thank you for your time.

#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;
}

Upvotes: 0

Views: 2003

Answers (1)

John Bode
John Bode

Reputation: 123448

So, one issue:

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

This method does not do what you say it does in the class declaration; your comment says that it updates Fah by the number of Fahrenheit degrees passed to it.

If I may suggest the following changes:

  • First, have ChangeBy simply add the input value to Fah:
    void Temp::ChangeBy( float D )
    {
      Fah += D;
    }
  • Second, have the Celcius method do the conversion and return the converted value:
    float Temp::Celcius()
    {
      return (5.0/9.0) * (Fah - 32.0);
    }
    
  • Finally, in your main function, write the output of Temp::Celcius() to the output stream:
    std::cout << T.Celcius() << std::endl;

    EDIT

    I took the liberty of rewriting your code to show what I mean; there isn't enough space in a single comment to really get the point across:

    #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;
    }
    

    This code builds and runs on a Linux system using g++ with the -pedantic -Wall -Werror flags.

    So, I've changed the return type of Celsius from void to float; instead of having Celsius print the value, it simply returns the value to main. This way Celsius doesn't have to worry about where the output gets written (what if you wanted to write to a file instead of cout, for example), and its focus is now much narrower.

    I also changed the ChangeBy function; in the implementation you pasted above, you aren't actually using the input parameter D to change the value of Fah; you're simply converting the value of Fah from Fahrenheit to Celcius.

    Notice that I also added the trailing const qualifier to the Fahrenheit and Celsius methods. This indicates that these two methods will not attempt to update any data internal to Temp. It's a good idea to make such "query" methods const in this manner; it keeps you from writing code that makes changes where it shouldn't.

    Upvotes: 1

  • Related Questions