Преобразование ввода времени в число с плавающей запятой для включения математических функций в C ++ - PullRequest
1 голос
/ 04 октября 2011

Я прошу пользователя ввести время начала и время окончания в этом формате: 15,45 (военное время с десятичной дробью вместо двоеточия), и мне нужно преобразовать эти времена в число с плавающей точкой, чтобы выполнить вычисления на них. У меня возникают проблемы, когда я перевожу 60 минут часа в десятичное значение. например - Пользовательские вводы начинаются с 12.45 и заканчиваются 14.15, их следует преобразовать в 12.75 и 14.25 соответственно. Как бы я пошел об этом преобразовании?

Кроме того, кое-что, на мой взгляд, более способно выяснить, но все равно любопытно: как бы я проверил ввод, чтобы не было времени больше 23,59 и не было времени с двумя последними цифрами больше 59?

Ответы [ 7 ]

2 голосов
/ 04 октября 2011

Как только одно из значений будет double, арифметика будет выполнена в double с результатами double.Таким образом, вы можете преобразовать minutes в double, используя любой из трех синтаксисов C ++: static_cast<double>(minutes), double(minutes) или (double)minutes или просто разделив на 60.0 вместо целого числа 60.(Мне нравится быть явным, поэтому я бы написал double(minutes) / 60.0. И некоторые люди предпочитают static_cast, даже в этом случае.)

Что касается проверки, я бы сделал это до преобразования;как только вы добавите минуты к часам, все равно будет слишком поздно.

2 голосов
/ 04 октября 2011

просто используйте

double time = hours + minutes / 60.0;
bool hoursValid = hours < 24; // hours are unsigned, right?
bool minutesValid = minutes < 60;

Пример:

char buf[] = "9.45";
unsigned int hours, minutes;
sscanf(buf, "%d.%d", &hours, &minutes);
printf("%f", hours + minutes/60.0); // outputs 9.75

Если вы получите double 9.45 в качестве ввода, вам нужно #include <cmath> и разделить его как

hours = floor(v);
minutes = (v - hours) * 100;
0 голосов
/ 04 октября 2011

Есть ли причина, по которой вы не хотите создавать класс MilTime и перегружать арифметические операторы? Это избавит вас от необходимости постоянно переводить в / из и более четко заявит о ваших намерениях.

0 голосов
/ 04 октября 2011
float t = 15.45;
int h = (int) t;
float m = 100 * (t - h);
printf("%f", h + m / 60);

дает вывод: 15.750000

Проверьте, находится ли h между 0 и 23 и m между 0 и 59.

0 голосов
/ 04 октября 2011
bool military_time_valid(float a) {
    int t = (int)a;
    if (t >= 24)
        throw std::runtime_error("invalid hours");
    if (a-t >= .6)
        throw std::runtime_error("invalid minutes");
}
float military_to_decimal(float a) {
    int t = (int)a;
    return t + (a-t)/.6;
}
float decimal_to_military(float a) {
    int t = (int)a;
    return t + (a-t)*.6;
}
0 голосов
/ 04 октября 2011

Я собираюсь предположить, что ваш код читает значение пользователя в виде строки. Вам нужно будет проанализировать ввод пользователя в десятичной точке, чтобы получить часы и минуты как два отдельных значения. Если у вас есть это, вы можете преобразовать минуты в доли часа и добавить их к количеству часов.

0 голосов
/ 04 октября 2011

Вы должны разделить целые и десятичные компоненты числа.Вы сохраните целую часть без изменений, а затем добавите к ней десятичную часть, разделенную на 60.

Проверка также проста, если разделить на часы и минуты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...