Фаренгейт к Цельсию неверный результат - PullRequest
0 голосов
/ 21 января 2019

Я изучаю разработку программного обеспечения, и мне нужно преобразовать Фаренгейт в Цельсий, но мой код вычисляет его неправильно. Вот мой код:

int main() {
    // configure the out put to display money
    cout.setf(ios::fixed);     //no scientific notation
    cout.setf(ios::showpoint); //show decimal point
    cout.precision(0);         //two decimal for cents

    int fahrenheit = 0 ;
    int celsius = 5/9*(fahrenheit-32);

    cout << "Please enter Fahrenheit degrees:  ";
    cin >> fahrenheit ;

    cout << "Celsius:  " <<  celsius << endl;

   return 0;
}

Ответы [ 3 ]

0 голосов
/ 21 января 2019

ваша формула использует int: 5/9, что означает, что вы теряете некоторую точность, измените 5 на 5.0 или, если вы хотите изменить Celsius, чтобы плавать

0 голосов
/ 21 января 2019

В вашем коде четыре ошибки.

1) Главное - понять, что компьютер делает все в том порядке, в котором вы его просите.Очевидно, правильный порядок: а) попросить пользователя ввести температуру; б) преобразовать ее в градусы Цельсия.Но ваш код делает это наоборот.Вот ваш код с некоторыми моими комментариями

// convert fahrenheit to celcius
int celsius = 5/9*(fahrenheit-32);

// ask user to enter fahrenheit temperature
cout << "Please enter Fahrenheit degrees:  ";
cin >> fahrenheit ;

Надеюсь, теперь очевидно, что у вас все не так, как надо

2) Вторая ошибка в том, что вы выбрали неправильный тип для ваших переменных.Температура не является целым числом (например, нет ничего плохого в том, что температура составляет 80,5 градусов).Таким образом, вы должны выбрать тип с плавающей точкой для своих переменных, float является одной из возможностей.

3) Третья ошибка довольно техническая, но важная для понимания.В своем уравнении вы написали 5/9, и 5, и 9 являются целыми числами, поэтому компьютер выполнит целочисленное деление , что означает любой математический результат деления, к которому собирается компьютеротбросить дробную часть результата, оставив целое число.Математически 5/9 равно 0.555555..., а дробная часть оставляет 0, поэтому ваше уравнение такое же, как 0*(fahrenheit-32), которое, очевидно, не даст правильного результата.Используйте 5.0/9.0 вместо 5/9 таким образом, вы получите деление с плавающей запятой .

4) Конечная ошибка довольно тривиальна

cout.precision(0);         //two decimal for cents

Если вы хотите два десятичных знакаместами это должно быть

cout.precision(2);

Наконец, это не ошибка, но комментарии о деньгах неуместны в программе о температуре.

Вот версия вашего кода с исправленными этими ошибками

int main() {
    cout.setf(ios::fixed);     //no scientific notation
    cout.setf(ios::showpoint); //show decimal point
    cout.precision(2);         //two decimal places


    float fahrenheit;
    cout << "Please enter Fahrenheit degrees:  ";
    cin >> fahrenheit;

    float celsius = 5.0/9.0*(fahrenheit-32.0);
    cout << "Celsius:  " <<  celsius << endl;

   return 0;
}

Я уверен, что вы удивлены тем, что в короткой программе может быть так много ошибок.Это просто подчеркивает, что вы должны быть осторожны и точны при написании кода.

0 голосов
/ 21 января 2019

Если вам нужно использовать int, то вы должны выполнить деление как последний шаг, чтобы уменьшить потерю точности для типов int.Но имейте в виду, что это может вызвать переполнение (не должно быть проблемой для температур ...)

#include <iostream>
using namespace std;
int main() {
    // configure the out put to display money
    cout.setf(ios::fixed);     //no scientific notation
    cout.setf(ios::showpoint); //show decimal point
    cout.precision(0);         //two decimal for cents

    int fahrenheit = 0 ;

    cout << "Please enter Fahrenheit degrees:  ";
    cin >> fahrenheit ;
    int celsius = 5*(fahrenheit-32)/9;
    cout << "Celsius:  " <<  celsius << endl;

   return 0;
}
...