将分钟转换为天,小时,分钟和秒

时间:2020-09-03 18:32:44

标签: c++

我正在学习C ++初级课程,在弄清楚为什么在C ++中将分钟转换为天,小时,分钟和秒时为什么得到错误的输出会遇到一些麻烦。

我有一个朋友帮我,她能够使用相同的数学方法在Python中获得正确的输出,但是由于某些原因,在C ++中,我无法在几秒钟内获得正确的输出。我敢肯定有一种容易得多的方法来获取输出,但这就是教授要我们编写的方式。

例如,输入为10.5,代码输出0d 0h 10m 0s而不是0d 0h 10m 30s。

这是代码:

#include <iostream>
using namespace std;

int main() {

  //get the starting number of minutes
  int inputMinutes;
  double decimalMinutes;
  cout << "Enter number of minutes: ";
  cin >> decimalMinutes;

    //allow decimal input
    inputMinutes = decimalMinutes;

    //get number of days
    int days = inputMinutes / 1440;
    inputMinutes = inputMinutes % 1440; 

    //get number of hours 
    int hours = inputMinutes / 60;

    //get number of minutes 
    int mins = inputMinutes % 60;

    int seconds = inputMinutes % 1 * 60;

    //output days, hours, minutes and seconds
    cout << days << "d " << hours << "h " << mins << "m " << seconds << "s" << endl;
}

我感觉这与将int转换为double有关,但如果不是这种情况,那么我不确定这可能是什么问题。谢谢您的任何帮助。

4 个答案:

答案 0 :(得分:1)

使用整数是一个问题。将inputMinutes更改为double并使用fmod。该代码应该有效。

#include <iostream>
#include <math.h>
using namespace std;

int main() {

  //get the starting number of minutes
  double inputMinutes;
  double decimalMinutes;
  cout << "Enter number of minutes: ";
  cin >> decimalMinutes;

    //allow decimal input
    inputMinutes = decimalMinutes;

    //get number of days
    int days = inputMinutes / 1440;
    inputMinutes = fmod(inputMinutes,1440); 

    //get number of hours 
    int hours = inputMinutes / 60;

    //get number of minutes 
    int mins = fmod(inputMinutes,60);

    int seconds = fmod(inputMinutes,1) * 60;

    //output days, hours, minutes and seconds
    cout << days << "d " << hours << "h " << mins << "m " << seconds << "s" << endl;
}

答案 1 :(得分:1)

正如其他用户已经指出的那样,当您编写inputMinutes = decimalMinutes;时,会将double转换为int,从而丢失了有关小数部分的所有信息。您必须将此部分与decimalMinutes变量的整数部分分开,然后将其乘以60以得到秒数。请参见下面的代码。

#include <iostream>

int main() {

  //get the starting number of minutes
  int inputMinutes;
  double decimalMinutes;
  double decPart;
  std::cout << "Enter number of minutes: ";
  std::cin >> decimalMinutes;

    //allow decimal input
    inputMinutes = decimalMinutes;
    decPart = decimalMinutes-inputMinutes;


    //get number of days
    int days = inputMinutes / 1440;
    inputMinutes = inputMinutes % 1440; 

    //get number of hours 
    int hours = inputMinutes / 60;

    //get number of minutes 
    int mins = inputMinutes % 60;

    int seconds = decPart * 60;

    //output days, hours, minutes and seconds
    std::cout << days << "d " << hours << "h " << mins << "m " << seconds << "s" << std::endl;

    return 0;
}

这应该可以工作:这是我的一些输出。

Enter number of minutes: 10.5
0d 0h 10m 30s

Enter number of minutes: 126.3333333
0d 2h 6m 19s

Enter number of minutes: 1440.4
1d 0h 0m 24s

Enter number of minutes: 12.1
0d 0h 12m 5s

您会看到仍然存在一些舍入问题(如果要计算1/3分钟,您应该输入周期数0.333333333 ...,而0.1的表示形式是浮点算术中的周期),这是由于如何处理从doubleint的转换(请参见@PaulMcKenzie对您的答案的评论)。

答案 2 :(得分:1)

除了自己保留数字之间的比率之外,还可以使用std::chrono名称空间中的定义。

#include <iostream>
#include <chrono>

using f_minutes = std::chrono::duration<double, std::chrono::minutes::period>;

int main() {

  //get the starting number of minutes
  double input;
  std::cout << "Enter number of minutes: ";
  std::cin >> input;

  f_minutes decimalMinutes(input);

  auto days = duration_cast<std::chrono::days>(decimalMinutes);
  decimalMinutes -= days;

  auto hours = duration_cast<std::chrono::hours>(decimalMinutes);
  decimalMinutes -= hours;

  auto mins = duration_cast<std::chrono::minutes>(decimalMinutes);
  decimalMinutes -= mins;

  auto seconds = duration_cast<std::chrono::seconds>(decimalMinutes);

  //output days, hours, minutes and seconds
  std::cout << days.count() << "d " << hours.count() << "h " << mins.count() << "m " << seconds.count() << "s" << std::endl;
}

See it live

答案 3 :(得分:0)

由于您不在乎几分之一秒,因此只需将输入乘以60,然后将其全部取整即可:

int main() {

    int inputSeconds; // << I changed this to seconds here
    double decimalMinutes;
    cout << "Enter number of minutes: ";
    cin >> decimalMinutes;
    inputSeconds = 60.*decimalMinutes; // << times 60, now contains the seconds as a whole number

    int days = inputSeconds / (1440*60); // I do a multiplication here to make it clear for you what is happening
    ...
}

请注意,从双精度到整数的转换本质上是四舍五入的。例如,(int) 0.9为零。如果您想四舍五入到最接近的数字,我们将变得更加复杂。

除此之外,我强烈建议您阅读有关使用调试器的教程。如果使用一个,您会发现您的变量丢失了一些数据。
或者,另外,学习如何使用控制台消息(std::cout)进行调试。